diff --git a/lib/Rewrite/HTMLRewrite.cpp b/lib/Rewrite/HTMLRewrite.cpp
index 79fff28..32d20df 100644
--- a/lib/Rewrite/HTMLRewrite.cpp
+++ b/lib/Rewrite/HTMLRewrite.cpp
@@ -20,10 +20,6 @@
 
 using namespace clang;
 
-//===----------------------------------------------------------------------===//
-// Basic operations.
-//===----------------------------------------------------------------------===//
-
 void html::EscapeText(Rewriter& R, unsigned FileID, bool EscapeSpaces) {
   
   const llvm::MemoryBuffer *Buf = R.getSourceMgr().getBuffer(FileID);
@@ -50,83 +46,19 @@
   }
 }
 
-
-static void TagOpen(Rewriter& R, const char* TagStr,
-                    const char* Attr, const char* Content,
-                    SourceLocation L, bool InsertBefore) {
-  
-  std::ostringstream os;
-  os << '<' << TagStr;
-  if (Attr) os << ' ' << Attr;
-  os << '>';
-  if (Content) os << Content;
-  
-  if (InsertBefore)
-    R.InsertTextBefore(L, os.str().c_str(), os.str().size());
-  else
-    R.InsertTextAfter(L, os.str().c_str(), os.str().size());
-}
-
-static void TagClose(Rewriter& R, const char* TagStr, SourceLocation L,
-                     bool Newline, bool InsertBefore) {
-  
-  std::ostringstream os;
-  os << "</" << TagStr << ">";
-  if (Newline) os << '\n';
-  
-  if (InsertBefore)
-    R.InsertTextBefore(L, os.str().c_str(), os.str().size());
-  else
-    R.InsertTextAfter(L, os.str().c_str(), os.str().size());
-}
-
-void html::InsertTag(Rewriter& R, html::Tags tag,
-                     SourceLocation B, SourceLocation E,
-                     const char* Attr, const char* Content, bool Newline,
-                     bool OpenInsertBefore, bool CloseInsertBefore) {
-  
-  const char* TagStr = 0;
-  
-  switch (tag) {
-    default: break;      
-    case BODY: TagStr = "body"; break;
-    case DIV:  TagStr = "div";  break;
-    case HEAD: TagStr = "head"; break;
-    case HTML: TagStr = "html"; break;
-    case PRE:  TagStr = "pre";  break;
-    case SPAN: TagStr = "span"; break;
-    case STYLE: TagStr = "style"; break;
-  }
-  
-  assert (TagStr && "Tag not supported.");
-
-  // Generate the opening tag.  We also generate the closing
-  // tag of the start and end SourceLocations are the same.
-
-  if (OpenInsertBefore) {    
-    TagClose(R, TagStr, E, Newline, CloseInsertBefore);
-    TagOpen(R, TagStr, Attr, Content, B, true);
-  }
-  else {
-    TagOpen(R, TagStr, Attr, Content, B, false);
-    TagClose(R, TagStr, E, Newline, true);
-  }
-}
-
-//===----------------------------------------------------------------------===//
-// High-level operations.
-//===----------------------------------------------------------------------===//
-
 static void AddLineNumber(Rewriter& R, unsigned LineNo,
                           SourceLocation B, SourceLocation E) {
+    
+  // Surround the line with a span tag.
   
-  // Add two "div" tags: one to contain the line number, and the other
-  // to contain the content of the line.
+  R.InsertTextBefore(E, "</span>", 7);
+  R.InsertTextBefore(B, "<span style=lines>", 18);
+  
+  // Insert a span tag for the line number.
 
   std::ostringstream os;
-  os << LineNo;
-  html::InsertTag(R, html::SPAN, B, E, "style=lines");  
-  html::InsertTag(R, html::SPAN, B, B, "style=nums", os.str().c_str());  
+  os << "<span style=nums>" << LineNo << "</span>";
+  R.InsertTextBefore(B, os.str().c_str(), os.str().size());
 }
 
 void html::AddLineNumbers(Rewriter& R, unsigned FileID) {
