diff --git a/Lib/decimal.py b/Lib/decimal.py
index 5216ac4..101e5d8 100644
--- a/Lib/decimal.py
+++ b/Lib/decimal.py
@@ -392,7 +392,7 @@
     def setcontext(context):
         """Set this thread's context to context."""
         if context in (DefaultContext, BasicContext, ExtendedContext):
-            context = copy.deepcopy(context)
+            context = context.copy()
             context.clear_flags()
         threading.currentThread().__decimal_context__ = context
 
@@ -413,6 +413,8 @@
 else:
 
     local = threading.local()
+    if hasattr(local, '__decimal_context__'):
+        del local.__decimal_context__
 
     def getcontext(_local=local):
         """Returns this thread's context.
@@ -431,7 +433,7 @@
     def setcontext(context, _local=local):
         """Set this thread's context to context."""
         if context in (DefaultContext, BasicContext, ExtendedContext):
-            context = copy.deepcopy(context)
+            context = context.copy()
             context.clear_flags()
         _local.__decimal_context__ = context
 
@@ -642,7 +644,7 @@
         elif self.adjusted < other.adjusted() and other._int[0] != 0:
             return -((-1)**self._sign)
 
-        context = context.copy()
+        context = context._shallow_copy()
         rounding = context._set_rounding(ROUND_UP) #round away from 0
 
         flags = context._ignore_all_flags()
@@ -861,7 +863,7 @@
             return ans
 
         if not round:
-            context = context.copy()
+            context = context._shallow_copy()
             context._set_rounding_decision(NEVER_ROUND)
 
         if self._sign:
@@ -1358,7 +1360,7 @@
 
         # If DivisionImpossible causes an error, do not leave Rounded/Inexact
         # ignored in the calling function.
-        context = context.copy()
+        context = context._shallow_copy()
         flags = context._ignore_flags(Rounded, Inexact)
         #keep DivisionImpossible flags
         (side, r) = self.__divmod__(other, context=context)
@@ -1367,7 +1369,7 @@
             context._regard_flags(*flags)
             return r
 
-        context = context.copy()
+        context = context._shallow_copy()
         rounding = context._set_rounding_decision(NEVER_ROUND)
 
         if other._sign:
@@ -1600,7 +1602,7 @@
         #Now we've got the rounding function
 
         if prec != context.prec:
-            context = context.copy()
+            context = context._shallow_copy()
             context.prec = prec
         ans = this_function(prec, expdiff, context)
         context._raise_error(Rounded)
@@ -1738,7 +1740,7 @@
 
         mul = Decimal(self)
         val = Decimal(1)
-        context = context.copy()
+        context = context._shallow_copy()
         context.prec = firstprec + elength + 1
         rounding = context.rounding
         if n < 0:
@@ -1938,7 +1940,7 @@
         else:
             tmp._exp = 0
 
-        context = context.copy()
+        context = context._shallow_copy()
         flags = context._ignore_all_flags()
         firstprec = context.prec
         context.prec = 3
@@ -2166,12 +2168,19 @@
         for flag in self.flags:
             self.flags[flag] = 0
 
-    def copy(self):
-        """Returns a copy from self."""
+    def _shallow_copy(self):
+        """Returns a shallow copy from self."""
         nc = Context(self.prec, self.rounding, self.traps, self.flags,
                          self._rounding_decision, self.Emin, self.Emax,
                          self.capitals, self._clamp, self._ignored_flags)
         return nc
+
+    def copy(self):
+        """Returns a deep copy from self."""
+        nc = Context(self.prec, self.rounding, self.traps.copy(), self.flags.copy(),
+                         self._rounding_decision, self.Emin, self.Emax,
+                         self.capitals, self._clamp, self._ignored_flags)
+        return nc
     __copy__ = copy
 
     def _raise_error(self, condition, explanation = None, *args):
@@ -2233,7 +2242,7 @@
         Sets the rounding decision, and returns the current (previous)
         rounding decision.  Often used like:
 
-        context = context.copy()
+        context = context._shallow_copy()
         # That so you don't change the calling context
         # if an error occurs in the middle (say DivisionImpossible is raised).
 
