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
diff --git a/web_app/templates/base.html b/web_app/templates/base.html
new file mode 100644
index 0000000..2067d55
--- /dev/null
+++ b/web_app/templates/base.html
@@ -0,0 +1,14 @@
+<!doctype html>
+<html>
+  <head>
+    {% block head %}
+        <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css"
+        <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap-theme.min.css">
+        <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/js/bootstrap.min.js"></script>
+    {% endblock %}
+  </head>
+  <body>
+      {% block body %}
+      {% endblock %}
+  </body>
+</html>
\ No newline at end of file
diff --git a/web_app/templates/index.html b/web_app/templates/index.html
new file mode 100644
index 0000000..ba32405
--- /dev/null
+++ b/web_app/templates/index.html
@@ -0,0 +1,25 @@
+{% extends "base.html" %}
+<html>
+<head>
+    {% block head %}
+    {{ super() }}
+    <title>Test report</title>
+    {% endblock %}
+</head>
+<body>
+    <h1>Tests</h1>
+    {% block body %}
+    <div>
+        <ol>
+            {% for test in tests %}
+            <li>
+                       <h2>
+                           <a href="{{ test.url }} ">{{ test.name }}</a>
+                        </h2>
+            </li>
+            {% endfor %}
+        </ol>
+    </div>
+    {% endblock %}
+</body>
+</html>
\ No newline at end of file
diff --git a/web_app/templates/table.html b/web_app/templates/table.html
new file mode 100644
index 0000000..0dba28c
--- /dev/null
+++ b/web_app/templates/table.html
@@ -0,0 +1,31 @@
+{% extends "base.html" %}
+<html>
+<head>
+    {% block head %}
+    {{ super() }}
+    <title>Table of results</title>
+    {% endblock %}
+</head>
+<body>
+    {% block body %}
+    <div class="table-responsive">
+        <table class="table">
+        {% for header in headers %}
+        <th>
+            <h2>{{ header }}</h2>
+        </th>
+        {% endfor %}
+        {% for row in table %}
+        <tr>
+            {% for data in row %}
+            <td>
+               {{ data }}
+            </td>
+            {%  endfor %}
+        </tr>
+        {% endfor %}
+        </table>
+    </div>
+    {% endblock %}
+</body>
+</html>
\ No newline at end of file
