diff --git a/scripts/Python/interface/SBFrame.i b/scripts/Python/interface/SBFrame.i
index 3a6e799..c718073 100644
--- a/scripts/Python/interface/SBFrame.i
+++ b/scripts/Python/interface/SBFrame.i
@@ -203,6 +203,34 @@
     FindVariable (const char *var_name, lldb::DynamicValueType use_dynamic);
 
     %feature("docstring", "
+    /// Get a lldb.SBValue for a variable path. 
+    ///
+    /// Variable paths can include access to pointer or instance members:
+    ///     rect_ptr->origin.y
+    ///     pt.x
+    /// Pointer dereferences:
+    ///     *this->foo_ptr
+    ///     **argv
+    /// Address of:
+    ///     &pt
+    ///     &my_array[3].x
+    /// Array accesses and treating pointers as arrays:
+    ///     int_array[1]
+    ///     pt_ptr[22].x
+    ///
+    /// Unlike EvaluateExpression() which returns lldb.SBValue objects
+    /// with constant copies of the values at the time of evaluation,
+    /// the result of this function is a value that will continue to
+    /// track the current value of the value as execution progresses
+    /// in the current frame.
+    ") GetValueForVariablePath;
+    lldb::SBValue
+    GetValueForVariablePath (const char *var_path);
+             
+    lldb::SBValue
+    GetValueForVariablePath (const char *var_path, lldb::DynamicValueType use_dynamic);
+
+    %feature("docstring", "
     /// Find variables, register sets, registers, or persistent variables using
     /// the frame as the scope.
     ///
@@ -219,6 +247,23 @@
     GetDescription (lldb::SBStream &description);
     
     %pythoncode %{
+        def get_all_variables(self):
+            return self.GetVariables(True,True,True,True)
+
+        def get_arguments(self):
+            return self.GetVariables(True,False,False,False)
+
+        def get_locals(self):
+            return self.GetVariables(False,True,False,False)
+
+        def get_statics(self):
+            return self.GetVariables(False,False,True,False)
+
+        def var(self, var_expr_path):
+            '''Calls through to lldb.SBFrame.GetValueForVariablePath() and returns 
+            a value that represents the variable expression path'''
+            return self.GetValueForVariablePath(var_expr_path)
+
         __swig_getmethods__["pc"] = GetPC
         __swig_setmethods__["pc"] = SetPC
         if _newclass: x = property(GetPC, SetPC)
@@ -265,6 +310,30 @@
         __swig_getmethods__["idx"] = GetFrameID
         if _newclass: x = property(GetFrameID, None)
 
+        __swig_getmethods__["variables"] = get_all_variables
+        if _newclass: x = property(get_all_variables, None)
+
+        __swig_getmethods__["vars"] = get_all_variables
+        if _newclass: x = property(get_all_variables, None)
+
+        __swig_getmethods__["locals"] = get_locals
+        if _newclass: x = property(get_locals, None)
+
+        __swig_getmethods__["args"] = get_arguments
+        if _newclass: x = property(get_arguments, None)
+
+        __swig_getmethods__["arguments"] = get_arguments
+        if _newclass: x = property(get_arguments, None)
+
+        __swig_getmethods__["statics"] = get_statics
+        if _newclass: x = property(get_statics, None)
+
+        __swig_getmethods__["registers"] = GetRegisters
+        if _newclass: x = property(GetRegisters, None)
+
+        __swig_getmethods__["regs"] = GetRegisters
+        if _newclass: x = property(GetRegisters, None)
+
     %}
 };
 
diff --git a/scripts/Python/interface/SBValue.i b/scripts/Python/interface/SBValue.i
index 1f13a37..b1c2405 100644
--- a/scripts/Python/interface/SBValue.i
+++ b/scripts/Python/interface/SBValue.i
@@ -436,6 +436,19 @@
         __swig_getmethods__["num_children"] = GetNumChildren
         if _newclass: x = property(GetNumChildren, None)
 
+        __swig_getmethods__["unsigned"] = GetValueAsUnsigned
+        if _newclass: x = property(GetValueAsUnsigned, None)
+
+        __swig_getmethods__["signed"] = GetValueAsSigned
+        if _newclass: x = property(GetValueAsSigned, None)
+
+        def get_expr_path(self):
+            s = SBStream()
+            self.GetExpressionPath (s)
+            return s.GetData()
+        
+        __swig_getmethods__["path"] = get_expr_path
+        if _newclass: x = property(get_expr_path, None)
     %}
 
 };
diff --git a/scripts/Python/interface/SBValueList.i b/scripts/Python/interface/SBValueList.i
index afd4891..1bc9049 100644
--- a/scripts/Python/interface/SBValueList.i
+++ b/scripts/Python/interface/SBValueList.i
@@ -96,6 +96,43 @@
 
     lldb::SBValue
     FindValueObjectByUID (lldb::user_id_t uid);
+    %pythoncode %{
+        def __len__(self):
+            return self.GetSize()
+        
+        def __getitem__(self, key):
+            count = len(self)
+            #------------------------------------------------------------
+            # Access with "int" to get Nth item in the list
+            #------------------------------------------------------------
+            if type(key) is int:
+                if key < count:
+                    return self.GetValueAtIndex(key)
+            #------------------------------------------------------------
+            # Access with "str" to get values by name
+            #------------------------------------------------------------
+            elif type(key) is str:
+                matches = []
+                for idx in range(count):
+                    value = self.GetValueAtIndex(idx)
+                    if value.name == key:
+                        matches.append(value)
+                return matches
+            #------------------------------------------------------------
+            # Match with regex
+            #------------------------------------------------------------
+            elif isinstance(key, type(re.compile('.'))):
+                matches = []
+                for idx in range(count):
+                    value = self.GetValueAtIndex(idx)
+                    re_match = key.search(value.name)
+                    if re_match:
+                        matches.append(value)
+                return matches
+
+    %}
+
+
 };
 
 } // namespace lldb
