diff --git a/include/lldb/API/SBLineEntry.h b/include/lldb/API/SBLineEntry.h
index 651f955..fb7f802 100644
--- a/include/lldb/API/SBLineEntry.h
+++ b/include/lldb/API/SBLineEntry.h
@@ -16,17 +16,8 @@
 
 namespace lldb {
 
-#ifdef SWIG
-%feature("docstring",
-         "Specifies an association with a contiguous range of instructions and"
-         " a source file location. SBCompileUnit contains SBLineEntry(s)."
-         ) SBLineEntry;
-#endif
 class SBLineEntry
 {
-#ifdef SWIG
-    %feature("autodoc", "1");
-#endif
 public:
 
     SBLineEntry ();
diff --git a/include/lldb/API/SBListener.h b/include/lldb/API/SBListener.h
index fd4c97c..0c7ebe5 100644
--- a/include/lldb/API/SBListener.h
+++ b/include/lldb/API/SBListener.h
@@ -16,9 +16,6 @@
 
 class SBListener
 {
-#ifdef SWIG
-    %feature("autodoc", "1");
-#endif
 public:
     SBListener ();
 
diff --git a/include/lldb/API/SBModule.h b/include/lldb/API/SBModule.h
index 79c5752..a762dbf 100644
--- a/include/lldb/API/SBModule.h
+++ b/include/lldb/API/SBModule.h
@@ -16,22 +16,8 @@
 
 namespace lldb {
 
-#ifdef SWIG
-%feature("docstring",
-         "Represents an executable image and its associated object and symbol"
-         " files.\n"
-         "\n"
-         "The module is designed to be able to select a single slice of an\n"
-         "executable image as it would appear on disk and during program\n"
-         "execution."
-         ) SBModule;
-#endif
 class SBModule
 {
-#ifdef SWIG
-    %feature("autodoc", "1");
-#endif
-
 public:
 
     SBModule ();
@@ -48,9 +34,6 @@
     bool
     IsValid () const;
 
-#ifdef SWIG
-    %feature("docstring", "
-#endif
     //------------------------------------------------------------------
     /// Get const accessor for the module file specification.
     ///
@@ -61,15 +44,9 @@
     /// @return
     ///     A const reference to the file specification object.
     //------------------------------------------------------------------
-#ifdef SWIG
-    ") GetFileSpec;
-#endif
     lldb::SBFileSpec
     GetFileSpec () const;
 
-#ifdef SWIG
-    %feature("docstring", "
-#endif
     //------------------------------------------------------------------
     /// Get accessor for the module platform file specification.
     ///
@@ -85,9 +62,6 @@
     /// @return
     ///     A const reference to the file specification object.
     //------------------------------------------------------------------
-#ifdef SWIG
-    ") GetPlatformFileSpec;
-#endif
     lldb::SBFileSpec
     GetPlatformFileSpec () const;
 
@@ -99,11 +73,6 @@
     GetUUIDBytes () const;
 #endif
 
-#ifdef SWIG
-    %feature("docstring",
-             "Returns the UUID of the module as a Python string."
-             ) GetUUIDString;
-#endif
     const char *
     GetUUIDString () const;
 
@@ -133,9 +102,6 @@
     lldb::SBSymbol
     GetSymbolAtIndex (size_t idx);
 
-#ifdef SWIG
-    %feature("docstring", "
-#endif
     //------------------------------------------------------------------
     /// Find functions by name.
     ///
@@ -160,18 +126,12 @@
     /// @return
     ///     The number of matches added to \a sc_list.
     //------------------------------------------------------------------
-#ifdef SWIG
-    ") FindFunctions;
-#endif
     uint32_t
     FindFunctions (const char *name, 
                    uint32_t name_type_mask, // Logical OR one or more FunctionNameType enum bits
                    bool append, 
                    lldb::SBSymbolContextList& sc_list);
 
-#ifdef SWIG
-    %feature("docstring", "
-#endif
     //------------------------------------------------------------------
     /// Find global and static variables by name.
     ///
@@ -188,9 +148,6 @@
     /// @return
     ///     A list of matched variables in an SBValueList.
     //------------------------------------------------------------------
-#ifdef SWIG
-    ") FindGlobalVariables;
-#endif
     lldb::SBValueList
     FindGlobalVariables (lldb::SBTarget &target, 
                          const char *name, 
diff --git a/scripts/Python/interface/SBBreakpoint.i b/scripts/Python/interface/SBBreakpoint.i
index 3c2920a..0ca83bf 100644
--- a/scripts/Python/interface/SBBreakpoint.i
+++ b/scripts/Python/interface/SBBreakpoint.i
@@ -64,12 +64,19 @@
 
         process.Continue()
 
-SBBreakpoint supports breakpoint location iteration. For example,
+SBBreakpoint supports breakpoint location iteration, for example,
 
     for bl in breakpoint:
         print 'breakpoint location load addr: %s' % hex(bl.GetLoadAddress())
         print 'breakpoint location condition: %s' % hex(bl.GetCondition())
-") SBBreakpoint;
+
+and rich comparion methods which allow the API program to use,
+
+    if aBreakpoint == bBreakpoint:
+        ...
+
+to compare two breakpoints for equality."
+) SBBreakpoint;
 class SBBreakpoint
 {
 public:
diff --git a/scripts/Python/interface/SBLineEntry.i b/scripts/Python/interface/SBLineEntry.i
new file mode 100644
index 0000000..18dc6c3
--- /dev/null
+++ b/scripts/Python/interface/SBLineEntry.i
@@ -0,0 +1,50 @@
+//===-- SWIG Interface for SBLineEntry --------------------------*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+namespace lldb {
+
+%feature("docstring",
+"Specifies an association with a contiguous range of instructions and
+a source file location. SBCompileUnit contains SBLineEntry(s).
+
+See also SBCompileUnit for example usage of SBLineEntry API."
+) SBLineEntry;
+class SBLineEntry
+{
+public:
+
+    SBLineEntry ();
+
+    SBLineEntry (const lldb::SBLineEntry &rhs);
+
+    ~SBLineEntry ();
+
+    lldb::SBAddress
+    GetStartAddress () const;
+
+    lldb::SBAddress
+    GetEndAddress () const;
+
+    bool
+    IsValid () const;
+
+    lldb::SBFileSpec
+    GetFileSpec () const;
+
+    uint32_t
+    GetLine () const;
+
+    uint32_t
+    GetColumn () const;
+
+    bool
+    GetDescription (lldb::SBStream &description);
+};
+
+} // namespace lldb
diff --git a/scripts/Python/interface/SBListener.i b/scripts/Python/interface/SBListener.i
new file mode 100644
index 0000000..ded91b9
--- /dev/null
+++ b/scripts/Python/interface/SBListener.i
@@ -0,0 +1,89 @@
+//===-- SWIG Interface for SBListener ---------------------------*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+namespace lldb {
+
+%feature("docstring",
+"API clients can register its own listener to debugger events.
+
+See aslo SBEvent for example usage of creating and adding a listener."
+) SBListener;
+class SBListener
+{
+public:
+    SBListener ();
+
+    SBListener (const char *name);
+
+    SBListener (const SBListener &rhs);
+
+    ~SBListener ();
+
+    void
+    AddEvent (const lldb::SBEvent &event);
+
+    void
+    Clear ();
+
+    bool
+    IsValid () const;
+
+    uint32_t
+    StartListeningForEvents (const lldb::SBBroadcaster& broadcaster,
+                             uint32_t event_mask);
+
+    bool
+    StopListeningForEvents (const lldb::SBBroadcaster& broadcaster,
+                            uint32_t event_mask);
+
+    // Returns true if an event was recieved, false if we timed out.
+    bool
+    WaitForEvent (uint32_t num_seconds,
+                  lldb::SBEvent &event);
+
+    bool
+    WaitForEventForBroadcaster (uint32_t num_seconds,
+                                const lldb::SBBroadcaster &broadcaster,
+                                lldb::SBEvent &sb_event);
+
+    bool
+    WaitForEventForBroadcasterWithType (uint32_t num_seconds,
+                                        const lldb::SBBroadcaster &broadcaster,
+                                        uint32_t event_type_mask,
+                                        lldb::SBEvent &sb_event);
+
+    bool
+    PeekAtNextEvent (lldb::SBEvent &sb_event);
+
+    bool
+    PeekAtNextEventForBroadcaster (const lldb::SBBroadcaster &broadcaster,
+                                   lldb::SBEvent &sb_event);
+
+    bool
+    PeekAtNextEventForBroadcasterWithType (const lldb::SBBroadcaster &broadcaster,
+                                           uint32_t event_type_mask,
+                                           lldb::SBEvent &sb_event);
+
+    bool
+    GetNextEvent (lldb::SBEvent &sb_event);
+
+    bool
+    GetNextEventForBroadcaster (const lldb::SBBroadcaster &broadcaster,
+                                lldb::SBEvent &sb_event);
+
+    bool
+    GetNextEventForBroadcasterWithType (const lldb::SBBroadcaster &broadcaster,
+                                        uint32_t event_type_mask,
+                                        lldb::SBEvent &sb_event);
+
+    bool
+    HandleBroadcastEvent (const lldb::SBEvent &event);
+};
+
+} // namespace lldb
diff --git a/scripts/Python/interface/SBModule.i b/scripts/Python/interface/SBModule.i
new file mode 100644
index 0000000..cea05e7
--- /dev/null
+++ b/scripts/Python/interface/SBModule.i
@@ -0,0 +1,165 @@
+//===-- SWIG Interface for SBModule -----------------------------*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+namespace lldb {
+
+%feature("docstring",
+"Represents an executable image and its associated object and symbol files.
+
+The module is designed to be able to select a single slice of an
+executable image as it would appear on disk and during program
+execution.
+
+You can retrieve SBModule from SBSymbolContext, which in turn is available
+from SBFrame.
+
+SBModule supports symbol iteration, for example,
+
+    for symbol in module:
+        name = symbol.GetName()
+        saddr = symbol.GetStartAddress()
+        eaddr = symbol.GetEndAddress()
+
+and rich comparion methods which allow the API program to use,
+
+    if thisModule == thatModule:
+        print 'This module is the same as that module'
+
+to test module equality."
+) SBModule;
+class SBModule
+{
+public:
+
+    SBModule ();
+
+    SBModule (const SBModule &rhs);
+    
+    ~SBModule ();
+
+    bool
+    IsValid () const;
+
+    %feature("docstring", "
+    //------------------------------------------------------------------
+    /// Get const accessor for the module file specification.
+    ///
+    /// This function returns the file for the module on the host system
+    /// that is running LLDB. This can differ from the path on the 
+    /// platform since we might be doing remote debugging.
+    ///
+    /// @return
+    ///     A const reference to the file specification object.
+    //------------------------------------------------------------------
+    ") GetFileSpec;
+    lldb::SBFileSpec
+    GetFileSpec () const;
+
+    %feature("docstring", "
+    //------------------------------------------------------------------
+    /// Get accessor for the module platform file specification.
+    ///
+    /// Platform file refers to the path of the module as it is known on
+    /// the remote system on which it is being debugged. For local 
+    /// debugging this is always the same as Module::GetFileSpec(). But
+    /// remote debugging might mention a file '/usr/lib/liba.dylib'
+    /// which might be locally downloaded and cached. In this case the
+    /// platform file could be something like:
+    /// '/tmp/lldb/platform-cache/remote.host.computer/usr/lib/liba.dylib'
+    /// The file could also be cached in a local developer kit directory.
+    ///
+    /// @return
+    ///     A const reference to the file specification object.
+    //------------------------------------------------------------------
+    ") GetPlatformFileSpec;
+    lldb::SBFileSpec
+    GetPlatformFileSpec () const;
+
+    bool
+    SetPlatformFileSpec (const lldb::SBFileSpec &platform_file);
+
+    %feature("docstring", "Returns the UUID of the module as a Python string."
+    ) GetUUIDString;
+    const char *
+    GetUUIDString () const;
+
+    bool
+    ResolveFileAddress (lldb::addr_t vm_addr, 
+                        lldb::SBAddress& addr);
+
+    lldb::SBSymbolContext
+    ResolveSymbolContextForAddress (const lldb::SBAddress& addr, 
+                                    uint32_t resolve_scope);
+
+    bool
+    GetDescription (lldb::SBStream &description);
+
+    size_t
+    GetNumSymbols ();
+    
+    lldb::SBSymbol
+    GetSymbolAtIndex (size_t idx);
+
+    %feature("docstring", "
+    //------------------------------------------------------------------
+    /// Find functions by name.
+    ///
+    /// @param[in] name
+    ///     The name of the function we are looking for.
+    ///
+    /// @param[in] name_type_mask
+    ///     A logical OR of one or more FunctionNameType enum bits that
+    ///     indicate what kind of names should be used when doing the
+    ///     lookup. Bits include fully qualified names, base names,
+    ///     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.
+    //------------------------------------------------------------------
+    ") FindFunctions;
+    uint32_t
+    FindFunctions (const char *name, 
+                   uint32_t name_type_mask, // Logical OR one or more FunctionNameType enum bits
+                   bool append, 
+                   lldb::SBSymbolContextList& sc_list);
+
+    %feature("docstring", "
+    //------------------------------------------------------------------
+    /// Find global and static variables by name.
+    ///
+    /// @param[in] target
+    ///     A valid SBTarget instance representing the debuggee.
+    ///
+    /// @param[in] name
+    ///     The name of the global or static variable we are looking
+    ///     for.
+    ///
+    /// @param[in] max_matches
+    ///     Allow the number of matches to be limited to \a max_matches.
+    ///
+    /// @return
+    ///     A list of matched variables in an SBValueList.
+    //------------------------------------------------------------------
+    ") FindGlobalVariables;
+    lldb::SBValueList
+    FindGlobalVariables (lldb::SBTarget &target, 
+                         const char *name, 
+                         uint32_t max_matches);
+};
+
+} // namespace lldb
diff --git a/scripts/lldb.swig b/scripts/lldb.swig
index 4f2cbac..c3760a5 100644
--- a/scripts/lldb.swig
+++ b/scripts/lldb.swig
@@ -215,9 +215,9 @@
 %include "lldb/API/SBInputReader.h"
 %include "lldb/API/SBInstruction.h"
 %include "lldb/API/SBInstructionList.h"
-%include "lldb/API/SBLineEntry.h"
-%include "lldb/API/SBListener.h"
-%include "lldb/API/SBModule.h"
+%include "./Python/interface/SBLineEntry.i"
+%include "./Python/interface/SBListener.i"
+%include "./Python/interface/SBModule.i"
 %include "./Python/interface/SBProcess.i"
 %include "lldb/API/SBSourceManager.h"
 %include "lldb/API/SBStream.h"
