diff --git "a/C:\\edk2\\MdePkg\\Library\\SafeOpenProtocolLib\\SafeProtocolLibOrg.c" "b/C:\\edk2\\MdePkg\\Library\\SafeOpenProtocolLib\\SafeOpenProtocolLib.c"
index aabeda6..c87fa2b 100644
--- "a/C:\\edk2\\MdePkg\\Library\\SafeOpenProtocolLib\\SafeProtocolLibOrg.c"
+++ "b/C:\\edk2\\MdePkg\\Library\\SafeOpenProtocolLib\\SafeOpenProtocolLib.c"
@@ -36,8 +36,9 @@ typedef struct {
   
   EFI_HANDLE                  Handle;
   EFI_GUID                    *Protocol;
-  VOID                        **Interface;
+  VOID                        *Interface;
   EFI_EVENT                   Event;
+  UINTN                       OpenCount;  // zero based
   
   EFI_DRIVER_BINDING_PROTOCOL DriverBinding;
   BOOLEAN                     DontStop;
@@ -79,7 +80,7 @@ SafeOpenProtocolBeginCriticalSection (
   Private = CR (Entry, SAFE_OPEN_PROTOCOL_PRIVATE, Signature, SAFE_OPEN_PROTOCOL_PRIVATE_SIGNATURE);
 
   EfiAcquireLock (&mSafeOpenProtocolLock);
-  Private->DontStop = TRUE;
+  Private->DontStop++;
   EfiReleaseLock (&mSafeOpenProtocolLock);
 
   return Private->StopRequested;
@@ -113,7 +114,7 @@ SafeOpenProtocolEndCriticalSection (
   Private = CR (Entry, SAFE_OPEN_PROTOCOL_PRIVATE, Signature, SAFE_OPEN_PROTOCOL_PRIVATE_SIGNATURE);
   
   EfiAcquireLock (&mSafeOpenProtocolLock);
-  Private->DontStop = FALSE;
+  Private->DontStop--;
   EfiReleaseLock (&mSafeOpenProtocolLock);
 
   return Private->StopRequested;
@@ -423,12 +424,17 @@ SafeOpenProtocol (
   EFI_STATUS                    Status;
   SAFE_OPEN_PROTOCOL_PRIVATE    *Private;
 
-  if (OpenProtocolFindIt (Handle, Protocol) != NULL) {
-    return NULL;
+  if ((Private=OpenProtocolFindIt (Handle, Protocol)) != NULL) {
+    EfiAcquireLock (&mSafeOpenProtocolLock);
+    Private->OpenCount++;
+    EfiReleaseLock (&mSafeOpenProtocolLock);
+    *Interface=Private->Interface;
+    return (SAFE_OPEN_PROTOCOL_LIB_HANDLE *)Private;
   }
   
   Private = AllocateZeroPool (sizeof (SAFE_OPEN_PROTOCOL_PRIVATE));
   if (Private == NULL) {
+    *Interface=NULL;
     return NULL;
   }
 
@@ -475,11 +481,12 @@ SafeOpenProtocol (
       Private->ReconnectOnClose = TRUE;
     } else {
       FreePool (Private);
+      *Interface=NULL;
       return NULL;
     }
   }
     
-  Private->Interface = Interface;
+  Private->Interface = *Interface;
   
   InsertTailList (&mOpenProtocolEntryList, &Private->Link);
   
@@ -515,6 +522,13 @@ SafeCloseProtocol (
   if (Private->Signature != SAFE_OPEN_PROTOCOL_PRIVATE_SIGNATURE) {
     return EFI_INVALID_PARAMETER;
   }
+  
+  if (Private->OpenCount) {
+    EfiAcquireLock (&mSafeOpenProtocolLock);
+    Private->OpenCount--;
+    EfiReleaseLock (&mSafeOpenProtocolLock);
+    return EFI_SUCCESS;
+  }
 
   Status = gBS->CloseProtocol (
                   Private->Handle, 
@@ -536,7 +550,6 @@ SafeCloseProtocol (
   }
 
   RemoveEntryList (&Private->Link);
-  *(Private->Interface) = NULL;
  
   if (Private->ReconnectOnClose) {
     // since we kicked off a driver reconnect a driver now.
