diff --git a/tools/llvm-mc/Disassembler.cpp b/tools/llvm-mc/Disassembler.cpp
index 4a63e99..9fe0790 100644
--- a/tools/llvm-mc/Disassembler.cpp
+++ b/tools/llvm-mc/Disassembler.cpp
@@ -15,7 +15,6 @@
 #include "Disassembler.h"
 
 #include "llvm/ADT/OwningPtr.h"
-#include "llvm/ADT/Triple.h"
 #include "llvm/MC/MCAsmInfo.h"
 #include "llvm/MC/MCDisassembler.h"
 #include "llvm/MC/MCInst.h"
@@ -25,9 +24,6 @@
 #include "llvm/Support/MemoryObject.h"
 #include "llvm/Support/raw_ostream.h"
 #include "llvm/Support/SourceMgr.h"
-
-#include "llvm-c/EnhancedDisassembly.h"
-
 using namespace llvm;
 
 typedef std::vector<std::pair<unsigned char, const char*> > ByteArrayTy;
@@ -68,7 +64,8 @@
                                /*REMOVE*/ nulls())) {
       Printer.printInst(&Inst, outs());
       outs() << "\n";
-    } else {
+    }
+    else {
       SM.PrintMessage(SMLoc::getFromPointer(Bytes[Index].second),
                       "invalid instruction encoding", "warning");
       if (Size == 0)
@@ -79,53 +76,6 @@
   return false;
 }
 
-static bool ByteArrayFromString(ByteArrayTy &ByteArray, 
-                                StringRef &Str, 
-                                SourceMgr &SM) {
-  while (!Str.empty()) {
-    // Strip horizontal whitespace.
-    if (size_t Pos = Str.find_first_not_of(" \t\r")) {
-      Str = Str.substr(Pos);
-      continue;
-    }
-    
-    // If this is the end of a line or start of a comment, remove the rest of
-    // the line.
-    if (Str[0] == '\n' || Str[0] == '#') {
-      // Strip to the end of line if we already processed any bytes on this
-      // line.  This strips the comment and/or the \n.
-      if (Str[0] == '\n') {
-        Str = Str.substr(1);
-      } else {
-        Str = Str.substr(Str.find_first_of('\n'));
-        if (!Str.empty())
-          Str = Str.substr(1);
-      }
-      continue;
-    }
-    
-    // Get the current token.
-    size_t Next = Str.find_first_of(" \t\n\r#");
-    StringRef Value = Str.substr(0, Next);
-    
-    // Convert to a byte and add to the byte vector.
-    unsigned ByteVal;
-    if (Value.getAsInteger(0, ByteVal) || ByteVal > 255) {
-      // If we have an error, print it and skip to the end of line.
-      SM.PrintMessage(SMLoc::getFromPointer(Value.data()),
-                      "invalid input token", "error");
-      Str = Str.substr(Str.find('\n'));
-      ByteArray.clear();
-      continue;
-    }
-    
-    ByteArray.push_back(std::make_pair((unsigned char)ByteVal, Value.data()));
-    Str = Str.substr(Next);
-  }
-  
-  return false;
-}
-
 int Disassembler::disassemble(const Target &T, const std::string &Triple,
                               MemoryBuffer &Buffer) {
   // Set up disassembler.
@@ -155,197 +105,52 @@
   
   // Convert the input to a vector for disassembly.
   ByteArrayTy ByteArray;
-  StringRef Str = Buffer.getBuffer();
   
-  ErrorOccurred |= ByteArrayFromString(ByteArray, Str, SM);
+  StringRef Str = Buffer.getBuffer();
+  while (!Str.empty()) {
+    // Strip horizontal whitespace.
+    if (size_t Pos = Str.find_first_not_of(" \t\r")) {
+      Str = Str.substr(Pos);
+      continue;
+    }
+    
+    // If this is the end of a line or start of a comment, remove the rest of
+    // the line.
+    if (Str[0] == '\n' || Str[0] == '#') {
+      // Strip to the end of line if we already processed any bytes on this
+      // line.  This strips the comment and/or the \n.
+      if (Str[0] == '\n')
+        Str = Str.substr(1);
+      else {
+        Str = Str.substr(Str.find_first_of('\n'));
+        if (!Str.empty())
+          Str = Str.substr(1);
+      }
+      continue;
+    }
+    
+    // Get the current token.
+    size_t Next = Str.find_first_of(" \t\n\r#");
+    StringRef Value = Str.substr(0, Next);
+    
+    // Convert to a byte and add to the byte vector.
+    unsigned ByteVal;
+    if (Value.getAsInteger(0, ByteVal) || ByteVal > 255) {
+      // If we have an error, print it and skip to the end of line.
+      SM.PrintMessage(SMLoc::getFromPointer(Value.data()),
+                                 "invalid input token", "error");
+      ErrorOccurred = true;
+      Str = Str.substr(Str.find('\n'));
+      ByteArray.clear();
+      continue;
+    }
+    
+    ByteArray.push_back(std::make_pair((unsigned char)ByteVal, Value.data()));
+    Str = Str.substr(Next);
+  }
   
   if (!ByteArray.empty())
     ErrorOccurred |= PrintInsts(*DisAsm, *IP, ByteArray, SM);
     
   return ErrorOccurred;
 }
-
-static int byteArrayReader(uint8_t *B, uint64_t A, void *Arg) {
-  ByteArrayTy &ByteArray = *((ByteArrayTy*)Arg);
-  
-  if (A >= ByteArray.size())
-    return -1;
-  
-  *B = ByteArray[A].first;
-  
-  return 0;
-}
-
-static int verboseEvaluator(uint64_t *V, unsigned R, void *Arg) {
-  EDDisassemblerRef &disassembler = *((EDDisassemblerRef*)Arg);
-  
-  const char *regName;
-  
-  if (!EDGetRegisterName(&regName,
-                        disassembler,
-                        R))
-    outs() << "[" << regName << "/" << R << "]";
-  if (EDRegisterIsStackPointer(disassembler, R))
-    outs() << "(sp)";
-  if (EDRegisterIsProgramCounter(disassembler, R))
-    outs() << "(pc)";
-  
-  *V = 0;
-  
-  return 0;
-}
-
-int Disassembler::disassembleEnhanced(const std::string &TS, 
-                                      MemoryBuffer &Buffer) {
-  ByteArrayTy ByteArray;
-  StringRef Str = Buffer.getBuffer();
-  SourceMgr SM;
-  
-  SM.AddNewSourceBuffer(&Buffer, SMLoc());
-  
-  if (ByteArrayFromString(ByteArray, Str, SM)) {
-    return -1;
-  }
-  
-  EDDisassemblerRef disassembler;
-  
-  Triple T(TS);
-  EDAssemblySyntax_t AS;
-  
-  switch (T.getArch()) {
-  default:
-    errs() << "error: no default assembly syntax for " << TS.c_str() << "\n";
-    return -1;
-  case Triple::arm:
-  case Triple::thumb:
-    AS = kEDAssemblySyntaxARMUAL;
-    break;
-  case Triple::x86:
-  case Triple::x86_64:
-    AS = kEDAssemblySyntaxX86ATT;
-    break;
-  }
-  
-  if (EDGetDisassembler(&disassembler, 
-                        TS.c_str(),
-                        AS)) {
-    errs() << "error: couldn't get disassembler for " << TS.c_str() << "\n";
-    return -1;
-  }
-  
-  EDInstRef inst;
-  
-  if (EDCreateInsts(&inst, 1, disassembler, byteArrayReader, 0,&ByteArray) 
-      != 1) {
-    errs() << "error: Didn't get an instruction\n";
-    return -1;
-  }
-  
-  int numTokens = EDNumTokens(inst);
-  
-  if (numTokens < 0) {
-    errs() << "error: Couldn't count the instruction's tokens\n";
-    return -1;
-  }
-  
-  int tokenIndex;
-  
-  for (tokenIndex = 0; tokenIndex < numTokens; ++tokenIndex) {
-    EDTokenRef token;
-    
-    if (EDGetToken(&token, inst, tokenIndex)) {
-      errs() << "error: Couldn't get token\n";
-      return -1;
-    }
-    
-    const char *buf;
-    
-    if (EDGetTokenString(&buf, token)) {
-      errs() << "error: Couldn't get string for token\n";
-      return -1;
-    }
-    
-    outs() << "[";
-    
-    int operandIndex = EDOperandIndexForToken(token);
-    
-    if (operandIndex >= 0)
-      outs() << operandIndex << "-";
-    
-    if (EDTokenIsWhitespace(token)) {
-      outs() << "w";
-    } else if (EDTokenIsPunctuation(token)) {
-      outs() << "p";
-    } else if (EDTokenIsOpcode(token)) {
-      outs() << "o";
-    } else if (EDTokenIsLiteral(token)) {
-      outs() << "l";
-    } else if (EDTokenIsRegister(token)) {
-      outs() << "r";
-    } else {
-      outs() << "?";
-    }
-    
-    outs() << ":" << buf;
-  
-    if (EDTokenIsLiteral(token)) {
-      outs() << "=";
-      if (EDTokenIsNegativeLiteral(token))
-        outs() << "-";
-      uint64_t absoluteValue;
-      if (EDLiteralTokenAbsoluteValue(&absoluteValue, token)) {
-        errs() << "error: Couldn't get the value of a literal token\n";
-        return -1;
-      }
-      outs() << absoluteValue;
-    } else if (EDTokenIsRegister(token)) {
-      outs() << "=";
-      unsigned regID;
-      if (EDRegisterTokenValue(&regID, token)) {
-        errs() << "error: Couldn't get the ID of a register token\n";
-        return -1;
-      }
-      outs() << "r" << regID;
-    }
-    
-    outs() << "]";
-  }
-  
-  outs() << " ";
-  
-  int numOperands = EDNumOperands(inst);
-  
-  if (numOperands < 0) {
-    errs() << "error: Couldn't count operands\n";
-    return -1;
-  }
-  
-  int operandIndex;
-  
-  for (operandIndex = 0; operandIndex < numOperands; ++operandIndex) {
-    outs() << operandIndex << ":";
-    
-    EDOperandRef operand;
-    
-    if (EDGetOperand(&operand,
-                     inst,
-                     operandIndex)) {
-      errs() << "error: Couldn't get operand\n";
-      return -1;
-    }
-    
-    uint64_t evaluatedResult;
-    
-    EDEvaluateOperand(&evaluatedResult, 
-                      operand, 
-                      verboseEvaluator, 
-                      &disassembler);
-    
-    outs() << " ";
-  }
-  
-  outs() << "\n";
-  
-  return 0;
-}
-
diff --git a/tools/llvm-mc/Disassembler.h b/tools/llvm-mc/Disassembler.h
index 3da2396..78c2f85 100644
--- a/tools/llvm-mc/Disassembler.h
+++ b/tools/llvm-mc/Disassembler.h
@@ -27,9 +27,6 @@
   static int disassemble(const Target &target, 
                          const std::string &tripleString,
                          MemoryBuffer &buffer);
-  
-  static int disassembleEnhanced(const std::string &tripleString,
-                                 MemoryBuffer &buffer);
 };
   
 } // namespace llvm
diff --git a/tools/llvm-mc/Makefile b/tools/llvm-mc/Makefile
index d09ea06..5b0fe3f 100644
--- a/tools/llvm-mc/Makefile
+++ b/tools/llvm-mc/Makefile
@@ -20,6 +20,5 @@
 include $(LEVEL)/Makefile.config
 
 LINK_COMPONENTS := $(TARGETS_TO_BUILD) MCParser MC support
-USEDLIBS := EnhancedDisassembly.a
 
 include $(LLVM_SRC_ROOT)/Makefile.rules
diff --git a/tools/llvm-mc/llvm-mc.cpp b/tools/llvm-mc/llvm-mc.cpp
index 47f67c5..c6657f5 100644
--- a/tools/llvm-mc/llvm-mc.cpp
+++ b/tools/llvm-mc/llvm-mc.cpp
@@ -97,8 +97,7 @@
 enum ActionType {
   AC_AsLex,
   AC_Assemble,
-  AC_Disassemble,
-  AC_EDisassemble
+  AC_Disassemble
 };
 
 static cl::opt<ActionType>
@@ -110,8 +109,6 @@
                              "Assemble a .s file (default)"),
                   clEnumValN(AC_Disassemble, "disassemble",
                              "Disassemble strings of hex bytes"),
-                  clEnumValN(AC_EDisassemble, "edis",
-                             "Enhanced disassembly of strings of hex bytes"),
                   clEnumValEnd));
 
 static const Target *GetTarget(const char *ProgName) {
@@ -328,7 +325,7 @@
   return Res;
 }
 
-static int DisassembleInput(const char *ProgName, bool Enhanced) {
+static int DisassembleInput(const char *ProgName) {
   const Target *TheTarget = GetTarget(ProgName);
   if (!TheTarget)
     return 0;
@@ -347,10 +344,7 @@
     return 1;
   }
   
-  if (Enhanced)
-    return Disassembler::disassembleEnhanced(TripleName, *Buffer);
-  else
-    return Disassembler::disassemble(*TheTarget, TripleName, *Buffer);
+  return Disassembler::disassemble(*TheTarget, TripleName, *Buffer);
 }
 
 
@@ -377,9 +371,7 @@
   case AC_Assemble:
     return AssembleInput(argv[0]);
   case AC_Disassemble:
-    return DisassembleInput(argv[0], false);
-  case AC_EDisassemble:
-    return DisassembleInput(argv[0], true);
+    return DisassembleInput(argv[0]);
   }
   
   return 0;
