items():  New method, provided by Gustavo Niemeyer in SF bug #545096.
diff --git a/Doc/lib/libcfgparser.tex b/Doc/lib/libcfgparser.tex
index c50b456..956de15 100644
--- a/Doc/lib/libcfgparser.tex
+++ b/Doc/lib/libcfgparser.tex
@@ -189,6 +189,13 @@
 cause it to raise \exception{ValueError}.
 \end{methoddesc}
 
+\begin{methoddesc}{items}{section\optional{, raw\optional{, vars}}}
+Create a generator which will return a tuple \code{(name, value)} for
+each option in the given \var{section}. Optional arguments have the
+same meaning as for the \code{get()} method.
+\versionadded{2.3}
+\end{methoddesc}
+
 \begin{methoddesc}{set}{section, option, value}
 If the given section exists, set the given option to the specified value;
 otherwise raise \exception{NoSectionError}.
diff --git a/Lib/ConfigParser.py b/Lib/ConfigParser.py
index 327f9ea..47243fb 100644
--- a/Lib/ConfigParser.py
+++ b/Lib/ConfigParser.py
@@ -70,6 +70,10 @@
         insensitively defined as 0, false, no, off for 0, and 1, true,
         yes, on for 1).  Returns 0 or 1.
 
+    items(section, raw=0, vars=None)
+        return a list of tuples with (name, value) for each option
+        in the section.
+
     remove_section(section)
         remove the given file section and all its options
 
@@ -278,6 +282,35 @@
             return value
         return self._interpolate(section, option, value, d)
 
+    def items(self, section, raw=0, vars=None):
+        """Return a list of tuples with (name, value) for each option
+        in the section.
+
+        All % interpolations are expanded in the return values, based on the
+        defaults passed into the constructor, unless the optional argument
+        `raw' is true.  Additional substitutions may be provided using the
+        `vars' argument, which must be a dictionary whose contents overrides
+        any pre-existing defaults.
+
+        The section DEFAULT is special.
+        """
+        d = self.__defaults.copy()
+        try:
+            d.update(self.__sections[section])
+        except KeyError:
+            if section != DEFAULTSECT:
+                raise NoSectionError(section)
+        # Update with the entry specific variables
+        if vars:
+            d.update(vars)
+        if raw:
+            for option in self.options(section):
+                yield (option, d[option])
+        else:
+            for option in self.options(section):
+                yield (option,
+                       self._interpolate(section, option, d[option], d))
+
     def _interpolate(self, section, option, rawval, vars):
         # do the string interpolation
         value = rawval