diff --git a/Custom_MNS/custom_hierarchical_mns.py b/Custom_MNS/flexible_custom_hierarchical_mns.py
similarity index 61%
rename from Custom_MNS/custom_hierarchical_mns.py
rename to Custom_MNS/flexible_custom_hierarchical_mns.py
index 3c5ae5bd6bf8e2f70c88f99dfb8801fb62454843..dd4c0c97503f49877b60f1db8047c11f6cb10814 100644
--- a/Custom_MNS/custom_hierarchical_mns.py
+++ b/Custom_MNS/flexible_custom_hierarchical_mns.py
@@ -1,32 +1,10 @@
-##
-# Copyright 2013-2016 Ghent University
-#
-# This file is part of EasyBuild,
-# originally created by the HPC team of Ghent University (http://ugent.be/hpc/en),
-# with support of Ghent University (http://ugent.be/hpc),
-# the Flemish Supercomputer Centre (VSC) (https://vscentrum.be/nl/en),
-# the Hercules foundation (http://www.herculesstichting.be/in_English)
-# and the Department of Economy, Science and Innovation (EWI) (http://www.ewi-vlaanderen.be/en).
-#
-# http://github.com/hpcugent/easybuild
-#
-# EasyBuild is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation v2.
-#
-# EasyBuild is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with EasyBuild.  If not, see <http://www.gnu.org/licenses/>.
-##
 """
-Implementation of an example hierarchical module naming scheme.
+Implementation of a hierarchical module naming scheme, with added flexibility
 
 @author: Kenneth Hoste (Ghent University)
 @author: Markus Geimer (Forschungszentrum Juelich GmbH)
+@author: Alan O'Cais (Forschungszentrum Juelich GmbH)
+@author: Damian Alvarez (Forschungszentrum Juelich GmbH)
 """
 
 import os
@@ -40,6 +18,7 @@ from easybuild.tools.module_naming_scheme.toolchain import det_toolchain_compile
 CORE = 'Core'
 COMPILER = 'Compiler'
 MPI = 'MPI'
+MPI_SETTINGS = 'MPI_settings'
 
 MODULECLASS_COMPILER = 'compiler'
 MODULECLASS_MPI = 'mpi'
@@ -54,7 +33,28 @@ COMP_NAME_VERSION_TEMPLATES = {
     'xlc,xlf': ('xlcxlf', '%(xlc)s'),
 }
 
-class CustomHierarchicalMNS(HierarchicalMNS):
+# Compiler relevant version numbers
+comp_relevant_versions = {
+    'intel': 1,
+    'PGI': 1,
+# The compilers load GCCcore/version. So GCC and GCCcore can't really be flexible, since GCCcore will always be loaded
+# as a dependency with a full version, and GCC is nothing but a bundle around GCCcore + binutils
+#    'GCC': 1,
+#    'GCCcore': 1,
+}
+
+# MPI relevant version numbers
+mpi_relevant_versions = {
+    'impi': 1,
+    'psmpi': 2,
+    'MVAPICH2': 2,
+    'OpenMPI': 2,
+}
+
+# MPIs with settings modules
+mpi_with_settings = ['psmpi', 'impi', 'MVAPICH2']
+
+class FlexibleCustomHierarchicalMNS(HierarchicalMNS):
     """Class implementing an example hierarchical module naming scheme."""
     def is_short_modname_for(self, short_modname, name):
         """
@@ -69,6 +69,8 @@ class CustomHierarchicalMNS(HierarchicalMNS):
             modname_regex = re.compile('^%s/\S+$' % re.escape('ParaStationMPI'))
         elif name == 'impi':
             modname_regex = re.compile('^%s/\S+$' % re.escape('IntelMPI'))
+        elif name in ['-'.join([x, 'settings']) for x in mpi_with_settings]:
+            modname_regex = re.compile('^%s/\S+$' % re.escape('mpi-settings'))
         else:
             modname_regex = re.compile('^%s/\S+$' % re.escape(name))
         res = bool(modname_regex.match(short_modname))
@@ -78,6 +80,43 @@ class CustomHierarchicalMNS(HierarchicalMNS):
 
         return res
 
+    def _find_relevant_compiler_info(self, comp_info):
+        comp_name, comp_ver = comp_info
+
+        # Strip the irrelevant bits of the version and append the suffix again
+        if comp_relevant_versions.has_key(comp_name):
+            suffix = '-'.join(comp_ver.split('-')[1:])
+            comp_ver = '.'.join(comp_ver.split('.')[:comp_relevant_versions[comp_name]])
+            if suffix:
+                comp_ver += '-%s' % suffix
+
+        return comp_name, comp_ver
+
+    def _find_relevant_mpi_info(self, mpi_info):
+        mpi_ver = self.det_full_version(mpi_info)
+        mpi_name = mpi_info['name']
+
+        # Find suffix, if any, to be appended. Try to be clever, since the suffix is embedded in the version
+        # and sometimes the version might include a string that looks like a suffix (ie: psmpi-5.4.0-1)
+        if mpi_relevant_versions.has_key(mpi_name):
+            # Find possible suffixes
+            possible_suffixes = mpi_ver.split('-')[1:]
+            # Match the '-1' that is a typical part of psmpi's version
+            if possible_suffixes:
+                if re.match('^\d$', possible_suffixes[0]):
+                    suffix_index = 2
+                else:
+                    suffix_index = 1
+                suffix = '-'.join(mpi_ver.split('-')[suffix_index:])
+            else:
+                suffix = ''
+
+            mpi_ver = '.'.join(mpi_ver.split('.')[:mpi_relevant_versions[mpi_name]])
+            if suffix:
+                mpi_ver += '-%s' % suffix
+
+        return mpi_name, mpi_ver
+
     def det_module_subdir(self, ec):
         """
         Determine module subdirectory, relative to the top of the module path.
@@ -90,8 +129,12 @@ class CustomHierarchicalMNS(HierarchicalMNS):
         if tc_comp_info is None:
             # no compiler in toolchain, dummy toolchain => Core module
             subdir = CORE
+            # except if the module is a MPI settings module
+            stripped_name = re.sub('-settings$', '', ec['name'])
+            if stripped_name in mpi_with_settings:
+                subdir = os.path.join(MPI_SETTINGS, stripped_name, ec['version'])
         else:
-            tc_comp_name, tc_comp_ver = tc_comp_info
+            tc_comp_name, tc_comp_ver = self._find_relevant_compiler_info(tc_comp_info)
             tc_mpi = det_toolchain_mpi(ec)
             if tc_mpi is None:
                 # compiler-only toolchain => Compiler/<compiler_name>/<compiler_version> namespace
@@ -101,12 +144,24 @@ class CustomHierarchicalMNS(HierarchicalMNS):
                 else:
                     subdir = os.path.join(COMPILER, tc_comp_name, tc_comp_ver)
             else:
+                tc_mpi_name, tc_mpi_ver = self._find_relevant_mpi_info(tc_mpi)
                 # compiler-MPI toolchain => MPI/<comp_name>/<comp_version>/<MPI_name>/<MPI_version> namespace
-                tc_mpi_fullver = self.det_full_version(tc_mpi)
-                subdir = os.path.join(MPI, tc_comp_name, tc_comp_ver, tc_mpi['name'], tc_mpi_fullver)
+                subdir = os.path.join(MPI, tc_comp_name, tc_comp_ver, tc_mpi_name, tc_mpi_ver)
 
         return subdir
 
+    def det_short_module_name(self, ec):
+        """
+        Determine short module name, i.e. the name under which modules will be exposed to users.
+        Examples: GCC/4.8.3, OpenMPI/1.6.5, OpenBLAS/0.2.9, HPL/2.1, Python/2.7.5
+                  UCX-UD (for MPI settings)
+        """
+        stripped_name = re.sub('-settings$', '', ec['name'])
+        if stripped_name in mpi_with_settings and '-settings' in ec['name']:
+            return os.path.join('mpi-settings', ec['versionsuffix'])
+        else:
+            return super(FlexibleCustomHierarchicalMNS, self).det_short_module_name(ec)
+
     def det_modpath_extensions(self, ec):
         """
         Determine module path extensions, if any.
@@ -146,20 +201,27 @@ class CustomHierarchicalMNS(HierarchicalMNS):
                 # This means icc/ifort are not of the moduleclass compiler but iccifort is
                 if ec['name'] == 'iccifort':
                     comp_name_ver = ['intel', self.det_full_version(ec)]
+
             # Exclude extending the path for icc/ifort, the iccifort special case is handled above
             if ec['name'] not in ['icc', 'ifort']:
+                # Overwrite version if necessary
+                comp_name_ver = self._find_relevant_compiler_info(comp_name_ver)
                 paths.append(os.path.join(COMPILER, *comp_name_ver))
                 # Always extend to capture the MPI implementations too (which are in a separate directory)
                 if ec['name'] not in [GCCCORE]:
                     paths.append(os.path.join(COMPILER, MODULECLASS_MPI, *comp_name_ver))
+
         elif modclass == MODULECLASS_MPI:
             if tc_comp_info is None:
                 raise EasyBuildError("No compiler available in toolchain %s used to install MPI library %s v%s, "
                                      "which is required by the active module naming scheme.",
                                      ec['toolchain'], ec['name'], ec['version'])
             else:
-                tc_comp_name, tc_comp_ver = tc_comp_info
-                fullver = self.det_full_version(ec)
-                paths.append(os.path.join(MPI, tc_comp_name, tc_comp_ver, ec['name'], fullver))
+                tc_comp_name, tc_comp_ver = self._find_relevant_compiler_info(tc_comp_info)
+                mpi_name, mpi_ver = self._find_relevant_mpi_info(ec)
+                paths.append(os.path.join(MPI, tc_comp_name, tc_comp_ver, mpi_name, mpi_ver))
+
+                if ec['name'] in mpi_with_settings:
+                    paths.append(os.path.join(MPI_SETTINGS, mpi_name, mpi_ver))
 
         return paths
diff --git a/Golden_Repo/hidden_deps.txt b/Golden_Repo/hidden_deps.txt
new file mode 100644
index 0000000000000000000000000000000000000000..9825e2dd98dba248f89648817883be8e5eda3820
--- /dev/null
+++ b/Golden_Repo/hidden_deps.txt
@@ -0,0 +1,221 @@
+adwaita-icon-theme
+ant
+ANTLR
+APR
+APR-util
+assimp
+ATK
+AT-SPI2-ATK
+AT-SPI2-core
+Autoconf
+Automake
+babl
+binutils
+Bison
+byacc
+bzip2
+cairo
+cling
+configurable-http-proxy
+Coreutils
+CUSP
+damageproto
+DB
+DBus
+dbus-glib
+DocBook-XML
+Dyninst
+ETSF_IO
+eudev
+Exiv2
+expat
+FFmpeg
+fixesproto
+FLTK
+fontconfig
+fontsproto
+FoX
+freeglut
+freetype
+FTGL
+g2clib
+g2lib
+gc
+GCCcore
+GDAL
+Gdk-Pixbuf
+GEGL
+gettext
+gexiv2
+gflags
+Ghostscript
+GL2PS
+GLEW
+GLib
+GLM
+glog
+GLPK
+glproto
+GObject-Introspection
+googletest
+GPC
+gperf
+GraphicsMagick
+gsettings-desktop-schemas
+GTI
+GTK+
+GtkSourceView
+GTS
+guile
+gzip
+HarfBuzz
+icc
+ICU
+ifort
+inputproto
+intltool
+itstool
+JasPer
+jhbuild
+JSON-C
+JSON-GLib
+JUnit
+kbproto
+LevelDB
+libcerf
+libcroco
+libctl
+libdap
+libdrm
+libdwarf
+libelf
+libepoxy
+libevent
+libffi
+libfontenc
+libgd
+libgeotiff
+libglade
+libGLU
+libICE
+libidn
+Libint
+libjpeg-turbo
+libmatheval
+libmypaint
+libpciaccess
+libpng
+libpthread-stubs
+libreadline
+librsvg
+libSM
+libsndfile
+libspatialindex
+LibTIFF
+libtool
+libunistring
+libunwind
+LibUUID
+libX11
+libXau
+libXaw
+libxcb
+libXcursor
+libXdamage
+libXdmcp
+libXext
+libXfixes
+libXfont
+libXft
+libXi
+libXinerama
+libxkbcommon
+libxml2
+libXmu
+libXp
+libXpm
+libXrandr
+libXrender
+libxslt
+libXt
+libXtst
+libyaml
+libyuv
+LittleCMS
+LMDB
+LZO
+M4
+makedepend
+MATIO
+motif
+msgpack-c
+NASM
+ncurses
+nettle
+NLopt
+nodejs
+nvenc_sdk
+nvidia
+OPARI2
+OTF2
+Pango
+patchelf
+PCRE
+PDT
+pixman
+pkgconfig
+pkg-config
+Pmw
+PnMPI
+popt
+printproto
+PROJ
+protobuf
+pscom
+pybind11
+PyCairo
+PyGObject
+Python-Xpra
+Qhull
+qrupdate
+Qt
+Qt5
+randrproto
+recordproto
+renderproto
+SCons
+scrollkeeper
+Serf
+SIP
+S-Lang
+snappy
+SQLite
+SWIG
+Szip
+texinfo
+Tk
+UDUNITS
+util-linux
+vpx
+wxPropertyGrid
+wxWidgets
+x264
+x265
+xbitmaps
+xcb-proto
+xcb-util
+xcb-util-image
+xcb-util-keysyms
+xcb-util-renderutil
+xcb-util-wm
+xextproto
+xineramaproto
+XKeyboardConfig
+XML-Parser
+xorg-macros
+xprop
+xproto
+xtrans
+XZ
+Yasm
+zlib