diff --git a/etc/spack/modules.yaml b/etc/spack/modules.yaml
index aa2a2c3fe2990d976c1c3ca6c682a149b4b6a4bf..395cf9c2cd5c94bffd894179104b7885c1e9dde6 100644
--- a/etc/spack/modules.yaml
+++ b/etc/spack/modules.yaml
@@ -6,3 +6,7 @@
 # -------------------------------------------------------------------------
 modules:
   enable: ['tcl', 'dotkit']
+
+  dotkit:
+    filter:
+      environment_modifications: ['CPATH', 'LIBRARY_PATH']  # Exclude changes to any of these variables
diff --git a/lib/spack/spack/config.py b/lib/spack/spack/config.py
index 14e5aaf4fb624e9532e56b2f2a2f60669b8b3152..4fca735fc976974974084b325c84d85e85d782e0 100644
--- a/lib/spack/spack/config.py
+++ b/lib/spack/spack/config.py
@@ -146,7 +146,7 @@
         'type': 'object',
         'additionalProperties': False,
         'patternProperties': {
-            'compilers:?': { # optional colon for overriding site config.
+            'compilers:?': {  # optional colon for overriding site config.
                 'type': 'object',
                 'default': {},
                 'additionalProperties': False,
@@ -195,6 +195,7 @@
                 'default': [],
                 'items': {
                     'type': 'string'},},},},
+
     'packages': {
         '$schema': 'http://json-schema.org/schema#',
         'title': 'Spack package configuration file schema',
@@ -238,11 +239,35 @@
                                 'default' : {},
                             }
                         },},},},},},
+
     'modules': {
         '$schema': 'http://json-schema.org/schema#',
         'title': 'Spack module file configuration file schema',
         'type': 'object',
         'additionalProperties': False,
+        'definitions': {
+            'module_type_configuration': {
+                'type': 'object',
+                'default': {},
+                'additionalProperties': False,
+                'properties': {
+                    'filter': {
+                        'type': 'object',
+                        'default': {},
+                        'additionalProperties': False,
+                        'properties': {
+                            'environment_modifications': {
+                                'type': 'array',
+                                'default': [],
+                                'items': {
+                                    'type': 'string'
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        },
         'patternProperties': {
             r'modules:?': {
                 'type': 'object',
@@ -253,9 +278,22 @@
                         'type': 'array',
                         'default': [],
                         'items': {
-                            'type': 'string'
+                            'type': 'string',
+                            'enum': ['tcl', 'dotkit']
                         }
-                    }
+                    },
+                    'tcl': {
+                        'allOf': [
+                            {'$ref': '#/definitions/module_type_configuration'},  # Base configuration
+                            {}  # Specific tcl extensions
+                        ]
+                    },
+                    'dotkit': {
+                        'allOf': [
+                            {'$ref': '#/definitions/module_type_configuration'},  # Base configuration
+                            {}  # Specific dotkit extensions
+                        ]
+                    },
                 }
             },
         },
diff --git a/lib/spack/spack/environment.py b/lib/spack/spack/environment.py
index 72aafa4e2d6b18d25c8ac0dcc7a2ff210cb3a38c..3d18d3a63fb80dfb576132e55719a5256b9e4e7c 100644
--- a/lib/spack/spack/environment.py
+++ b/lib/spack/spack/environment.py
@@ -250,3 +250,19 @@ def validate(env, errstream):
     modifications = env.group_by_name()
     for variable, list_of_changes in sorted(modifications.items()):
         set_or_unset_not_first(variable, list_of_changes, errstream)
+
+
+def filter_environment_modifications(env, variables):
+    """
+    Generator that filters out any change to environment variables present in the input list
+
+    Args:
+        env: list of environment modifications
+        variables: list of variable names to be filtered
+
+    Yields:
+        items in env if they are not in variables
+    """
+    for item in env:
+        if item.name not in variables:
+            yield item
diff --git a/lib/spack/spack/modules.py b/lib/spack/spack/modules.py
index d797af287d37eaf242e7662430eee8277136fae1..aca37ae14bfbe008125f666cf1f0ee2ac33d8311 100644
--- a/lib/spack/spack/modules.py
+++ b/lib/spack/spack/modules.py
@@ -179,9 +179,17 @@ def write(self):
         if not env:
             return
 
+        # Filter modifications to the environment according to configuration files
+        try:
+            filter_list = CONFIGURATION[self.name]['filter']['environment_modifications']
+        except KeyError:
+            filter_list = []
+
         with open(self.file_name, 'w') as f:
             self.write_header(f)
-            for line in self.process_environment_command(env):
+            for line in self.process_environment_command(
+                    filter_environment_modifications(env, filter_list)
+            ):
                 f.write(line)
 
     def write_header(self, stream):