imported patch NDB
diff --git a/oauth2client/appengine.py b/oauth2client/appengine.py
index 8e05d8b..165c9b1 100644
--- a/oauth2client/appengine.py
+++ b/oauth2client/appengine.py
@@ -31,7 +31,6 @@
 from google.appengine.api import memcache
 from google.appengine.api import users
 from google.appengine.ext import db
-from google.appengine.ext import ndb
 from google.appengine.ext import webapp
 from google.appengine.ext.webapp.util import login_required
 from google.appengine.ext.webapp.util import run_wsgi_app
@@ -49,6 +48,13 @@
 from oauth2client.client import OAuth2WebServerFlow
 from oauth2client.client import Storage
 
+# TODO(dhermes): Resolve import issue.
+# This is a temporary fix for a Google internal issue.
+try:
+  from google.appengine.ext import ndb
+except ImportError:
+  ndb = None
+
 logger = logging.getLogger(__name__)
 
 OAUTH2CLIENT_NAMESPACE = 'oauth2client#ns'
@@ -84,23 +90,23 @@
   """
   secret = db.StringProperty()
 
+if ndb is not None:
+  class SiteXsrfSecretKeyNDB(ndb.Model):
+    """NDB Model for storage for the sites XSRF secret key.
 
-class SiteXsrfSecretKeyNDB(ndb.Model):
-  """NDB Model for storage for the sites XSRF secret key.
+    Since this model uses the same kind as SiteXsrfSecretKey, it can be used
+    interchangeably. This simply provides an NDB model for interacting with the
+    same data the DB model interacts with.
 
-  Since this model uses the same kind as SiteXsrfSecretKey, it can be used
-  interchangeably. This simply provides an NDB model for interacting with the
-  same data the DB model interacts with.
+    There should only be one instance stored of this model, the one used for the
+    site.
+    """
+    secret = ndb.StringProperty()
 
-  There should only be one instance stored of this model, the one used for the
-  site.
-  """
-  secret = ndb.StringProperty()
-
-  @classmethod
-  def _get_kind(cls):
-    """Return the kind name for this class."""
-    return 'SiteXsrfSecretKey'
+    @classmethod
+    def _get_kind(cls):
+      """Return the kind name for this class."""
+      return 'SiteXsrfSecretKey'
 
 
 def _generate_new_xsrf_secret_key():
@@ -217,30 +223,31 @@
     return not value
 
 
-class FlowNDBProperty(ndb.PickleProperty):
-  """App Engine NDB datastore Property for Flow.
+if ndb is not None:
+  class FlowNDBProperty(ndb.PickleProperty):
+    """App Engine NDB datastore Property for Flow.
 
-  Serves the same purpose as the DB FlowProperty, but for NDB models. Since
-  PickleProperty inherits from BlobProperty, the underlying representation of
-  the data in the datastore will be the same as in the DB case.
+    Serves the same purpose as the DB FlowProperty, but for NDB models. Since
+    PickleProperty inherits from BlobProperty, the underlying representation of
+    the data in the datastore will be the same as in the DB case.
 
-  Utility property that allows easy storage and retrieval of an
-  oauth2client.Flow
-  """
-
-  def _validate(self, value):
-    """Validates a value as a proper Flow object.
-
-    Args:
-      value: A value to be set on the property.
-
-    Raises:
-      TypeError if the value is not an instance of Flow.
+    Utility property that allows easy storage and retrieval of an
+    oauth2client.Flow
     """
-    logger.info('validate: Got type %s', type(value))
-    if value is not None and not isinstance(value, Flow):
-      raise TypeError('Property %s must be convertible to a flow '
-                      'instance; received: %s.' % (self._name, value))
+
+    def _validate(self, value):
+      """Validates a value as a proper Flow object.
+
+      Args:
+        value: A value to be set on the property.
+
+      Raises:
+        TypeError if the value is not an instance of Flow.
+      """
+      logger.info('validate: Got type %s', type(value))
+      if value is not None and not isinstance(value, Flow):
+        raise TypeError('Property %s must be convertible to a flow '
+                        'instance; received: %s.' % (self._name, value))
 
 
 class CredentialsProperty(db.Property):
@@ -289,65 +296,66 @@
     return value
 
 
-# TODO(dhermes): Turn this into a JsonProperty and overhaul the Credentials
-#                and subclass mechanics to use new_from_dict, to_dict,
-#                from_dict, etc.
-class CredentialsNDBProperty(ndb.BlobProperty):
-  """App Engine NDB datastore Property for Credentials.
+if ndb is not None:
+  # TODO(dhermes): Turn this into a JsonProperty and overhaul the Credentials
+  #                and subclass mechanics to use new_from_dict, to_dict,
+  #                from_dict, etc.
+  class CredentialsNDBProperty(ndb.BlobProperty):
+    """App Engine NDB datastore Property for Credentials.
 
-  Serves the same purpose as the DB CredentialsProperty, but for NDB models.
-  Since CredentialsProperty stores data as a blob and this inherits from
-  BlobProperty, the data in the datastore will be the same as in the DB case.
+    Serves the same purpose as the DB CredentialsProperty, but for NDB models.
+    Since CredentialsProperty stores data as a blob and this inherits from
+    BlobProperty, the data in the datastore will be the same as in the DB case.
 
-  Utility property that allows easy storage and retrieval of Credentials and
-  subclasses.
-  """
-  def _validate(self, value):
-    """Validates a value as a proper credentials object.
-
-    Args:
-      value: A value to be set on the property.
-
-    Raises:
-      TypeError if the value is not an instance of Credentials.
+    Utility property that allows easy storage and retrieval of Credentials and
+    subclasses.
     """
-    logger.info('validate: Got type %s', type(value))
-    if value is not None and not isinstance(value, Credentials):
-      raise TypeError('Property %s must be convertible to a credentials '
-                      'instance; received: %s.' % (self._name, value))
+    def _validate(self, value):
+      """Validates a value as a proper credentials object.
 
-  def _to_base_type(self, value):
-    """Converts our validated value to a JSON serialized string.
+      Args:
+        value: A value to be set on the property.
 
-    Args:
-      value: A value to be set in the datastore.
+      Raises:
+        TypeError if the value is not an instance of Credentials.
+      """
+      logger.info('validate: Got type %s', type(value))
+      if value is not None and not isinstance(value, Credentials):
+        raise TypeError('Property %s must be convertible to a credentials '
+                        'instance; received: %s.' % (self._name, value))
 
-    Returns:
-      A JSON serialized version of the credential, else '' if value is None.
-    """
-    if value is None:
-      return ''
-    else:
-      return value.to_json()
+    def _to_base_type(self, value):
+      """Converts our validated value to a JSON serialized string.
 
-  def _from_base_type(self, value):
-    """Converts our stored JSON string back to the desired type.
+      Args:
+        value: A value to be set in the datastore.
 
-    Args:
-      value: A value from the datastore to be converted to the desired type.
+      Returns:
+        A JSON serialized version of the credential, else '' if value is None.
+      """
+      if value is None:
+        return ''
+      else:
+        return value.to_json()
 
-    Returns:
-      A deserialized Credentials (or subclass) object, else None if the
-          value can't be parsed.
-    """
-    if not value:
-      return None
-    try:
-      # Uses the from_json method of the implied class of value
-      credentials = Credentials.new_from_json(value)
-    except ValueError:
-      credentials = None
-    return credentials
+    def _from_base_type(self, value):
+      """Converts our stored JSON string back to the desired type.
+
+      Args:
+        value: A value from the datastore to be converted to the desired type.
+
+      Returns:
+        A deserialized Credentials (or subclass) object, else None if the
+            value can't be parsed.
+      """
+      if not value:
+        return None
+      try:
+        # Uses the from_json method of the implied class of value
+        credentials = Credentials.new_from_json(value)
+      except ValueError:
+        credentials = None
+      return credentials
 
 
 class StorageByKeyName(Storage):
@@ -385,7 +393,7 @@
     # issubclass will fail if one of the arguments is not a class, only need
     # worry about new-style classes since ndb and db models are new-style
     if isinstance(self._model, type):
-      if issubclass(self._model, ndb.Model):
+      if ndb is not None and issubclass(self._model, ndb.Model):
         return True
       elif issubclass(self._model, db.Model):
         return False
@@ -469,23 +477,24 @@
   credentials = CredentialsProperty()
 
 
-class CredentialsNDBModel(ndb.Model):
-  """NDB Model for storage of OAuth 2.0 Credentials
+if ndb is not None:
+  class CredentialsNDBModel(ndb.Model):
+    """NDB Model for storage of OAuth 2.0 Credentials
 
-  Since this model uses the same kind as CredentialsModel and has a property
-  which can serialize and deserialize Credentials correctly, it can be used
-  interchangeably with a CredentialsModel to access, insert and delete the same
-  entities. This simply provides an NDB model for interacting with the
-  same data the DB model interacts with.
+    Since this model uses the same kind as CredentialsModel and has a property
+    which can serialize and deserialize Credentials correctly, it can be used
+    interchangeably with a CredentialsModel to access, insert and delete the
+    same entities. This simply provides an NDB model for interacting with the
+    same data the DB model interacts with.
 
-  Storage of the model is keyed by the user.user_id().
-  """
-  credentials = CredentialsNDBProperty()
+    Storage of the model is keyed by the user.user_id().
+    """
+    credentials = CredentialsNDBProperty()
 
-  @classmethod
-  def _get_kind(cls):
-    """Return the kind name for this class."""
-    return 'CredentialsModel'
+    @classmethod
+    def _get_kind(cls):
+      """Return the kind name for this class."""
+      return 'CredentialsModel'
 
 
 def _build_state_value(request_handler, user):