diff --git a/ale/base/base.py b/ale/base/base.py
index e0c5346d208a08e6328c0598749aa21bdeae7d7e..7857574664021417929e793000f618ccb3de54f0 100644
--- a/ale/base/base.py
+++ b/ale/base/base.py
@@ -11,7 +11,7 @@ class Driver():
             Reference to file path to be used by mixins for opening.
     """
 
-    def __init__(self, file, num_ephem=909, num_quats=909, props={}):
+    def __init__(self, file, num_ephem=909, num_quats=909, props={}, parsed_label=None):
         """
         Parameters
         ----------
@@ -31,6 +31,9 @@ class Driver():
         self._num_ephem = num_ephem
         self._file = file
 
+        if parsed_label:
+            self._label = parsed_label
+
     @property
     def image_lines(self):
         """
diff --git a/ale/drivers/__init__.py b/ale/drivers/__init__.py
index d47d9e9711d47cfdde8b055d32c58a015f39c9bc..0b7889f81dd8fc35472b9ca0a579ac54d5375a68 100644
--- a/ale/drivers/__init__.py
+++ b/ale/drivers/__init__.py
@@ -93,11 +93,25 @@ def load(label, props={}, formatter='ale', verbose=False):
     drivers = chain.from_iterable(inspect.getmembers(dmod, lambda x: inspect.isclass(x) and "_driver" in x.__module__) for dmod in __driver_modules__)
     drivers = sort_drivers([d[1] for d in drivers])
 
+    try:
+        # Try default grammar for pds3 label
+        parsed_label = parse_label(label)
+    except ValueError as e:
+        if verbose:
+            print(e)
+        # If pds3 label fails, try isis grammar
+        parsed_label = parse_label(label, pvl.grammar.ISISGrammar)
+    except Exception as e:
+        if verbose:
+            print(e)
+        # If both fail, then don't parse the label, and just pass the driver a file.
+        parsed_label = None
+
     for driver in drivers:
         if verbose:
             print(f'Trying {driver}')
         try:
-            res = driver(label, props=props)
+            res = driver(label, props=props, parsed_label=parsed_label)
             # get instrument_id to force early failure
             res.instrument_id
 
@@ -130,3 +144,36 @@ def loads(label, props='', formatter='ale', verbose=False):
     """
     res = load(label, props, formatter, verbose=verbose)
     return json.dumps(res, cls=AleJsonEncoder)
+
+
+def parse_label(label, grammar=pvl.grammar.PVLGrammar):
+    """
+    Attempt to parse a PVL label.
+
+    Parameters
+    ----------
+    label
+        The label as a pvl string or pvl file.
+
+    grammar
+        The pvl grammar with which to parse the label. If None, default to PVLGrammar
+
+
+    Returns
+    -------
+    pvl.collections.PVLModule
+        The PVL label deserialized to a Python object
+
+    See Also
+    --------
+    load
+    loads
+    """
+    try:
+        parsed_label = pvl.loads(label, grammar=grammar)
+    except Exception:
+        parsed_label = pvl.load(label, grammar=grammar)
+    except:
+        raise ValueError("{} is not a valid label for grammar {}".format(label, grammar.__name__))
+
+    return parsed_label