diff --git a/cfg_checker/reports/reporter.py b/cfg_checker/reports/reporter.py
index 7ddbc4f..1f54ff3 100644
--- a/cfg_checker/reports/reporter.py
+++ b/cfg_checker/reports/reporter.py
@@ -32,6 +32,11 @@
     return text.replace("\n", "<br />")
 
 
+def tabstops(text):
+    # replace python linebreaks with html breaks
+    return text.replace("\t", "&#9;")
+
+
 def get_sorted_keys(td):
     # detect if we can sort by desc
     # Yes, this is slow, but bullet-proof from empty desc
@@ -116,6 +121,78 @@
     return _text
 
 
+def to_gb(bytes_str):
+    _bytes = int(bytes_str)
+    _gb = _bytes / 1024 / 1024 / 1024
+    return "{}".format(round(_gb, 2))
+
+
+def to_mb(bytes_str):
+    _bytes = int(bytes_str)
+    _mb = _bytes / 1024 / 1024
+    return "{}".format(round(_mb, 2))
+
+
+def get_bucket_item_name(id, cmap):
+    for buck in cmap["buckets"]:
+        if id == buck["id"]:
+            return buck["name"]
+    for dev in cmap["devices"]:
+        if id == dev["id"]:
+            return dev["name"]
+    return id
+
+
+def get_rule_steps(steps):
+    _steps = []
+    for step in steps:
+        _ops = step.pop("op").split('_')
+        if "take" in _ops:
+            _steps.append(
+                "step {} {}".format(
+                    " ".join(_ops),
+                    step["item_name"]
+                )
+            )
+        else:
+            _steps.append(
+                "step {} {}".format(
+                    " ".join(_ops),
+                    " ".join(["{} {}".format(k, v) for k, v in step.items()])
+                )
+            )
+    return _steps
+
+
+def get_osdmap(cs):
+    _osdmap = cs
+    while True:
+        _keys = list(_osdmap.keys())
+        for _k in _keys:
+            if _k == "osdmap":
+                _osdmap = _osdmap[_k]
+                break
+            elif _k == 'epoch':
+                return _osdmap
+    return {
+        "epoch": 0,
+        "num_osds": 0,
+        "num_up_osds": 0,
+        "osd_up_since": 0,
+        "num_in_osds": 0,
+        "osd_in_since": 0,
+        "num_remapped_pgs": 0
+    }
+
+
+def get_pool_stats(id, pgdump):
+    _stats = {}
+    for pool in pgdump["pg_map"]["pool_stats"]:
+        if id == pool["poolid"]:
+            _stats = pool
+    return _stats
+
+
 @six.add_metaclass(abc.ABCMeta)
 class _Base(object):
     def __init__(self, master=None):
@@ -167,6 +244,12 @@
         self.jinja2_env.filters['pkg_action_class'] = make_pkg_action_class
         self.jinja2_env.filters['node_status_class'] = make_node_status
         self.jinja2_env.filters['pkg_repo_info'] = make_repo_info
+        self.jinja2_env.filters['to_gb'] = to_gb
+        self.jinja2_env.filters['to_mb'] = to_mb
+        self.jinja2_env.filters['get_bucket_item_name'] = get_bucket_item_name
+        self.jinja2_env.filters['get_rule_steps'] = get_rule_steps
+        self.jinja2_env.filters['get_pool_stats'] = get_pool_stats
+        self.jinja2_env.filters['get_osdmap'] = get_osdmap
 
         # render!
         logger_cli.info("-> Using template: {}".format(self.tmpl))
@@ -195,6 +278,11 @@
     tmpl = "pkg_versions_html.j2"
 
 
+# HTML Ceph information report
+class HTMLCephInfo(_TMPLBase):
+    tmpl = "ceph_info_html.j2"
+
+
 # Package versions report
 class HTMLModelCompare(_TMPLBase):
     tmpl = "model_tree_cmp_tmpl.j2"
