diff --git a/Doc/lib/libdecimal.tex b/Doc/lib/libdecimal.tex
index b6164fc..a00feb3 100644
--- a/Doc/lib/libdecimal.tex
+++ b/Doc/lib/libdecimal.tex
@@ -112,7 +112,7 @@
 >>> from decimal import *
 >>> getcontext()
 Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999999, Emax=999999999,
-        setflags=[], settraps=[])
+        capitals=1, flags=[], traps=[])
 
 >>> getcontext().prec = 7
 \end{verbatim}
@@ -204,10 +204,10 @@
 >>> myothercontext = Context(prec=60, rounding=ROUND_HALF_DOWN)
 >>> myothercontext
 Context(prec=60, rounding=ROUND_HALF_DOWN, Emin=-999999999, Emax=999999999,
-        setflags=[], settraps=[])
+        capitals=1, flags=[], traps=[])
 >>> ExtendedContext
 Context(prec=9, rounding=ROUND_HALF_EVEN, Emin=-999999999, Emax=999999999,
-        setflags=[], settraps=[])
+        capitals=1, flags=[], traps=[])
 >>> setcontext(myothercontext)
 >>> Decimal(1) / Decimal(7)
 Decimal("0.142857142857142857142857142857142857142857142857142857142857")
@@ -236,21 +236,21 @@
 Decimal("3.14159292")
 >>> getcontext()
 Context(prec=9, rounding=ROUND_HALF_EVEN, Emin=-999999999, Emax=999999999,
-        setflags=['Inexact', 'Rounded'], settraps=[])
+        capitals=1, flags=[Inexact, Rounded], traps=[])
 \end{verbatim}
 
-The \var{setflags} entry shows that the rational approximation to
+The \var{flags} entry shows that the rational approximation to
 \constant{Pi} was rounded (digits beyond the context precision were thrown
 away) and that the result is inexact (some of the discarded digits were
 non-zero).
 
-Individual traps are set using the dictionary in the \member{trap_enablers}
+Individual traps are set using the dictionary in the \member{traps}
 field of a context:
 
 \begin{verbatim}
 >>> Decimal(1) / Decimal(0)
 Decimal("Infinity")
->>> getcontext().trap_enablers[DivisionByZero] = 1
+>>> getcontext().traps[DivisionByZero] = 1
 >>> Decimal(1) / Decimal(0)
 
 Traceback (most recent call last):
@@ -264,14 +264,14 @@
 
 \begin{verbatim}
 >>> getcontext.clear_flags()
->>> for sig in getcontext().trap_enablers:
-...     getcontext().trap_enablers[sig] = 1
+>>> for sig in getcontext().traps:
+...     getcontext().traps[sig] = 1
 
->>> getcontext().trap_enablers.update({Rounded:0, Inexact:0, Subnormal:0})
+>>> getcontext().traps.update({Rounded:0, Inexact:0, Subnormal:0})
 >>> getcontext()
 Context(prec=9, rounding=ROUND_HALF_EVEN, Emin=-999999999, Emax=999999999,
-        setflags=[], settraps=['Clamped', 'Underflow', 'InvalidOperation',
-        'DivisionByZero', 'Overflow'])
+        capitals=1, flags=[], traps=[Clamped, Underflow,
+        InvalidOperation, DivisionByZero, Overflow])
 \end{verbatim}
 
 Applications typically set the context once at the beginning of a program
@@ -489,7 +489,7 @@
 In addition to the three supplied contexts, new contexts can be created
 with the \class{Context} constructor.
 
-\begin{classdesc}{Context}{prec=None, rounding=None, trap_enablers=None,
+\begin{classdesc}{Context}{prec=None, rounding=None, traps=None,
         flags=None, Emin=None, Emax=None, capitals=1}
   Creates a new context.  If a field is not specified or is \constant{None},
   the default values are copied from the \constant{DefaultContext}.  If the
@@ -508,7 +508,7 @@
       \constant{ROUND_HALF_UP} (away from zero), or
       \constant{ROUND_UP} (away from zero).
 
-  The \var{trap_enablers} and \var{flags} fields are mappings from signals
+  The \var{traps} and \var{flags} fields are mappings from signals
   to either \constant{0} or \constant{1}.
 
   The \var{Emin} and \var{Emax} fields are integers specifying the outer
@@ -839,7 +839,7 @@
 # Set applicationwide defaults for all threads about to be launched
 DefaultContext.prec=12
 DefaultContext.rounding=ROUND_DOWN
-DefaultContext.trap_enablers=dict.fromkeys(Signals, 0)
+DefaultContext.traps=dict.fromkeys(Signals, 0)
 setcontext(DefaultContext)
 
 # Now start all of the threads
diff --git a/Lib/decimal.py b/Lib/decimal.py
index d9c3f10..85e0f34 100644
--- a/Lib/decimal.py
+++ b/Lib/decimal.py
@@ -70,7 +70,7 @@
 -Infinity
 >>> print dig / 0
 Infinity
->>> getcontext().trap_enablers[DivisionByZero] = 1
+>>> getcontext().traps[DivisionByZero] = 1
 >>> print dig / 0
 Traceback (most recent call last):
   ...
@@ -78,12 +78,12 @@
   ...
 DivisionByZero: x / 0
 >>> c = Context()
->>> c.trap_enablers[InvalidOperation] = 0
+>>> c.traps[InvalidOperation] = 0
 >>> print c.flags[InvalidOperation]
 0
 >>> c.divide(Decimal(0), Decimal(0))
 Decimal("NaN")
->>> c.trap_enablers[InvalidOperation] = 1
+>>> c.traps[InvalidOperation] = 1
 >>> print c.flags[InvalidOperation]
 1
 >>> c.flags[InvalidOperation] = 0
@@ -98,7 +98,7 @@
 >>> print c.flags[InvalidOperation]
 1
 >>> c.flags[InvalidOperation] = 0
->>> c.trap_enablers[InvalidOperation] = 0
+>>> c.traps[InvalidOperation] = 0
 >>> print c.divide(Decimal(0), Decimal(0))
 NaN
 >>> print c.flags[InvalidOperation]
@@ -495,7 +495,11 @@
             self._int  = value._int
             return
 
-        raise TypeError("Can't convert %r" % value)
+        if isinstance(value, float):
+            raise TypeError("Cannot convert float to Decimal.  " +
+                            "First convert the float to a string")
+
+        raise TypeError("Cannot convert %r" % value)
 
     def _convert_other(self, other):
         """Convert other to Decimal.
@@ -2096,7 +2100,7 @@
     prec - precision (for use in rounding, division, square roots..)
     rounding - rounding type. (how you round)
     _rounding_decision - ALWAYS_ROUND, NEVER_ROUND -- do you round?
-    trap_enablers - If trap_enablers[exception] = 1, then the exception is
+    traps - If traps[exception] = 1, then the exception is
                     raised when it is caused.  Otherwise, a value is
                     substituted in.
     flags  - When an exception is caused, flags[exception] is incremented.
@@ -2110,13 +2114,15 @@
     """
 
     def __init__(self, prec=None, rounding=None,
-                 trap_enablers=None, flags=None,
+                 traps=None, flags=[],
                  _rounding_decision=None,
                  Emin=None, Emax=None,
                  capitals=None, _clamp=0,
                  _ignored_flags=[]):
-        if flags is None:
-            flags = dict.fromkeys(Signals, 0)
+        if not isinstance(flags, dict):
+            flags = dict([(s,s in flags) for s in Signals])
+        if traps is not None and not isinstance(traps, dict):
+            traps = dict([(s,s in traps) for s in Signals])
         for name, val in locals().items():
             if val is None:
                 setattr(self, name, copy.copy(getattr(DefaultContext, name)))
@@ -2125,11 +2131,11 @@
         del self.self
 
     def __repr__(self):
-        """Show the current context in readable form, not in a form for eval()."""
+        """Show the current context."""
         s = []
-        s.append('Context(prec=%(prec)d, rounding=%(rounding)s, Emin=%(Emin)d, Emax=%(Emax)d' % vars(self))
-        s.append('setflags=%r' % [f.__name__ for f, v in self.flags.items() if v])
-        s.append('settraps=%r' % [t.__name__ for t, v in self.trap_enablers.items() if v])
+        s.append('Context(prec=%(prec)d, rounding=%(rounding)s, Emin=%(Emin)d, Emax=%(Emax)d, capitals=%(capitals)d' % vars(self))
+        s.append('flags=[' + ', '.join([f.__name__ for f, v in self.flags.items() if v]) + ']')
+        s.append('traps=[' + ', '.join([t.__name__ for t, v in self.traps.items() if v]) + ']')
         return ', '.join(s) + ')'
 
     def clear_flags(self):
@@ -2139,7 +2145,7 @@
 
     def copy(self):
         """Returns a copy from self."""
-        nc = Context(self.prec, self.rounding, self.trap_enablers, self.flags,
+        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
@@ -2159,7 +2165,7 @@
             return error().handle(self, *args)
 
         self.flags[error] += 1
-        if not self.trap_enablers[error]:
+        if not self.traps[error]:
             #The errors define how to handle themselves.
             return condition().handle(self, *args)
 
@@ -2946,13 +2952,10 @@
 # The default context prototype used by Context()
 # Is mutable, so than new contexts can have different default values
 
-_default_traps = dict.fromkeys(Signals, 0)
-_default_traps.update({DivisionByZero:1, Overflow:1, InvalidOperation:1})
-
 DefaultContext = Context(
         prec=28, rounding=ROUND_HALF_EVEN,
-        trap_enablers=_default_traps,
-        flags=None,
+        traps=[DivisionByZero, Overflow, InvalidOperation],
+        flags=[],
         _rounding_decision=ALWAYS_ROUND,
         Emax=DEFAULT_MAX_EXPONENT,
         Emin=DEFAULT_MIN_EXPONENT,
@@ -2964,20 +2967,17 @@
 # contexts and be able to reproduce results from other implementations
 # of the spec.
 
-_basic_traps = dict.fromkeys(Signals, 1)
-_basic_traps.update({Inexact:0, Rounded:0, Subnormal:0})
-
 BasicContext = Context(
         prec=9, rounding=ROUND_HALF_UP,
-        trap_enablers=_basic_traps,
-        flags=None,
+        traps=[DivisionByZero, Overflow, InvalidOperation, Clamped, Underflow],
+        flags=[],
         _rounding_decision=ALWAYS_ROUND,
 )
 
 ExtendedContext = Context(
         prec=9, rounding=ROUND_HALF_EVEN,
-        trap_enablers=dict.fromkeys(Signals, 0),
-        flags=None,
+        traps=[],
+        flags=[],
         _rounding_decision=ALWAYS_ROUND,
 )
 
diff --git a/Lib/test/test_decimal.py b/Lib/test/test_decimal.py
index dc202f3..6354063 100644
--- a/Lib/test/test_decimal.py
+++ b/Lib/test/test_decimal.py
@@ -38,7 +38,7 @@
 # Tests are built around these assumed context defaults
 DefaultContext.prec=9
 DefaultContext.rounding=ROUND_HALF_EVEN
-DefaultContext.trap_enablers=dict.fromkeys(Signals, 0)
+DefaultContext.traps=dict.fromkeys(Signals, 0)
 setcontext(DefaultContext)
 
 
@@ -105,8 +105,8 @@
     def setUp(self):
         global dir
         self.context = Context()
-        for key in DefaultContext.trap_enablers.keys():
-            DefaultContext.trap_enablers[key] = 1
+        for key in DefaultContext.traps.keys():
+            DefaultContext.traps[key] = 1
         self.ignore_list = ['#']
         # Basically, a # means return NaN InvalidOperation.
         # Different from a sNaN in trim
@@ -120,8 +120,8 @@
     def tearDown(self):
         """Cleaning up enviroment."""
         # leaving context in original state
-        for key in DefaultContext.trap_enablers.keys():
-            DefaultContext.trap_enablers[key] = 0
+        for key in DefaultContext.traps.keys():
+            DefaultContext.traps[key] = 0
         return
 
     def eval_file(self, file):
@@ -205,9 +205,9 @@
         theirexceptions = [ErrorNames[x.lower()] for x in exceptions]
 
         for exception in Signals:
-            self.context.trap_enablers[exception] = 1 #Catch these bugs...
+            self.context.traps[exception] = 1 #Catch these bugs...
         for exception in theirexceptions:
-            self.context.trap_enablers[exception] = 0
+            self.context.traps[exception] = 0
         for i, val in enumerate(valstemp):
             if val.count("'") % 2 == 1:
                 quote = 1 - quote
@@ -221,7 +221,7 @@
             if fname in ('to_sci_string', 'to_eng_string'):
                 if EXTENDEDERRORTEST:
                     for error in theirexceptions:
-                        self.context.trap_enablers[error] = 1
+                        self.context.traps[error] = 1
                         try:
                             funct(self.context.create_decimal(v))
                         except error:
@@ -231,7 +231,7 @@
                                       (e, s, error))
                         else:
                             self.fail("Did not raise %s in %s" % (error, s))
-                        self.context.trap_enablers[error] = 0
+                        self.context.traps[error] = 0
                 v = self.context.create_decimal(v)
             else:
                 v = Decimal(v)
@@ -241,7 +241,7 @@
 
         if EXTENDEDERRORTEST and fname not in ('to_sci_string', 'to_eng_string'):
             for error in theirexceptions:
-                self.context.trap_enablers[error] = 1
+                self.context.traps[error] = 1
                 try:
                     funct(*vals)
                 except error:
@@ -251,7 +251,7 @@
                               (e, s, error))
                 else:
                     self.fail("Did not raise %s in %s" % (error, s))
-                self.context.trap_enablers[error] = 0
+                self.context.traps[error] = 0
         try:
             result = str(funct(*vals))
             if fname == 'same_quantum':
@@ -263,7 +263,7 @@
             raise
 
         myexceptions = self.getexceptions()
-        self.resetflags()
+        self.context.clear_flags()
 
         myexceptions.sort()
         theirexceptions.sort()
@@ -282,10 +282,6 @@
                 L.append(exception)
         return L
 
-    def resetflags(self):
-        for exception in Signals:
-            self.context.flags[exception] = 0
-
     def change_precision(self, prec):
         self.context.prec = prec
     def change_rounding_method(self, rounding):
