diff --git a/data_generator.py b/data_generator.py
index 019b861..975f307 100644
--- a/data_generator.py
+++ b/data_generator.py
@@ -15,7 +15,7 @@
 op_type = ["randread", "read", "randwrite", "write"]
 is_sync = ["s", "a"]
 
-storage = create_storage(sys.argv[1])
+storage = create_storage("file:///home/gstepanov/rally-results-processor/sample.json", "", "")
 combinations = list(itertools.product(op_type, is_sync, sz))
 
 for i in range(30):
@@ -27,4 +27,5 @@
         row[" ".join([sz, op_type, is_sync])] = (random.random() * 100,
                                                  random.random() * 5)
 
+    print row
     storage.store(row)
diff --git a/storage_api.py b/storage_api.py
index fb3d8b7..8e995c1 100644
--- a/storage_api.py
+++ b/storage_api.py
@@ -184,6 +184,7 @@
 
         return result
 
+
 if __name__ == "__main__":
     storage = create_storage("file:///home/gstepanov/rally-results-processor/sample.json", "", "")
     print storage.recent_builds()
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
