diff --git a/core/src/main/java/org/apache/shiro/util/ThreadContext.java b/core/src/main/java/org/apache/shiro/util/ThreadContext.java
index e52ec4e..e6237e1 100644
--- a/core/src/main/java/org/apache/shiro/util/ThreadContext.java
+++ b/core/src/main/java/org/apache/shiro/util/ThreadContext.java
@@ -24,6 +24,7 @@
 import org.slf4j.LoggerFactory;
 import org.slf4j.MDC;
 
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -74,7 +75,11 @@
      * @return the map of bound resources
      */
     public static Map<Object, Object> getResources() {
-        return resources != null ? new HashMap<Object, Object>(resources.get()) : null;
+        if (resources.get() == null){
+            return Collections.emptyMap();
+        } else {
+            return new HashMap<Object, Object>(resources.get());
+        }
     }
 
     /**
@@ -89,6 +94,7 @@
         if (CollectionUtils.isEmpty(newResources)) {
             return;
         }
+        ensureResourcesInitialized();
         resources.get().clear();
         resources.get().putAll(newResources);
     }
@@ -103,7 +109,14 @@
      * @since 1.0
      */
     private static Object getValue(Object key) {
-        return resources.get().get(key);
+        Map<Object, Object> perThreadResources = resources.get();
+        return perThreadResources != null ? perThreadResources.get(key) : null;
+    }
+
+    private static void ensureResourcesInitialized(){
+        if (resources.get() == null){
+           resources.set(new HashMap<Object, Object>());
+        }
     }
 
     /**
@@ -154,6 +167,7 @@
             return;
         }
 
+        ensureResourcesInitialized();
         resources.get().put(key, value);
 
         if (log.isTraceEnabled()) {
@@ -172,7 +186,8 @@
      *         under the specified <tt>key</tt> name.
      */
     public static Object remove(Object key) {
-        Object value = resources.get().remove(key);
+        Map<Object, Object> perThreadResources = resources.get();
+        Object value = perThreadResources != null ? perThreadResources.remove(key) : null;
 
         if ((value != null) && log.isTraceEnabled()) {
             String msg = "Removed value of type [" + value.getClass().getName() + "] for key [" +
@@ -316,9 +331,6 @@
     }
     
     private static final class InheritableThreadLocalMap<T extends Map<Object, Object>> extends InheritableThreadLocal<Map<Object, Object>> {
-        protected Map<Object, Object> initialValue() {
-            return new HashMap<Object, Object>();
-        }
 
         /**
          * This implementation was added to address a
