diff --git a/lib/matplotlib/cbook.py b/lib/matplotlib/cbook.py
index 19a078a..d1f0085 100644
--- a/lib/matplotlib/cbook.py
+++ b/lib/matplotlib/cbook.py
@@ -1788,7 +1788,7 @@ class ThinWrap(object) :
     The ThinWrap class is a way to produce modified interfaces
     to an object while still maintaining the original object.
 
-    An example use case is the ReMap class in colors.py.  The ReMap
+    An example use case is the ReMap class in remap.py.  The ReMap
     class takes a colormap object and intercepts its __call__() function.
     This allows for a remapping function to modify the returned rgba values.
     Meanwhile, any access to the attributes and functions of the original
diff --git a/lib/matplotlib/cm.py b/lib/matplotlib/cm.py
index b246bae..6f42019 100644
--- a/lib/matplotlib/cm.py
+++ b/lib/matplotlib/cm.py
@@ -120,17 +120,20 @@ def get_cmap(name=None, lut=None):
     if name is None:
         name = mpl.rcParams['image.cmap']
 
-    if isinstance(name, colors.Colormap):
+    
+    if cbook.is_string_like(name) :
+        if name in cmap_d:
+            if lut is None:
+                return cmap_d[name]
+            elif name in datad:
+                return colors.LinearSegmentedColormap(name,  datad[name], lut)
+        
+        raise ValueError("Colormap %s is not recognized" % name)
+    else :
+        # Assume that the user knows what it wants and that the object
+        # works as a colormap.
         return name
 
-    if name in cmap_d:
-        if lut is None:
-            return cmap_d[name]
-        elif name in datad:
-            return colors.LinearSegmentedColormap(name,  datad[name], lut)
-        else:
-            raise ValueError("Colormap %s is not recognized" % name)
-
 class ScalarMappable:
     """
     This is a mixin class to support scalar -> RGBA mapping.  Handles
diff --git a/lib/matplotlib/colors.py b/lib/matplotlib/colors.py
index eb2f445..023904b 100644
--- a/lib/matplotlib/colors.py
+++ b/lib/matplotlib/colors.py
@@ -462,7 +462,7 @@ def makeMappingArray(N, data, gamma=1.0):
     return lut
 
 
-class Colormap:
+class Colormap(object):
     """Base class for all scalar to rgb mappings
 
         Important methods:
diff --git a/lib/matplotlib/contour.py b/lib/matplotlib/contour.py
index f5e480f..5507c93 100644
--- a/lib/matplotlib/contour.py
+++ b/lib/matplotlib/contour.py
@@ -678,7 +678,7 @@ class ContourSet(cm.ScalarMappable, ContourLabeler):
         if self.origin is not None: assert(self.origin in
                                             ['lower', 'upper', 'image'])
         if self.extent is not None: assert(len(self.extent) == 4)
-        if cmap is not None: assert(isinstance(cmap, colors.Colormap))
+        #if cmap is not None: assert(isinstance(cmap, colors.Colormap))
         if self.colors is not None and cmap is not None:
             raise ValueError('Either colors or cmap must be None')
         if self.origin == 'image': self.origin = mpl.rcParams['image.origin']
diff --git a/lib/matplotlib/remap.py b/lib/matplotlib/remap.py
new file mode 100755
index 0000000..610db9a
--- /dev/null
+++ b/lib/matplotlib/remap.py
@@ -0,0 +1,60 @@
+"""
+The remap module provides a mechanism to alter the behavior of colormaps
+without modifying the underlying Colormap object. Contained in this module
+are several useful colormap ReMappers that can be combined to achieve
+a desired effect.
+"""
+
+
+import numpy as np
+from matplotlib.colors import Colormap
+import matplotlib.cm as cm
+from cbook import ThinWrap
+
+
+class ReMap(ThinWrap) :
+    """
+    Base class for classes that modify the replies from calls to
+    a normal colormap. These calls modify the rgba values returned
+    by a call to a Colormap.
+    """
+    def __init__(self, cmap=None) :
+        """
+        Create a new ReMap wrapper around the colormap.
+
+        cmap can be a string indicating a registered
+        colormap, or a colormap object, or None to obtain
+        the default colormap.
+        """
+        cmap = cm.get_cmap(cmap)
+        ThinWrap.__init__(self, cmap)
+
+    def __call__(self, *args, **kwargs) :
+        """
+        Generic overload of the __call__ method.
+        This method will modify the returned rgba values using
+        the _remap method defined by subclasses of ThinWrap.
+        """
+        return self._remap(self.__dict__['_origobj'](*args, **kwargs))
+
+    def _remap(self, rgba) :
+        raise NotImplemented("The base ReMap class does not define _remap()")
+
+
+
+
+class ToGrayscale(ReMap) :
+    """
+    A ReMapper that will convert any color from a colormap
+    into a gray color according to the ITU-R 601-2 luma transform.
+    """
+    def _remap(self, rgba) :
+        if rgba is not None :
+            rgba = np.atleast_2d(rgba)
+            l = np.sum(rgba[:, :3] * np.array([0.299, 0.587, 0.114]), axis=1)
+            return np.squeeze(np.dstack([l, l, l, rgba[:, 3]]))
+        else :
+            # If we get a None, then return it in kind.
+            return None
+
+
