diff --git a/source/Interpreter/CommandObjectCrossref.cpp b/source/Interpreter/CommandObjectCrossref.cpp
new file mode 100644
index 0000000..27b6637
--- /dev/null
+++ b/source/Interpreter/CommandObjectCrossref.cpp
@@ -0,0 +1,92 @@
+//===-- CommandObjectCrossref.cpp -------------------------------*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "lldb/Interpreter/CommandObjectCrossref.h"
+
+// C Includes
+// C++ Includes
+// Other libraries and framework includes
+// Project includes
+#include "lldb/Interpreter/CommandReturnObject.h"
+
+using namespace lldb;
+using namespace lldb_private;
+
+//-------------------------------------------------------------------------
+// CommandObjectCrossref
+//-------------------------------------------------------------------------
+
+CommandObjectCrossref::CommandObjectCrossref
+(
+    const char *name,
+    const char *help,
+    const char *syntax
+) :
+    CommandObject (name, help, syntax),
+    m_crossref_object_types()
+{
+}
+
+CommandObjectCrossref::~CommandObjectCrossref ()
+{
+}
+
+bool
+CommandObjectCrossref::Execute
+(
+    Args& command,
+    CommandContext *context,
+    CommandInterpreter *interpreter,
+    CommandReturnObject &result
+)
+{
+    if (m_crossref_object_types.GetArgumentCount() == 0)
+    {
+        result.AppendErrorWithFormat ("There are no objects for which you can call '%s'.\n", GetCommandName());
+        result.SetStatus (eReturnStatusFailed);
+    }
+    else
+    {
+        GenerateHelpText (result);
+    }
+    return result.Succeeded();
+}
+
+void
+CommandObjectCrossref::AddObject (const char *obj_name)
+{
+    m_crossref_object_types.AppendArgument (obj_name);
+}
+
+const char **
+CommandObjectCrossref::GetObjectTypes () const
+{
+    return m_crossref_object_types.GetConstArgumentVector();
+}
+
+void
+CommandObjectCrossref::GenerateHelpText (CommandReturnObject &result)
+{
+    result.AppendMessage ("This command can be called on the following types of objects:");
+
+    for (int i = 0; i < m_crossref_object_types.GetArgumentCount(); ++i)
+    {
+        const char *obj_name = m_crossref_object_types.GetArgumentAtIndex(i);
+        result.AppendMessageWithFormat ("    %s    (e.g.  '%s %s')\n", obj_name,
+                                        obj_name, GetCommandName());
+    }
+
+    result.SetStatus (eReturnStatusSuccessFinishNoResult);
+}
+
+bool
+CommandObjectCrossref::IsCrossRefObject ()
+{
+    return true;
+}
