diff --git a/_modules/reclass.py b/_modules/reclass.py
index 10fcdc3..ae94541 100644
--- a/_modules/reclass.py
+++ b/_modules/reclass.py
@@ -6,12 +6,13 @@
 
 from __future__ import absolute_import
 
+import io
+import json
 import logging
 import os
 import sys
 import six
 import yaml
-import json
 
 from reclass import get_storage, output
 from reclass.core import Core
@@ -38,6 +39,11 @@
     return os.path.join(defaults.get('inventory_base_uri'), 'classes')
 
 
+def _get_cluster_dir():
+    classes_dir = _get_classes_dir()
+    return os.path.join(classes_dir, 'cluster')
+
+
 def _get_node_meta(name, cluster="default", environment="prd", classes=None, parameters=None):
     host_name = name.split('.')[0]
     domain_name = '.'.join(name.split('.')[1:])
@@ -257,3 +263,71 @@
             'services': service_classification,
         }
     return output
+
+
+def cluster_meta_list(file_name="overrides.yml", cluster="", **kwargs):
+    path = os.path.join(_get_cluster_dir(), cluster, file_name)
+    try:
+        with io.open(path, 'r') as file_handle:
+            meta_yaml = yaml.safe_load(file_handle.read())
+        meta = meta_yaml or {}
+    except Exception as e:
+        msg = "Unable to load cluster metadata YAML %s: %s" % (path, repr(e))
+        LOG.debug(msg)
+        meta = {'Error': msg}
+    return meta
+
+
+def cluster_meta_delete(name, file_name="overrides.yml", cluster="", **kwargs):
+    ret = {}
+    path = os.path.join(_get_cluster_dir(), cluster, file_name)
+    meta = __salt__['reclass.cluster_meta_list'](path, **kwargs)
+    if 'Error' not in meta:
+        metadata = meta.get('parameters', {}).get('_param', {})
+        if name not in metadata:
+            return ret
+        del metadata[name]
+        try:
+            with io.open(path, 'w') as file_handle:
+                file_handle.write(unicode(yaml.dump(meta, default_flow_style=False)))
+        except Exception as e:
+            msg = "Unable to save cluster metadata YAML: %s" % repr(e)
+            LOG.error(msg)
+            return {'Error': msg}
+        ret = 'Cluster metadata entry {0} deleted'.format(name)
+    return ret
+
+
+def cluster_meta_set(name, value, file_name="overrides.yml", cluster="", **kwargs):
+    path = os.path.join(_get_cluster_dir(), cluster, file_name)
+    meta = __salt__['reclass.cluster_meta_list'](path, **kwargs)
+    if 'Error' not in meta:
+        if not meta:
+            meta = {'parameters': {'_param': {}}}
+        metadata = meta.get('parameters', {}).get('_param', {})
+        if name in metadata and metadata[name] == value:
+            return {name: 'Cluster metadata entry %s already exists and is in correct state' % name}
+        metadata.update({name: value})
+        try:
+            with io.open(path, 'w') as file_handle:
+                file_handle.write(unicode(yaml.dump(meta, default_flow_style=False)))
+        except Exception as e:
+            msg = "Unable to save cluster metadata YAML %s: %s" % (path, repr(e))
+            LOG.error(msg)
+            return {'Error': msg}
+        return cluster_meta_get(name, path, **kwargs)
+    return meta
+
+
+def cluster_meta_get(name, file_name="overrides.yml", cluster="", **kwargs):
+    ret = {}
+    path = os.path.join(_get_cluster_dir(), cluster, file_name)
+    meta = __salt__['reclass.cluster_meta_list'](path, **kwargs)
+    metadata = meta.get('parameters', {}).get('_param', {})
+    if 'Error' in meta:
+        ret['Error'] = meta['Error']
+    elif name in metadata:
+        ret[name] = metadata.get(name)
+
+    return ret
+
diff --git a/_states/reclass.py b/_states/reclass.py
index a930021..8f94b3e 100644
--- a/_states/reclass.py
+++ b/_states/reclass.py
@@ -18,10 +18,21 @@
           neco: value1
           neco2: value2
 
+.. code-block:: yaml
+
+    node_meta_01:
+      reclass.cluster_meta_present:
+      - name: my_key
+      - value: my_value
 '''
+from __future__ import absolute_import
+
 import json
+import os
 import six
 
+from reclass.config import find_and_read_configfile
+
 
 def __virtual__():
     '''
@@ -30,6 +41,16 @@
     return 'reclass' if 'reclass.node_list' in __salt__ else False
 
 
+def _get_classes_dir():
+    defaults = find_and_read_configfile()
+    return os.path.join(defaults.get('inventory_base_uri'), 'classes')
+
+
+def _get_cluster_dir():
+    classes_dir = _get_classes_dir()
+    return os.path.join(classes_dir, 'cluster')
+
+
 def node_present(name, path=None, cluster="default", environment="prd", classes=None, parameters=None, **kwargs):
     '''
     Ensure that the reclass node exists
@@ -57,3 +78,60 @@
         ret['changes']['Node'] = 'Created'
     return ret
 
+
+def cluster_meta_present(name, value, file_name="overrides.yml", cluster="", **kwargs):
+    '''
+    Ensures that the cluster metadata entry exists
+    
+    :param name: Metadata entry name
+    :param value: Metadata entry value
+    :param file_name: Name of metadata file, defaults to overrides.yml
+    :param cluster: Name of cluster directory to put the metadata file into, optional
+    '''
+    value = value or ""
+    cluster = cluster or ""
+    path = os.path.join(_get_cluster_dir(), cluster, file_name)
+    ret = {'name': name,
+           'changes': {},
+           'result': True,
+           'comment': 'Cluster metadata entry "{0}" already exists and is in correct state'.format(name)}
+    meta_check = __salt__['reclass.cluster_meta_get'](name, path, **kwargs)
+    if not meta_check:
+        __salt__['reclass.cluster_meta_set'](name, value, path, **kwargs)
+        ret['comment'] = 'Cluster meta entry {0} has been created'.format(name)
+        ret['changes']['Meta Entry'] = 'Cluster meta entry %s: "%s" has been created' % (name, value)
+    elif 'Error' in meta_check:
+        ret['comment'] = meta_check.get('Error')
+        ret['result'] = False
+    elif meta_check[name] != value:
+        __salt__['reclass.cluster_meta_set'](name, value, path, **kwargs)
+        ret['comment'] = 'Cluster metadata entry %s has been changed' % (name,)
+        ret['changes']['Old Meta Entry'] = '%s: "%s"' % (name, meta_check[name])
+        ret['changes']['New Meta Entry'] = '%s: "%s"' % (name, value)
+    return ret
+
+
+def cluster_meta_absent(name, file_name="overrides.yml", cluster="", **kwargs):
+    '''
+    Ensures that the cluster metadata entry does not exist
+
+    :param name: Metadata entry name
+    :param file_name: Name of metadata file, defaults to overrides.yml
+    :param cluster: Name of cluster directory to put the metadata file into, optional
+    '''
+    cluster = cluster or ""
+    path = os.path.join(_get_cluster_dir(), cluster, file_name)
+    ret = {'name': name,
+           'changes': {},
+           'result': True,
+           'comment': 'Cluster metadata entry "{0}" is already absent'.format(name)}
+    meta_check = __salt__['reclass.cluster_meta_get'](name, path, **kwargs)
+    if meta_check:
+        __salt__['reclass.cluster_meta_delete'](name, path, **kwargs)
+        ret['comment'] = 'Cluster metadata entry {0} has been deleted'.format(name)
+        ret['changes']['Meta Entry'] = 'Cluster metadata entry %s: "%s" has been deleted' % (name, meta_check[name])
+    elif 'Error' in meta_check:
+        ret['comment'] = meta_check.get('Error')
+        ret['result'] = False
+    return ret
+
