diff --git a/hallgrim/IliasXMLCreator/gap.py b/hallgrim/IliasXMLCreator/gap.py
index 2c8e83e78093ed8ca67037d0714744dba0898714..6e794cb14ae9bd8ea2c93d568c61ea1297f71fe2 100644
--- a/hallgrim/IliasXMLCreator/gap.py
+++ b/hallgrim/IliasXMLCreator/gap.py
@@ -2,14 +2,83 @@ import xml.etree.ElementTree as et
 
 from hallgrim.IliasXMLCreator.xmlBuildingBlocks import *
 
+
+###
+# Solution 1
+# ['text', 'text', 'text']
+# [('gap_solution', points, length), ..., (['one', 'two', 'three'], points, length)]
+#
+# str : str_gap
+# list : choice_gap
+# tuple : num_gap (x, min, max)
+#
+# Solution 2
+# ['text', ('gap_solution', points, length), ('gap_solution', points, length), 'text', ...]
+#
+###
+
 class GapQuestion:
     """docstring for GapQuestion"""
-    def __init__(self, type, description, question_text, author, title, questions, feedback, gapLength):
+    def __init__(self, type, description, gap_list, author, title, questions, feedback, gapLength):
         self.type           = type
         self.description    = description
-        self.question_text  = question_text
+        self.gap_list       = gap_list
         self.author         = author
         self.title          = title
         self.questions      = questions
         self.feedback       = feedback
         self.gapLength      = gapLength
+
+        self.itemmetadata       = self.itemmetadata(feedback_setting=1)
+        self.presentation       = self.presentation()
+        self.resprocessing      = self.resprocessing()
+        self.xml_representation = self.create_item()
+
+    def __call__(self):
+        return self.xml_representation
+
+    def itemmetadata(self, feedback_setting=1):
+        subroot = et.Element('qtimetadata')
+        subroot.append(qtimetadatafield('ILIAS_VERSION', '5.1.8 2016-08-03'))
+        subroot.append(qtimetadatafield('QUESTIONTYPE', self.type))
+        subroot.append(qtimetadatafield('AUTHOR',  self.author))
+        subroot.append(qtimetadatafield('additional_cont_edit_mode', 'default'))
+        subroot.append(qtimetadatafield('externalId', '99.99'))
+        subroot.append(qtimetadatafield('textgaprating', 'ci'))
+        subroot.append(qtimetadatafield('fixedTextLength', str(self.gapLength)))
+        subroot.append(qtimetadatafield('identicalScoring', '1'))
+        subroot.append(qtimetadatafield('combinations', 'W10='))
+        root = et.Element('itemmetadata')
+        root.append(subroot)
+        return root
+
+    ############################################################################
+    def presentation(self):
+        root = et.Element('presentation', attrib={'label': self.title})
+        flow = et.Element('flow')
+        root.append(flow)
+        gap_ident = 0
+        for item in self.gap_list:
+            if type(item) == str:
+                f = material(item)
+            if type(item) == tuple:
+                if type(item[0] == list):
+                    f = response_choice(gap_ident, item[0])
+                if type(item[0] == str):
+                    f = response_str(gap_ident, self.gapLength)
+                if type(item[0] == tuple):
+                    f = response_num(gap_ident, self.gapLength, item[1], item[2]):
+                gap_ident += 1
+            flow.append(f)
+        return root
+
+    ############################################################################
+    def resprocessing(self):
+        root = et.Element('resprocessing')
+        outcomes = et.Element('outcomes')
+        outcomes.append(simple_elemet('decvar'))
+        root.append(outcomes)
+        for i, (_, correct, points) in enumerate(self.questions):
+            root.append(respcondition(points if correct else 0, i, True))
+            root.append(respcondition(points if not correct else 0, i, False))
+        return root
diff --git a/hallgrim/IliasXMLCreator/xmlBuildingBlocks.py b/hallgrim/IliasXMLCreator/xmlBuildingBlocks.py
index a42b6c449ef2e8376987fe08368e199ea5b940d3..3fa2aa02e067710b117873a78af71110bcd1a18e 100644
--- a/hallgrim/IliasXMLCreator/xmlBuildingBlocks.py
+++ b/hallgrim/IliasXMLCreator/xmlBuildingBlocks.py
@@ -8,6 +8,7 @@ import xml.etree.ElementTree as et
 #
 ##########################################################################
 
+##########################################################################
 
 def simple_elemet(name, text=None, attrib={}):
     if not text:
@@ -81,4 +82,33 @@ def itemfeedback(ident, content='NONE'):
     flow_mat = et.Element('flow_mat')
     flow_mat.append(material(content))
     root.append(flow_mat)
-    return root
\ No newline at end of file
+    return root
+
+### gap specific #########################################################
+def material_raw(content):
+    material = et.Element('material')
+    material.append(simple_elemet(
+        'mattext',
+        text=content
+    ))
+    return material
+
+def response_str(ident, columns):
+    response_str = et.Element('response_str', attrib={'ident': indent, 'rcardinality': 'Single'})
+    render_fib   = et.Element('render_fib', attrib={'columns': str(columns), 'fibtype': "String", 'prompt': "Box"})
+    response_str.append(render_fib)
+    return response_str
+
+def response_choice(ident, answers)
+    response_str = et.Element('response_str', attrib={'ident': indent, 'rcardinality': 'Single'})
+    render_choice = et.Element('render_choice', attrib={'shuffle': 'Yes'})
+    for i, answer in enumerate(answers):
+        response_label = et.Element('response_label', attrib={'ident': str(i)})
+        response_label.append(material_raw(answer))
+    return response_str
+
+def response_num(ident, columns, _min, _max, numtype='Decimal'):
+    response_num = et.Element('response_num', attrib={'ident': ident, 'numtype': numtype, 'rcardinality': 'Single'})
+    render_fib   = et.Element('render_fib', attrib={'columns': columns, 'fibtype': numtype, 'maxnumber': _min, 'minnumber': _max, 'prompt': "Box"})
+    response_num.append(render_fib)
+    return response_num
\ No newline at end of file