diff --git a/TestON/core/xmldict.py b/TestON/core/xmldict.py
new file mode 100644
index 0000000..34e9cfc
--- /dev/null
+++ b/TestON/core/xmldict.py
@@ -0,0 +1,191 @@
+'''
+Created on 03-Dec-2012
+
+@author: Anil Kumar (anilkumar.s@paxterrasolutions.com)
+
+    TestON is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 2 of the License, or
+    (at your option) any later version.
+
+    TestON is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with TestON.  If not, see <http://www.gnu.org/licenses/>.		
+
+'''
+
+"""
+    xmldict
+    ~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    Convert xml to python dictionaries.
+"""
+import datetime
+
+def xml_to_dict(root_or_str, strict=True):
+    """
+    Converts `root_or_str` which can be parsed xml or a xml string to dict.
+
+    """
+    root = root_or_str
+    if isinstance(root, str):
+        import xml.etree.cElementTree as ElementTree
+        root = ElementTree.XML(root_or_str)
+    try :
+        return {root.tag: _from_xml(root, strict)}
+    except :
+        return None
+
+def dict_to_xml(dict_xml):
+    """
+    Converts `dict_xml` which is a python dict to corresponding xml.
+    """
+    return _to_xml(dict_xml)
+
+def _to_xml(el):
+    """
+    Converts `el` to its xml representation.
+    """
+    val = None
+    if isinstance(el, dict):
+        val = _dict_to_xml(el)
+    elif isinstance(el, bool):
+        val = str(el).lower()
+    else:
+        val = el
+    if val is None: val = 'null'
+    return val
+
+def _extract_attrs(els):
+    """
+    Extracts attributes from dictionary `els`. Attributes are keys which start
+    with '@'
+    """
+    if not isinstance(els, dict):
+        return ''
+    return ''.join(' %s="%s"' % (key[1:], value) for key, value in els.iteritems()
+                   if key.startswith('@'))
+
+def _dict_to_xml(els):
+    """
+    Converts `els` which is a python dict to corresponding xml.
+    """
+    def process_content(tag, content):
+        attrs = _extract_attrs(content)
+        text = isinstance(content, dict) and content.get('#text', '') or ''
+        return '<%s%s>%s%s</%s>' % (tag, attrs, _to_xml(content), text, tag)
+
+    tags = []
+    for tag, content in els.iteritems():
+        # Text and attributes
+        if tag.startswith('@') or tag == '#text':
+            continue
+        elif isinstance(content, list):
+            for el in content:
+                tags.append(process_content(tag, el))
+        elif isinstance(content, dict):
+            tags.append(process_content(tag, content))
+        else:
+            tags.append('<%s>%s</%s>' % (tag, _to_xml(content), tag))
+    return ''.join(tags)
+
+def _is_xml_el_dict(el):
+    """
+    Returns true if `el` is supposed to be a dict.
+    This function makes sense only in the context of making dicts out of xml.
+    """
+    if len(el) == 1  or el[0].tag != el[1].tag:
+        return True
+    return False
+
+def _is_xml_el_list(el):
+    """
+    Returns true if `el` is supposed to be a list.
+    This function makes sense only in the context of making lists out of xml.
+    """
+    if len(el) > 1 and el[0].tag == el[1].tag:
+        return True
+    return False
+
+def _str_to_datetime(date_str):
+    try:
+        val = datetime.datetime.strptime(date_str,  "%Y-%m-%dT%H:%M:%SZ")
+    except ValueError:
+        val = date_str
+    return val
+
+def _str_to_boolean(bool_str):
+    if bool_str.lower() != 'false' and bool(bool_str):
+        return True
+    return False
+
+def _from_xml(el, strict):
+    """
+    Extracts value of xml element element `el`.
+    """
+    val = None
+    # Parent node.
+    if el:
+        if _is_xml_el_dict(el):
+            val = _dict_from_xml(el, strict)
+        elif _is_xml_el_list(el):
+            val = _list_from_xml(el, strict)
+    # Simple node.
+    else:
+        attribs = el.items()
+        # An element with attributes.
+        if attribs and strict:
+            val = dict(('@%s' % k, v) for k, v in dict(attribs).iteritems())
+            if el.text:
+                converted = _val_and_maybe_convert(el)
+                val['#text'] = el.text
+                if converted != el.text:
+                    val['#value'] = converted
+        elif el.text:
+            # An element with no subelements but text.
+            val = _val_and_maybe_convert(el)
+        elif attribs:
+            val = dict(attribs)
+    return val
+
+def _val_and_maybe_convert(el):
+    """
+    Converts `el.text` if `el` has attribute `type` with valid value.
+    """
+    text = el.text.strip()
+    data_type = el.get('type')
+    convertor = _val_and_maybe_convert.convertors.get(data_type)
+    if convertor:
+        return convertor(text)
+    else:
+        return text
+_val_and_maybe_convert.convertors = {
+    'boolean': _str_to_boolean,
+    'datetime': _str_to_datetime,
+    'integer': int
+}
+
+def _list_from_xml(els, strict):
+    """
+    Converts xml elements list `el_list` to a python list.
+    """
+
+    temp = {}
+    for el in els:
+        tag = el.attrib["name"]
+        temp[tag] = (_from_xml(el, strict))
+    return temp
+
+def _dict_from_xml(els, strict):
+    """
+    Converts xml doc with root `root` to a python dict.
+    """
+    # An element with subelements.
+    res = {}
+    for el in els:
+        res[el.tag] = _from_xml(el, strict)
+    return res
