diff --git a/THANKS b/THANKS
index bf9c341fb..4303e5c6b 100644
--- a/THANKS
+++ b/THANKS
@@ -1,208 +1,212 @@
 Invenio THANKS
 ==============
 
 Several people besides the core Invenio Development Team
 contributed to the project:
 
   - Thierry Thomas <thierry@FreeBSD.org>
     Patches for compiling old CDSware 0.3.x sources on FreeBSD.
 
   - Guido Pelzer <guido.pelzer@web.de>
     Contributions to the German translation.  German stopword list.
 
   - Valerio Gracco <valerio.gracco@cern.ch>
     Contributions to the Italian translation.
 
   - Tullio Basaglia <tullio.basaglia@cern.ch>
     Contributions to the Italian translation.
 
   - Flavio C. Coelho <fccoelho@fiocruz.br>
     Contributions to the Portuguese translation.
 
   - Lyuba Vasilevskaya <lyubov.vassilevskaya@cern.ch>
     Contributions to the Russian translation.
 
   - Maria Gomez Marti <maria.gomez.marti@cern.ch>
     Contributions to the Spanish translation.
 
   - Magaly Bascones Dominguez <magaly.bascones.dominguez@cern.ch>
     Contributions to the Spanish translation.
 
   - Urban Andersson <urban.andersson@hb.se>
     Contributions to the Swedish translation.
 
   - Eric Grand <eric.grand@rero.ch>
     Contributions to the French translation.
 
   - Theodoropoulos Theodoros <theod@lib.auth.gr>
     Contributions to the Greek translation, Greek stopword list,
     XML RefWorks output format, Google Analytics documentation update,
     BibConvert target/source CLI flag description fix.
 
   - Vasyl Ostrovskyi <vo@imath.kiev.ua>
     Contributions to the Ukrainian translation.
 
   - Ferran Jorba <Ferran.Jorba@uab.cat>
     Contributions to the Catalan and Spanish translations.  Cleanup of
     the old PHP-based BibFormat Admin Guide.  Several minor patches.
 
   - Beatriu Piera <Beatriz.Piera@uab.es>
     Translation of the Search Guide into Catalan and Spanish.
 
   - Anonymous contributor (name withheld by request)
     Contributions to the Japanese translation.
 
   - Anonymous contributor (name withheld by request)
     Contributions to the Spanish translation.
 
   - Alen Vodopijevec <alen@irb.hr>
     Contributions to the Croatian translation.
 
   - Jasna Marković <jmarkov@irb.hr>
     Contributions to the Croatian translation.
 
   - Kam-ming Ku <kmku@hkusua.hku.hk>
     Contributions to the Chinese translations (zh_CN, zh_TW).
 
   - Benedikt Koeppel <be.public@gmail.com>
     Contributions to the German translation.
 
   - Toru Tsuboyama <toru.tsuboyama@kek.jp>
     Contributions to the Japanese translation.
 
   - Mike Marino <mmarino@gmail.com>
     Several minor patches and suggestions.
 
   - Zbigniew Szklarz <zszklarz@student.agh.edu.pl>
     Contributions to the Polish translation.
 
   - Iaroslav Gaponenko <adrahil@gmail.com>
     Contributions to the Russian translation.
 
   - Yana Osborne <ianna.osborne@cern.ch>
     Contributions to the Russian translation.
 
   - Zbigniew Leonowicz <leonowicz@ieee.org>
     Contributions to the Polish translation.
 
   - Makiko Matsumoto <maki.matsumoto@gmail.com> and Takao Ishigaki
     Contributions to the Japanese translation.
 
   - Eva Papp <Eva.Papp@cern.ch>
     Contributions to the Hungarian translation.
 
   - Nino Jejelava <nino.jejelava@gmail.com>
     Contributions to the Georgian translation.
 
   - Cristian Bacchi <cristian.bacchi@gmail.com>
     Improvements to the browse interface.
 
   - Genis Musulmanbekov <genis@jinr.ru>
     Contributions to the Russian translation.
 
   - Andrey Tremba <metandrey@gmail.com>
     Contributions to the Russian translation.
 
   - Cornelia Plott <c.plott@fz-juelich.de>
     Contributions to the German translation.
 
   - Johnny Mariéthoz <johnny.mariethoz@rero.ch>
     Patch to improve BibRecDocs argument checking.
 
   - Alexander Wagner <a.wagner@fz-juelich.de>
     Contributions to the German translation.
 
   - Miguel Martín <miguelm@unizar.es>
     Patch to fix traceback in get_collection_reclist() occurring for
     misspelled collection names in access control rules.
 
   - Stefan Hesselbach <s.hesselbach@gsi.de>
     Patch for OAI harvesting via HTTP proxy.
 
   - Bessem Amira <bessem.amira@cnudst.rnrt.tn>
     Contributions to the Arabic translation.
 
   - Kevin M. Flannery <flannery@fnal.gov>
     Patch for WebSubmit's Move_Photos_to_Storage.
 
   - Thomas McCauley <thomas.mccauley@cern.ch>
     Improvements to Invenio Connector.
 
 The Flask SSLify plugin was adapted from the original version developed
 by Kenneth Reitz <_@kennethreitz.com>.
 <https://github.com/kennethreitz/flask-sslify>
 
 The URL handler was inspired by the Quixote Web Framework which is
 ``Copyright (c) 2004 Corporation for National Research Initiatives;
 All Rights Reserved''.
 <http://www.quixote.ca/>
 
 The session handler was adapted from the mod_python session implementation.
 <http://www.modpython.org/>
 
 Javascript Quicktags scripts from Alex King are used to provide
 additional capabilities to the edition of BibFormat templates through
 the web admin interface.
 <http://www.alexking.org>
 
 The indexer engine uses the Martin Porter Stemming Algorithm and its
 Vivake Gupta free Python implementation.
 <http://tartarus.org/~martin/PorterStemmer/>
 
 The CSS style for rounded corners box used in detailed record pages
 adapted from Francky Lleyneman liquidcorners CSS.
 <http://home.tiscali.nl/developerscorner/liquidcorners/liquidcorners.htm>
 
 The NASA_Subjects.rdf files has been retrieved from the American National
 Aeronautics and Space Administration (NASA) who kindly provide this for
 free re-use.
 <http://nasataxonomy.jpl.nasa.gov/fordevelopers/>
 
 The tiger test picure used in automated demo picture submission was
 converted from Ghostscript's 'tiger.eps'.
 <http://www.gnu.org/software/ghostscript/>
 
 Some icon images were taken from (i) the Silk icon set, (ii) the
 Function icon set, (iii) the activity indicator icon, and (iv) the
 Open Icon Libray.
 <http://www.famfamfam.com/lab/icons/silk/>
 <http://wefunction.com/2008/07/function-free-icon-set/>
 <http://www.badeziner.com/2008/05/04/120-free-ajax-activity-indicator-gif-icons/>
 <http://openiconlibrary.sourceforge.net/gallery2/>
 
 The unoconv.py script has been adapted from UNOCONV by Dag Wieers.
 <http://dag.wieers.com/home-made/unoconv/>
 
 PDFA_def.ps has been adapted from the GPL distribution of GhostScript.
 <http://ghostscript.com/>
 
 The ISOCoatedsb.icc ICC profile has been retrieved from the European Color
 Initiative.
 <http://www.eci.org/>
 
 The PEP8 conformance checking script (pep8.py) was written by
 Johann C. Rocholl <johann@browsershots.org>.
 The pep8.py version included with Invenio was downloaded from
 <http://svn.browsershots.org/trunk/devtools/pep8/pep8.py> on
 2009-06-14.
 
 The logicutils library was originally authored by
 Peter Norvig <peter.norvig@google.com> and was taken from
 <http://code.google.com/p/aima-python/> on 2010-05-20 and later expanded
 to fit Invenio needs.
 
 The git-version-gen script was taken from gnulib 20100704+stable-1.
 <http://www.gnu.org/software/gnulib/>
 
 The LaTeX-to-Unicode translation table was compiled from:
 FX, <http://stackoverflow.com/questions/4578912/replace-all-accented-characters-by-their-latex-equivalent>
 Lea Wiemann <LeWiemann@gmail.com>, <http://docutils.sourceforge.net/docutils/writers/newlatex2e/unicode_map.py>
 
 The scientificchar plugin for the CKEditor was adapted from the
 specialchar plugin from Frederico Knabben.
 <http://ckeditor.com/>
 
 The oai2.xsl.v1.0 OAI to HTML XSLT Style Sheet was taken from EPrints.
 <http://www.eprints.org/software/xslt.php>
 
+The xmlDict.py code is authored by Duncan McGreggor and is licensed
+under PSF license.  It was taken from
+<http://code.activestate.com/recipes/410469/>.
+
 - end of file -
diff --git a/modules/webdeposit/lib/xmlDict.py b/modules/webdeposit/lib/xmlDict.py
new file mode 100644
index 000000000..9d09042a8
--- /dev/null
+++ b/modules/webdeposit/lib/xmlDict.py
@@ -0,0 +1,69 @@
+# -*- coding: utf-8 -*-
+#
+## The following code is authored by Duncan McGreggor and is licensed
+## under PSF license.  It was taken from
+## <http://code.activestate.com/recipes/410469/>.
+
+import xml.etree.ElementTree as ElementTree
+
+class XmlListConfig(list):
+    def __init__(self, aList):
+        for element in aList:
+            if element:
+                # treat like dict
+                if len(element) == 1 or element[0].tag != element[1].tag:
+                    self.append(XmlDictConfig(element))
+                # treat like list
+                elif element[0].tag == element[1].tag:
+                    self.append(XmlListConfig(element))
+            elif element.text:
+                text = element.text.strip()
+                if text:
+                    self.append(text)
+
+
+class XmlDictConfig(dict):
+    '''
+    Example usage:
+
+    >>> tree = ElementTree.parse('your_file.xml')
+    >>> root = tree.getroot()
+    >>> xmldict = XmlDictConfig(root)
+
+    Or, if you want to use an XML string:
+
+    >>> root = ElementTree.XML(xml_string)
+    >>> xmldict = XmlDictConfig(root)
+
+    And then use xmldict for what it is... a dict.
+    '''
+    def __init__(self, parent_element):
+        if parent_element.items():
+            self.update(dict(parent_element.items()))
+        for element in parent_element:
+            if element:
+                # treat like dict - we assume that if the first two tags
+                # in a series are different, then they are all different.
+                if len(element) == 1 or element[0].tag != element[1].tag:
+                    aDict = XmlDictConfig(element)
+                # treat like list - we assume that if the first two tags
+                # in a series are the same, then the rest are the same.
+                else:
+                    # here, we put the list in dictionary; the key is the
+                    # tag name the list elements all share in common, and
+                    # the value is the list itself
+                    aDict = {element[0].tag: XmlListConfig(element)}
+                # if the tag has attributes, add those to the dict
+                if element.items():
+                    aDict.update(dict(element.items()))
+                self.update({element.tag: aDict})
+            # this assumes that if you've got an attribute in a tag,
+            # you won't be having any text. This may or may not be a
+            # good idea -- time will tell. It works for the way we are
+            # currently doing XML configuration files...
+            elif element.items():
+                self.update({element.tag: dict(element.items())})
+            # finally, if there are no child tags and no attributes, extract
+            # the text
+            else:
+                self.update({element.tag: element.text})