diff --git a/scripts/prepare.sh b/scripts/prepare.sh
index e8813f1..1f47f20 100644
--- a/scripts/prepare.sh
+++ b/scripts/prepare.sh
@@ -34,12 +34,14 @@
         fi
     done
 
-    echo -n "Looking for keypair $KEYPAIR_NAME ... "
-    export keypair_id=$(nova keypair-list | grep " $KEYPAIR_NAME " | awk '{print $2}' )
-    if [ ! -z "$keypair_id" ] ; then
-        echo " Found"
-    else
-        echo " Not Found"
+    if [ ! -z "$KEYPAIR_NAME" ] ; then
+        echo -n "Looking for keypair $KEYPAIR_NAME ... "
+        export keypair_id=$(nova keypair-list | grep " $KEYPAIR_NAME " | awk '{print $2}' )
+        if [ ! -z "$keypair_id" ] ; then
+            echo " Found"
+        else
+            echo " Not Found"
+        fi
     fi
 
     echo -n "Looking for security group $SECGROUP ... "
@@ -97,7 +99,7 @@
 
         IMAGE_FILE="/tmp/${IMAGE_NAME}.qcow"
         if [ ! -f "$IMAGE_FILE" ] ; then
-            curl "$IMAGE_URL" -o "$IMAGE_FILE" >/dev/null
+            curl "$IMAGE_URL" -o "$IMAGE_FILE" 2>&1 >/dev/null
         fi
         opts="--disk-format qcow2 --container-format bare --is-public true"
         glance image-create --name "$IMAGE_NAME" $opts --file "$IMAGE_FILE" >/dev/null
@@ -116,10 +118,12 @@
         export groups_ids="$groups_ids $group_id"
     done
 
-    if [ -z "$keypair_id" ] ; then
-        echo "Creating server group $SERV_GROUP. Key would be stored into $KEY_FILE_NAME"
-        nova keypair-add "$KEYPAIR_NAME" > "$KEY_FILE_NAME"
-        chmod og= "$KEY_FILE_NAME"
+    if [ ! -z "$KEYPAIR_NAME" ] ; then
+        if [ -z "$keypair_id" ] ; then
+            echo "Creating server group $SERV_GROUP. Key would be stored into $KEY_FILE_NAME"
+            nova keypair-add "$KEYPAIR_NAME" > "$KEY_FILE_NAME"
+            chmod og= "$KEY_FILE_NAME"
+        fi
     fi
 
     if [ -z "$secgroup_id" ] ; then
diff --git a/scripts/webui.py b/scripts/webui.py
new file mode 100644
index 0000000..5c8e989
--- /dev/null
+++ b/scripts/webui.py
@@ -0,0 +1,93 @@
+import time
+import random
+import os.path
+import logging
+import calendar
+import datetime
+import threading
+
+import cherrypy
+from cherrypy import tools
+
+import wally
+
+logger = logging.getLogger("wally.webui")
+
+
+def to_timestamp(str_datetime):
+    dt, str_gmt_offset = str_datetime.split("GMT", 1)
+    dt = dt.strip().split(" ", 1)[1]
+    dto = datetime.datetime.strptime(dt, "%b %d %Y %H:%M:%S")
+    timestamp = calendar.timegm(dto.timetuple())
+    str_gmt_offset = str_gmt_offset.strip().split(" ", 1)[0]
+    gmt_offset = int(str_gmt_offset)
+    gmt_offset_sec = gmt_offset // 100 * 3600 + (gmt_offset % 100) * 60
+    return timestamp - gmt_offset_sec
+
+
+def backfill_thread(dstore):
+    with dstore.lock:
+        for i in range(600):
+            dstore.data['disk_io'].append(int(random.random() * 100))
+            dstore.data['net_io'].append(int(random.random() * 100))
+
+    while True:
+        time.sleep(1)
+        with dstore.lock:
+            dstore.data['disk_io'].append(int(random.random() * 100))
+            dstore.data['net_io'].append(int(random.random() * 100))
+
+
+class WebWally(object):
+
+    def __init__(self, sensors_data_storage):
+        self.storage = sensors_data_storage
+
+    @cherrypy.expose
+    @tools.json_out()
+    def sensors(self, start, stop, step, name):
+        try:
+            start = to_timestamp(start)
+            stop = to_timestamp(stop)
+
+            with self.storage.lock:
+                data = self.storage.data[name]
+        except Exception:
+            logger.exception("During parse input data")
+            raise cherrypy.HTTPError("Wrong date format")
+
+        if step != 1000:
+            raise cherrypy.HTTPError("Step must be equals to 1s")
+
+        num = stop - start
+
+        if len(data) > num:
+            data = data[-num:]
+        else:
+            data = [0] * (num - len(data)) + data
+
+        return data
+
+    @cherrypy.expose
+    def index(self):
+        idx = os.path.dirname(wally.__file__)
+        idx = os.path.join(idx, "sensors.html")
+        return open(idx).read()
+
+
+def web_main_thread(sensors_data_storage):
+
+    cherrypy.config.update({'environment': 'embedded',
+                            'server.socket_port': 8089,
+                            'engine.autoreload_on': False})
+
+    th = threading.Thread(None, backfill_thread, "backfill_thread",
+                          (sensors_data_storage,))
+    th.daemon = True
+    th.start()
+
+    cherrypy.quickstart(WebWally(sensors_data_storage), '/')
+
+
+def web_main_stop():
+    cherrypy.engine.stop()
