diff --git a/python/dune/perftool/compile.py b/python/dune/perftool/compile.py
new file mode 100644
index 0000000000000000000000000000000000000000..8bee29ee739e8946102692fa535a7d160386f2a4
--- /dev/null
+++ b/python/dune/perftool/compile.py
@@ -0,0 +1,62 @@
+"""
+The methods to run the parts of the form compiler
+
+Should also contain the entrypoint methods.
+"""
+
+def read_ufl(uflfile=None):
+    assert uflfile
+    
+    from ufl.algorithms.formfiles import read_ufl_file, interpret_ufl_namespace
+    from ufl.algorithms import compute_form_data
+
+    uflcode = read_ufl_file(uflfile)
+    namespace = {}
+    uflcode = "from dune.perftool.runtime_ufl import *\n" + uflcode
+    exec uflcode in namespace
+    data = interpret_ufl_namespace(namespace)
+    formdata = compute_form_data(data.forms[0])
+    return formdata
+
+
+def write_driver(formdata=None, filename=None):
+    assert formdata
+    assert filename
+    
+    # The driver module uses a global variable for ease of use
+    import dune.perftool.driver
+    dune.perftool.driver._formdata = formdata
+
+    # The vtkoutput is the generating method that triggers all others.
+    # Alternatively, one could use the `solve` method.
+    from dune.perftool.driver import vtkoutput
+    vtkoutput()
+
+    from dune.perftool.generation import cache_preambles, cache_includes
+    includes = cache_includes()
+
+    # Get all preambles for the driver and sort them.
+    driver_content = [i[1] for i in sorted(cache_preambles(), key=lambda x : x[0])]
+
+    # And flatten out those, that conained nested lists
+    def flatjoin(l):
+        if isinstance(l, str):
+            return "\n" + l
+        return "".join(flatjoin(i) for i in l)
+
+    from cgen import LiteralBlock, FunctionDeclaration    
+    driver = LiteralBlock(flatjoin(driver_content))
+
+    # Write the file.
+    f = open(filename, 'w')
+    f.write("\n".join(cache_includes()))
+    f.write("\nvoid driver(int argc, char** argv)\n")
+    f.write("\n".join(driver.generate()))
+
+
+def write_localoperator():
+    pass
+
+
+def compile_form():
+    pass    
diff --git a/python/dune/perftool/options.py b/python/dune/perftool/options.py
new file mode 100644
index 0000000000000000000000000000000000000000..125d112f6546a1b73551e8585dc20e2f0be3d270
--- /dev/null
+++ b/python/dune/perftool/options.py
@@ -0,0 +1,21 @@
+""" A module that manages the command line options to the form compiler executable """
+
+from pytools import memoize
+
+@memoize
+def get_form_compiler_arguments():
+    from argparse import ArgumentParser
+    parser = ArgumentParser(description="Compile UFL files to PDELab C++ code", epilog="Please report bugs to dominic.kempf@iwr.uni-heidelberg.de")
+    parser.add_argument("uflfile", type=str, nargs=1, help="the UFL file to compile")
+#     parser.add_argument("--numerical-jacobian", action="store_true", help="use numerical jacobians (only makes sense, if uflpdelab for some reason fails to generate analytic jacobians)")
+#     parser.add_argument('--version', action='version', version='%(prog)s 0.0')
+#     parser.add_argument("--operator-file", type=str, help="The filename for the generated local operator header")
+#     parser.add_argument("--driver-file", type=str, help="The filename for the generated driver header")
+#     parser.add_argument("--param-class-file", type=str, help="The filename for the generated parameter class header")
+#     parser.add_argument("--export-trafo-graphs", action="store_true", help="export expression graphs after the application of each single transformation")
+#     parser.add_argument("--parameter-tree", action="store_true", help="have the generated local operate take a Dune::ParameterTree as constructor argument")
+#     parser.add_argument("--inifile", type=str, help="The inifile that this program's driver should be hardcoded to. Omit to use a commandline argument ini file")
+    return vars(parser.parse_args)
+
+def get_option(key):
+    return get_form_compiler_arguments()(key)
\ No newline at end of file
diff --git a/python/setup.py b/python/setup.py
index cb01adab85ac000eafbb1c78f200309d435ce1a4..4a6b0729424d131e329058dc66da6f727206abf7 100644
--- a/python/setup.py
+++ b/python/setup.py
@@ -32,4 +32,9 @@ setup(name='dune.perftool',
       packages=['dune.perftool'],
       install_requires=[],
       tests_require=['pytest'],
-      cmdclass={'test': PyTest})
+      cmdclass={'test': PyTest},
+      entry_points = {
+        "console_scripts": [
+            "ufl2pdelab = dune.perftool.compiler:compile_form",
+        ]
+    })