diff --git a/compiler/cpp/src/generate/t_dart_generator.cc b/compiler/cpp/src/generate/t_dart_generator.cc
index 1bd2ce6..2931447 100644
--- a/compiler/cpp/src/generate/t_dart_generator.cc
+++ b/compiler/cpp/src/generate/t_dart_generator.cc
@@ -176,11 +176,11 @@
 
   void generate_function_helpers(t_function* tfunction);
   std::string get_cap_name(std::string name);
-  std::string get_field_name(std::string name);
+  std::string get_member_name(std::string name);
   std::string get_args_class_name(std::string name);
   std::string get_result_class_name(std::string name);
   std::string get_file_name(std::string name);
-  std::string get_class_name(std::string name);
+  std::string get_constants_class_name(std::string name);
   std::string generate_isset_check(t_field* field);
   std::string generate_isset_check(std::string field);
   void generate_isset_set(ofstream& out, t_field* field);
@@ -535,7 +535,7 @@
     return;
   }
 
-  string class_name = get_class_name(program_name_) + "Constants";
+  string class_name = get_constants_class_name(program_name_);
   string file_name = get_file_name(class_name);
 
   string f_consts_name = src_dir_ + "/" + file_name + ".dart";
@@ -799,7 +799,7 @@
   for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
     generate_dart_doc(out, *m_iter);
     indent(out) << type_name((*m_iter)->get_type()) + " _"
-                << get_field_name((*m_iter)->get_name()) << ";" << endl;
+                << get_member_name((*m_iter)->get_name()) << ";" << endl;
 
     indent(out) << "static const int " << upcase_string((*m_iter)->get_name())
                 << " = " << (*m_iter)->get_key() << ";" << endl;
@@ -811,7 +811,7 @@
   if (members.size() > 0) {
     for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
       if (!type_can_be_null((*m_iter)->get_type())) {
-        string field_name = get_field_name((*m_iter)->get_name());
+        string field_name = get_member_name((*m_iter)->get_name());
         indent(out) << "bool __isset_" << field_name << " = false;" << endl;
       }
     }
@@ -826,7 +826,7 @@
     t_type* t = get_true_type((*m_iter)->get_type());
     if ((*m_iter)->get_value() != NULL) {
       print_const_value(out,
-                        "this." + get_field_name((*m_iter)->get_name()),
+                        "this." + get_member_name((*m_iter)->get_name()),
                         t,
                         (*m_iter)->get_value(),
                         true,
@@ -928,7 +928,7 @@
                  "checked in the validate method" << endl;
   for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
     if ((*f_iter)->get_req() == t_field::T_REQUIRED && !type_can_be_null((*f_iter)->get_type())) {
-      string field_name = get_field_name((*f_iter)->get_name());
+      string field_name = get_member_name((*f_iter)->get_name());
       indent(out) << "if (!__isset_" << field_name << ")";
       scope_up(out);
       indent(out) << "  throw new TProtocolError(TProtocolErrorType.UNKNOWN, \"Required field '"
@@ -956,7 +956,7 @@
   indent(out) << "// check for required fields" << endl;
   for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
     if ((*f_iter)->get_req() == t_field::T_REQUIRED) {
-      string field_name = get_field_name((*f_iter)->get_name());
+      string field_name = get_member_name((*f_iter)->get_name());
       if (type_can_be_null((*f_iter)->get_type())) {
         indent(out) << "if (" << field_name << " == null)";
         scope_up(out);
@@ -978,7 +978,7 @@
     t_type* type = field->get_type();
     // if field is an enum, check that its value is valid
     if (type->is_enum()) {
-      string field_name = get_field_name(field->get_name());
+      string field_name = get_member_name(field->get_name());
       indent(out) << "if (" << generate_isset_check(field) << " && !" << get_ttype_class_name(type)
                   << ".VALID_VALUES.contains(" << field_name << "))";
       scope_up(out);
@@ -1001,7 +1001,6 @@
   out << indent() << "write(TProtocol oprot)";
   scope_up(out);
 
-  string name = tstruct->get_name();
   const vector<t_field*>& fields = tstruct->get_sorted_members();
   vector<t_field*>::const_iterator f_iter;
 
@@ -1011,7 +1010,7 @@
   indent(out) << "oprot.writeStructBegin(_STRUCT_DESC);" << endl;
 
   for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
-    string field_name = get_field_name((*f_iter)->get_name());
+    string field_name = get_member_name((*f_iter)->get_name());
     bool could_be_unset = (*f_iter)->get_req() == t_field::T_OPTIONAL;
     if (could_be_unset) {
       indent(out) << "if (" << generate_isset_check(*f_iter) << ")";
@@ -1058,7 +1057,6 @@
   indent(out) << "write(TProtocol oprot)";
   scope_up(out);
 
-  string name = tstruct->get_name();
   const vector<t_field*>& fields = tstruct->get_sorted_members();
   vector<t_field*>::const_iterator f_iter;
 
@@ -1109,7 +1107,7 @@
   vector<t_field*>::const_iterator f_iter;
   for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
     t_field* field = *f_iter;
-    std::string field_name = get_field_name(field->get_name());
+    std::string field_name = get_member_name(field->get_name());
 
     indent(out) << "case " << upcase_string(field_name) << ":" << endl;
     indent_up();
@@ -1141,7 +1139,7 @@
   vector<t_field*>::const_iterator f_iter;
   for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
     t_field* field = *f_iter;
-    std::string field_name = get_field_name(field->get_name());
+    std::string field_name = get_member_name(field->get_name());
 
     indent(out) << "case " << upcase_string(field_name) << ":" << endl;
     indent_up();
@@ -1214,7 +1212,7 @@
   for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
     t_field* field = *f_iter;
     t_type* type = get_true_type(field->get_type());
-    std::string field_name = get_field_name(field->get_name());
+    std::string field_name = get_member_name(field->get_name());
     std::string cap_name = get_cap_name(field_name);
 
     indent(out) << "// " << field_name << endl;
@@ -1276,7 +1274,7 @@
     }
 
     t_field* field = (*f_iter);
-    std::string field_name = get_field_name(field->get_name());
+    std::string field_name = get_member_name(field->get_name());
 
     if (!first) {
       indent(out) << "ret.write(\", \");" << endl;
@@ -1494,8 +1492,6 @@
   vector<t_function*> functions = tservice->get_functions();
   vector<t_function*>::const_iterator f_iter;
   for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
-    string funname = (*f_iter)->get_name();
-
     // Open function
     indent(f_service_) << function_signature(*f_iter) << " async";
     scope_up(f_service_);
@@ -1508,13 +1504,13 @@
     const vector<t_field*>& fields = arg_struct->get_members();
 
     // Serialize the request
-    indent(f_service_) << "oprot.writeMessageBegin(new TMessage(\"" << funname << "\", "
+    indent(f_service_) << "oprot.writeMessageBegin(new TMessage(\"" << (*f_iter)->get_name() << "\", "
                << ((*f_iter)->is_oneway() ? "TMessageType.ONEWAY" : "TMessageType.CALL")
                << ", nextSeqid()));" << endl;
     indent(f_service_) << argsname << " args = new " << argsname << "();" << endl;
 
     for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) {
-      string arg_field_name = get_field_name((*fld_iter)->get_name());
+      string arg_field_name = get_member_name((*fld_iter)->get_name());
       indent(f_service_) << "args." << arg_field_name << " = "
                  << arg_field_name << ";" << endl;
     }
@@ -1550,7 +1546,7 @@
       const std::vector<t_field*>& xceptions = xs->get_members();
       vector<t_field*>::const_iterator x_iter;
       for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) {
-        string result_field_name = get_field_name((*x_iter)->get_name());
+        string result_field_name = get_member_name((*x_iter)->get_name());
         indent(f_service_) << "if (result." << result_field_name << " != null)";
         scope_up(f_service_);
         indent(f_service_) << "throw result." << result_field_name << ";" << endl;
@@ -1614,7 +1610,7 @@
 
   for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
     indent(f_service_) << "PROCESS_MAP[\"" << (*f_iter)->get_name()
-               << "\"] = " << (*f_iter)->get_name() << ";" << endl;
+               << "\"] = " << get_member_name((*f_iter)->get_name()) << ";" << endl;
   }
   scope_down(f_service_, endl2);
 
@@ -1691,7 +1687,7 @@
 
   bool await_result = (!tfunction->is_oneway() && !tfunction->get_returntype()->is_void());
 
-  indent(f_service_) << tfunction->get_name() << "(int seqid, TProtocol iprot, TProtocol oprot)";
+  indent(f_service_) << get_member_name(tfunction->get_name()) << "(int seqid, TProtocol iprot, TProtocol oprot)";
   if (await_result) {
     f_service_ << " async";
   }
@@ -1726,7 +1722,7 @@
   if (await_result) {
     f_service_ << "result.success = await ";
   }
-  f_service_ << "iface_." << tfunction->get_name() << "(";
+  f_service_ << "iface_." << get_member_name(tfunction->get_name()) << "(";
   bool first = true;
   for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
     if (first) {
@@ -1734,13 +1730,13 @@
     } else {
       f_service_ << ", ";
     }
-    f_service_ << "args." << get_field_name((*f_iter)->get_name());
+    f_service_ << "args." << get_member_name((*f_iter)->get_name());
   }
   f_service_ << ");" << endl;
 
   if (!tfunction->is_oneway() && xceptions.size() > 0) {
     for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) {
-      string result_field_name = get_field_name((*x_iter)->get_name());
+      string result_field_name = get_member_name((*x_iter)->get_name());
       scope_down(f_service_, "");
       f_service_ << " on " << type_name((*x_iter)->get_type())
               << " catch(" << result_field_name << ")";
@@ -1787,7 +1783,7 @@
  */
 void t_dart_generator::generate_deserialize_field(ofstream& out, t_field* tfield, string prefix) {
   t_type* type = get_true_type(tfield->get_type());
-  string field_name = get_field_name(tfield->get_name());
+  string field_name = get_member_name(tfield->get_name());
 
   if (type->is_void()) {
     throw "CANNOT GENERATE DESERIALIZE CODE FOR void TYPE: " + prefix + field_name;
@@ -1969,7 +1965,7 @@
  */
 void t_dart_generator::generate_serialize_field(ofstream& out, t_field* tfield, string prefix) {
   t_type* type = get_true_type(tfield->get_type());
-  string field_name = get_field_name(tfield->get_name());
+  string field_name = get_member_name(tfield->get_name());
 
   // Do nothing for void types
   if (type->is_void()) {
@@ -2190,7 +2186,7 @@
  * @param ttype The type
  */
 string t_dart_generator::declare_field(t_field* tfield, bool init) {
-  string field_name = get_field_name(tfield->get_name());
+  string field_name = get_member_name(tfield->get_name());
   string result = type_name(tfield->get_type()) + " " + field_name;
   if (init) {
     t_type* ttype = get_true_type(tfield->get_type());
@@ -2247,7 +2243,8 @@
     returntype = "Future<" + type_name(tfunction->get_returntype()) + ">";
   }
 
-  std::string result = returntype + " "  + tfunction->get_name() + "(" + arguments + ")";
+  std::string result = returntype + " " + get_member_name(tfunction->get_name()) +
+                       "(" + arguments + ")";
   return result;
 }
 
@@ -2266,7 +2263,7 @@
     } else {
       result += ", ";
     }
-    string field_name = get_field_name((*f_iter)->get_name());
+    string field_name = get_member_name((*f_iter)->get_name());
     result += type_name((*f_iter)->get_type()) + " " + field_name;
   }
   return result;
@@ -2318,7 +2315,7 @@
   return name;
 }
 
-std::string t_dart_generator::get_field_name(std::string name) {
+std::string t_dart_generator::get_member_name(std::string name) {
   name[0] = tolower(name[0]);
   return name;
 }
@@ -2361,8 +2358,8 @@
   return ret;
 }
 
-std::string t_dart_generator::get_class_name(std::string name) {
-  // e.g. change my_great_model to MyGreatModel
+std::string t_dart_generator::get_constants_class_name(std::string name) {
+  // e.g. change my_great_model to MyGreatModelConstants
   string ret;
   const char* tmp = name.c_str();
   bool is_prev_underscore = true;
@@ -2381,7 +2378,7 @@
     }
   }
 
-  return ret;
+  return ret + "Constants";
 }
 
 string t_dart_generator::constant_name(string name) {
@@ -2426,7 +2423,7 @@
     vector<t_field*>::const_iterator p_iter;
     for (p_iter = fields.begin(); p_iter != fields.end(); ++p_iter) {
       t_field* p = *p_iter;
-      string field_name = get_field_name(p->get_name());
+      string field_name = get_member_name(p->get_name());
       ss << "\n@param " << field_name;
       if (p->has_doc()) {
         ss << " " << p->get_doc();
@@ -2437,7 +2434,7 @@
 }
 
 std::string t_dart_generator::generate_isset_check(t_field* field) {
-  string field_name = get_field_name(field->get_name());
+  string field_name = get_member_name(field->get_name());
   return generate_isset_check(field_name);
 }
 
@@ -2447,7 +2444,7 @@
 
 void t_dart_generator::generate_isset_set(ofstream& out, t_field* field) {
   if (!type_can_be_null(field->get_type())) {
-    string field_name = get_field_name(field->get_name());
+    string field_name = get_member_name(field->get_name());
     indent(out) << "this.__isset_" << field_name << " = true;" << endl;
   }
 }
