diff --git a/compiler/cpp/src/generate/t_generator.h b/compiler/cpp/src/generate/t_generator.h
index 7514fb1..617015d 100644
--- a/compiler/cpp/src/generate/t_generator.h
+++ b/compiler/cpp/src/generate/t_generator.h
@@ -178,6 +178,14 @@
     }
     return in;
   }
+  /**
+   * Transforms a camel case string to an equivalent one separated by underscores
+   * e.g. aMultiWord -> a_multi_word
+   *      someName   -> some_name
+   *      CamelCase  -> camel_case
+   *      name       -> name
+   *      Name       -> name
+   */
   std::string underscore(std::string in) {
     in[0] = tolower(in[0]);
     for (size_t i = 1; i < in.size(); ++i) {
@@ -188,6 +196,31 @@
     }
     return in;
   }
+  /**
+    * Transforms a string with words separated by underscores to a camel case equivalent
+    * e.g. a_multi_word -> aMultiWord
+    *      some_name    ->  someName
+    *      name         ->  name
+    */
+  std::string camelcase(std::string in) {
+    std::ostringstream out;
+    bool underscore = false;
+
+    for (size_t i = 0; i < in.size(); i++) {
+      if (in[i] == '_') {
+        underscore = true;
+        continue;
+      }
+      if (underscore) {
+        out << (char) toupper(in[i]);
+        underscore = false;
+        continue;
+      }
+      out << in[i];
+    }
+
+    return out.str();
+  }
 
   /**
    * Get the true type behind a series of typedefs.
diff --git a/compiler/cpp/src/generate/t_st_generator.cc b/compiler/cpp/src/generate/t_st_generator.cc
index 1d2d323..2ed76a4 100644
--- a/compiler/cpp/src/generate/t_st_generator.cc
+++ b/compiler/cpp/src/generate/t_st_generator.cc
@@ -124,7 +124,6 @@
   std::string client_class_name();
   std::string prefix(std::string name);
   std::string declare_field(t_field* tfield);
-  std::string sanitize(std::string s);
   std::string type_name(t_type* ttype);
 
   std::string function_signature(t_function* tfunction);
@@ -495,7 +494,7 @@
   if (members.size() > 0) {
     for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
       if (m_iter != members.begin()) out << " ";
-      out << sanitize((*m_iter)->get_name());
+      out << camelcase((*m_iter)->get_name());
     }
   }
 
@@ -536,7 +535,7 @@
     for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
       st_accessors(out,
                    capitalize(type_name(tstruct)),
-                   sanitize((*m_iter)->get_name()),
+                   camelcase((*m_iter)->get_name()),
                    a_type((*m_iter)->get_type()));
     }
     out << endl;
@@ -706,8 +705,8 @@
 
   for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) {
     bool optional = (*fld_iter)->get_req() == t_field::T_OPTIONAL;
-    string fname = (*fld_iter)->get_name();
-    string accessor = sname + " " + sanitize(fname);
+    string fname = camelcase((*fld_iter)->get_name());
+    string accessor = sname + " " + camelcase(fname);
 
     if (optional) {
       out << indent() << accessor << " ifNotNil: [" << endl;
@@ -765,7 +764,7 @@
     indent_up();
 
     out << indent() << found << " := true." << endl <<
-      indent() << val << " " << sanitize((*fld_iter)->get_name()) << ": " <<
+      indent() << val << " " << camelcase((*fld_iter)->get_name()) << ": " <<
       read_val((*fld_iter)->get_type());
     indent_down();
 
@@ -854,10 +853,10 @@
   indent_down();
 
   f_ << indent() << "oprot writeStructBegin: " <<
-    "(TStruct new name: '" + capitalize(function->get_name()) + "_args')." << endl;
+    "(TStruct new name: '" + capitalize(camelcase(funname)) + "_args')." << endl;
 
   for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) {
-    string fname = (*fld_iter)->get_name();
+    string fname = camelcase((*fld_iter)->get_name());
 
     f_ << indent() << "oprot writeFieldBegin: (TField new name: '" << fname <<
       "'; type: " << type_to_enum((*fld_iter)->get_type()) <<
@@ -875,7 +874,7 @@
 
 // We only support receiving TResult structures (so this won't work on the server side)
 void t_st_generator::generate_recv_method(t_function* function) {
-  string funname = function->get_name();
+  string funname = camelcase(function->get_name());
   string signature = function_signature(function);
 
   t_struct result(program_, "TResult");
@@ -911,7 +910,7 @@
   out << "\"";
 
   for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
-    out << (*f_iter)->get_name() << ": " << type_name((*f_iter)->get_type());
+    out << camelcase((*f_iter)->get_name()) << ": " << type_name((*f_iter)->get_type());
     if ((f_iter + 1) != fields.end()) {
       out << ", ";
     }
@@ -945,7 +944,7 @@
     "\tcategory: '" << generated_category() << "'!\n\n";
 
   for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
-    string funname = (*f_iter)->get_name();
+    string funname = camelcase((*f_iter)->get_name());
     string signature = function_signature(*f_iter);
 
     st_method(f_, client_class_name(), signature);
@@ -965,26 +964,6 @@
   }
 }
 
-string t_st_generator::sanitize(string s) {
-  std::ostringstream out;
-  bool underscore = false;
-
-  for (unsigned int i = 0; i < s.size(); i++) {
-    if (s[i] == '_') {
-      underscore = true;
-      continue;
-    }
-    if (underscore) {
-      out << (char) toupper(s[i]);
-      underscore = false;
-      continue;
-    }
-    out << s[i];
-  }
-
-  return out.str();
-}
-
 /**
  * Renders a function signature of the form 'type name(args)'
  *
@@ -992,7 +971,7 @@
  * @return String of rendered function definition
  */
 string t_st_generator::function_signature(t_function* tfunction) {
-  return tfunction->get_name() + capitalize(argument_list(tfunction->get_arglist()));
+  return camelcase(tfunction->get_name()) + capitalize(argument_list(tfunction->get_arglist()));
 }
 
 /**
@@ -1010,7 +989,8 @@
     } else {
       result += " ";
     }
-    result += (*f_iter)->get_name() + ": " + (*f_iter)->get_name();
+    string name = camelcase((*f_iter)->get_name());
+    result += name + ": " + name;
   }
   return result;
 }
diff --git a/lib/st/thrift.st b/lib/st/thrift.st
index 8675e01..fdb66df 100644
--- a/lib/st/thrift.st
+++ b/lib/st/thrift.st
@@ -294,7 +294,6 @@
 
 !TBinaryProtocol methodsFor: 'reading' stamp: 'pc 02/07/2009 19:00'!
 readString
-readString
 	| sz |
 	sz := self readI32.
 	^ sz > 0 ifTrue: [(transport read: sz) asString] ifFalse: ['']! !
