diff --git a/source/Commands/CommandObjectFrame.cpp b/source/Commands/CommandObjectFrame.cpp
index 33e735a..d184e00 100644
--- a/source/Commands/CommandObjectFrame.cpp
+++ b/source/Commands/CommandObjectFrame.cpp
@@ -26,6 +26,7 @@
 #include "lldb/Interpreter/CommandReturnObject.h"
 #include "lldb/Interpreter/Options.h"
 #include "lldb/Interpreter/OptionGroupValueObjectDisplay.h"
+#include "lldb/Interpreter/OptionGroupVariable.h"
 #include "lldb/Symbol/ClangASTType.h"
 #include "lldb/Symbol/ClangASTContext.h"
 #include "lldb/Symbol/ObjectFile.h"
@@ -378,7 +379,7 @@
                        NULL,
                        eFlagProcessMustBeLaunched | eFlagProcessMustBePaused),
         m_option_group (interpreter),
-        m_frame_var_options(),
+        m_option_variable(true), // Include the frame specific options by passing "true"
         m_varobj_options()
     {
         CommandArgumentEntry arg;
@@ -394,7 +395,7 @@
         // Push the data for the first argument into the m_arguments vector.
         m_arguments.push_back (arg);
         
-        m_option_group.Append (&m_frame_var_options, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1);
+        m_option_group.Append (&m_option_variable, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1);
         m_option_group.Append (&m_varobj_options, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1);
         m_option_group.Finalize();
     }
@@ -438,73 +439,8 @@
 
             const char *name_cstr = NULL;
             size_t idx;
-            if (!m_frame_var_options.globals.empty())
-            {
-                uint32_t fail_count = 0;
-                if (exe_ctx.target)
-                {
-                    const size_t num_globals = m_frame_var_options.globals.size();
-                    for (idx = 0; idx < num_globals; ++idx)
-                    {
-                        VariableList global_var_list;
-                        const uint32_t num_matching_globals 
-                                = exe_ctx.target->GetImages().FindGlobalVariables (m_frame_var_options.globals[idx], 
-                                                                                   true, 
-                                                                                   UINT32_MAX, 
-                                                                                   global_var_list);
 
-                        if (num_matching_globals == 0)
-                        {
-                            ++fail_count;
-                            result.GetErrorStream().Printf ("error: can't find global variable '%s'\n", 
-                                                            m_frame_var_options.globals[idx].AsCString());
-                        }
-                        else
-                        {
-                            for (uint32_t global_idx=0; global_idx<num_matching_globals; ++global_idx)
-                            {
-                                var_sp = global_var_list.GetVariableAtIndex(global_idx);
-                                if (var_sp)
-                                {
-                                    valobj_sp = exe_ctx.frame->GetValueObjectForFrameVariable (var_sp, 
-                                                                                               m_varobj_options.use_dynamic);
-                                    if (!valobj_sp)
-                                        valobj_sp = exe_ctx.frame->TrackGlobalVariable (var_sp, 
-                                                                                        m_varobj_options.use_dynamic);
-
-                                    if (valobj_sp)
-                                    {
-                                        if (m_frame_var_options.format != eFormatDefault)
-                                            valobj_sp->SetFormat (m_frame_var_options.format);
-
-                                        if (m_frame_var_options.show_decl && var_sp->GetDeclaration ().GetFile())
-                                        {
-                                            var_sp->GetDeclaration ().DumpStopContext (&s, false);
-                                            s.PutCString (": ");
-                                        }
-                                        
-                                        ValueObject::DumpValueObject (result.GetOutputStream(), 
-                                                                      valobj_sp.get(), 
-                                                                      name_cstr, 
-                                                                      m_varobj_options.ptr_depth, 
-                                                                      0, 
-                                                                      m_varobj_options.max_depth, 
-                                                                      m_varobj_options.show_types,
-                                                                      m_varobj_options.show_location,
-                                                                      m_varobj_options.use_objc,
-                                                                      m_varobj_options.use_dynamic,
-                                                                      false,
-                                                                      m_varobj_options.flat_output);                                        
-                                    }
-                                }
-                            }
-                        }
-                    }
-                }
-                if (fail_count)
-                    result.SetStatus (eReturnStatusFailed);
-            }
-            else if (variable_list)
+            if (variable_list)
             {
                 if (command.GetArgumentCount() > 0)
                 {
@@ -516,7 +452,7 @@
                     {
                         uint32_t ptr_depth = m_varobj_options.ptr_depth;
                         
-                        if (m_frame_var_options.use_regex)
+                        if (m_option_variable.use_regex)
                         {
                             const uint32_t regex_start_index = regex_var_list.GetSize();
                             RegularExpression regex (name_cstr);
@@ -538,10 +474,10 @@
                                             valobj_sp = exe_ctx.frame->GetValueObjectForFrameVariable (var_sp, m_varobj_options.use_dynamic);
                                             if (valobj_sp)
                                             {                                        
-                                                if (m_frame_var_options.format != eFormatDefault)
-                                                    valobj_sp->SetFormat (m_frame_var_options.format);
+                                                if (m_option_variable.format != eFormatDefault)
+                                                    valobj_sp->SetFormat (m_option_variable.format);
                                                 
-                                                if (m_frame_var_options.show_decl && var_sp->GetDeclaration ().GetFile())
+                                                if (m_option_variable.show_decl && var_sp->GetDeclaration ().GetFile())
                                                 {
                                                     var_sp->GetDeclaration ().DumpStopContext (&s, false);
                                                     s.PutCString (": ");
@@ -589,9 +525,9 @@
                                                                                           error);
                             if (valobj_sp)
                             {
-                                if (m_frame_var_options.format != eFormatDefault)
-                                    valobj_sp->SetFormat (m_frame_var_options.format);
-                                if (m_frame_var_options.show_decl && var_sp && var_sp->GetDeclaration ().GetFile())
+                                if (m_option_variable.format != eFormatDefault)
+                                    valobj_sp->SetFormat (m_option_variable.format);
+                                if (m_option_variable.show_decl && var_sp && var_sp->GetDeclaration ().GetFile())
                                 {
                                     var_sp->GetDeclaration ().DumpStopContext (&s, false);
                                     s.PutCString (": ");
@@ -635,26 +571,26 @@
                             switch (var_sp->GetScope())
                             {
                             case eValueTypeVariableGlobal:
-                                dump_variable = m_frame_var_options.show_globals;
-                                if (dump_variable && m_frame_var_options.show_scope)
+                                dump_variable = m_option_variable.show_globals;
+                                if (dump_variable && m_option_variable.show_scope)
                                     s.PutCString("GLOBAL: ");
                                 break;
 
                             case eValueTypeVariableStatic:
-                                dump_variable = m_frame_var_options.show_globals;
-                                if (dump_variable && m_frame_var_options.show_scope)
+                                dump_variable = m_option_variable.show_globals;
+                                if (dump_variable && m_option_variable.show_scope)
                                     s.PutCString("STATIC: ");
                                 break;
                                 
                             case eValueTypeVariableArgument:
-                                dump_variable = m_frame_var_options.show_args;
-                                if (dump_variable && m_frame_var_options.show_scope)
+                                dump_variable = m_option_variable.show_args;
+                                if (dump_variable && m_option_variable.show_scope)
                                     s.PutCString("   ARG: ");
                                 break;
                                 
                             case eValueTypeVariableLocal:
-                                dump_variable = m_frame_var_options.show_locals;
-                                if (dump_variable && m_frame_var_options.show_scope)
+                                dump_variable = m_option_variable.show_locals;
+                                if (dump_variable && m_option_variable.show_scope)
                                     s.PutCString(" LOCAL: ");
                                 break;
 
@@ -672,14 +608,14 @@
                                                                                            m_varobj_options.use_dynamic);
                                 if (valobj_sp)
                                 {
-                                    if (m_frame_var_options.format != eFormatDefault)
-                                        valobj_sp->SetFormat (m_frame_var_options.format);
+                                    if (m_option_variable.format != eFormatDefault)
+                                        valobj_sp->SetFormat (m_option_variable.format);
                                     
                                     // When dumping all variables, don't print any variables
                                     // that are not in scope to avoid extra unneeded output
                                     if (valobj_sp->IsInScope ())
                                     {
-                                        if (m_frame_var_options.show_decl && var_sp->GetDeclaration ().GetFile())
+                                        if (m_option_variable.show_decl && var_sp->GetDeclaration ().GetFile())
                                         {
                                             var_sp->GetDeclaration ().DumpStopContext (&s, false);
                                             s.PutCString (": ");
@@ -710,30 +646,10 @@
 protected:
 
     OptionGroupOptions m_option_group;
-    OptionGroupFrameVariable m_frame_var_options;
+    OptionGroupVariable m_option_variable;
     OptionGroupValueObjectDisplay m_varobj_options;
 };
 
-OptionDefinition
-CommandObjectFrameVariable::OptionGroupFrameVariable::g_option_table[] =
-{
-{ LLDB_OPT_SET_1, false, "no-args",         'a', no_argument,       NULL, 0, eArgTypeNone,    "Omit function arguments."},
-{ LLDB_OPT_SET_1, false, "show-declaration",'c', no_argument,       NULL, 0, eArgTypeNone,    "Show variable declaration information (source file and line where the variable was declared)."},
-{ LLDB_OPT_SET_1, false, "format",          'f', required_argument, NULL, 0, eArgTypeExprFormat,  "Specify the format that the variable output should use."},
-{ LLDB_OPT_SET_1, false, "show-globals",    'g', no_argument,       NULL, 0, eArgTypeNone,    "Show the current frame source file global and static variables."},
-{ LLDB_OPT_SET_1, false, "find-global",     'G', required_argument, NULL, 0, eArgTypeVarName, "Find a global variable by name (which might not be in the current stack frame source file)."},
-{ LLDB_OPT_SET_1, false, "no-locals",       'l', no_argument,       NULL, 0, eArgTypeNone,    "Omit local variables."},
-{ LLDB_OPT_SET_1, false, "regex",           'r', no_argument,       NULL, 0, eArgTypeRegularExpression,    "The <variable-name> argument for name lookups are regular expressions."},
-{ LLDB_OPT_SET_1, false, "scope",           's', no_argument,       NULL, 0, eArgTypeNone,    "Show variable scope (argument, local, global, static)."},
-{ 0, false, NULL, 0, 0, NULL, NULL, eArgTypeNone, NULL }
-};
-
-uint32_t
-CommandObjectFrameVariable::OptionGroupFrameVariable::GetNumDefinitions ()
-{
-    return sizeof(CommandObjectFrameVariable::OptionGroupFrameVariable::g_option_table)/sizeof(OptionDefinition);
-}
-        
 
 #pragma mark CommandObjectMultiwordFrame
 
