--- /dev/null
+##############################################################################
+# Copyright (c) 2017 taseer94@gmail.com and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+
+import click
+
+from qtip.cli.entry import Context
+
+pass_context = click.make_pass_decorator(Context, ensure=False)
+
+
+@click.group()
+@pass_context
+def cli(ctx):
+    """ View Qtip results"""
+    pass
+
+
+@cli.command('show')
+@pass_context
+def show(ctx):
+    pass
 
 ##############################################################################
-# Copyright (c) 2016 ZTE Corp and others.
+# Copyright (c) 2017 taseer94@gmail.com and others.
 #
 # All rights reserved. This program and the accompanying materials
 # are made available under the terms of the Apache License, Version 2.0
 # http://www.apache.org/licenses/LICENSE-2.0
 ##############################################################################
 
+from jinja2 import Environment
+from jinja2 import FileSystemLoader
+from os import path
 from qtip.base import BaseActor
 
 
     """
     def __init__(self, config, parent=None):
         super(ConsoleReporter, self).__init__(config, parent=parent)
-        # TODO(yujunz) remove PoC code
-        self._fmt = "{title}: {description}"
+
+        # TODO (taseer) load template from config
+        tpl_loader = FileSystemLoader(path.join(path.dirname(__file__), 'templates'))
+        env = Environment(loader=tpl_loader)
+        self._template = env.get_template('timeline.j2')
 
     def render(self, var_dict):
-        return self._fmt.format(**var_dict)
+        out = self._template.render(var_dict)
+        return out
 
-{% title %}
+{{ title }}
 {% for phase in phases %}
 {{ phase.name|upper }}{{ "TIME" }}
 {% for cp in phase.checkpoints %}
 
--- /dev/null
+VTimeline\u000a\u000aMONITOR TIME\u000a\u000aT00 1\u000a\u000a\u000aINSPECTOR TIME\u000a\u000aT01 2\u000a\u000aT02 5\u000a\u000aT03 8\u000a\u000a\u000aCONTROLLER TIME\u000a\u000aT04 11\u000a\u000a\u000aNOTIFIER TIME\u000a\u000aT05 16\u000a\u000a\u000aEVALUATOR TIME\u000a\u000aT06 40\u000a\u000a\u000aTotal: 312ms
+p0
+.
 
--- /dev/null
+###############################################################
+# Copyright (c) 2016 ZTE Corp and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+
+import pytest
+from click.testing import CliRunner
+
+from qtip.cli.entry import cli
+
+
+@pytest.fixture(scope="module")
+def runner():
+    return CliRunner()
+
+
+def test_show(runner):
+    result = runner.invoke(cli, ['report', 'show'])
+    assert result.output == ''
 
 # http://www.apache.org/licenses/LICENSE-2.0
 ##############################################################################
 
+import pickle
 import pytest
+import os
+
 from qtip.reporter.console import ConsoleReporter
 
 
 
 
 def test_render(console_reporter):
-    var_dict = {
-        'title': 'fake title',
-        'description': 'fake description'
-    }
-    output = console_reporter.render(var_dict=var_dict)
-    assert output == 'fake title: fake description'
+    var_dict = {'title': 'Timeline', 'total': '312ms', 'phases': [{'name': 'Monitor ',
+                'checkpoints': [{'name': 'T00 ', 'timestamp': '1'}]},
+               {'name': 'Inspector ', 'checkpoints': [{'name': 'T01 ', 'timestamp': '2'},
+                {'name': 'T02 ', 'timestamp': '5'}, {'name': 'T03 ', 'timestamp': '8'}]},
+               {'name': 'Controller ', 'checkpoints': [{'name': 'T04 ', 'timestamp': '11'}]},
+               {'name': 'Notifier ', 'checkpoints': [{'name': 'T05 ', 'timestamp': '16'}]},
+               {'name': 'Evaluator ', 'checkpoints': [{'name': 'T06 ', 'timestamp': '40'}]}]}
+
+    result = console_reporter.render(var_dict=var_dict)
+    path = os.path.join(os.path.dirname(__file__), os.pardir, os.pardir,
+                        os.pardir, 'tests/data/reporter/')
+    timeline = pickle.load(open(path + 'timeline.pickle', 'rb'))
+    assert result == timeline