diff --git a/backends/llvm.py b/backends/llvm.py
index affc9987fdb2a8b753c3badfa1f45bd75c1ee11c..7fa025c06e91913cc561b6600b2d3c87d345205a 100644
--- a/backends/llvm.py
+++ b/backends/llvm.py
@@ -4,6 +4,9 @@ from sympy.printing.printer import Printer
 from sympy import S
 # S is numbers?
 
+from ..llvm.control_flow import Loop
+
+
 
 class LLVMPrinter(Printer):
     """Convert expressions to LLVM IR"""
@@ -29,6 +32,9 @@ class LLVMPrinter(Printer):
     def _print_Integer(self, expr):
         return ir.Constant(self.fp_type, float(expr.p))
 
+    def _print_int(self, i):
+        return ir.Constant(self.integer, i)
+
     def _print_Symbol(self, s):
         val = self.tmp_var.get(s)
         if not val:
@@ -84,20 +90,34 @@ class LLVMPrinter(Printer):
                 parameter_type.append(self.fp_pointer)
             else:
                 parameter_type.append(self.fp_type)
-        # TODO need tuple()?
         func_type = ir.FunctionType(return_type, tuple(parameter_type))
         self.fn = ir.Function(self.module, func_type, function.functionName)
 
+        # set proper names to arguments
+        for i, arg in enumerate(self.fn.args):
+            arg.name = function.parameters[i].name
+
         # func.attributes.add("inlinehint")
         # func.attributes.add("argmemonly")
         block = self.fn.append_basic_block(name="entry")
         self.builder = ir.IRBuilder(block)
+        self._print(function.body)
         return self.fn
 
+    def _print_Block(self, block):
+        for node in block.children():
+            self._print(node)
 
+    def _print_LoopOverCoordinate(self, loop):
+        with Loop(self.builder, self._print(loop.start), self._print(loop.stop), self._print(loop.step),
+                  loop.loopCounterName, loop.loopCounterSymbol.name) as i:
+            self._print(loop.body)
 
-        # TODO - assumes all called functions take one double precision argument.
-        #        Should have a list of math library functions to validate this.
+    def _print_SympyAssignment(self, loop):
+        pass
+
+
+        #  Should have a list of math library functions to validate this.
 
     # TODO delete this?
     def _print_Function(self, expr):
@@ -115,7 +135,8 @@ class LLVMPrinter(Printer):
                         % type(expr))
 
 
-
-
 def generateLLVM(astNode):
-    return None
+    module = ir.Module()
+    builder = ir.IRBuilder()
+    printer = LLVMPrinter(module, builder)
+    return printer._print(astNode)
diff --git a/llvm/__init__.py b/llvm/__init__.py
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..7eb3311e99358390954c2ec0b86ce7bc2fd3bbbf 100644
--- a/llvm/__init__.py
+++ b/llvm/__init__.py
@@ -0,0 +1,2 @@
+from pystencils.cpu.kernelcreation import createKernel
+from pystencils.backends.llvm import generateLLVM
\ No newline at end of file