diff --git a/util/doxify.py b/util/doxify.py
new file mode 100644
index 0000000..f9f60ad
--- /dev/null
+++ b/util/doxify.py
@@ -0,0 +1,89 @@
+#!/usr/bin/python
+
+"""
+Convert simple documentation to epydoc/pydoctor-compatible markup
+"""
+
+from sys import stdin, stdout, argv
+import os
+from tempfile import mkstemp
+from subprocess import call
+
+import re
+
+spaces = re.compile( r'\s+' )
+singleLineExp = re.compile( r'\s+"([^"]+)"' )
+commentStartExp = re.compile( r'\s+"""' )
+commentEndExp = re.compile( r'"""$' )
+returnExp = re.compile( r'\s+(returns:.*)' )
+lastindent = ''
+
+
+comment = False
+
+def fixParam( line ):
+    "Change foo: bar to @foo bar"
+    result = re.sub( r'(\w+):', r'@param \1', line )
+    result = re.sub( r'   @', r'@', result)
+    return result
+
+def fixReturns( line ):
+    "Change returns: foo to @return foo"
+    return re.sub( 'returns:', r'@returns', line )
+    
+def fixLine( line ):
+    global comment
+    match = spaces.match( line )
+    if not match:
+        return line
+    else:
+        indent = match.group(0)
+    if singleLineExp.match( line ):
+        return re.sub( '"', '"""', line )
+    if commentStartExp.match( line ):
+        comment = True
+    if comment:
+        line = fixReturns( line )
+        line = fixParam( line )
+    if commentEndExp.search( line ):
+        comment = False
+    return line
+
+
+def test():
+    "Test transformations"
+    assert fixLine(' "foo"') == ' """foo"""'
+    assert fixParam( 'foo: bar' ) == '@param foo bar'
+    assert commentStartExp.match( '   """foo"""')
+
+def funTest():
+    testFun = (
+    'def foo():\n'
+    '   "Single line comment"\n'
+    '   """This is a test"""\n'
+    '      bar: int\n'
+    '      baz: string\n'
+    '      returns: junk"""\n'
+    '   if True:\n'
+    '       print "OK"\n'
+    ).splitlines( True )
+
+    fixLines( testFun )
+    
+def fixLines( lines, fid ):
+    for line in lines:
+        os.write( fid, fixLine( line ) )
+
+if __name__ == '__main__':
+    if False:
+        funTest()
+    infile = open( argv[1] )
+    outfid, outname = mkstemp()
+    fixLines( infile.readlines(), outfid )
+    infile.close()
+    os.close( outfid )
+    call( [ 'doxypy', outname ] )
+
+
+
+    
