diff --git a/README.rst b/README.rst
index 9d41c97..06e79d7 100644
--- a/README.rst
+++ b/README.rst
@@ -952,6 +952,19 @@
 
   salt -C 'I@opencontrail:compute' health_checks.libvirt_capabilities
 
+Check if contrail elements are connected to each other
+
+.. code-block:: bash
+
+  salt-call health_checks.contrail_mesh_check
+  salt-call health_checks.contrail_mesh_check debug=True
+
+Check if contrail elements are connected to each other and DNS names match
+
+.. code-block:: bash
+
+  salt-call health_checks.contrail_mesh_check strict=True
+
 Check keystone fernet keys are in sync
 
 .. code-block:: bash
diff --git a/_modules/health_checks.py b/_modules/health_checks.py
index ea34371..97d1703 100644
--- a/_modules/health_checks.py
+++ b/_modules/health_checks.py
@@ -1710,6 +1710,99 @@
     return vr_info
 
 
+def contrail_mesh_check(target='I@opencontrail:control', target_type='compound', ignore_dead=False, strict=False, **kwargs):
+
+    ''' Check if contrail elements are connected to each other '''
+
+    agent = "contrail mesh check"
+    out = __salt__['saltutil.cmd']( tgt=target,
+                                    tgt_type=target_type,
+                                    fun='health_checks.contrail_control_peer_status',
+                                    timeout=3
+                                  ) or None
+
+    if not _minions_output(out, agent, ignore_dead):
+        __context__['retcode'] = 2
+        return False
+
+
+    minions = []
+    for node in out:
+        if strict:
+            minions.append(node)
+        else:
+            minions.append(node.split('.')[0])
+
+    elements = {}
+    for node in out:
+        peer_elem = out[node]["ret"]
+        for elem in peer_elem:
+            if not strict:
+                elem = elem.split('.')[0]
+            if elem in elements:
+                continue
+            elements[elem] = {}
+            elements[elem]["peers"] = []
+            elements[elem]["my_address"] = peer_elem[elem]["peer_address"]
+            if peer_elem[elem]["encoding"] == "XMPP":
+                elements[elem]["type"] = "COMPUTE"
+            elif peer_elem[elem]["encoding"] == "BGP":
+                if elem in minions:
+                    elements[elem]["type"] = "CONTROLLER"
+                else:
+                    elements[elem]["type"] = "EDGE-ROUTER"
+
+    for node in out:
+        if strict:
+            peer_name = node
+        else:
+            peer_name = node.split('.')[0]
+        peer_elem = out[node]["ret"]
+        for elem in peer_elem:
+            if not strict:
+                elem = elem.split('.')[0]
+            peer_elem[elem]["peer"] = peer_name
+            del(peer_elem[elem]["peer_address"])
+            elements[elem]["peers"].append(peer_elem[elem])
+
+    failed_peers = []
+    for elem_name in elements:
+        elem = elements[elem_name]
+        if elem["type"] == "COMPUTE":
+            if len(elem["peers"]) < 2:
+                if elem not in failed_peers:
+                    failed_peers.append(elem)
+        if elem["type"] == "CONTROLLER":
+            if len(elem["peers"]) < len(minions)-1:
+                if elem not in failed_peers:
+                    failed_peers.append(elem)
+        if elem["type"] == "EDGE-ROUTER":
+            if not len(elem["peers"]) == len(minions):
+                if elem not in failed_peers:
+                    failed_peers.append(elem)
+        for peer in elem["peers"]:
+            if not peer["state"] == "Established":
+                if elem not in failed_peers:
+                    failed_peers.append(elem)
+
+    if len(failed_peers) > 0:
+        logger.error("%s check FAILED" % agent)
+        if strict:
+            logger.error("Strict mode is on. Check DNS names in output")
+            logger.error("Minions output:")
+            logger.error(json.dumps(out, indent=4))
+        else:
+            logger.error("Failed peers:")
+            logger.error(json.dumps(failed_peers, indent=4))
+        __context__['retcode'] = 2
+        return False
+
+    if kwargs.get("debug", False):
+        logger.info(json.dumps(elements, indent=4))
+
+    return True
+
+
 def kafka_brokers_ids():
 
     ''' Retrieve kafka brokers ids '''
