Add Global Classes feature
diff --git a/README-extentions.rst b/README-extentions.rst
index 97d78af..b443d01 100644
--- a/README-extentions.rst
+++ b/README-extentions.rst
@@ -208,6 +208,29 @@
   group_errors: True
 
 
+
+Use global classes
+------------------
+
+Allows specify regexp pattern for "global class".
+
+Normally, classes are loaded when first seen. Thus they are not evaluated later when hit 2nd time. Only way to override
+parameters they load is by another class.
+
+Global classes, recognized by regexp pattern, are always loaded when hit and thus their content might be
+understood as enforced, globally available and not to be overridden by other class, even deeper in hierarchy.
+
+To avoid pitfalls do not over-engineer your solution. By default global class regexp pattern is not set.
+
+
+Global class regexp setup:
+
+.. code-block:: yaml
+
+  #/etc/reclass/reclass-config.yml
+  global_class_regexp = ['.*global']
+
+
 Inventory Queries
 -----------------
 
diff --git a/reclass/core.py b/reclass/core.py
index 9a23d89..3dcacac 100644
--- a/reclass/core.py
+++ b/reclass/core.py
@@ -22,6 +22,7 @@
 from reclass.output.yaml_outputter import ExplicitDumper
 from reclass.datatypes import Entity, Classes, Parameters, Exports
 from reclass.errors import MappingFormatError, ClassNotFound, InvQueryClassNotFound, InvQueryError, InterpolationError
+from reclass.values.parser import Parser
 
 try:
     basestring
@@ -37,6 +38,8 @@
         self._input_data = input_data
         if self._settings.ignore_class_notfound:
             self._cnf_r = re.compile('|'.join([x for x in self._settings.ignore_class_notfound_regexp]))
+        self._gcl_r = re.compile('|'.join([x for x in self._settings.global_class_regexp]))
+
 
     @staticmethod
     def _get_timestamp():
@@ -97,6 +100,10 @@
         return Entity(self._settings, parameters=p, name='input data')
 
     def _recurse_entity(self, entity, merge_base=None, seen=None, nodename=None, environment=None):
+
+        # values/parser in order to interpolate references in classes
+        _parser = Parser()
+
         if seen is None:
             seen = {}
 
@@ -107,7 +114,10 @@
             merge_base = Entity(self._settings, name='empty (@{0})'.format(nodename))
 
         for klass in entity.classes.as_list():
-            if klass not in seen:
+            if merge_base is not None:
+               klass=str(_parser.parse(klass, self._settings).render(merge_base.parameters.as_dict(), {}))
+            # class not seen or class on a list of global classes (always (re)loaded)
+            if klass not in seen or self._gcl_r.match(klass):
                 try:
                     class_entity = self._storage.get_class(klass, environment, self._settings)
                 except ClassNotFound as e:
diff --git a/reclass/defaults.py b/reclass/defaults.py
index 408307d..ccd3db9 100644
--- a/reclass/defaults.py
+++ b/reclass/defaults.py
@@ -23,6 +23,9 @@
 OPT_IGNORE_CLASS_NOTFOUND_REGEXP = ['.*']
 OPT_IGNORE_CLASS_NOTFOUND_WARNING = True
 
+
+OPT_GLOBAL_CLASS_REGEXP = []
+
 OPT_IGNORE_OVERWRITTEN_MISSING_REFERENCES = True
 
 OPT_ALLOW_SCALAR_OVER_DICT = False
diff --git a/reclass/settings.py b/reclass/settings.py
index e3fc26e..a33b742 100644
--- a/reclass/settings.py
+++ b/reclass/settings.py
@@ -38,6 +38,11 @@
         self.ref_parser = reclass.values.parser_funcs.get_ref_parser(self.escape_character, self.reference_sentinels, self.export_sentinels)
         self.simple_ref_parser = reclass.values.parser_funcs.get_simple_ref_parser(self.escape_character, self.reference_sentinels, self.export_sentinels)
 
+        self.global_class_regexp = options.get('global_class_regexp', OPT_GLOBAL_CLASS_REGEXP)
+        if isinstance(self.global_class_regexp, basestring):
+            self.global_class_regexp = [ self.global_class_regexp ]
+
+
     def __eq__(self, other):
         return isinstance(other, type(self)) \
                and self.allow_scalar_over_dict == other.allow_scalar_over_dict \
@@ -56,7 +61,8 @@
                and self.reference_sentinels == other.reference_sentinels \
                and self.ignore_class_notfound == other.ignore_class_notfound \
                and self.ignore_class_notfound_regexp == other.ignore_class_notfound_regexp \
-               and self.ignore_class_notfound_warning == other.ignore_class_notfound_warning
+               and self.ignore_class_notfound_warning == other.ignore_class_notfound_warning \
+               and self.global_class_regexp == other.global_class_regexp
 
     def __copy__(self):
         cls = self.__class__