diff --git a/auth_token/client/engine.c b/auth_token/client/engine.c
index 6fb756c8..cdbe124d 100644
--- a/auth_token/client/engine.c
+++ b/auth_token/client/engine.c
@@ -38,7 +38,7 @@
 //
 // Debug tracing level
 // 
-int   DebugLevel = 3;
+int   DebugLevel = 0;
 
 //
 // Operating parameter
@@ -98,6 +98,11 @@ ObtainSessionToken(
             retStatus = pCacheEntry->status;
             break;
          }
+         else
+         {
+            // Release auth cache entry reference
+            ReleaseAuthCacheEntry(pCacheEntry);
+         }
       }
 
       // Advance to the next entry
@@ -196,10 +201,12 @@ ObtainSessionToken(
                pCacheEntry->status = retStatus;
                AddEntryToAuthCache(pCacheEntry, cacheEntryLifetime);
             }
-            else
+
+            // Release the cache entry if the resulting status is not successful
+            if (!CASA_SUCCESS(retStatus))
             {
-               // Free the entry
-               FreeAuthCacheEntry(pCacheEntry);
+               // Release auth cache entry reference
+               ReleaseAuthCacheEntry(pCacheEntry);
             }
          }
          else
@@ -213,6 +220,11 @@ ObtainSessionToken(
          // Free up the buffer associated with the authentication mechanism token
          free(pAuthMechToken);
       }
+      else
+      {
+         // Release auth cache entry reference
+         ReleaseAuthCacheEntry(pCacheEntry);
+      }
 
       // Advance to the next entry
       pListEntry = pListEntry->Flink;
@@ -235,6 +247,9 @@ ObtainSessionToken(
                                      CASA_FACILITY_AUTHTOKEN,
                                      CASA_STATUS_INSUFFICIENT_RESOURCES);
       }
+
+      // Release auth cache entry reference
+      ReleaseAuthCacheEntry(pCacheEntry);
    }
 
    DbgTrace(1, "-ObtainSessionToken- End, retStatus = %08X\n", retStatus);
@@ -247,8 +262,8 @@ ObtainSessionToken(
 static
 CasaStatus
 ObtainAuthTokenFromServer(
-   IN    char *pServiceName,
-   IN    char *pHostName,
+   IN    const char *pServiceName,
+   IN    const char *pHostName,
    INOUT char **ppAuthToken,
    INOUT int *pTokenLifetime)
 //
@@ -514,10 +529,12 @@ ObtainAuthToken(
                pCacheEntry->status = retStatus;
                AddEntryToAuthCache(pCacheEntry, cacheEntryLifetime);
             }
-            else
+
+            // Release the cache entry if the resulting status is not successful
+            if (!CASA_SUCCESS(retStatus))
             {
-               // Free the entry
-               FreeAuthCacheEntry(pCacheEntry);
+               // Release auth cache entry reference
+               ReleaseAuthCacheEntry(pCacheEntry);
             }
          }
          else
@@ -530,8 +547,13 @@ ObtainAuthToken(
       }
       else
       {
-         // Cache entry found, update the return status with the information saved in it.
-         retStatus = pCacheEntry->status;
+         // Cache entry found, update the return status with the information saved in it
+         // and release it if its status is not successful.
+         if (!CASA_SUCCESS(retStatus = pCacheEntry->status))
+         {
+            // Release auth cache entry reference
+            ReleaseAuthCacheEntry(pCacheEntry);
+         }
       }
 
       // Try to return auth token if we have one to return
@@ -556,6 +578,9 @@ ObtainAuthToken(
 
          // Return the token length to the caller
          *pAuthTokenBufLen = tokenLen;
+
+         // Release auth cache entry reference
+         ReleaseAuthCacheEntry(pCacheEntry);
       }
 
       // Stop user process synchronization
diff --git a/auth_token/client/internal.h b/auth_token/client/internal.h
index 5b926869..b1aef0c1 100644
--- a/auth_token/client/internal.h
+++ b/auth_token/client/internal.h
@@ -222,19 +222,23 @@ RelGetAuthTokenResp(
 extern
 AuthCacheEntry*
 CreateAuthCacheEntry(
-   IN    char *pCacheKey,
-   IN    char *pHostName);
+   IN    const char *pCacheKey,
+   IN    const char *pHostName);
 
 extern
 void
-FreeAuthCacheEntry(
+ReleaseAuthCacheEntry(
+   IN    AuthCacheEntry *pEntry);
+
+extern void
+IncAuthCacheEntryRefCount(
    IN    AuthCacheEntry *pEntry);
 
 extern
 AuthCacheEntry*
 FindEntryInAuthCache(
-   IN    char *pCacheKey,
-   IN    char *pHostName);
+   IN    const char *pCacheKey,
+   IN    const char *pHostName);
 
 extern
 void
@@ -292,7 +296,7 @@ GetFunctionPtr(
 extern
 char*
 NormalizeHostName(
-   IN    char *pHostName);
+   IN    const char *pHostName);
 
 extern
 CasaStatus
@@ -345,8 +349,8 @@ DecodeData(
 extern
 int
 dtoul(
-   IN    char *cp,
-   IN    int len);
+   IN    const char *cp,
+   IN    const int len);
 
 
 //=========================================================================
diff --git a/auth_token/client/mechanisms/krb5/util.c b/auth_token/client/mechanisms/krb5/util.c
index 634203f8..90454c7a 100644
--- a/auth_token/client/mechanisms/krb5/util.c
+++ b/auth_token/client/mechanisms/krb5/util.c
@@ -33,7 +33,7 @@
 //===[ Global variables ]==================================================
 
 // Debug Level
-int   DebugLevel = 2;
+int   DebugLevel = 0;
 
 // Tables for Base64 encoding and decoding
 static const int8_t  g_Base64[] =
diff --git a/auth_token/client/mechanisms/pwd/util.c b/auth_token/client/mechanisms/pwd/util.c
index 634203f8..90454c7a 100644
--- a/auth_token/client/mechanisms/pwd/util.c
+++ b/auth_token/client/mechanisms/pwd/util.c
@@ -33,7 +33,7 @@
 //===[ Global variables ]==================================================
 
 // Debug Level
-int   DebugLevel = 2;
+int   DebugLevel = 0;
 
 // Tables for Base64 encoding and decoding
 static const int8_t  g_Base64[] =
diff --git a/auth_token/client/util.c b/auth_token/client/util.c
index bf6a48b6..b93a5508 100644
--- a/auth_token/client/util.c
+++ b/auth_token/client/util.c
@@ -276,8 +276,8 @@ DecodeData(
 //++=======================================================================
 int
 dtoul(
-   IN    char *cp,
-   IN    int len)
+   IN    const char *cp,
+   IN    const int len)
 //
 //  Arguments: 
 //
diff --git a/auth_token/client/windows/cache.c b/auth_token/client/windows/cache.c
index 468d8cdf..b261acec 100644
--- a/auth_token/client/windows/cache.c
+++ b/auth_token/client/windows/cache.c
@@ -45,17 +45,21 @@
 //===[ Global variables ]==================================================
 
 // In memory auth cache list head
+static
 LIST_ENTRY  g_authCacheListHead;
 
 // Non-host specific key name
+static
 char  g_allHosts[] = "AllHosts";
 
+static
+int   g_cacheEntryCount = 0;
 
 //++=======================================================================
 AuthCacheEntry*
 CreateAuthCacheEntry(
-   IN    char *pCacheKeyName,
-   IN    char *pHostName)
+   IN    const char *pCacheKeyName,
+   IN    const char *pHostName)
 //
 //  Arguments: 
 //
@@ -95,6 +99,12 @@ CreateAuthCacheEntry(
             // Save the names within the entry
             strcpy(pEntry->pCacheKeyName, pCacheKeyName);
             strcpy(pEntry->pHostName, pHostName);
+
+            // Initialize the entries refCount
+            pEntry->refCount = 1;
+
+            // Increment the cache entry count
+            g_cacheEntryCount ++;
          }
          else
          {
@@ -131,6 +141,7 @@ CreateAuthCacheEntry(
 
 
 //++=======================================================================
+static
 void
 FreeAuthCacheEntry(
    IN    AuthCacheEntry *pEntry)
@@ -146,7 +157,7 @@ FreeAuthCacheEntry(
 // L2
 //=======================================================================--
 {
-   DbgTrace(1, "-FreeAuthCacheEntry- Start\n", 0);
+   DbgTrace(1, "-FreeAuthCacheEntry- Start, pEntry = %08X\n", pEntry);
 
    // Free resources associated with the entry
    if (pEntry->pToken)
@@ -161,10 +172,65 @@ FreeAuthCacheEntry(
    // Free the entry
    free(pEntry);
 
+   // Decrement the cache entry count
+   g_cacheEntryCount --;
+
    DbgTrace(1, "-FreeAuthCacheEntry- End\n", 0);
 }
 
 
+//++=======================================================================
+void
+ReleaseAuthCacheEntry(
+   IN    AuthCacheEntry *pEntry)
+//
+//  Arguments: 
+//
+//  Returns:   
+//
+//  Abstract:  
+//
+//  Notes:
+//
+// L2
+//=======================================================================--
+{
+   DbgTrace(1, "-ReleaseAuthCacheEntry- Start, pEntry = %08X\n", pEntry);
+
+   // Reduce the entries reference count and free it if it goes to zero
+   pEntry->refCount --;
+   if (pEntry->refCount == 0)
+      FreeAuthCacheEntry(pEntry);
+
+   DbgTrace(1, "-ReleaseAuthCacheEntry- End\n", 0);
+}
+
+
+//++=======================================================================
+void
+IncAuthCacheEntryRefCount(
+   IN    AuthCacheEntry *pEntry)
+//
+//  Arguments: 
+//
+//  Returns:   
+//
+//  Abstract:  
+//
+//  Notes:
+//
+// L2
+//=======================================================================--
+{
+   DbgTrace(1, "-IncAuthCacheEntryRefCount- Start, pEntry = %08X\n", pEntry);
+
+   // Increase the entries reference count
+   pEntry->refCount ++;
+
+   DbgTrace(1, "-IncAuthCacheEntryRefCount- End\n", 0);
+}
+
+
 //++=======================================================================
 static
 BOOL
@@ -236,8 +302,8 @@ CacheEntryLifetimeExpired(
 //++=======================================================================
 AuthCacheEntry*
 FindEntryInAuthCache(
-   IN    char *pCacheKeyName,
-   IN    char *pHostName)
+   IN    const char *pCacheKeyName,
+   IN    const char *pHostName)
 //
 //  Arguments: 
 //
@@ -286,9 +352,9 @@ FindEntryInAuthCache(
                 && CacheEntryLifetimeExpired(pWrkEntry->creationTime, pWrkEntry->expirationTime))
             {
                // The lifetime of the entry has expired, remove it from the in-memory cache
-               // and free it.
+               // and release it.
                RemoveEntryList(&pWrkEntry->listEntry);
-               FreeAuthCacheEntry(pWrkEntry);
+               ReleaseAuthCacheEntry(pWrkEntry);
             }
             else
             {
@@ -524,6 +590,13 @@ FindEntryInAuthCache(
       }
    }
 
+   // Increment the reference count of entry being returned
+   if (pEntry)
+   {
+      // Increment entries reference count since we are returning it to the caller
+      IncAuthCacheEntryRefCount(pEntry);
+   }
+
    DbgTrace(1, "-FindEntryInAuthCache- End, pEntry = %08X\n", pEntry);
 
    return pEntry;
@@ -550,7 +623,7 @@ AddEntryToAuthCache(
    LONG  status;
    HKEY  hCASARegKey;
 
-   DbgTrace(1, "-AddEntryToAuthCache- Start\n", 0);
+   DbgTrace(1, "-AddEntryToAuthCache- Start, pEntry = %08X\n", pEntry);
 
    // Set the time when the entry was added to the cache
    pEntry->creationTime = GetTickCount();
@@ -712,12 +785,9 @@ AddEntryToAuthCache(
       // The entry was added to the cache, save it in
       // our in-memory cache.
       InsertHeadList(&g_authCacheListHead, &pEntry->listEntry);
-   }
-   else
-   {
-      // Not able to successfully add the entry to the cache,
-      // free the entry.
-      FreeAuthCacheEntry(pEntry);
+
+      // Increment its reference count since we are keeping a reference
+      IncAuthCacheEntryRefCount(pEntry);
    }
 
    DbgTrace(1, "-AddEntryToAuthCache- End\n", 0);
diff --git a/auth_token/client/windows/platform.c b/auth_token/client/windows/platform.c
index 7ffc0fb3..e359d8eb 100644
--- a/auth_token/client/windows/platform.c
+++ b/auth_token/client/windows/platform.c
@@ -301,7 +301,7 @@ GetFunctionPtr(
 //++=======================================================================
 char*
 NormalizeHostName(
-   IN    char *pHostName)
+   IN    const char *pHostName)
 //
 //  Arguments: 
 //
diff --git a/auth_token/client/windows/platform.h b/auth_token/client/windows/platform.h
index 2c63dae7..b1729a01 100644
--- a/auth_token/client/windows/platform.h
+++ b/auth_token/client/windows/platform.h
@@ -75,6 +75,7 @@ char printBuff[256];                                           \
 typedef struct _AuthCacheEntry
 {
    LIST_ENTRY  listEntry;
+   int         refCount;
    DWORD       creationTime;
    DWORD       expirationTime;
    BOOL        doesNotExpire;