diff --git a/content/fop/trunk/fopxconf.mdtext b/content/fop/trunk/fopxconf.mdtext
index b033163..670e960 100644
--- a/content/fop/trunk/fopxconf.mdtext
+++ b/content/fop/trunk/fopxconf.mdtext
@@ -4,151 +4,148 @@
 
 ### [FopConfParser](configuration.html)
 
-- accessibility element boolean
-- base element
-- break-indent-inheritance element boolean
-- class attribute
-- complex-scripts element
-- country attribute
-- default-page-settings element
-- disabled attribute boolean
-- extension attribute
-- height attribute
-- hyp
-- hyphenation-base element
-- hyphenation-pattern element
-- image-loading element
-- lang attribute
-- penalty element
-- prefer-renderer
-- simple-line-breaking
-- source-resolution element float
-- strict-configuration element boolean
-- strict-validation element boolean
-- table-border-overpaint
-- target-resolution element float
-- value attribute
-- width attribute
-- xml
+- &lt;prefer-renderer&gt;true/false&lt;/prefer-renderer&gt;
+- &lt;table-border-overpaint&gt;true/false&lt;/table-border-overpaint&gt;
+- &lt;simple-line-breaking&gt;true/false&lt;/simple-line-breaking&gt;
+- &lt;skip-page-position-only-allowed&gt;true/false&lt;/skip-page-position-only-allowed&gt;
+- &lt;strict-validation&gt;true/false&lt;/strict-validation&gt;
+- &lt;strict-configuration&gt;true/false&lt;/strict-configuration&gt;
+- &lt;accessibility&gt;true/false&lt;/accessibility&gt;
+- &lt;base/&gt;
+- &lt;source-resolution&gt;float&lt;/source-resolution&gt;
+- &lt;target-resolution&gt;float&lt;/target-resolution&gt;
+- &lt;break-indent-inheritance&gt;true/false&lt;/break-indent-inheritance&gt;
+- &lt;default-page-settings/&gt;
+- height=string
+- width=string
+- &lt;complex-scripts/&gt;
+- disabled=true/false
+- &lt;image-loading/&gt;
+- &lt;hyphenation-base/&gt;
+- &lt;hyphenation-pattern/&gt;
+- lang=string
+- country=string
+- extension=string
+- xml=string
+- hyp=string
+- &lt;penalty/&gt;
+- class=string
+- value=string
 
 ### [DefaultFontConfig](fonts.html#bulk)
 
-- advanced attribute boolean
-- auto-detect element
-- directory element
-- embed-as-type1 attribute boolean
-- embed-url attribute
-- embed-url-afm attribute
-- embed-url-pfm attribute
-- embedding-mode attribute
-- encoding-mode attribute
-- font element
-- font-family attribute
-- font-triplet element
-- fonts element
-- kerning attribute boolean
-- match element
-- metrics-url attribute
-- mime attribute
-- name attribute
-- recursive attribute boolean
-- referenced-fonts element
-- simulate-style
-- style attribute
-- sub-font attribute
-- svg attribute boolean
-- weight attribute
-
-### [PDFEncryptionOption](pdfencryption.html#embedded)
-
-- encrypt-metadata default: true
-- encryption-length
-- encryption-params
-- noaccesscontent default: false
-- noannotations default: false
-- noassembledoc default: false
-- nocopy default: false
-- noedit default: false
-- nofillinforms default: false
-- noprint default: false
-- noprinthq
-- owner-password
-- user-password
-
-### [PDFRendererOption](pdfa.html#fop-xconf)
-
-- disable-srgb-colorspace default: false
-- form-xobject default: false
-- linearization default: false
-- merge-fonts default: false
-- output-profile
-- pdf-a-mode
-- pdf-ua-mode
-- pdf-vt-mode
-- pdf-x-mode
-- version
+- &lt;fonts/&gt;
+- &lt;auto-detect/&gt;
+- &lt;font/&gt;
+- embed-url=string
+- metrics-url=string
+- embed-url-afm=string
+- embed-url-pfm=string
+- sub-font=string
+- kerning=true/false
+- advanced=true/false
+- encoding-mode=string
+- embedding-mode=string
+- simulate-style=true/false
+- embed-as-type1=true/false
+- svg=true/false
+- &lt;font-triplet/&gt;
+- mime=string
+- &lt;referenced-fonts/&gt;
+- &lt;match/&gt;
+- font-family=string
+- &lt;directory/&gt;
+- recursive=true/false
+- name=string
+- weight=string
+- style=string
 
 ### [AFPRendererOption](output.html#afp-configuration)
 
-- allow-embedding boolean
-- bitmap-encoding-quality float
-- default-resource-levels
-- dithering-quality float
-- fs45 boolean
-- goca boolean
-- images
-- jpeg
-- line-width-correction float
-- mapping_option
-- mode boolean
-- native boolean
-- pseg boolean
-- renderer-resolution integer
-- resource-group-file
-- shading
-- text boolean
-
-### [PSRendererOption](output.html#ps-configuration)
-
-- acrobat-downsample default: false
-- auto-rotate-landscape default: false
-- dsc-compliant default: true
-- language-level
-- optimize-resources default: false
-- rendering
-- safe-set-page-device default: false
+- default-resource-levels=string
+- images=string
+- jpeg=string
+- dithering-quality=float
+- fs45=true/false
+- mapping_option=string
+- mode=true/false
+- native=true/false
+- pseg=true/false
+- allow-embedding=true/false
+- bitmap-encoding-quality=float
+- renderer-resolution=integer
+- resource-group-file=string
+- shading=string
+- line-width-correction=float
+- goca=true/false
+- text=true/false
 
 ### [TxtRendererConfig](output.html#txt)
 
-- encoding
-
-### [PCLRendererOption](output.html#pcl-configuration)
-
-- color boolean
-- disable-pjl boolean
-- optimize-resources boolean
-- rendering
-- text-rendering boolean
-- transparent-page-background
-
-### [BitmapRendererOption](output.html#bitmap-configuration)
-
-- anti-aliasing default: true
-- background-color
-- bi-level
-- binary
-- color-mode
-- gray
-- quality default: true
-- rendering
-- rgb
-- rgba
-- speed
-- transparent-page-background default: false
+- encoding=string
 
 ### [TIFFRendererConfig](output.html#bitmap-configuration)
 
-- compression
-- endianness
-- single-strip boolean
+- compression=string
+- single-strip=true/false
+- endianness=string
+
+### [BitmapRendererOption](output.html#bitmap-configuration)
+
+- transparent-page-background=default: false
+- background-color=string
+- anti-aliasing=default: true
+- rendering=string
+- quality=default: true
+- speed=string
+- color-mode=string
+- rgba=string
+- rgb=string
+- gray=string
+- binary=string
+- bi-level=string
+
+### [PSRendererOption](output.html#ps-configuration)
+
+- auto-rotate-landscape=default: false
+- language-level=string
+- optimize-resources=true/false
+- safe-set-page-device=default: false
+- dsc-compliant=default: true
+- acrobat-downsample=default: false
+
+### [PDFEncryptionOption](pdfencryption.html#embedded)
+
+- encryption-length=string
+- noprinthq=string
+- noassembledoc=default: false
+- noaccesscontent=default: false
+- nofillinforms=default: false
+- noannotations=default: false
+- noprint=default: false
+- nocopy=default: false
+- noedit=default: false
+- user-password=string
+- owner-password=string
+- encrypt-metadata=default: true
+- encryption-params=string
+
+### [PDFRendererOption](pdfa.html#fop-xconf)
+
+- pdf-a-mode=string
+- pdf-ua-mode=string
+- pdf-x-mode=string
+- pdf-vt-mode=string
+- version=string
+- disable-srgb-colorspace=default: false
+- merge-fonts=default: false
+- linearization=default: false
+- form-xobject=default: false
+- output-profile=string
+
+### [PCLRendererOption](output.html#pcl-configuration)
+
+- text-rendering=true/false
+- disable-pjl=true/false
+- color=true/false
 
diff --git a/generatefopxconf.py b/generatefopxconf.py
new file mode 100644
index 0000000..f542593
--- /dev/null
+++ b/generatefopxconf.py
@@ -0,0 +1,124 @@
+import os
+import argparse
+
+parser = argparse.ArgumentParser()
+parser.add_argument('fop', help='fop dir')
+parser.add_argument('website', help='website dir')
+args = parser.parse_args()
+
+class Item:
+    def __init__(self, name, parent):
+        self.name = name
+        self.parent = parent.replace('.java', '')
+        self.element = False
+        self.attrtype = 'string'
+
+tags = []
+
+def getItem(parent, l):
+    tag = None
+    if '"' in l:
+        tag = l.split('"')[1]
+        if ' ' in tag or len(tag) < 2 or tag.lower() != tag or tag == 'true':
+            return None
+    elif '(' in l:
+        tag = l.split('(')[1].split(')')[0]
+        if '_' not in tag or ' ' in tag or '.' in tag:
+            return None
+        tag = tag.lower().replace('_', '-')
+    else:
+        return None
+    for item in tags:
+        if tag == item.name:
+            return item
+    item = Item(tag, parent)
+    tags.append(item)
+    return item
+
+for root, _, files in os.walk(args.fop):
+    for name in files:
+        if name.endswith('.java'):
+            fn = os.path.join(root, name)
+            f = open(fn)
+            
+            if name == 'Java2DRendererOption.java':
+                name = 'PCLRendererOption.java'
+            check = name in ['FopConfParser.java', 'DefaultFontConfig.java'] 
+            for l in f:
+                l = l.strip()
+                if 'implements RendererConfigOption' in l:
+                    check = True
+                if check:
+                    item = getItem(name, l)
+                    if item:
+                        if 'getChild' in l:
+                            item.element = True
+                        if 'Boolean' in l:
+                            item.attrtype = 'true/false'
+                        if 'Integer' in l:
+                            item.attrtype = 'integer'
+                        if 'Float' in l:
+                            item.attrtype = 'float'
+                        if 'Option' in name:
+                            if 'true' in l:
+                                item.attrtype = 'default: true'
+                            if 'false' in l:
+                                item.attrtype = 'default: false'       
+            f.close()
+            
+def check(fn):
+    f = open(fn)
+    for l in f:
+        for tag in list(tags):
+            if ('<' + tag + ' ') in l or ('"' + tag + '"') in l or (' ' + tag + ' ') in l or ('<' + tag + '>') in l or (' ' + tag + '=') in l or ('<' + tag + '/') in l :
+                tags.remove(tag)
+    f.close()
+            
+for root, _, files in os.walk(args.website + '/content/fop/trunk'):
+    for name in files:
+        if name.endswith('.mdtext'):
+            fn = os.path.join(root, name)
+            #check(fn)
+#check(home + '/xmlgraphics-website/content/fop/fop-pdf-images.mdtext')
+
+print('Title: Apache(tm) FOP: Config Options\n')
+print('#Apache&trade; FOP: Config Options\n')
+
+links = {
+'FopConfParser':'configuration.html',
+'DefaultFontConfig': 'fonts.html#bulk',
+'PDFEncryptionOption': 'pdfencryption.html#embedded',
+'PDFRendererOption': 'pdfa.html#fop-xconf',
+'AFPRendererOption': 'output.html#afp-configuration',
+'PSRendererOption': 'output.html#ps-configuration',
+'TxtRendererConfig': 'output.html#txt',
+'PCLRendererOption': 'output.html#pcl-configuration',
+'BitmapRendererOption': 'output.html#bitmap-configuration',
+'TIFFRendererConfig': 'output.html#bitmap-configuration',
+}
+
+def printtags(tag):
+    if tag.element:
+        if tag.attrtype != 'string':
+            print('- &lt;' + tag.name + '&gt;' + tag.attrtype + '&lt;/' + tag.name + '&gt;')
+        else:
+            print('- &lt;' + tag.name + '/&gt;')
+    else:
+        print('- ' + tag.name + '=' + tag.attrtype)
+    
+seen = []
+    
+def printGroup(parent):
+    if parent not in seen:
+        print('### [' + parent + '](' + links[parent] + ')\n')
+        for tag in tags:
+            if tag.parent == parent:
+                printtags(tag)
+        print('')
+        seen.append(parent)
+
+printGroup('FopConfParser')
+printGroup('DefaultFontConfig')
+for tag in tags:
+    printGroup(tag.parent)
+    
\ No newline at end of file
