diff --git a/compiler/cpp/src/generate/t_html_generator.cc b/compiler/cpp/src/generate/t_html_generator.cc
index 217f451..77cb972 100644
--- a/compiler/cpp/src/generate/t_html_generator.cc
+++ b/compiler/cpp/src/generate/t_html_generator.cc
@@ -59,7 +59,7 @@
   void generate_program_toc();
   void generate_program_toc_row(t_program* tprog);
   void generate_program_toc_rows(t_program* tprog,
-				 std::vector<t_program*>& finished);
+         std::vector<t_program*>& finished);
   void generate_index();
   void generate_css();
 
@@ -86,7 +86,7 @@
  */
 void t_html_generator::generate_program_toc() {
   f_out_ << "<table><tr><th>Module</th><th>Services</th>"
-	 << "<th>Data types</th><th>Constants</th></tr>" << endl;
+   << "<th>Data types</th><th>Constants</th></tr>" << endl;
   generate_program_toc_row(program_);
   f_out_ << "</table>" << endl;
 }
@@ -98,7 +98,7 @@
  * completed rows in 'finished'
  */
 void t_html_generator::generate_program_toc_rows(t_program* tprog,
-				 std::vector<t_program*>& finished) {
+         std::vector<t_program*>& finished) {
   for (vector<t_program*>::iterator iter = finished.begin();
        iter != finished.end(); iter++) {
     if (tprog->get_path() == (*iter)->get_path()) {
@@ -126,20 +126,20 @@
     for (sv_iter = services.begin(); sv_iter != services.end(); ++sv_iter) {
       string name = get_service_name(*sv_iter);
       f_out_ << "<a href=\"" << fname << "#Svc_" << name << "\">" << name
-	     << "</a><br/>" << endl;
+        << "</a><br/>" << endl;
       f_out_ << "<ul>" << endl;
       map<string,string> fn_html;
       vector<t_function*> functions = (*sv_iter)->get_functions();
       vector<t_function*>::iterator fn_iter;
       for (fn_iter = functions.begin(); fn_iter != functions.end(); ++fn_iter) {
-	string fn_name = (*fn_iter)->get_name();
-	string html = "<li><a href=\"" + fname + "#Fn_" + name + "_" +
-	  fn_name + "\">" + fn_name + "</a></li>";
-	fn_html.insert(pair<string,string>(fn_name, html));
+        string fn_name = (*fn_iter)->get_name();
+        string html = "<li><a href=\"" + fname + "#Fn_" + name + "_" +
+          fn_name + "\">" + fn_name + "</a></li>";
+        fn_html.insert(pair<string,string>(fn_name, html));
       }
       for (map<string,string>::iterator html_iter = fn_html.begin();
-	   html_iter != fn_html.end(); html_iter++) {
-	f_out_ << html_iter->second << endl;
+        html_iter != fn_html.end(); html_iter++) {
+        f_out_ << html_iter->second << endl;
       }
       f_out_ << "</ul>" << endl;
     }
@@ -154,7 +154,7 @@
       // f_out_ << "<a href=\"" << fname << "#Enum_" << name << "\">" << name
       // <<  "</a><br/>" << endl;
       string html = "<a href=\"" + fname + "#Enum_" + name + "\">" + name +
-	"</a>";
+        "</a>";
       data_types.insert(pair<string,string>(name, html));
     }
   }
@@ -166,7 +166,7 @@
       // f_out_ << "<a href=\"" << fname << "#Typedef_" << name << "\">" << name
       // << "</a><br/>" << endl;
       string html = "<a href=\"" + fname + "#Typedef_" + name + "\">" + name +
-	"</a>";
+        "</a>";
       data_types.insert(pair<string,string>(name, html));
     }
   }
@@ -178,7 +178,7 @@
       //f_out_ << "<a href=\"" << fname << "#Struct_" << name << "\">" << name
       //<< "</a><br/>" << endl;
       string html = "<a href=\"" + fname + "#Struct_" + name + "\">" + name +
-	"</a>";
+        "</a>";
       data_types.insert(pair<string,string>(name, html));
     }
   }
@@ -194,11 +194,11 @@
     for (con_iter = consts.begin(); con_iter != consts.end(); ++con_iter) {
       string name = (*con_iter)->get_name();
       string html ="<a href=\"" + fname + "#Const_" + name +
-	"\">" + name + "</a>";
+        "\">" + name + "</a>";
       const_html.insert(pair<string,string>(name, html));
     }
     for (map<string,string>::iterator con_iter = const_html.begin();
-	 con_iter != const_html.end(); con_iter++) {
+   con_iter != const_html.end(); con_iter++) {
       f_out_ << con_iter->second << "<br/>" << endl;
     }
   }
@@ -220,10 +220,10 @@
   f_out_ << "<head>" << endl;
   f_out_ << "<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />" << endl;
   f_out_ << "<link href=\"style.css\" rel=\"stylesheet\" type=\"text/css\"/>"
-	 << endl;
+   << endl;
   f_out_ << "<title>Thrift module: " << program_->get_name()
-	 << "</title></head><body>" << endl << "<h1>Thrift module: "
-	 << program_->get_name() << "</h1>" << endl;
+   << "</title></head><body>" << endl << "<h1>Thrift module: "
+   << program_->get_name() << "</h1>" << endl;
 
   print_doc(program_);
 
@@ -265,9 +265,9 @@
     vector<t_struct*>::iterator o_iter;
     for (o_iter = objects.begin(); o_iter != objects.end(); ++o_iter) {
       if ((*o_iter)->is_xception()) {
-	generate_xception(*o_iter);
+        generate_xception(*o_iter);
       } else {
-	generate_struct(*o_iter);
+        generate_struct(*o_iter);
       }
     }
   }
@@ -298,11 +298,11 @@
   f_out_.open(index_fname.c_str());
   f_out_ << "<html><head>" << endl;
   f_out_ << "<link href=\"style.css\" rel=\"stylesheet\" type=\"text/css\"/>"
-	 << endl;
+   << endl;
   f_out_ << "<title>All Thrift declarations</title></head><body>"
-	 << endl << "<h1>All Thrift declarations</h1>" << endl;
+   << endl << "<h1>All Thrift declarations</h1>" << endl;
   f_out_ << "<table><tr><th>Module</th><th>Services</th><th>Data types</th>"
-	 << "<th>Constants</th></tr>" << endl;
+   << "<th>Constants</th></tr>" << endl;
   vector<t_program*> programs;
   generate_program_toc_rows(program_, programs);
   f_out_ << "</table>" << endl;
@@ -344,13 +344,13 @@
     size_t index;
     while ((index = doc.find_first_of("\r\n")) != string::npos) {
       if (index == 0) {
-	f_out_ << "<p/>" << endl;
+  f_out_ << "<p/>" << endl;
       } else {
-	f_out_ << doc.substr(0, index) << endl;
+  f_out_ << doc.substr(0, index) << endl;
       }
       if (index + 1 < doc.size() && doc.at(index) != doc.at(index + 1) &&
-	  (doc.at(index + 1) == '\r' || doc.at(index + 1) == '\n')) {
-	index++;
+    (doc.at(index + 1) == '\r' || doc.at(index + 1) == '\n')) {
+  index++;
       }
       doc = doc.substr(index + 1);
     }
@@ -428,15 +428,14 @@
       f_out_ << "{ ";
       map<t_const_value*, t_const_value*> map_elems = tvalue->get_map();
       map<t_const_value*, t_const_value*>::iterator map_iter;
-      for (map_iter = map_elems.begin(); map_iter != map_elems.end();
-	   map_iter++) {
-	if (!first) {
-	  f_out_ << ", ";
-	}
-	first = false;
-	print_const_value(map_iter->first);
-	f_out_ << " = ";
-	print_const_value(map_iter->second);
+      for (map_iter = map_elems.begin(); map_iter != map_elems.end(); map_iter++) {
+        if (!first) {
+          f_out_ << ", ";
+        }
+        first = false;
+        print_const_value(map_iter->first);
+        f_out_ << " = ";
+        print_const_value(map_iter->second);
       }
       f_out_ << " }";
     }
@@ -446,13 +445,12 @@
       f_out_ << "{ ";
       vector<t_const_value*> list_elems = tvalue->get_list();;
       vector<t_const_value*>::iterator list_iter;
-      for (list_iter = list_elems.begin(); list_iter != list_elems.end();
-	   list_iter++) {
-	if (!first) {
-	  f_out_ << ", ";
-	}
-	first = false;
-	print_const_value(*list_iter);
+      for (list_iter = list_elems.begin(); list_iter != list_elems.end(); list_iter++) {
+        if (!first) {
+          f_out_ << ", ";
+        }
+        first = false;
+        print_const_value(*list_iter);
       }
       f_out_ << " }";
     }
@@ -472,7 +470,7 @@
   string name = ttypedef->get_name();
   f_out_ << "<div class=\"definition\">";
   f_out_ << "<h3 id=\"Typedef_" << name << "\">Typedef: " << name
-	 << "</h3>" << endl;
+   << "</h3>" << endl;
   f_out_ << "<p><strong>Base type:</strong>&nbsp;";
   print_type(ttypedef->get_type());
   f_out_ << "</p>" << endl;
@@ -489,7 +487,7 @@
   string name = tenum->get_name();
   f_out_ << "<div class=\"definition\">";
   f_out_ << "<h3 id=\"Enum_" << name << "\">Enumeration: " << name
-	 << "</h3>" << endl;
+   << "</h3>" << endl;
   print_doc(tenum);
   vector<t_enum_value*> values = tenum->get_constants();
   vector<t_enum_value*>::iterator val_iter;
@@ -510,7 +508,7 @@
 void t_html_generator::generate_const(t_const* tconst) {
   string name = tconst->get_name();
   f_out_ << "<tr id=\"Const_" << name << "\"><td><code>" << name
-	 << "</code></td><td><code>";
+   << "</code></td><td><code>";
   print_type(tconst->get_type());
   f_out_ << "</code></td><td><code>";
   print_const_value(tconst->get_value());
@@ -541,7 +539,7 @@
   vector<t_field*>::iterator mem_iter = members.begin();
   f_out_ << "<table>";
   f_out_ << "<tr><th>Key</th><th>Field</th><th>Type</th><th>Description</th><th>Requiredness</th><th>Default value</th></tr>"
-	 << endl;
+    << endl;
   for ( ; mem_iter != members.end(); mem_iter++) {
     f_out_ << "<tr><td>" << (*mem_iter)->get_key() << "</td><td>";
     f_out_ << (*mem_iter)->get_name();
@@ -585,7 +583,7 @@
  */
 void t_html_generator::generate_service(t_service* tservice) {
   f_out_ << "<h3 id=\"Svc_" << service_name_ << "\">Service: "
-	 << service_name_ << "</h3>" << endl;
+    << service_name_ << "</h3>" << endl;
 
   if (tservice->get_extends()) {
     f_out_ << "<div class=\"extends\"><em>extends</em> ";
@@ -599,8 +597,8 @@
     string fn_name = (*fn_iter)->get_name();
     f_out_ << "<div class=\"definition\">";
     f_out_ << "<h4 id=\"Fn_" << service_name_ << "_" << fn_name
-	   << "\">Function: " << service_name_ << "." << fn_name
-	   << "</h4>" << endl;
+      << "\">Function: " << service_name_ << "." << fn_name
+      << "</h4>" << endl;
     f_out_ << "<pre>";
     int offset = print_type((*fn_iter)->get_returntype());
     bool first = true;
@@ -610,19 +608,19 @@
     vector<t_field*>::iterator arg_iter = args.begin();
     if (arg_iter != args.end()) {
       for ( ; arg_iter != args.end(); arg_iter++) {
-	if (!first) {
-	  f_out_ << "," << endl;
-	  for (int i = 0; i < offset; ++i) {
-	    f_out_ << " ";
-	  }
-	}
-	first = false;
-	print_type((*arg_iter)->get_type());
-	f_out_ << " " << (*arg_iter)->get_name();
-	if ((*arg_iter)->get_value() != NULL) {
-	  f_out_ << " = ";
-	  print_const_value((*arg_iter)->get_value());
-	}
+        if (!first) {
+          f_out_ << "," << endl;
+          for (int i = 0; i < offset; ++i) {
+            f_out_ << " ";
+          }
+        }
+        first = false;
+        print_type((*arg_iter)->get_type());
+        f_out_ << " " << (*arg_iter)->get_name();
+        if ((*arg_iter)->get_value() != NULL) {
+          f_out_ << " = ";
+          print_const_value((*arg_iter)->get_value());
+        }
       }
     }
     f_out_ << ")" << endl;
@@ -632,11 +630,11 @@
     if (ex_iter != excepts.end()) {
       f_out_ << "    throws ";
       for ( ; ex_iter != excepts.end(); ex_iter++) {
-	if (!first) {
-	  f_out_ << ", ";
-	}
-	first = false;
-	print_type((*ex_iter)->get_type());
+        if (!first) {
+          f_out_ << ", ";
+        }
+        first = false;
+        print_type((*ex_iter)->get_type());
       }
       f_out_ << endl;
     }
