Index: trac/tests/config.py
===================================================================
--- trac/tests/config.py	(revision 8199)
+++ trac/tests/config.py	(working copy)
@@ -244,7 +244,18 @@
         finally:
             os.remove(sitename)
 
+    def test_read_option_from_descriptor(self):
+        config = self._read()
+        Option('a', 'option', 'x')
+        self.assertEqual('x', config.get('a', 'option'))
 
+    def test_iterate_option_from_descriptor(self):
+        config = self._read()
+        Option('a', 'option', 'x')
+        self.assertTrue('option' in config['a'])
+        options = config['a'].options()
+        self.assertEqual(('option', 'x'), options.next())
+        
 def suite():
     return unittest.makeSuite(ConfigurationTestCase, 'test')
 
Index: trac/config.py
===================================================================
--- trac/config.py	(revision 8199)
+++ trac/config.py	(working copy)
@@ -253,8 +253,10 @@
         if self.config.parser.has_option(self.name, name):
             return True
         if self.config.parent:
-            return name in self.config.parent[self.name]
-        return False
+            if name in self.config.parent[self.name]:
+                return True
+        return name in [op for sec, op in Option.registry
+                        if sec == self.name]
 
     def __iter__(self):
         options = set()
@@ -265,21 +267,35 @@
         if self.config.parent:
             for option in self.config.parent[self.name]:
                 if option.lower() not in options:
+                    options.add(option.lower())
                     yield option
+        for option in [op for sec, op in Option.registry if sec == self.name]:
+            if option.lower() not in options:
+                options.add(option.lower())
+                yield option           
 
     def __repr__(self):
         return '<Section [%s]>' % (self.name)
 
+    def _get(self, name):
+        """Iterates through .ini inheritance hierarchy and 
+        returns value of specified option if found. Otherwise
+        returns None. 
+        """
+        if self.config.parser.has_option(self.name, name):
+            return self.config.parser.get(self.name, name)
+        elif self.config.parent:
+            return self.config.parent[self.name]._get(name)
+        return None      
+
     def get(self, name, default=''):
         """Return the value of the specified option.
         
         Valid default input is a string. Returns a string.
         """
-        if self.config.parser.has_option(self.name, name):
-            value = self.config.parser.get(self.name, name)
-        elif self.config.parent:
-            value = self.config.parent[self.name].get(name, default)
-        else:
+        value = self._get(name)
+
+        if not value:
             option = Option.registry.get((self.name, name))
             if option:
                 value = option.default or default

