diff --git a/charts.py b/charts.py
index d8fb73d..000a561 100644
--- a/charts.py
+++ b/charts.py
@@ -3,7 +3,7 @@
 from GChartWrapper import constants
 
 
-COLORS = ["red", "orange", "yellow", "green", "blue", "indigo", "violet"]
+COLORS = ["1569C7", "81D8D0", "307D7E", "5CB3FF", "blue", "indigo"]
 constants.MARKERS += 'E'  # append E marker to available markers
 
 
@@ -61,9 +61,10 @@
     bar.axes.type('xy')
     if scale_x:
         bar.axes.label(0, *scale_x)
-    scale_y = scale_y or range(int(max([max(l) for l in values]) + 2))
-    bar.axes.range(1, *scale_y)
 
+    max_value = (max([max(l) for l in values + deviations]))
+    bar.axes.range(1, 0, max_value)
+    bar.scale(0, max_value)
     bar.bar('r', '.1', '1')
     for i in range(len(legend)):
         bar.marker('E', '000000', '%s:%s' % ((len(values) + i*2), i),
@@ -72,14 +73,20 @@
     bar.color(*COLORS[:len(values)])
     bar.size(width, height)
 
-    return str(bar)
+    return bar
 
 
-def render_lines():
-    line = Line([])
-    line.dataset([[1,2,3], [3,2,1], [5,6,7]])
-    scale_y = range(int(max([max(l) for l in
-                             [[1,2,3], [3,2,1], [5,6,7]]]) + 2))
-    line.axes.range(1, *scale_y)
-    # G.legend('Animals','Vegetables','Minerals')
-    # G.axes('y')
+def render_lines(title, legend, dataset, scale_x, width=700, height=400):
+    line = Line([], encoding="text")
+    line.title(title)
+    line.dataset(dataset)
+
+    line.axes('xy')
+    max_value = (max([max(l) for l in dataset]))
+    line.axes.range(1, 0, max_value)
+    line.scale(0, max_value)
+    line.axes.label(0, *scale_x)
+    line.legend(*legend)
+    line.color(*COLORS[:len(legend)])
+    line.size(width, height)
+    return str(line)
diff --git a/report.py b/report.py
index dff1ed1..c36a87e 100644
--- a/report.py
+++ b/report.py
@@ -6,6 +6,23 @@
 import storage_api
 
 
+def ssize_to_kb(ssize):
+    try:
+        smap = dict(k=1, K=1, M=1024, m=1024, G=1024**2, g=1024**2)
+        for ext, coef in smap.items():
+            if ssize.endswith(ext):
+                return int(ssize[:-1]) * coef
+
+        if int(ssize) % 1024 != 0:
+            raise ValueError()
+
+        return int(ssize) / 1024
+
+    except (ValueError, TypeError, AttributeError):
+        tmpl = "Unknow size format {0!r} (or size not multiples 1024)"
+        raise ValueError(tmpl.format(ssize))
+
+
 def parse_args(argv):
     parser = argparse.ArgumentParser()
     parser.add_argument('-s', '--storage', help='storage location', dest="url")
@@ -16,15 +33,12 @@
     return parser.parse_args(argv)
 
 
-def report(url, email=None, password=None):
-    storage = storage_api.create_storage(url, email, password)
-    results = storage.recent_builds()
-
+def build_vertical_bar(results):
     data = {}
+    charts_url = []
 
-    # render vertical bar
     for build, results in results.items():
-        for key, value in results.items():
+        for key, value in results.results.items():
             keys = key.split(' ')
             if not data.get(keys[2]):
                 data[keys[2]] = {}
@@ -47,7 +61,60 @@
 
         bar = charts.render_vertical_bar(title, legend, dataset,
                                          scale_x=scale_x)
-        print "Vertical bar for %s:\n %s" % (name, str(bar))
+        charts_url.append(str(bar))
+    return charts_url
+
+
+def build_lines_chart(results):
+    data = {}
+    charts_url = []
+
+    for build, results in results.items():
+        for key, value in results.results.items():
+            keys = key.split(' ')
+            if not data.get(' '.join([keys[0], keys[1]])):
+                data[' '.join([keys[0], keys[1]])] = {}
+            if not data[' '.join([keys[0], keys[1]])].get(build):
+                data[' '.join([keys[0], keys[1]])][build] = {}
+            data[' '.join([keys[0], keys[1]])][build][keys[2]] = value
+
+    for name, value in data.items():
+        title = name
+        legend = []
+        dataset = []
+        scale_x = []
+        for build_id, build_results in value.items():
+            legend.append(build_id)
+            ordered_build_results = OrderedDict(sorted(build_results.items(),
+                                                key=lambda t: ssize_to_kb(t[0])))
+            if not scale_x:
+                scale_x = ordered_build_results.keys()
+            dataset.append(zip(*ordered_build_results.values())[0])
+
+        chart = charts.render_lines(title, legend, dataset, scale_x)
+        charts_url.append(str(chart))
+
+    return charts_url
+
+
+def render_html(charts_urls):
+    templ = open("report.html", 'r').read()
+    body = "<div><ol>%s</ol></div>"
+    li = "<li><img src='%s'></li>"
+    ol = []
+    for chart in charts_urls:
+        ol.append(li % chart)
+    html = templ % {'body': body % '\n'.join(ol)}
+    open('results.html', 'w').write(html)
+
+
+def report(url, email=None, password=None):
+    storage = storage_api.create_storage(url, email, password)
+    results = storage.recent_builds()
+    bars = build_vertical_bar(results)
+    lines = build_lines_chart(results)
+
+    render_html(bars + lines)
 
 
 def main(argv):
