diff --git a/simple/src/main/java/org/odftoolkit/simple/text/list/BulletDecorator.java b/simple/src/main/java/org/odftoolkit/simple/text/list/BulletDecorator.java
index bc33927..acf3d3d 100644
--- a/simple/src/main/java/org/odftoolkit/simple/text/list/BulletDecorator.java
+++ b/simple/src/main/java/org/odftoolkit/simple/text/list/BulletDecorator.java
@@ -1,4 +1,4 @@
-/* 
+/*
 Licensed to the Apache Software Foundation (ASF) under one
 or more contributor license agreements.  See the NOTICE file
 distributed with this work for additional information
@@ -21,7 +21,6 @@
 
 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;
@@ -35,6 +34,7 @@
 import org.odftoolkit.odfdom.incubator.doc.style.OdfStyle;
 import org.odftoolkit.odfdom.incubator.doc.text.OdfTextListStyle;
 import org.odftoolkit.simple.Document;
+import static org.odftoolkit.simple.text.list.BulletDecoratorBase.DEFAULT_BULLET_CHAR;
 import org.w3c.dom.Node;
 
 /**
@@ -44,7 +44,7 @@
  * with red color.
  * <p>
  * A BulletDecorator can be reused in the same Document.
- * 
+ *
  * @since 0.4
  */
 public class BulletDecorator implements ListDecorator {
@@ -53,7 +53,6 @@
 			"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;
@@ -62,7 +61,7 @@
 
 	/**
 	 * Constructor with Document.
-	 * 
+	 *
 	 * @param doc
 	 *            the Document which this BulletDecorator will be used on.
 	 */
@@ -115,7 +114,7 @@
 			Logger.getLogger(BulletDecorator.class.getName()).log(Level.SEVERE, null, e);
 		}
 	}
-	
+
 	public void decorateList(List list) {
 		TextListElement listElement = list.getOdfElement();
 		listElement.setTextStyleNameAttribute(listStyle.getStyleNameAttribute());
diff --git a/simple/src/main/java/org/odftoolkit/simple/text/list/BulletDecoratorBase.java b/simple/src/main/java/org/odftoolkit/simple/text/list/BulletDecoratorBase.java
new file mode 100644
index 0000000..af35971
--- /dev/null
+++ b/simple/src/main/java/org/odftoolkit/simple/text/list/BulletDecoratorBase.java
@@ -0,0 +1,167 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS 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 abstract class BulletDecoratorBase implements ListDecorator {
+
+	private static final 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 final String DEFAULT_TEXT_MIN_LABEL_WIDTH = "0.4cm";
+	private static final String DEFAULT_FONT_NAME = "Tahoma";
+	protected static final String DEFAULT_BULLET_CHAR = "\u25e6";
+//	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.
+	 * @param styleName style name: (i.e. BulletDecorator:  BulletDecorator.DEFAULT_NAME)
+	 * @param styleNameIntern intern style name:  (i.e. BulletDecorator:  "Bullet_20_Symbols")
+	 * @param listCharacter listing character: (i.e. BulletDecorator:  BulletDecorator.DEFAULT_BULLET_CHAR)
+	 */
+	public BulletDecoratorBase(Document doc, String styleName, String styleNameIntern, String listCharacter) {
+		OdfContentDom contentDocument;
+		try {
+			contentDocument = doc.getContentDom();
+			styles = contentDocument.getAutomaticStyles();
+			OdfOfficeStyles documentStyles = doc.getDocumentStyles();
+			listStyle = styles.getListStyle(styleName);
+			// 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, styleNameIntern, OdfStyleFamily.Text);
+				for (int i = 0; i < 10; i++) {
+					TextListLevelStyleBulletElement listLevelElement = listStyle.newTextListLevelStyleBulletElement(
+						listCharacter, i + 1);
+					// get from default style element
+					listLevelElement.setTextStyleNameAttribute(styleNameIntern);
+					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(BulletDecoratorBase.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/simple/src/main/java/org/odftoolkit/simple/text/list/DiscDecorator.java b/simple/src/main/java/org/odftoolkit/simple/text/list/DiscDecorator.java
new file mode 100644
index 0000000..32e68c9
--- /dev/null
+++ b/simple/src/main/java/org/odftoolkit/simple/text/list/DiscDecorator.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.text.list;
+
+import org.odftoolkit.simple.Document;
+
+/**
+ * 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 DiscDecorator extends BulletDecoratorBase {
+	private static String DEFAULT_NAME = "Simple_Default_Disc_List";
+
+	/**
+	 * Constructor with Document.
+	 *
+	 * @param doc
+	 *            the Document which this BulletDecorator will be used on.
+	 */
+	public DiscDecorator(Document doc) {
+	    super(doc, DEFAULT_NAME, "Bullet_20_Symbols", DEFAULT_BULLET_CHAR);
+	}
+
+}
diff --git a/simple/src/main/java/org/odftoolkit/simple/text/list/NumberDecorator.java b/simple/src/main/java/org/odftoolkit/simple/text/list/NumberDecorator.java
index cdced8b..e1eaab8 100644
--- a/simple/src/main/java/org/odftoolkit/simple/text/list/NumberDecorator.java
+++ b/simple/src/main/java/org/odftoolkit/simple/text/list/NumberDecorator.java
@@ -19,23 +19,7 @@
 
 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,
@@ -47,109 +31,18 @@
  * 
  * @since 0.4
  */
-public class NumberDecorator implements ListDecorator {
+public class NumberDecorator extends NumberDecoratorBase {
 
-	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;
+	    	super(doc, DEFAULT_NAME, "Numbering_20_Symbols", DEFAULT_NUM_FORMAT, DEFAULT_NUM_SUFFIX, null);
 	}
 }
diff --git a/simple/src/main/java/org/odftoolkit/simple/text/list/NumberDecoratorBase.java b/simple/src/main/java/org/odftoolkit/simple/text/list/NumberDecoratorBase.java
new file mode 100644
index 0000000..a545d5b
--- /dev/null
+++ b/simple/src/main/java/org/odftoolkit/simple/text/list/NumberDecoratorBase.java
@@ -0,0 +1,171 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS 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 abstract class NumberDecoratorBase 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";
+//	protected static String DEFAULT_NUM_FORMAT = "1";
+//	protected static String DEFAULT_NUM_SUFFIX = ".";
+//	private static String DEFAULT_NAME = "Simple_Custom_Number_List";
+
+	protected OdfTextListStyle listStyle;
+	protected OdfStyle paragraphStyle;
+	protected OdfOfficeAutomaticStyles styles;
+
+	/**
+	 * Constructor with Document.
+	 * 
+	 * @param doc
+	 *            the Document which this NumberDecorator will be used on.
+	 * @param styleName style name: (i.e. NumberDecorator:  NumberDecorator.DEFAULT_NAME)                 
+	 * @param styleNameIntern intern stylename (i.e. NumberDecorator:  "Numbering_20_Symbols")      
+	 * @param numberingFormat the numbering format (i.e. NumberDecorator:  "1", sonsrt "a", "A", "i", "I", ....)      
+	 * @param suffix  suffix after the number ("." for 1., 2., ... ")" for a) b) c) etc)
+	 * @param prefix  prefix before the number ("(" for (a) (b) (c) etc)
+	 */
+	protected NumberDecoratorBase(Document doc, String styleName, String styleNameIntern, String numberingFormat, String suffix, String prefix) {
+		OdfContentDom contentDocument;
+		try {
+			contentDocument = doc.getContentDom();
+			styles = contentDocument.getAutomaticStyles();
+			OdfOfficeStyles documentStyles = doc.getDocumentStyles();
+			listStyle = styles.getListStyle(styleName);
+			// 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, styleNameIntern, OdfStyleFamily.Text);
+				for (int i = 0; i < 10; i++) {
+					TextListLevelStyleNumberElement listLevelElement = listStyle.newTextListLevelStyleNumberElement(
+						numberingFormat, i + 1);
+					// get from default style element
+					listLevelElement.setTextStyleNameAttribute(styleNameIntern);
+					listLevelElement.setStyleNumSuffixAttribute(suffix);
+					listLevelElement.setStyleNumPrefixAttribute(prefix);
+					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(NumberDecoratorBase.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;
+	}
+	
+	/**
+	 * only for JUnit Test
+	 * @return
+	 */
+	OdfTextListStyle getListStyle()
+	{
+	    return listStyle;
+	}
+
+}
diff --git a/simple/src/main/java/org/odftoolkit/simple/text/list/NumberedAlphaLowerDecorator.java b/simple/src/main/java/org/odftoolkit/simple/text/list/NumberedAlphaLowerDecorator.java
new file mode 100644
index 0000000..5ec2977
--- /dev/null
+++ b/simple/src/main/java/org/odftoolkit/simple/text/list/NumberedAlphaLowerDecorator.java
@@ -0,0 +1,44 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.text.list;
+
+import org.odftoolkit.simple.Document;
+
+/**
+ * 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 NumberedAlphaLowerDecorator extends NumberDecoratorBase {
+
+	/**
+	 * Constructor with Document.
+	 * @param doc
+	 *            the Document which this NumberDecorator will be used on.
+	 */
+	public NumberedAlphaLowerDecorator(Document doc) {
+	    	super(doc, "Simple_Default_alfa_lower_List", "Numbering_20_Symbols", "a", ")", null);
+	}
+}
diff --git a/simple/src/main/java/org/odftoolkit/simple/text/list/NumberedAlphaUpperDecorator.java b/simple/src/main/java/org/odftoolkit/simple/text/list/NumberedAlphaUpperDecorator.java
new file mode 100644
index 0000000..73b24a8
--- /dev/null
+++ b/simple/src/main/java/org/odftoolkit/simple/text/list/NumberedAlphaUpperDecorator.java
@@ -0,0 +1,44 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.text.list;
+
+import org.odftoolkit.simple.Document;
+
+/**
+ * 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 NumberedAlphaUpperDecorator extends NumberDecoratorBase {
+
+	/**
+	 * Constructor with Document.
+	 * @param doc
+	 *            the Document which this NumberDecorator will be used on.
+	 */
+	public NumberedAlphaUpperDecorator(Document doc) {
+	    	super(doc, "Simple_Default_alfa_upper_List", "Numbering_20_Symbols", "A", ")", null);
+	}
+}
diff --git a/simple/src/main/java/org/odftoolkit/simple/text/list/NumberedGreekLowerDecorator.java b/simple/src/main/java/org/odftoolkit/simple/text/list/NumberedGreekLowerDecorator.java
new file mode 100644
index 0000000..3b92648
--- /dev/null
+++ b/simple/src/main/java/org/odftoolkit/simple/text/list/NumberedGreekLowerDecorator.java
@@ -0,0 +1,44 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.text.list;
+
+import org.odftoolkit.simple.Document;
+
+/**
+ * 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 NumberedGreekLowerDecorator extends NumberDecoratorBase {
+
+	/**
+	 * Constructor with Document.
+	 * @param doc
+	 *            the Document which this NumberDecorator will be used on.
+	 */
+	public NumberedGreekLowerDecorator(Document doc) {
+	    	super(doc, "Simple_Default_greek_lower_List", "Numbering_20_Symbols", "Î±, Î², ... (gr)", ")", null);
+	}
+}
diff --git a/simple/src/main/java/org/odftoolkit/simple/text/list/NumberedRomanLowerDecorator.java b/simple/src/main/java/org/odftoolkit/simple/text/list/NumberedRomanLowerDecorator.java
new file mode 100644
index 0000000..7341a61
--- /dev/null
+++ b/simple/src/main/java/org/odftoolkit/simple/text/list/NumberedRomanLowerDecorator.java
@@ -0,0 +1,44 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.text.list;
+
+import org.odftoolkit.simple.Document;
+
+/**
+ * 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 NumberedRomanLowerDecorator extends NumberDecoratorBase {
+
+	/**
+	 * Constructor with Document.
+	 * @param doc
+	 *            the Document which this NumberDecorator will be used on.
+	 */
+	public NumberedRomanLowerDecorator(Document doc) {
+	    	super(doc, "Simple_Default_roman_lower_List", "Numbering_20_Symbols", "i", ")", null);
+	}
+}
diff --git a/simple/src/main/java/org/odftoolkit/simple/text/list/NumberedRomanUpperDecorator.java b/simple/src/main/java/org/odftoolkit/simple/text/list/NumberedRomanUpperDecorator.java
new file mode 100644
index 0000000..899ea05
--- /dev/null
+++ b/simple/src/main/java/org/odftoolkit/simple/text/list/NumberedRomanUpperDecorator.java
@@ -0,0 +1,44 @@
+/* 
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.odftoolkit.simple.text.list;
+
+import org.odftoolkit.simple.Document;
+
+/**
+ * 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 NumberedRomanUpperDecorator extends NumberDecoratorBase {
+
+	/**
+	 * Constructor with Document.
+	 * @param doc
+	 *            the Document which this NumberDecorator will be used on.
+	 */
+	public NumberedRomanUpperDecorator(Document doc) {
+	    	super(doc, "Simple_Default_roman_upper_List", "Numbering_20_Symbols", "I", ")", null);
+	}
+}
diff --git a/simple/src/main/java/org/odftoolkit/simple/text/list/SquareDecorator.java b/simple/src/main/java/org/odftoolkit/simple/text/list/SquareDecorator.java
new file mode 100644
index 0000000..db6c793
--- /dev/null
+++ b/simple/src/main/java/org/odftoolkit/simple/text/list/SquareDecorator.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.text.list;
+
+import org.odftoolkit.simple.Document;
+
+/**
+ * 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 SquareDecorator extends BulletDecoratorBase {
+	private static String DEFAULT_NAME = "Simple_Default_Square_List";
+
+	/**
+	 * Constructor with Document.
+	 *
+	 * @param doc
+	 *            the Document which this BulletDecorator will be used on.
+	 */
+	public SquareDecorator(Document doc) {
+	    super(doc, DEFAULT_NAME, "Bullet_20_Symbols", DEFAULT_BULLET_CHAR);
+	}
+
+}
diff --git a/simple/src/test/java/org/odftoolkit/simple/text/list/ListTest.java b/simple/src/test/java/org/odftoolkit/simple/text/list/ListTest.java
index d842b14..51ddcab 100644
--- a/simple/src/test/java/org/odftoolkit/simple/text/list/ListTest.java
+++ b/simple/src/test/java/org/odftoolkit/simple/text/list/ListTest.java
@@ -1,4 +1,4 @@
-/* 
+/*
 Licensed to the Apache Software Foundation (ASF) under one
 or more contributor license agreements.  See the NOTICE file
 distributed with this work for additional information
@@ -22,9 +22,7 @@
 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;
@@ -383,7 +381,128 @@
 			Assert.assertEquals(ListType.NUMBER, outLineList.getType());
 			outLineList.setDecorator(imageDecorator);
 			Assert.assertEquals(ListType.IMAGE, outLineList.getType());
-			doc.save(ResourceUtilities.getTestOutput("ListOutput.odt"));
+			doc.save(ResourceUtilities.newTestOutputFile("ListOutput.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(ListTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+
+	@Test
+	public void testSetExtendedNumberedListDecorator() {
+		try {
+			TextDocument doc = TextDocument.newTextDocument();
+
+			String[] subItemContents = { "sub list item 1", "sub list item 2", "sub list item 3" };
+
+			doc.newParagraph(" ");
+			doc.newParagraph("Alpha lower List Example:");
+			List alphaLwrList = doc.addList(new NumberedAlphaLowerDecorator(doc));
+			alphaLwrList.setHeader("Alpha lower List");
+			for (String listitem : subItemContents)
+			{
+			    alphaLwrList.addItem(listitem);
+			}
+			Assert.assertEquals(ListType.NUMBER, alphaLwrList.getType());
+
+			doc.newParagraph(" ");
+			doc.newParagraph("Alpha upper List Example:");
+			List alphaUprList = doc.addList(new NumberedAlphaUpperDecorator(doc));
+			alphaUprList.setHeader("Alpha upper List");
+			for (String listitem : subItemContents)
+			{
+			    alphaUprList.addItem(listitem);
+			}
+
+			Assert.assertEquals(ListType.NUMBER, alphaUprList.getType());
+
+
+			doc.newParagraph(" ");
+			doc.newParagraph("Greek lower List Example:");
+			List greekLwrList = doc.addList(new NumberedGreekLowerDecorator(doc));
+			greekLwrList.setHeader("Greek lower List");
+			for (String listitem : subItemContents)
+			{
+			    greekLwrList.addItem(listitem);
+			}
+
+			Assert.assertEquals(ListType.NUMBER, greekLwrList.getType());
+
+
+			doc.newParagraph(" ");
+			doc.newParagraph("Roman lower List Example:");
+			List romanLwrList = doc.addList(new NumberedRomanLowerDecorator(doc));
+			romanLwrList.setHeader("Roman lower List");
+			for (String listitem : subItemContents)
+			{
+			    romanLwrList.addItem(listitem);
+			}
+
+			Assert.assertEquals(ListType.NUMBER, romanLwrList.getType());
+
+
+			doc.newParagraph(" ");
+			doc.newParagraph("Roman upper List Example:");
+			List romanUprList = doc.addList(new NumberedRomanUpperDecorator(doc));
+			romanUprList.setHeader("Roman upper List");
+			for (String listitem : subItemContents)
+			{
+			    romanUprList.addItem(listitem);
+			}
+
+			Assert.assertEquals(ListType.NUMBER, romanUprList.getType());
+
+
+			doc.save(ResourceUtilities.newTestOutputFile("NumberedListOutput.odt"));
+		} catch (Exception e) {
+			Logger.getLogger(ListTest.class.getName()).log(Level.SEVERE, null, e);
+			Assert.fail(e.getMessage());
+		}
+	}
+
+
+	@Test
+	public void testSetExtendedBulletListDecorator() {
+		try {
+			TextDocument doc = TextDocument.newTextDocument();
+
+			String[] subItemContents = { "sub list item 1", "sub list item 2", "sub list item 3" };
+
+			doc.newParagraph(" ");
+			doc.newParagraph("Bullet List Example:");
+			List bulletList = doc.addList(new BulletDecorator(doc));
+			bulletList.setHeader("Bullet List");
+			for (String listitem : subItemContents)
+			{
+			    bulletList.addItem(listitem);
+			}
+			Assert.assertEquals(ListType.BULLET, bulletList.getType());
+
+			doc.newParagraph(" ");
+			doc.newParagraph("Disc List Example:");
+			List discList = doc.addList(new DiscDecorator(doc));
+			discList.setHeader("Disc List");
+			for (String listitem : subItemContents)
+			{
+			    discList.addItem(listitem);
+			}
+
+			Assert.assertEquals(ListType.BULLET, discList.getType());
+
+
+			doc.newParagraph(" ");
+			doc.newParagraph("Square List Example:");
+			List squareList = doc.addList(new SquareDecorator(doc));
+			squareList.setHeader("Square List");
+			for (String listitem : subItemContents)
+			{
+			    squareList.addItem(listitem);
+			}
+
+			Assert.assertEquals(ListType.BULLET, squareList.getType());
+
+			doc.save(ResourceUtilities.newTestOutputFile("BulletListOutput.odt"));
 		} catch (Exception e) {
 			Logger.getLogger(ListTest.class.getName()).log(Level.SEVERE, null, e);
 			Assert.fail(e.getMessage());
