diff --git a/web_app/__init__.py b/web_app/__init__.py
new file mode 100644
index 0000000..45e6180
--- /dev/null
+++ b/web_app/__init__.py
@@ -0,0 +1,88 @@
+from flask import Flask, render_template, url_for, request, g
+from flask_bootstrap import Bootstrap
+import json
+import os.path
+from storage_api import create_storage
+
+app = Flask(__name__)
+Bootstrap(app)
+
+
+def collect_tests():
+    result = []
+
+    for file in os.listdir("../test_results"):
+        if file.endswith(".json"):
+            result.append(file.split('.')[0])
+
+    return result
+
+
+def load_test(test_name):
+    test_name += '.json'
+
+    with open("../" + test_name, 'rt') as f:
+        raw = f.read()
+
+        if raw == '':
+            raise Exception("Test is emoty")
+
+        test = json.loads(raw)
+
+    return test
+
+
+@app.route("/", methods=['GET', 'POST'])
+def index():
+    data = []
+    for test in collect_tests():
+        d = {}
+        d["name"] = test
+        d["url"] = url_for("render_test", test_name=test)
+        data.append(d)
+
+    return render_template("index.html", tests=data)
+
+
+@app.route("/tests/<test_name>", methods=['GET'])
+def render_test(test_name):
+    tests = load_test(test_name)
+    header_keys = ['build_id', 'iso_md5', 'type']
+    table = []
+
+    if len(tests) > 0:
+        sorted_keys = sorted(tests[0].keys())
+
+    for key in sorted_keys:
+        if key not in header_keys:
+            header_keys.append(key)
+
+    for test in tests:
+        row = []
+
+        for header in header_keys:
+            if isinstance(test[header], list):
+                row.append(str(test[header][0]) + unichr(0x00B1) + str(test[header][1]))
+            else:
+                row.append(test[header])
+
+        table.append(row)
+
+    return render_template("table.html", headers=header_keys, table=table)
+
+
+@app.route("/tests/<test_name>", methods=['POST'])
+def add_test(test_name):
+    tests = json.loads(request.data)
+
+    if not hasattr(g, "storage"):
+        g.storage = create_storage("file:///home/gstepanov/rally-results-processor/test_results/sample.json", "", "")
+
+    for test in tests:
+        g.storage.store(test)
+    return "Created", 201
+
+
+
+if __name__ == "__main__":
+    app.run(debug=True)
\ No newline at end of file
