diff --git a/source/Commands/CommandObjectImage.cpp b/source/Commands/CommandObjectImage.cpp
index 414e031..8c17221 100644
--- a/source/Commands/CommandObjectImage.cpp
+++ b/source/Commands/CommandObjectImage.cpp
@@ -476,10 +476,11 @@
 {
 public:
 
-    CommandObjectImageDumpModuleList (const char *name,
+    CommandObjectImageDumpModuleList (CommandInterpreter &interpreter,
+                                      const char *name,
                                       const char *help,
                                       const char *syntax) :
-        CommandObject (name, help, syntax)
+        CommandObject (interpreter, name, help, syntax)
     {
     }
 
@@ -489,8 +490,7 @@
     }
 
     virtual int
-    HandleArgumentCompletion (CommandInterpreter &interpreter,
-                              Args &input,
+    HandleArgumentCompletion (Args &input,
                               int &cursor_index,
                               int &cursor_char_position,
                               OptionElementVector &opt_element_vector,
@@ -503,7 +503,7 @@
         std::string completion_str (input.GetArgumentAtIndex(cursor_index));
         completion_str.erase (cursor_char_position);
 
-        CommandCompletions::InvokeCommonCompletionCallbacks (interpreter,
+        CommandCompletions::InvokeCommonCompletionCallbacks (m_interpreter,
                                                              CommandCompletions::eModuleCompletion,
                                                              completion_str.c_str(),
                                                              match_start_point,
@@ -519,10 +519,11 @@
 {
 public:
 
-    CommandObjectImageDumpSourceFileList (const char *name,
+    CommandObjectImageDumpSourceFileList (CommandInterpreter &interpreter,
+                                          const char *name,
                                           const char *help,
                                           const char *syntax) :
-        CommandObject (name, help, syntax)
+        CommandObject (interpreter, name, help, syntax)
     {
     }
 
@@ -532,8 +533,7 @@
     }
 
     virtual int
-    HandleArgumentCompletion (CommandInterpreter &interpreter,
-                              Args &input,
+    HandleArgumentCompletion (Args &input,
                               int &cursor_index,
                               int &cursor_char_position,
                               OptionElementVector &opt_element_vector,
@@ -546,7 +546,7 @@
         std::string completion_str (input.GetArgumentAtIndex(cursor_index));
         completion_str.erase (cursor_char_position);
 
-        CommandCompletions::InvokeCommonCompletionCallbacks (interpreter, 
+        CommandCompletions::InvokeCommonCompletionCallbacks (m_interpreter, 
                                                              CommandCompletions::eSourceFileCompletion,
                                                              completion_str.c_str(),
                                                              match_start_point,
@@ -562,10 +562,11 @@
 class CommandObjectImageDumpSymtab : public CommandObjectImageDumpModuleList
 {
 public:
-    CommandObjectImageDumpSymtab () :
-        CommandObjectImageDumpModuleList ("image dump symtab",
-                         "Dump the symbol table from one or more executable images.",
-                         "image dump symtab [<file1> ...]")
+    CommandObjectImageDumpSymtab (CommandInterpreter &interpreter) :
+        CommandObjectImageDumpModuleList (interpreter,
+                                          "image dump symtab",
+                                          "Dump the symbol table from one or more executable images.",
+                                          "image dump symtab [<file1> ...]")
     {
     }
 
@@ -575,11 +576,10 @@
     }
 
     virtual bool
-    Execute (CommandInterpreter &interpreter,
-             Args& command,
+    Execute (Args& command,
              CommandReturnObject &result)
     {
-        Target *target = interpreter.GetDebugger().GetSelectedTarget().get();
+        Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
         if (target == NULL)
         {
             result.AppendError ("invalid target, set executable file using 'file' command");
@@ -604,7 +604,7 @@
                     for (uint32_t image_idx = 0;  image_idx<num_modules; ++image_idx)
                     {
                         num_dumped++;
-                        DumpModuleSymtab (interpreter, result.GetOutputStream(), target->GetImages().GetModulePointerAtIndex(image_idx));
+                        DumpModuleSymtab (m_interpreter, result.GetOutputStream(), target->GetImages().GetModulePointerAtIndex(image_idx));
                     }
                 }
                 else
@@ -642,7 +642,7 @@
                             if (image_module)
                             {
                                 num_dumped++;
-                                DumpModuleSymtab (interpreter, result.GetOutputStream(), image_module);
+                                DumpModuleSymtab (m_interpreter, result.GetOutputStream(), image_module);
                             }
                         }
                     }
@@ -670,8 +670,9 @@
 class CommandObjectImageDumpSections : public CommandObjectImageDumpModuleList
 {
 public:
-    CommandObjectImageDumpSections () :
-        CommandObjectImageDumpModuleList ("image dump sections",
+    CommandObjectImageDumpSections (CommandInterpreter &interpreter) :
+        CommandObjectImageDumpModuleList (interpreter,
+                                          "image dump sections",
                                           "Dump the sections from one or more executable images.",
                                           "image dump sections [<file1> ...]")
     {
@@ -683,11 +684,10 @@
     }
 
     virtual bool
-    Execute (CommandInterpreter &interpreter,
-             Args& command,
+    Execute (Args& command,
              CommandReturnObject &result)
     {
-        Target *target = interpreter.GetDebugger().GetSelectedTarget().get();
+        Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
         if (target == NULL)
         {
             result.AppendError ("invalid target, set executable file using 'file' command");
@@ -712,7 +712,7 @@
                     for (uint32_t image_idx = 0;  image_idx<num_modules; ++image_idx)
                     {
                         num_dumped++;
-                        DumpModuleSections (interpreter, result.GetOutputStream(), target->GetImages().GetModulePointerAtIndex(image_idx));
+                        DumpModuleSections (m_interpreter, result.GetOutputStream(), target->GetImages().GetModulePointerAtIndex(image_idx));
                     }
                 }
                 else
@@ -750,7 +750,7 @@
                             if (image_module)
                             {
                                 num_dumped++;
-                                DumpModuleSections (interpreter, result.GetOutputStream(), image_module);
+                                DumpModuleSections (m_interpreter, result.GetOutputStream(), image_module);
                             }
                         }
                     }
@@ -777,10 +777,11 @@
 class CommandObjectImageDumpSymfile : public CommandObjectImageDumpModuleList
 {
 public:
-    CommandObjectImageDumpSymfile () :
-        CommandObjectImageDumpModuleList ("image dump symfile",
-                         "Dump the debug symbol file for one or more executable images.",
-                         "image dump symfile [<file1> ...]")
+    CommandObjectImageDumpSymfile (CommandInterpreter &interpreter) :
+        CommandObjectImageDumpModuleList (interpreter,
+                                          "image dump symfile",
+                                          "Dump the debug symbol file for one or more executable images.",
+                                          "image dump symfile [<file1> ...]")
     {
     }
 
@@ -790,11 +791,10 @@
     }
 
     virtual bool
-    Execute (CommandInterpreter &interpreter,
-             Args& command,
+    Execute (Args& command,
              CommandReturnObject &result)
     {
-        Target *target = interpreter.GetDebugger().GetSelectedTarget().get();
+        Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
         if (target == NULL)
         {
             result.AppendError ("invalid target, set executable file using 'file' command");
@@ -884,10 +884,11 @@
 class CommandObjectImageDumpLineTable : public CommandObjectImageDumpSourceFileList
 {
 public:
-    CommandObjectImageDumpLineTable () :
-        CommandObjectImageDumpSourceFileList ("image dump line-table",
-                         "Dump the debug symbol file for one or more executable images.",
-                         "image dump line-table <source-file1> [<source-file2> ...]")
+    CommandObjectImageDumpLineTable (CommandInterpreter &interpreter) :
+        CommandObjectImageDumpSourceFileList (interpreter,
+                                              "image dump line-table",
+                                              "Dump the debug symbol file for one or more executable images.",
+                                              "image dump line-table <source-file1> [<source-file2> ...]")
     {
     }
 
@@ -897,11 +898,10 @@
     }
 
     virtual bool
-    Execute (CommandInterpreter &interpreter,
-             Args& command,
+    Execute (Args& command,
              CommandReturnObject &result)
     {
-        Target *target = interpreter.GetDebugger().GetSelectedTarget().get();
+        Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
         if (target == NULL)
         {
             result.AppendError ("invalid target, set executable file using 'file' command");
@@ -910,7 +910,7 @@
         }
         else
         {
-            ExecutionContext exe_ctx(interpreter.GetDebugger().GetExecutionContext());
+            ExecutionContext exe_ctx(m_interpreter.GetDebugger().GetExecutionContext());
             uint32_t total_num_dumped = 0;
 
             uint32_t addr_byte_size = target->GetArchitecture().GetAddressByteSize();
@@ -935,7 +935,7 @@
                         uint32_t num_dumped = 0;
                         for (uint32_t i = 0; i<num_modules; ++i)
                         {
-                            if (DumpCompileUnitLineTable (interpreter,
+                            if (DumpCompileUnitLineTable (m_interpreter,
                                                           result.GetOutputStream(),
                                                           target->GetImages().GetModulePointerAtIndex(i),
                                                           file_spec,
@@ -973,14 +973,15 @@
     // Constructors and Destructors
     //------------------------------------------------------------------
     CommandObjectImageDump(CommandInterpreter &interpreter) :
-        CommandObjectMultiword ("image dump",
+        CommandObjectMultiword (interpreter, 
+                                "image dump",
                                 "A set of commands for dumping information about one or more executable images; 'line-table' expects a source file name",
                                 "image dump [symtab|sections|symfile|line-table] [<file1> <file2> ...]")
     {
-        LoadSubCommand (interpreter, "symtab",      CommandObjectSP (new CommandObjectImageDumpSymtab ()));
-        LoadSubCommand (interpreter, "sections",    CommandObjectSP (new CommandObjectImageDumpSections ()));
-        LoadSubCommand (interpreter, "symfile",     CommandObjectSP (new CommandObjectImageDumpSymfile ()));
-        LoadSubCommand (interpreter, "line-table",  CommandObjectSP (new CommandObjectImageDumpLineTable ()));
+        LoadSubCommand ("symtab",      CommandObjectSP (new CommandObjectImageDumpSymtab (interpreter)));
+        LoadSubCommand ("sections",    CommandObjectSP (new CommandObjectImageDumpSections (interpreter)));
+        LoadSubCommand ("symfile",     CommandObjectSP (new CommandObjectImageDumpSymfile (interpreter)));
+        LoadSubCommand ("line-table",  CommandObjectSP (new CommandObjectImageDumpLineTable (interpreter)));
     }
 
     virtual
@@ -1045,11 +1046,11 @@
         FormatWidthCollection m_format_array;
     };
 
-    CommandObjectImageList () :
-        CommandObject (
-                "image list",
-                "List current executable and dependent shared library images.",
-                "image list [<cmd-options>]")
+    CommandObjectImageList (CommandInterpreter &interpreter) :
+        CommandObject (interpreter,
+                       "image list",
+                       "List current executable and dependent shared library images.",
+                       "image list [<cmd-options>]")
     {
     }
 
@@ -1066,11 +1067,10 @@
     }
 
     virtual bool
-    Execute (CommandInterpreter &interpreter,
-             Args& command,
+    Execute (Args& command,
              CommandReturnObject &result)
     {
-        Target *target = interpreter.GetDebugger().GetSelectedTarget().get();
+        Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
         if (target == NULL)
         {
             result.AppendError ("invalid target, set executable file using 'file' command");
@@ -1322,11 +1322,11 @@
 
     };
 
-    CommandObjectImageLookup () :
-        CommandObject (
-                "image lookup",
-                "Look up information within executable and dependent shared library images.",
-                "image lookup [<cmd-options>] [<file1>...]")
+    CommandObjectImageLookup (CommandInterpreter &interpreter) :
+        CommandObject (interpreter,
+                       "image lookup",
+                       "Look up information within executable and dependent shared library images.",
+                       "image lookup [<cmd-options>] [<file1>...]")
     {
     }
 
@@ -1351,7 +1351,7 @@
         case eLookupTypeAddress:
             if (m_options.m_addr != LLDB_INVALID_ADDRESS)
             {
-                if (LookupAddressInModule (interpreter, 
+                if (LookupAddressInModule (m_interpreter, 
                                            result.GetOutputStream(), 
                                            module, 
                                            eSymbolContextEverything, 
@@ -1368,7 +1368,7 @@
         case eLookupTypeSymbol:
             if (!m_options.m_str.empty())
             {
-                if (LookupSymbolInModule (interpreter, result.GetOutputStream(), module, m_options.m_str.c_str(), m_options.m_use_regex))
+                if (LookupSymbolInModule (m_interpreter, result.GetOutputStream(), module, m_options.m_str.c_str(), m_options.m_use_regex))
                 {
                     result.SetStatus(eReturnStatusSuccessFinishResult);
                     return true;
@@ -1380,7 +1380,7 @@
             if (m_options.m_file)
             {
 
-                if (LookupFileAndLineInModule (interpreter,
+                if (LookupFileAndLineInModule (m_interpreter,
                                                result.GetOutputStream(),
                                                module,
                                                m_options.m_file,
@@ -1396,7 +1396,7 @@
         case eLookupTypeFunction:
             if (!m_options.m_str.empty())
             {
-                if (LookupFunctionInModule (interpreter,
+                if (LookupFunctionInModule (m_interpreter,
                                             result.GetOutputStream(),
                                             module,
                                             m_options.m_str.c_str(),
@@ -1411,7 +1411,7 @@
         case eLookupTypeType:
             if (!m_options.m_str.empty())
             {
-                if (LookupTypeInModule (interpreter,
+                if (LookupTypeInModule (m_interpreter,
                                         result.GetOutputStream(),
                                         module,
                                         m_options.m_str.c_str(),
@@ -1424,7 +1424,7 @@
             break;
 
         default:
-            m_options.GenerateOptionUsage (result.GetErrorStream(), this, interpreter.GetDebugger().GetInstanceName().AsCString());
+            m_options.GenerateOptionUsage (m_interpreter, result.GetErrorStream(), this);
             syntax_error = true;
             break;
         }
@@ -1434,11 +1434,10 @@
     }
 
     virtual bool
-    Execute (CommandInterpreter &interpreter,
-             Args& command,
+    Execute (Args& command,
              CommandReturnObject &result)
     {
-        Target *target = interpreter.GetDebugger().GetSelectedTarget().get();
+        Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get();
         if (target == NULL)
         {
             result.AppendError ("invalid target, set executable file using 'file' command");
@@ -1463,7 +1462,7 @@
                 {
                     for (i = 0; i<num_modules && syntax_error == false; ++i)
                     {
-                        if (LookupInModule (interpreter, target->GetImages().GetModulePointerAtIndex(i), result, syntax_error))
+                        if (LookupInModule (m_interpreter, target->GetImages().GetModulePointerAtIndex(i), result, syntax_error))
                         {
                             result.GetOutputStream().EOL();
                             num_successful_lookups++;
@@ -1504,7 +1503,7 @@
                             Module * image_module = matching_modules.GetModulePointerAtIndex(j);
                             if (image_module)
                             {
-                                if (LookupInModule (interpreter, image_module, result, syntax_error))
+                                if (LookupInModule (m_interpreter, image_module, result, syntax_error))
                                 {
                                     result.GetOutputStream().EOL();
                                     num_successful_lookups++;
@@ -1553,13 +1552,14 @@
 // CommandObjectImage constructor
 //----------------------------------------------------------------------
 CommandObjectImage::CommandObjectImage(CommandInterpreter &interpreter) :
-    CommandObjectMultiword ("image",
+    CommandObjectMultiword (interpreter,
+                            "image",
                             "A set of commands for accessing information for one or more executable images.",
                             "image <sub-command> ...")
 {
-    LoadSubCommand (interpreter, "dump",    CommandObjectSP (new CommandObjectImageDump (interpreter)));
-    LoadSubCommand (interpreter, "list",    CommandObjectSP (new CommandObjectImageList ()));
-    LoadSubCommand (interpreter, "lookup",  CommandObjectSP (new CommandObjectImageLookup ()));
+    LoadSubCommand ("dump",    CommandObjectSP (new CommandObjectImageDump (interpreter)));
+    LoadSubCommand ("list",    CommandObjectSP (new CommandObjectImageList (interpreter)));
+    LoadSubCommand ("lookup",  CommandObjectSP (new CommandObjectImageLookup (interpreter)));
 }
 
 //----------------------------------------------------------------------
