diff --git a/scripts/Python/interface/SBBlock.i b/scripts/Python/interface/SBBlock.i
index 83895ed..cdaf62c 100644
--- a/scripts/Python/interface/SBBlock.i
+++ b/scripts/Python/interface/SBBlock.i
@@ -89,6 +89,87 @@
 
     bool
     GetDescription (lldb::SBStream &description);
+
+    lldb::SBValueList
+    GetVariables (lldb::SBFrame& frame,
+                  bool arguments,
+                  bool locals,
+                  bool statics,
+                  lldb::DynamicValueType use_dynamic);
+
+     lldb::SBValueList
+     GetVariables (lldb::SBTarget& target,
+                   bool arguments,
+                   bool locals,
+                   bool statics);
+
+    %pythoncode %{
+        def get_range_at_index(self, idx):
+            if idx < self.GetNumRanges():
+                return [self.sbblock.GetRangeStartAddress(key), self.sbblock.GetRangeEndAddress(key)]
+            return []
+
+        class ranges_access(object):
+            '''A helper object that will lazily hand out an array of lldb.SBAddress that represent address ranges for a block.'''
+            def __init__(self, sbblock):
+                self.sbblock = sbblock
+        
+            def __len__(self):
+                if self.sbblock:
+                    return self.sbblock.GetNumRanges()
+                return 0
+        
+            def __getitem__(self, key):
+                count = len(self)
+                if type(key) is int:
+                    return self.sbblock.get_range_at_index (key);
+                else:
+                    print "error: unsupported item type: %s" % type(key)
+                return None
+        
+        def get_ranges_access_object(self):
+            '''An accessor function that returns a ranges_access() object which allows lazy block address ranges access.'''
+            return self.ranges_access (self)
+        
+        def get_ranges_array(self):
+            '''An accessor function that returns an array object that contains all ranges in this block object.'''
+            if not hasattr(self, 'ranges'):
+                self.ranges = []
+                for idx in range(self.num_ranges):
+                    self.ranges.append (self.get_range_at_index (idx))
+            return self.ranges
+        
+        def get_call_site(self):
+            return declaration(self.GetInlinedCallSiteFile(), self.GetInlinedCallSiteLine(), self.GetInlinedCallSiteColumn())
+
+        __swig_getmethods__["parent"] = GetParent
+        if _newclass: x = property(GetParent, None)
+
+        __swig_getmethods__["first_child"] = GetFirstChild
+        if _newclass: x = property(GetFirstChild, None)
+        
+        __swig_getmethods__["call_site"] = get_call_site
+        if _newclass: x = property(get_call_site, None)
+        
+        __swig_getmethods__["sibling"] = GetSibling
+        if _newclass: x = property(GetSibling, None)
+
+        __swig_getmethods__["name"] = GetInlinedName
+        if _newclass: x = property(GetInlinedName, None)
+
+        __swig_getmethods__["inlined_block"] = GetContainingInlinedBlock
+        if _newclass: x = property(GetContainingInlinedBlock, None)
+
+        __swig_getmethods__["range"] = get_ranges_access_object
+        if _newclass: x = property(get_ranges_access_object, None)
+
+        __swig_getmethods__["ranges"] = get_ranges_array
+        if _newclass: x = property(get_ranges_array, None)
+
+        __swig_getmethods__["num_ranges"] = GetNumRanges
+        if _newclass: x = property(GetNumRanges, None)
+    %}
+
 };
 
 } // namespace lldb
diff --git a/scripts/Python/interface/SBFunction.i b/scripts/Python/interface/SBFunction.i
index 37b957f..e259490 100644
--- a/scripts/Python/interface/SBFunction.i
+++ b/scripts/Python/interface/SBFunction.i
@@ -65,15 +65,21 @@
     lldb::SBInstructionList
     GetInstructions (lldb::SBTarget target);
 
-    SBAddress
+    lldb::SBAddress
     GetStartAddress ();
 
-    SBAddress
+    lldb::SBAddress
     GetEndAddress ();
 
     uint32_t
     GetPrologueByteSize ();
 
+    lldb::SBType
+    GetType ();
+
+    lldb::SBBlock
+    GetBlock ();
+
     bool
     GetDescription (lldb::SBStream &description);
     
@@ -81,24 +87,29 @@
         def get_instructions_from_current_target (self):
             return self.GetInstructions (target)
 
-        __swig_getmethods__["name"] = GetName
-        if _newclass: x = property(GetName, None)
-        
-        __swig_getmethods__["mangled"] = GetMangledName
-        if _newclass: x = property(GetMangledName, None)
-        
         __swig_getmethods__["addr"] = GetStartAddress
         if _newclass: x = property(GetStartAddress, None)
-        
+
+        __swig_getmethods__["block"] = GetBlock
+        if _newclass: x = property(GetBlock, None)
+
         __swig_getmethods__["end_addr"] = GetEndAddress
         if _newclass: x = property(GetEndAddress, None)
         
-        __swig_getmethods__["prologue_size"] = GetPrologueByteSize
-        if _newclass: x = property(GetPrologueByteSize, None)
-
         __swig_getmethods__["instructions"] = get_instructions_from_current_target
         if _newclass: x = property(get_instructions_from_current_target, None)
 
+        __swig_getmethods__["mangled"] = GetMangledName
+        if _newclass: x = property(GetMangledName, None)
+
+        __swig_getmethods__["name"] = GetName
+        if _newclass: x = property(GetName, None)
+
+        __swig_getmethods__["prologue_size"] = GetPrologueByteSize
+        if _newclass: x = property(GetPrologueByteSize, None)
+
+        __swig_getmethods__["type"] = GetType
+        if _newclass: x = property(GetType, None)
     %}
 
 };
diff --git a/scripts/Python/interface/SBModule.i b/scripts/Python/interface/SBModule.i
index dc8f674..44d3a86 100644
--- a/scripts/Python/interface/SBModule.i
+++ b/scripts/Python/interface/SBModule.i
@@ -192,23 +192,14 @@
     ///     C++ methods, or ObjC selectors. 
     ///     See FunctionNameType for more details.
     ///
-    /// @param[in] append
-    ///     If true, any matches will be appended to \a sc_list, else
-    ///     matches replace the contents of \a sc_list.
-    ///
-    /// @param[out] sc_list
+    /// @return
     ///     A symbol context list that gets filled in with all of the
     ///     matches.
-    ///
-    /// @return
-    ///     The number of matches added to \a sc_list.
     //------------------------------------------------------------------
     ") FindFunctions;
-    uint32_t
+    lldb::SBSymbolContextList
     FindFunctions (const char *name, 
-                   uint32_t name_type_mask, // Logical OR one or more FunctionNameType enum bits
-                   bool append, 
-                   lldb::SBSymbolContextList& sc_list);
+                   uint32_t name_type_mask = lldb::eFunctionNameTypeAny);
     
     lldb::SBType
     FindFirstType (const char* name);
diff --git a/scripts/Python/interface/SBSymbolContext.i b/scripts/Python/interface/SBSymbolContext.i
index 5f29e8e..4bf7fe3 100644
--- a/scripts/Python/interface/SBSymbolContext.i
+++ b/scripts/Python/interface/SBSymbolContext.i
@@ -79,6 +79,34 @@
 
     bool
     GetDescription (lldb::SBStream &description);
+    
+    
+    %pythoncode %{
+        __swig_getmethods__["module"] = GetModule
+        __swig_setmethods__["module"] = SetModule
+        if _newclass: x = property(GetModule, SetModule)
+
+        __swig_getmethods__["compile_unit"] = GetCompileUnit
+        __swig_setmethods__["compile_unit"] = SetCompileUnit
+        if _newclass: x = property(GetCompileUnit, SetCompileUnit)
+
+        __swig_getmethods__["function"] = GetFunction
+        __swig_setmethods__["function"] = SetFunction
+        if _newclass: x = property(GetFunction, SetFunction)
+
+        __swig_getmethods__["block"] = GetBlock
+        __swig_setmethods__["block"] = SetBlock
+        if _newclass: x = property(GetBlock, SetBlock)
+            
+        __swig_getmethods__["symbol"] = GetSymbol
+        __swig_setmethods__["symbol"] = SetSymbol
+        if _newclass: x = property(GetSymbol, SetSymbol)
+
+        __swig_getmethods__["line_entry"] = GetLineEntry
+        __swig_setmethods__["line_entry"] = SetLineEntry
+        if _newclass: x = property(GetLineEntry, SetLineEntry)
+    %}
+
 };
 
 } // namespace lldb
diff --git a/scripts/Python/interface/SBSymbolContextList.i b/scripts/Python/interface/SBSymbolContextList.i
index 6ea5978..0a03a22 100644
--- a/scripts/Python/interface/SBSymbolContextList.i
+++ b/scripts/Python/interface/SBSymbolContextList.i
@@ -49,7 +49,92 @@
     GetContextAtIndex (uint32_t idx);
 
     void
+    Append (lldb::SBSymbolContext &sc);
+    
+    void
+    Append (lldb::SBSymbolContextList &sc_list);
+
+    bool
+    GetDescription (lldb::SBStream &description);
+
+    void
     Clear();
+    
+    %pythoncode %{
+        def __len__(self):
+            return self.GetSize()
+
+        def __getitem__(self, key):
+            count = len(self)
+            if type(key) is int:
+                if key < count:
+                    return self.GetContextAtIndex(key)
+                else:
+                    raise IndexError
+            raise TypeError
+        
+        def get_module_array(self):
+            a = []
+            for i in range(len(self)):
+                obj = self.GetContextAtIndex(i).module
+                if obj:
+                    a.append(obj)
+            return a
+            
+        def get_compile_unit_array(self):
+            a = []
+            for i in range(len(self)):
+                obj = self.GetContextAtIndex(i).compile_unit
+                if obj:
+                    a.append(obj)
+            return a
+        def get_function_array(self):
+            a = []
+            for i in range(len(self)):
+                obj = self.GetContextAtIndex(i).function
+                if obj:
+                    a.append(obj)
+            return a
+        def get_block_array(self):
+            a = []
+            for i in range(len(self)):
+                obj = self.GetContextAtIndex(i).block
+                if obj:
+                    a.append(obj)
+            return a
+        def get_symbol_array(self):
+            a = []
+            for i in range(len(self)):
+                obj = self.GetContextAtIndex(i).symbol
+                if obj:
+                    a.append(obj)
+            return a
+        def get_line_entry_array(self):
+            a = []
+            for i in range(len(self)):
+                obj = self.GetContextAtIndex(i).line_entry
+                if obj:
+                    a.append(obj)
+            return a
+        __swig_getmethods__["modules"] = get_module_array
+        if _newclass: x = property(get_module_array, None)
+        
+        __swig_getmethods__["compile_units"] = get_compile_unit_array
+        if _newclass: x = property(get_compile_unit_array, None)
+        
+        __swig_getmethods__["functions"] = get_function_array
+        if _newclass: x = property(get_function_array, None)
+        
+        __swig_getmethods__["blocks"] = get_block_array
+        if _newclass: x = property(get_block_array, None)
+        
+        __swig_getmethods__["line_entries"] = get_line_entry_array
+        if _newclass: x = property(get_line_entry_array, None)
+        
+        __swig_getmethods__["symbols"] = get_symbol_array
+        if _newclass: x = property(get_symbol_array, None)
+    %}
+
 };
 
 } // namespace lldb
diff --git a/scripts/Python/interface/SBTarget.i b/scripts/Python/interface/SBTarget.i
index d917530..58a546b 100644
--- a/scripts/Python/interface/SBTarget.i
+++ b/scripts/Python/interface/SBTarget.i
@@ -348,23 +348,14 @@
     ///     C++ methods, or ObjC selectors. 
     ///     See FunctionNameType for more details.
     ///
-    /// @param[in] append
-    ///     If true, any matches will be appended to \a sc_list, else
-    ///     matches replace the contents of \a sc_list.
-    ///
-    /// @param[out] sc_list
-    ///     A symbol context list that gets filled in with all of the
-    ///     matches.
-    ///
     /// @return
-    ///     The number of matches added to \a sc_list.
+    ///     A lldb::SBSymbolContextList that gets filled in with all of 
+    ///     the symbol contexts for all the matches.
     //------------------------------------------------------------------
     ") FindFunctions;
-    uint32_t
+    lldb::SBSymbolContextList
     FindFunctions (const char *name, 
-                   uint32_t name_type_mask, // Logical OR one or more FunctionNameType enum bits
-                   bool append, 
-                   lldb::SBSymbolContextList& sc_list);
+                   uint32_t name_type_mask = lldb::eFunctionNameTypeAny);
     
     lldb::SBType
     FindFirstType (const char* type);
diff --git a/scripts/Python/python-extensions.swig b/scripts/Python/python-extensions.swig
index c6c12fc..29e39e5 100644
--- a/scripts/Python/python-extensions.swig
+++ b/scripts/Python/python-extensions.swig
@@ -280,6 +280,20 @@
                     return PyString_FromString("");
         }
 }
+%extend lldb::SBSymbolContextList {
+        PyObject *lldb::SBSymbolContextList::__str__ (){
+                lldb::SBStream description;
+                $self->GetDescription (description);
+                const char *desc = description.GetData();
+                size_t desc_len = description.GetSize();
+                if (desc_len > 0 && (desc[desc_len-1] == '\n' || desc[desc_len-1] == '\r'))
+                    --desc_len;
+                if (desc_len > 0)
+                    return PyString_FromStringAndSize (desc, desc_len);
+                else
+                    return PyString_FromString("");
+        }
+}
 %extend lldb::SBTarget {
         PyObject *lldb::SBTarget::__str__ (){
                 lldb::SBStream description;
@@ -389,6 +403,13 @@
 
 %pythoncode %{
 
+class declaration(object):
+    '''A class that represents a source declaration location with file, line and column.'''
+    def __init__(self, file, line, col):
+        self.file = file
+        self.line = line
+        self.col = col
+
 class value(object):
     '''A class designed to wrap lldb.SBValue() objects so the resulting object
     can be used as a variable would be in code. So if you have a Point structure
