diff --git a/.gitignore b/.gitignore
index eacff5b..d11897e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -184,9 +184,6 @@
 /lib/c_glib/test/testserialization
 /lib/c_glib/thriftc.pc
 /lib/c_glib/thrift_c_glib.pc
-/lib/csharp/**/bin/
-/lib/csharp/**/obj/
-/lib/csharp/src/packages
 /lib/d/test/*.pem
 /lib/d/libthriftd*.a
 /lib/d/test/async_test
@@ -234,8 +231,6 @@
 /lib/js/dist
 /lib/js/doc
 /lib/js/test/build
-/lib/netcore/**/bin
-/lib/netcore/**/obj
 /lib/netstd/**/bin
 /lib/netstd/**/obj
 /lib/nodejs/coverage
@@ -328,8 +323,6 @@
 /test/cpp/StressTestNonBlocking
 /test/cpp/TestClient
 /test/cpp/TestServer
-/test/csharp/obj
-/test/csharp/bin
 /test/dart/**/.dart_tool
 /test/dart/**/.packages
 /test/dart/**/packages
@@ -358,9 +351,6 @@
 /test/php/php_ext_dir/
 /test/py.twisted/_trial_temp/
 /test/rb/Gemfile.lock
-/test/netcore/**/bin
-/test/netcore/**/obj
-/test/netcore/Thrift
 /test/netstd/**/bin
 /test/netstd/**/obj
 /test/netstd/**/launchSettings.json
@@ -393,10 +383,6 @@
 /tutorial/cpp/TutorialServer
 /tutorial/c_glib/tutorial_client
 /tutorial/c_glib/tutorial_server
-/tutorial/csharp/CsharpServer/obj
-/tutorial/csharp/CsharpServer/bin
-/tutorial/csharp/CsharpClient/obj
-/tutorial/csharp/CsharpClient/bin
 /tutorial/d/async_client
 /tutorial/d/client
 /tutorial/d/server
@@ -421,9 +407,6 @@
 /tutorial/hs/dist/
 /tutorial/java/build/
 /tutorial/js/build/
-/tutorial/netcore/**/bin
-/tutorial/netcore/**/obj
-/tutorial/netcore/Thrift
 /tutorial/netstd/**/bin
 /tutorial/netstd/**/obj
 /tutorial/netstd/Interfaces
diff --git a/compiler/cpp/CMakeLists.txt b/compiler/cpp/CMakeLists.txt
index 0d80f79..0675f0e 100644
--- a/compiler/cpp/CMakeLists.txt
+++ b/compiler/cpp/CMakeLists.txt
@@ -76,7 +76,6 @@
 THRIFT_ADD_COMPILER(c_glib  "Enable compiler for C with Glib" ON)
 THRIFT_ADD_COMPILER(cl      "Enable compiler for Common LISP" ON)
 THRIFT_ADD_COMPILER(cpp     "Enable compiler for C++" ON)
-THRIFT_ADD_COMPILER(csharp  "Enable compiler for C#" ON)
 THRIFT_ADD_COMPILER(d       "Enable compiler for D" ON)
 THRIFT_ADD_COMPILER(dart    "Enable compiler for Dart" ON)
 THRIFT_ADD_COMPILER(delphi  "Enable compiler for Delphi" ON)
diff --git a/compiler/cpp/Makefile.am b/compiler/cpp/Makefile.am
index 2f962fe..05c9121 100644
--- a/compiler/cpp/Makefile.am
+++ b/compiler/cpp/Makefile.am
@@ -73,7 +73,6 @@
                   src/thrift/generate/t_c_glib_generator.cc \
                   src/thrift/generate/t_cl_generator.cc \
                   src/thrift/generate/t_cpp_generator.cc \
-                  src/thrift/generate/t_csharp_generator.cc \
                   src/thrift/generate/t_d_generator.cc \
                   src/thrift/generate/t_dart_generator.cc \
                   src/thrift/generate/t_delphi_generator.cc \
diff --git a/compiler/cpp/compiler.vcxproj b/compiler/cpp/compiler.vcxproj
index 6e2bd8a..dc9793f 100644
--- a/compiler/cpp/compiler.vcxproj
+++ b/compiler/cpp/compiler.vcxproj
@@ -1,5 +1,5 @@
 ﻿<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <ItemGroup Label="ProjectConfigurations">
     <ProjectConfiguration Include="Debug|Win32">
       <Configuration>Debug</Configuration>
@@ -57,7 +57,6 @@
     <ClCompile Include="src\thrift\generate\t_c_glib_generator.cc" />
     <ClCompile Include="src\thrift\generate\t_cl_generator.cc" />
     <ClCompile Include="src\thrift\generate\t_cpp_generator.cc" />
-    <ClCompile Include="src\thrift\generate\t_csharp_generator.cc" />
     <ClCompile Include="src\thrift\generate\t_d_generator.cc" />
     <ClCompile Include="src\thrift\generate\t_dart_generator.cc" />
     <ClCompile Include="src\thrift\generate\t_delphi_generator.cc" />
@@ -99,34 +98,29 @@
     <ProjectGuid>{89975A1A-F799-4556-98B8-64E30AB39A90}</ProjectGuid>
     <Keyword>Win32Proj</Keyword>
     <RootNamespace>compiler</RootNamespace>
-    <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
     <ConfigurationType>Application</ConfigurationType>
     <UseDebugLibraries>true</UseDebugLibraries>
     <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v142</PlatformToolset>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
     <ConfigurationType>Application</ConfigurationType>
     <UseDebugLibraries>true</UseDebugLibraries>
     <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v142</PlatformToolset>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
     <ConfigurationType>Application</ConfigurationType>
     <UseDebugLibraries>false</UseDebugLibraries>
     <WholeProgramOptimization>true</WholeProgramOptimization>
     <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v142</PlatformToolset>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
     <ConfigurationType>Application</ConfigurationType>
     <UseDebugLibraries>false</UseDebugLibraries>
     <WholeProgramOptimization>true</WholeProgramOptimization>
     <CharacterSet>MultiByte</CharacterSet>
-    <PlatformToolset>v142</PlatformToolset>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
   <ImportGroup Label="ExtensionSettings">
@@ -149,7 +143,6 @@
     <IncludePath>$(ProjectDir)\src\;$(ProjectDir)\src\windows\;$(IncludePath)</IncludePath>
     <TargetName>thrift</TargetName>
     <ExecutablePath>$(ExecutablePath);C:\Program Files (x86)\Git\bin</ExecutablePath>
-    <OutDir>E:\D\TOOLS\Thrift\</OutDir>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
     <LinkIncremental>true</LinkIncremental>
diff --git a/compiler/cpp/compiler.vcxproj.filters b/compiler/cpp/compiler.vcxproj.filters
index fcb3230..360c446 100644
--- a/compiler/cpp/compiler.vcxproj.filters
+++ b/compiler/cpp/compiler.vcxproj.filters
@@ -101,9 +101,6 @@
     <ClCompile Include="src\generate\t_cpp_generator.cc">
       <Filter>generate</Filter>
     </ClCompile>
-    <ClCompile Include="src\generate\t_csharp_generator.cc">
-      <Filter>generate</Filter>
-    </ClCompile>
     <ClCompile Include="src\generate\t_c_glib_generator.cc">
       <Filter>generate</Filter>
     </ClCompile>
diff --git a/compiler/cpp/src/thrift/generate/t_csharp_generator.cc b/compiler/cpp/src/thrift/generate/t_csharp_generator.cc
deleted file mode 100644
index e4d99b2..0000000
--- a/compiler/cpp/src/thrift/generate/t_csharp_generator.cc
+++ /dev/null
@@ -1,3259 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- * Contains some contributions under the Thrift Software License.
- * Please see doc/old-thrift-license.txt in the Thrift distribution for
- * details.
- */
-
-#include <cassert>
-
-#include <string>
-#include <fstream>
-#include <iostream>
-#include <vector>
-#include <cctype>
-
-#include <stdlib.h>
-#include <sys/stat.h>
-#include <sstream>
-
-#include "thrift/platform.h"
-#include "thrift/generate/t_oop_generator.h"
-
-using std::map;
-using std::ostream;
-using std::ostringstream;
-using std::string;
-using std::stringstream;
-using std::vector;
-
-static const string endl = "\n"; // avoid ostream << std::endl flushes
-
-struct member_mapping_scope {
-  void* scope_member;
-  std::map<std::string, std::string> mapping_table;
-};
-
-class t_csharp_generator : public t_oop_generator {
-public:
-  t_csharp_generator(t_program* program,
-                     const std::map<std::string, std::string>& parsed_options,
-                     const std::string& option_string)
-    : t_oop_generator(program) {
-    (void)option_string;
-
-    std::map<std::string, std::string>::const_iterator iter;
-
-    async_ = false;
-    nullable_ = false;
-    hashcode_ = false;
-    union_ = false;
-    serialize_ = false;
-    wcf_ = false;
-    wcf_namespace_.clear();
-    for( iter = parsed_options.begin(); iter != parsed_options.end(); ++iter) {
-      if( iter->first.compare("async") == 0) {
-        async_ = true;
-      } else if( iter->first.compare("nullable") == 0) {
-        nullable_ = true;
-      } else if( iter->first.compare("hashcode") == 0) {
-        hashcode_ = true;
-      } else if( iter->first.compare("union") == 0) {
-        union_ = true;
-      } else if( iter->first.compare("serial") == 0) {
-        serialize_ = true;
-        wcf_namespace_ = iter->second; // since there can be only one namespace
-      } else if( iter->first.compare("wcf") == 0) {
-        wcf_ = true;
-        wcf_namespace_ = iter->second;
-      } else {
-        throw "unknown option csharp:" + iter->first;
-      }
-    }
-
-    out_dir_base_ = "gen-csharp";
-  }
-  void init_generator() override;
-  void close_generator() override;
-
-  void generate_consts(std::vector<t_const*> consts) override;
-
-  void generate_typedef(t_typedef* ttypedef) override;
-  void generate_enum(t_enum* tenum) override;
-  void generate_struct(t_struct* tstruct) override;
-  void generate_union(t_struct* tunion);
-  void generate_xception(t_struct* txception) override;
-  void generate_service(t_service* tservice) override;
-  void generate_property(ostream& out, t_field* tfield, bool isPublic, bool generateIsset);
-  void generate_csharp_property(ostream& out,
-                                t_field* tfield,
-                                bool isPublic,
-                                bool includeIsset = true,
-                                std::string fieldPrefix = "");
-  bool print_const_value(std::ostream& out,
-                         std::string name,
-                         t_type* type,
-                         t_const_value* value,
-                         bool in_static,
-                         bool defval = false,
-                         bool needtype = false);
-  std::string render_const_value(std::ostream& out,
-                                 std::string name,
-                                 t_type* type,
-                                 t_const_value* value);
-  void print_const_constructor(std::ostream& out, std::vector<t_const*> consts);
-  void print_const_def_value(std::ostream& out,
-                             std::string name,
-                             t_type* type,
-                             t_const_value* value);
-
-  void generate_csharp_struct(t_struct* tstruct, bool is_exception);
-  void generate_csharp_union(t_struct* tunion);
-  void generate_csharp_struct_definition(std::ostream& out,
-                                         t_struct* tstruct,
-                                         bool is_xception = false,
-                                         bool in_class = false,
-                                         bool is_result = false);
-  void generate_csharp_union_definition(std::ostream& out, t_struct* tunion);
-  void generate_csharp_union_class(std::ostream& out, t_struct* tunion, t_field* tfield);
-  void generate_csharp_wcffault(std::ostream& out, t_struct* tstruct);
-  void generate_csharp_struct_reader(std::ostream& out, t_struct* tstruct);
-  void generate_csharp_struct_result_writer(std::ostream& out, t_struct* tstruct);
-  void generate_csharp_struct_writer(std::ostream& out, t_struct* tstruct);
-  void generate_csharp_struct_tostring(std::ostream& out, t_struct* tstruct);
-  void generate_csharp_struct_equals(std::ostream& out, t_struct* tstruct);
-  void generate_csharp_struct_hashcode(std::ostream& out, t_struct* tstruct);
-  void generate_csharp_union_reader(std::ostream& out, t_struct* tunion);
-
-  void generate_function_helpers(t_function* tfunction);
-  void generate_service_interface(t_service* tservice);
-  void generate_separate_service_interfaces(t_service* tservice);
-  void generate_sync_service_interface(t_service* tservice);
-  void generate_async_service_interface(t_service* tservice);
-  void generate_combined_service_interface(t_service* tservice);
-  void generate_silverlight_async_methods(t_service* tservice);
-  void generate_service_helpers(t_service* tservice);
-  void generate_service_client(t_service* tservice);
-  void generate_service_server(t_service* tservice);
-  void generate_service_server_sync(t_service* tservice);
-  void generate_service_server_async(t_service* tservice);
-  void generate_process_function(t_service* tservice, t_function* function);
-  void generate_process_function_async(t_service* tservice, t_function* function);
-
-  void generate_deserialize_field(std::ostream& out,
-                                  t_field* tfield,
-                                  std::string prefix = "",
-                                  bool is_propertyless = false);
-  void generate_deserialize_struct(std::ostream& out, t_struct* tstruct, std::string prefix = "");
-  void generate_deserialize_container(std::ostream& out, t_type* ttype, std::string prefix = "");
-  void generate_deserialize_set_element(std::ostream& out, t_set* tset, std::string prefix = "");
-  void generate_deserialize_map_element(std::ostream& out, t_map* tmap, std::string prefix = "");
-  void generate_deserialize_list_element(std::ostream& out, t_list* list, std::string prefix = "");
-  void generate_serialize_field(std::ostream& out,
-                                t_field* tfield,
-                                std::string prefix = "",
-                                bool is_element = false,
-                                bool is_propertyless = false);
-  void generate_serialize_struct(std::ostream& out, t_struct* tstruct, std::string prefix = "");
-  void generate_serialize_container(std::ostream& out, t_type* ttype, std::string prefix = "");
-  void generate_serialize_map_element(std::ostream& out,
-                                      t_map* tmap,
-                                      std::string iter,
-                                      std::string map);
-  void generate_serialize_set_element(std::ostream& out, t_set* tmap, std::string iter);
-  void generate_serialize_list_element(std::ostream& out, t_list* tlist, std::string iter);
-
-  void generate_csharp_doc(std::ostream& out, t_field* field);
-  void generate_csharp_doc(std::ostream& out, t_doc* tdoc);
-  void generate_csharp_doc(std::ostream& out, t_function* tdoc);
-  void generate_csharp_docstring_comment(std::ostream& out, string contents);
-
-  void start_csharp_namespace(std::ostream& out);
-  void end_csharp_namespace(std::ostream& out);
-
-  std::string csharp_type_usings();
-  std::string csharp_thrift_usings();
-
-  std::string type_name(t_type* ttype,
-                        bool in_countainer = false,
-                        bool in_init = false,
-                        bool in_param = false,
-                        bool is_required = false);
-  std::string base_type_name(t_base_type* tbase,
-                             bool in_container = false,
-                             bool in_param = false,
-                             bool is_required = false);
-  std::string declare_field(t_field* tfield, bool init = false, std::string prefix = "");
-  std::string function_signature_async_begin(t_function* tfunction, std::string prefix = "");
-  std::string function_signature_async_end(t_function* tfunction, std::string prefix = "");
-  std::string function_signature_async(t_function* tfunction, std::string prefix = "");
-  std::string function_signature(t_function* tfunction, std::string prefix = "");
-  std::string argument_list(t_struct* tstruct);
-  std::string type_to_enum(t_type* ttype);
-  std::string prop_name(t_field* tfield, bool suppress_mapping = false);
-  std::string get_enum_class_name(t_type* type) override;
-
-  bool field_has_default(t_field* tfield) { return tfield->get_value() != NULL; }
-
-  bool field_is_required(t_field* tfield) { return tfield->get_req() == t_field::T_REQUIRED; }
-
-  bool type_can_be_null(t_type* ttype) {
-    while (ttype->is_typedef()) {
-      ttype = ((t_typedef*)ttype)->get_type();
-    }
-
-    return ttype->is_container() || ttype->is_struct() || ttype->is_xception()
-           || ttype->is_string();
-  }
-
-private:
-  std::string namespace_name_;
-  ofstream_with_content_based_conditional_update f_service_;
-  std::string namespace_dir_;
-  bool async_;
-  bool nullable_;
-  bool union_;
-  bool hashcode_;
-  bool serialize_;
-  bool wcf_;
-  std::string wcf_namespace_;
-
-  std::map<std::string, int> csharp_keywords;
-  std::vector<member_mapping_scope>  member_mapping_scopes;
-
-  void init_keywords();
-  std::string normalize_name(std::string name);
-  std::string make_valid_csharp_identifier(std::string const& fromName);
-  void prepare_member_name_mapping(t_struct* tstruct);
-  void prepare_member_name_mapping(void* scope,
-                                   const vector<t_field*>& members,
-                                   const string& structname);
-  void cleanup_member_name_mapping(void* scope);
-  string get_mapped_member_name(string oldname);
-};
-
-void t_csharp_generator::init_generator() {
-  MKDIR(get_out_dir().c_str());
-  namespace_name_ = program_->get_namespace("csharp");
-
-  string dir = namespace_name_;
-  string subdir = get_out_dir().c_str();
-  string::size_type loc;
-
-  while ((loc = dir.find(".")) != string::npos) {
-    subdir = subdir + "/" + dir.substr(0, loc);
-    MKDIR(subdir.c_str());
-    dir = dir.substr(loc + 1);
-  }
-  if (dir.size() > 0) {
-    subdir = subdir + "/" + dir;
-    MKDIR(subdir.c_str());
-  }
-
-  namespace_dir_ = subdir;
-  init_keywords();
-
-  while( ! member_mapping_scopes.empty()) {
-    cleanup_member_name_mapping( member_mapping_scopes.back().scope_member);
-  }
-
-  pverbose("C# options:\n");
-  pverbose("- async ...... %s\n", (async_ ? "ON" : "off"));
-  pverbose("- nullable ... %s\n", (nullable_ ? "ON" : "off"));
-  pverbose("- union ...... %s\n", (union_ ? "ON" : "off"));
-  pverbose("- hashcode ... %s\n", (hashcode_ ? "ON" : "off"));
-  pverbose("- serialize .. %s\n", (serialize_ ? "ON" : "off"));
-  pverbose("- wcf ........ %s\n", (wcf_ ? "ON" : "off"));
-}
-
-std::string t_csharp_generator::normalize_name(std::string name) {
-  string tmp(name);
-  std::transform(tmp.begin(), tmp.end(), tmp.begin(), static_cast<int (*)(int)>(std::tolower));
-
-  // un-conflict keywords by prefixing with "@"
-  if (csharp_keywords.find(tmp) != csharp_keywords.end()) {
-    return "@" + name;
-  }
-
-  // no changes necessary
-  return name;
-}
-
-void t_csharp_generator::init_keywords() {
-  csharp_keywords.clear();
-
-  // C# keywords
-  csharp_keywords["abstract"] = 1;
-  csharp_keywords["as"] = 1;
-  csharp_keywords["base"] = 1;
-  csharp_keywords["bool"] = 1;
-  csharp_keywords["break"] = 1;
-  csharp_keywords["byte"] = 1;
-  csharp_keywords["case"] = 1;
-  csharp_keywords["catch"] = 1;
-  csharp_keywords["char"] = 1;
-  csharp_keywords["checked"] = 1;
-  csharp_keywords["class"] = 1;
-  csharp_keywords["const"] = 1;
-  csharp_keywords["continue"] = 1;
-  csharp_keywords["decimal"] = 1;
-  csharp_keywords["default"] = 1;
-  csharp_keywords["delegate"] = 1;
-  csharp_keywords["do"] = 1;
-  csharp_keywords["double"] = 1;
-  csharp_keywords["else"] = 1;
-  csharp_keywords["enum"] = 1;
-  csharp_keywords["event"] = 1;
-  csharp_keywords["explicit"] = 1;
-  csharp_keywords["extern"] = 1;
-  csharp_keywords["false"] = 1;
-  csharp_keywords["finally"] = 1;
-  csharp_keywords["fixed"] = 1;
-  csharp_keywords["float"] = 1;
-  csharp_keywords["for"] = 1;
-  csharp_keywords["foreach"] = 1;
-  csharp_keywords["goto"] = 1;
-  csharp_keywords["if"] = 1;
-  csharp_keywords["implicit"] = 1;
-  csharp_keywords["in"] = 1;
-  csharp_keywords["int"] = 1;
-  csharp_keywords["interface"] = 1;
-  csharp_keywords["internal"] = 1;
-  csharp_keywords["is"] = 1;
-  csharp_keywords["lock"] = 1;
-  csharp_keywords["long"] = 1;
-  csharp_keywords["namespace"] = 1;
-  csharp_keywords["new"] = 1;
-  csharp_keywords["null"] = 1;
-  csharp_keywords["object"] = 1;
-  csharp_keywords["operator"] = 1;
-  csharp_keywords["out"] = 1;
-  csharp_keywords["override"] = 1;
-  csharp_keywords["params"] = 1;
-  csharp_keywords["private"] = 1;
-  csharp_keywords["protected"] = 1;
-  csharp_keywords["public"] = 1;
-  csharp_keywords["readonly"] = 1;
-  csharp_keywords["ref"] = 1;
-  csharp_keywords["return"] = 1;
-  csharp_keywords["sbyte"] = 1;
-  csharp_keywords["sealed"] = 1;
-  csharp_keywords["short"] = 1;
-  csharp_keywords["sizeof"] = 1;
-  csharp_keywords["stackalloc"] = 1;
-  csharp_keywords["static"] = 1;
-  csharp_keywords["string"] = 1;
-  csharp_keywords["struct"] = 1;
-  csharp_keywords["switch"] = 1;
-  csharp_keywords["this"] = 1;
-  csharp_keywords["throw"] = 1;
-  csharp_keywords["true"] = 1;
-  csharp_keywords["try"] = 1;
-  csharp_keywords["typeof"] = 1;
-  csharp_keywords["uint"] = 1;
-  csharp_keywords["ulong"] = 1;
-  csharp_keywords["unchecked"] = 1;
-  csharp_keywords["unsafe"] = 1;
-  csharp_keywords["ushort"] = 1;
-  csharp_keywords["using"] = 1;
-  csharp_keywords["virtual"] = 1;
-  csharp_keywords["void"] = 1;
-  csharp_keywords["volatile"] = 1;
-  csharp_keywords["while"] = 1;
-
-  // C# contextual keywords
-  csharp_keywords["add"] = 1;
-  csharp_keywords["alias"] = 1;
-  csharp_keywords["ascending"] = 1;
-  csharp_keywords["async"] = 1;
-  csharp_keywords["await"] = 1;
-  csharp_keywords["descending"] = 1;
-  csharp_keywords["dynamic"] = 1;
-  csharp_keywords["from"] = 1;
-  csharp_keywords["get"] = 1;
-  csharp_keywords["global"] = 1;
-  csharp_keywords["group"] = 1;
-  csharp_keywords["into"] = 1;
-  csharp_keywords["join"] = 1;
-  csharp_keywords["let"] = 1;
-  csharp_keywords["orderby"] = 1;
-  csharp_keywords["partial"] = 1;
-  csharp_keywords["remove"] = 1;
-  csharp_keywords["select"] = 1;
-  csharp_keywords["set"] = 1;
-  csharp_keywords["value"] = 1;
-  csharp_keywords["var"] = 1;
-  csharp_keywords["where"] = 1;
-  csharp_keywords["yield"] = 1;
-}
-
-void t_csharp_generator::start_csharp_namespace(ostream& out) {
-  if (!namespace_name_.empty()) {
-    out << "namespace " << namespace_name_ << "\n";
-    scope_up(out);
-  }
-}
-
-void t_csharp_generator::end_csharp_namespace(ostream& out) {
-  if (!namespace_name_.empty()) {
-    scope_down(out);
-  }
-}
-
-string t_csharp_generator::csharp_type_usings() {
-  return string() + "using System;\n" + "using System.Collections;\n"
-         + "using System.Collections.Generic;\n" + "using System.Text;\n" + "using System.IO;\n"
-         + ((async_) ? "using System.Threading.Tasks;\n" : "") + "using Thrift;\n"
-         + "using Thrift.Collections;\n" + ((serialize_ || wcf_) ? "#if !SILVERLIGHT\n" : "")
-         + ((serialize_ || wcf_) ? "using System.Xml.Serialization;\n" : "")
-         + ((serialize_ || wcf_) ? "#endif\n" : "")
-         + "using System.Runtime.Serialization;\n";
-}
-
-string t_csharp_generator::csharp_thrift_usings() {
-  return string() + "using Thrift.Protocol;\n" + "using Thrift.Transport;\n";
-}
-
-void t_csharp_generator::close_generator() {
-}
-void t_csharp_generator::generate_typedef(t_typedef* ttypedef) {
-  (void)ttypedef;
-}
-
-void t_csharp_generator::generate_enum(t_enum* tenum) {
-  string f_enum_name = namespace_dir_ + "/" + (tenum->get_name()) + ".cs";
-  ofstream_with_content_based_conditional_update f_enum;
-  f_enum.open(f_enum_name.c_str());
-
-  f_enum << autogen_comment() << endl;
-
-  start_csharp_namespace(f_enum);
-
-  generate_csharp_doc(f_enum, tenum);
-
-  indent(f_enum) << "public enum " << tenum->get_name() << "\n";
-  scope_up(f_enum);
-
-  vector<t_enum_value*> constants = tenum->get_constants();
-  vector<t_enum_value*>::iterator c_iter;
-  for (c_iter = constants.begin(); c_iter != constants.end(); ++c_iter) {
-    generate_csharp_doc(f_enum, *c_iter);
-
-    int value = (*c_iter)->get_value();
-    indent(f_enum) << (*c_iter)->get_name() << " = " << value << "," << endl;
-  }
-
-  scope_down(f_enum);
-
-  end_csharp_namespace(f_enum);
-
-  f_enum.close();
-}
-
-void t_csharp_generator::generate_consts(std::vector<t_const*> consts) {
-  if (consts.empty()) {
-    return;
-  }
-  string f_consts_name = namespace_dir_ + '/' + program_name_ + ".Constants.cs";
-  ofstream_with_content_based_conditional_update f_consts;
-  f_consts.open(f_consts_name.c_str());
-
-  f_consts << autogen_comment() << csharp_type_usings() << endl;
-
-  start_csharp_namespace(f_consts);
-
-  indent(f_consts) << "public static class " << make_valid_csharp_identifier(program_name_)
-                   << "Constants" << endl;
-  scope_up(f_consts);
-
-  vector<t_const*>::iterator c_iter;
-  bool need_static_constructor = false;
-  for (c_iter = consts.begin(); c_iter != consts.end(); ++c_iter) {
-    generate_csharp_doc(f_consts, (*c_iter));
-    if (print_const_value(f_consts,
-                          (*c_iter)->get_name(),
-                          (*c_iter)->get_type(),
-                          (*c_iter)->get_value(),
-                          false)) {
-      need_static_constructor = true;
-    }
-  }
-
-  if (need_static_constructor) {
-    print_const_constructor(f_consts, consts);
-  }
-
-  scope_down(f_consts);
-  end_csharp_namespace(f_consts);
-  f_consts.close();
-}
-
-void t_csharp_generator::print_const_def_value(std::ostream& out,
-                                               string name,
-                                               t_type* type,
-                                               t_const_value* value) {
-  if (type->is_struct() || type->is_xception()) {
-    const vector<t_field*>& fields = ((t_struct*)type)->get_members();
-    vector<t_field*>::const_iterator f_iter;
-    const map<t_const_value*, t_const_value*, t_const_value::value_compare>& val = value->get_map();
-    map<t_const_value*, t_const_value*, t_const_value::value_compare>::const_iterator v_iter;
-    prepare_member_name_mapping((t_struct*)type);
-    for (v_iter = val.begin(); v_iter != val.end(); ++v_iter) {
-      t_field* field = NULL;
-      for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
-        if ((*f_iter)->get_name() == v_iter->first->get_string()) {
-          field = (*f_iter);
-        }
-      }
-      if (field == NULL) {
-        throw "type error: " + type->get_name() + " has no field " + v_iter->first->get_string();
-      }
-      t_type* field_type = field->get_type();
-      string val = render_const_value(out, name, field_type, v_iter->second);
-      indent(out) << name << "." << prop_name(field) << " = " << val << ";" << endl;
-    }
-    cleanup_member_name_mapping((t_struct*)type);
-  } else if (type->is_map()) {
-    t_type* ktype = ((t_map*)type)->get_key_type();
-    t_type* vtype = ((t_map*)type)->get_val_type();
-    const map<t_const_value*, t_const_value*, t_const_value::value_compare>& val = value->get_map();
-    map<t_const_value*, t_const_value*, t_const_value::value_compare>::const_iterator v_iter;
-    for (v_iter = val.begin(); v_iter != val.end(); ++v_iter) {
-      string key = render_const_value(out, name, ktype, v_iter->first);
-      string val = render_const_value(out, name, vtype, v_iter->second);
-      indent(out) << name << "[" << key << "]"
-                  << " = " << val << ";" << endl;
-    }
-  } else if (type->is_list() || type->is_set()) {
-    t_type* etype;
-    if (type->is_list()) {
-      etype = ((t_list*)type)->get_elem_type();
-    } else {
-      etype = ((t_set*)type)->get_elem_type();
-    }
-
-    const vector<t_const_value*>& val = value->get_list();
-    vector<t_const_value*>::const_iterator v_iter;
-    for (v_iter = val.begin(); v_iter != val.end(); ++v_iter) {
-      string val = render_const_value(out, name, etype, *v_iter);
-      indent(out) << name << ".Add(" << val << ");" << endl;
-    }
-  }
-}
-
-void t_csharp_generator::print_const_constructor(std::ostream& out, std::vector<t_const*> consts) {
-  indent(out) << "static " << make_valid_csharp_identifier(program_name_).c_str() << "Constants()"
-              << endl;
-  scope_up(out);
-  vector<t_const*>::iterator c_iter;
-  for (c_iter = consts.begin(); c_iter != consts.end(); ++c_iter) {
-    string name = (*c_iter)->get_name();
-    t_type* type = (*c_iter)->get_type();
-    t_const_value* value = (*c_iter)->get_value();
-
-    print_const_def_value(out, name, type, value);
-  }
-  scope_down(out);
-}
-
-// it seems like all that methods that call this are using in_static to be the opposite of what it
-// would imply
-bool t_csharp_generator::print_const_value(std::ostream& out,
-                                           string name,
-                                           t_type* type,
-                                           t_const_value* value,
-                                           bool in_static,
-                                           bool defval,
-                                           bool needtype) {
-  indent(out);
-  bool need_static_construction = !in_static;
-  while (type->is_typedef()) {
-    type = ((t_typedef*)type)->get_type();
-  }
-
-  if (!defval || needtype) {
-    out << (in_static ? "" : type->is_base_type() ? "public const " : "public static ")
-        << type_name(type) << " ";
-  }
-  if (type->is_base_type()) {
-    string v2 = render_const_value(out, name, type, value);
-    out << name << " = " << v2 << ";" << endl;
-    need_static_construction = false;
-  } else if (type->is_enum()) {
-    out << name << " = " << type_name(type, false, true) << "." << value->get_identifier_name()
-        << ";" << endl;
-    need_static_construction = false;
-  } else if (type->is_struct() || type->is_xception()) {
-    out << name << " = new " << type_name(type) << "();" << endl;
-  } else if (type->is_map()) {
-    out << name << " = new " << type_name(type, true, true) << "();" << endl;
-  } else if (type->is_list() || type->is_set()) {
-    out << name << " = new " << type_name(type) << "();" << endl;
-  }
-
-  if (defval && !type->is_base_type() && !type->is_enum()) {
-    print_const_def_value(out, name, type, value);
-  }
-
-  return need_static_construction;
-}
-
-std::string t_csharp_generator::render_const_value(ostream& out,
-                                                   string name,
-                                                   t_type* type,
-                                                   t_const_value* value) {
-  (void)name;
-  std::ostringstream render;
-
-  if (type->is_base_type()) {
-    t_base_type::t_base tbase = ((t_base_type*)type)->get_base();
-    switch (tbase) {
-    case t_base_type::TYPE_STRING:
-      render << '"' << get_escaped_string(value) << '"';
-      break;
-    case t_base_type::TYPE_BOOL:
-      render << ((value->get_integer() > 0) ? "true" : "false");
-      break;
-    case t_base_type::TYPE_I8:
-    case t_base_type::TYPE_I16:
-    case t_base_type::TYPE_I32:
-    case t_base_type::TYPE_I64:
-      render << value->get_integer();
-      break;
-    case t_base_type::TYPE_DOUBLE:
-      if (value->get_type() == t_const_value::CV_INTEGER) {
-        render << value->get_integer();
-      } else {
-        render << value->get_double();
-      }
-      break;
-    default:
-      throw "compiler error: no const of base type " + t_base_type::t_base_name(tbase);
-    }
-  } else if (type->is_enum()) {
-    render << type->get_name() << "." << value->get_identifier_name();
-  } else {
-    string t = tmp("tmp");
-    print_const_value(out, t, type, value, true, true, true);
-    render << t;
-  }
-
-  return render.str();
-}
-
-void t_csharp_generator::generate_struct(t_struct* tstruct) {
-  if (union_ && tstruct->is_union()) {
-    generate_csharp_union(tstruct);
-  } else {
-    generate_csharp_struct(tstruct, false);
-  }
-}
-
-void t_csharp_generator::generate_xception(t_struct* txception) {
-  generate_csharp_struct(txception, true);
-}
-
-void t_csharp_generator::generate_csharp_struct(t_struct* tstruct, bool is_exception) {
-  string f_struct_name = namespace_dir_ + "/" + (tstruct->get_name()) + ".cs";
-  ofstream_with_content_based_conditional_update f_struct;
-
-  f_struct.open(f_struct_name.c_str());
-
-  f_struct << autogen_comment() << csharp_type_usings() << csharp_thrift_usings() << endl;
-
-  generate_csharp_struct_definition(f_struct, tstruct, is_exception);
-
-  f_struct.close();
-}
-
-void t_csharp_generator::generate_csharp_struct_definition(ostream& out,
-                                                           t_struct* tstruct,
-                                                           bool is_exception,
-                                                           bool in_class,
-                                                           bool is_result) {
-
-  if (!in_class) {
-    start_csharp_namespace(out);
-  }
-
-  out << endl;
-
-  generate_csharp_doc(out, tstruct);
-  prepare_member_name_mapping(tstruct);
-
-  indent(out) << "#if !SILVERLIGHT" << endl;
-  indent(out) << "[Serializable]" << endl;
-  indent(out) << "#endif" << endl;
-  if ((serialize_ || wcf_) && !is_exception) {
-    indent(out) << "[DataContract(Namespace=\"" << wcf_namespace_ << "\")]"
-                << endl; // do not make exception classes directly WCF serializable, we provide a
-                         // separate "fault" for that
-  }
-  bool is_final = (tstruct->annotations_.find("final") != tstruct->annotations_.end());
-
-  indent(out) << "public " << (is_final ? "sealed " : "") << "partial class "
-              << normalize_name(tstruct->get_name()) << " : ";
-
-  if (is_exception) {
-    out << "TException, ";
-  }
-  out << "TBase";
-
-  out << endl;
-
-  scope_up(out);
-
-  const vector<t_field*>& members = tstruct->get_members();
-  vector<t_field*>::const_iterator m_iter;
-
-  // make private members with public Properties
-  for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
-    // if the field is requied, then we use auto-properties
-    if (!field_is_required((*m_iter)) && (!nullable_ || field_has_default((*m_iter)))) {
-      indent(out) << "private " << declare_field(*m_iter, false, "_") << endl;
-    }
-  }
-  out << endl;
-
-  bool has_non_required_fields = false;
-  bool has_non_required_default_value_fields = false;
-  bool has_required_fields = false;
-  for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
-    generate_csharp_doc(out, *m_iter);
-    generate_property(out, *m_iter, true, true);
-    bool is_required = field_is_required((*m_iter));
-    bool has_default = field_has_default((*m_iter));
-    if (is_required) {
-      has_required_fields = true;
-    } else {
-      if (has_default) {
-        has_non_required_default_value_fields = true;
-      }
-      has_non_required_fields = true;
-    }
-  }
-
-  bool generate_isset = (nullable_ && has_non_required_default_value_fields)
-                        || (!nullable_ && has_non_required_fields);
-  if (generate_isset) {
-    out << endl;
-    if (serialize_ || wcf_) {
-      out << indent() << "[XmlIgnore] // XmlSerializer" << endl << indent()
-          << "[DataMember(Order = 1)]  // XmlObjectSerializer, DataContractJsonSerializer, etc."
-          << endl;
-    }
-    out << indent() << "public Isset __isset;" << endl << indent() << "#if !SILVERLIGHT" << endl
-        << indent() << "[Serializable]" << endl << indent() << "#endif" << endl;
-    if (serialize_ || wcf_) {
-      indent(out) << "[DataContract]" << endl;
-    }
-    indent(out) << "public struct Isset {" << endl;
-    indent_up();
-    for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
-      bool is_required = field_is_required((*m_iter));
-      bool has_default = field_has_default((*m_iter));
-      // if it is required, don't need Isset for that variable
-      // if it is not required, if it has a default value, we need to generate Isset
-      // if we are not nullable, then we generate Isset
-      if (!is_required && (!nullable_ || has_default)) {
-        if (serialize_ || wcf_) {
-          indent(out) << "[DataMember]" << endl;
-        }
-        indent(out) << "public bool " << normalize_name((*m_iter)->get_name()) << ";" << endl;
-      }
-    }
-
-    indent_down();
-    indent(out) << "}" << endl << endl;
-
-    if (generate_isset && (serialize_ || wcf_)) {
-      indent(out) << "#region XmlSerializer support" << endl << endl;
-
-      for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
-        bool is_required = field_is_required((*m_iter));
-        bool has_default = field_has_default((*m_iter));
-        // if it is required, don't need Isset for that variable
-        // if it is not required, if it has a default value, we need to generate Isset
-        // if we are not nullable, then we generate Isset
-        if (!is_required && (!nullable_ || has_default)) {
-          indent(out) << "public bool ShouldSerialize" << prop_name((*m_iter)) << "()" << endl;
-          indent(out) << "{" << endl;
-          indent_up();
-          indent(out) << "return __isset." << normalize_name((*m_iter)->get_name()) << ";" << endl;
-          indent_down();
-          indent(out) << "}" << endl << endl;
-        }
-      }
-
-      indent(out) << "#endregion XmlSerializer support" << endl << endl;
-    }
-  }
-
-  // We always want a default, no argument constructor for Reading
-  indent(out) << "public " << normalize_name(tstruct->get_name()) << "() {" << endl;
-  indent_up();
-
-  for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
-    t_type* t = (*m_iter)->get_type();
-    while (t->is_typedef()) {
-      t = ((t_typedef*)t)->get_type();
-    }
-    if ((*m_iter)->get_value() != NULL) {
-      if (field_is_required((*m_iter))) {
-        print_const_value(out, "this." + prop_name(*m_iter), t, (*m_iter)->get_value(), true, true);
-      } else {
-        print_const_value(out,
-                          "this._" + (*m_iter)->get_name(),
-                          t,
-                          (*m_iter)->get_value(),
-                          true,
-                          true);
-        // Optionals with defaults are marked set
-        indent(out) << "this.__isset." << normalize_name((*m_iter)->get_name()) << " = true;"
-                    << endl;
-      }
-    }
-  }
-  indent_down();
-  indent(out) << "}" << endl << endl;
-
-  if (has_required_fields) {
-    indent(out) << "public " << tstruct->get_name() << "(";
-    bool first = true;
-    for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
-      if (field_is_required((*m_iter))) {
-        if (first) {
-          first = false;
-        } else {
-          out << ", ";
-        }
-        out << type_name((*m_iter)->get_type()) << " " << normalize_name((*m_iter)->get_name());
-      }
-    }
-    out << ") : this() {" << endl;
-    indent_up();
-
-    for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
-      if (field_is_required((*m_iter))) {
-        indent(out) << "this." << prop_name((*m_iter)) << " = " << normalize_name((*m_iter)->get_name()) << ";"
-                    << endl;
-      }
-    }
-
-    indent_down();
-    indent(out) << "}" << endl << endl;
-  }
-
-  generate_csharp_struct_reader(out, tstruct);
-  if (is_result) {
-    generate_csharp_struct_result_writer(out, tstruct);
-  } else {
-    generate_csharp_struct_writer(out, tstruct);
-  }
-  if (hashcode_) {
-    generate_csharp_struct_equals(out, tstruct);
-    generate_csharp_struct_hashcode(out, tstruct);
-  }
-  generate_csharp_struct_tostring(out, tstruct);
-  scope_down(out);
-  out << endl;
-
-  // generate a corresponding WCF fault to wrap the exception
-  if ((serialize_ || wcf_) && is_exception) {
-    generate_csharp_wcffault(out, tstruct);
-  }
-
-  cleanup_member_name_mapping(tstruct);
-  if (!in_class) {
-    end_csharp_namespace(out);
-  }
-}
-
-void t_csharp_generator::generate_csharp_wcffault(ostream& out, t_struct* tstruct) {
-  out << endl;
-  indent(out) << "#if !SILVERLIGHT" << endl;
-  indent(out) << "[Serializable]" << endl;
-  indent(out) << "#endif" << endl;
-  indent(out) << "[DataContract]" << endl;
-  bool is_final = (tstruct->annotations_.find("final") != tstruct->annotations_.end());
-
-  indent(out) << "public " << (is_final ? "sealed " : "") << "partial class " << tstruct->get_name()
-              << "Fault" << endl;
-
-  scope_up(out);
-
-  const vector<t_field*>& members = tstruct->get_members();
-  vector<t_field*>::const_iterator m_iter;
-
-  // make private members with public Properties
-  for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
-    // if the field is requied, then we use auto-properties
-    if (!field_is_required((*m_iter)) && (!nullable_ || field_has_default((*m_iter)))) {
-      indent(out) << "private " << declare_field(*m_iter, false, "_") << endl;
-    }
-  }
-  out << endl;
-
-  for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
-    generate_property(out, *m_iter, true, false);
-  }
-
-  scope_down(out);
-  out << endl;
-}
-
-void t_csharp_generator::generate_csharp_struct_reader(ostream& out, t_struct* tstruct) {
-  indent(out) << "public void Read (TProtocol iprot)" << endl;
-  scope_up(out);
-
-  out << indent() << "iprot.IncrementRecursionDepth();" << endl;
-  out << indent() << "try" << endl;
-  scope_up(out);
-
-  const vector<t_field*>& fields = tstruct->get_members();
-  vector<t_field*>::const_iterator f_iter;
-
-  // Required variables aren't in __isset, so we need tmp vars to check them
-  for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
-    if (field_is_required((*f_iter))) {
-      indent(out) << "bool isset_" << (*f_iter)->get_name() << " = false;" << endl;
-    }
-  }
-
-  indent(out) << "TField field;" << endl << indent() << "iprot.ReadStructBegin();" << endl;
-
-  indent(out) << "while (true)" << endl;
-  scope_up(out);
-
-  indent(out) << "field = iprot.ReadFieldBegin();" << endl;
-
-  indent(out) << "if (field.Type == TType.Stop) { " << endl;
-  indent_up();
-  indent(out) << "break;" << endl;
-  indent_down();
-  indent(out) << "}" << endl;
-
-  indent(out) << "switch (field.ID)" << endl;
-
-  scope_up(out);
-
-  for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
-    bool is_required = field_is_required((*f_iter));
-    indent(out) << "case " << (*f_iter)->get_key() << ":" << endl;
-    indent_up();
-    indent(out) << "if (field.Type == " << type_to_enum((*f_iter)->get_type()) << ") {" << endl;
-    indent_up();
-
-    generate_deserialize_field(out, *f_iter);
-    if (is_required) {
-      indent(out) << "isset_" << (*f_iter)->get_name() << " = true;" << endl;
-    }
-
-    indent_down();
-    out << indent() << "} else { " << endl << indent() << "  TProtocolUtil.Skip(iprot, field.Type);"
-        << endl << indent() << "}" << endl << indent() << "break;" << endl;
-    indent_down();
-  }
-
-  indent(out) << "default: " << endl;
-  indent_up();
-  indent(out) << "TProtocolUtil.Skip(iprot, field.Type);" << endl;
-  indent(out) << "break;" << endl;
-  indent_down();
-
-  scope_down(out);
-
-  indent(out) << "iprot.ReadFieldEnd();" << endl;
-
-  scope_down(out);
-
-  indent(out) << "iprot.ReadStructEnd();" << endl;
-
-  for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
-    if (field_is_required((*f_iter))) {
-      indent(out) << "if (!isset_" << (*f_iter)->get_name() << ")" << endl;
-      indent_up();
-      out << indent()
-          << "throw new TProtocolException(TProtocolException.INVALID_DATA, "
-          << "\"required field " << prop_name((*f_iter)) << " not set\");"
-          << endl;
-      indent_down();
-    }
-  }
-
-  scope_down(out);
-  out << indent() << "finally" << endl;
-  scope_up(out);
-  out << indent() << "iprot.DecrementRecursionDepth();" << endl;
-  scope_down(out);
-
-  indent_down();
-
-  indent(out) << "}" << endl << endl;
-}
-
-void t_csharp_generator::generate_csharp_struct_writer(ostream& out, t_struct* tstruct) {
-  out << indent() << "public void Write(TProtocol oprot) {" << endl;
-  indent_up();
-
-  out << indent() << "oprot.IncrementRecursionDepth();" << endl;
-  out << indent() << "try" << endl;
-  scope_up(out);
-
-  string name = tstruct->get_name();
-  const vector<t_field*>& fields = tstruct->get_sorted_members();
-  vector<t_field*>::const_iterator f_iter;
-
-  indent(out) << "TStruct struc = new TStruct(\"" << name << "\");" << endl;
-  indent(out) << "oprot.WriteStructBegin(struc);" << endl;
-
-  if (fields.size() > 0) {
-    indent(out) << "TField field = new TField();" << endl;
-    for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
-      bool is_required = field_is_required((*f_iter));
-      bool has_default = field_has_default((*f_iter));
-      bool null_allowed = type_can_be_null((*f_iter)->get_type());
-
-      if (is_required)
-      {
-        if (null_allowed) {
-          indent(out) << "if (" << prop_name((*f_iter)) << " == null)" << endl;
-          indent_up();
-          out << indent()
-              << "throw new TProtocolException(TProtocolException.INVALID_DATA, "
-              << "\"required field " << prop_name((*f_iter)) << " not set\");"
-              << endl;
-          indent_down();
-        }
-      }
-      else
-      {
-        if (nullable_ && !has_default) {
-            indent(out) << "if (" << prop_name((*f_iter)) << " != null) {" << endl;
-        }
-        else if (null_allowed) {
-          out << indent()
-              << "if (" << prop_name((*f_iter)) << " != null && __isset."
-              << normalize_name((*f_iter)->get_name()) << ") {"
-              << endl;
-        }
-        else {
-           indent(out) << "if (__isset." << normalize_name((*f_iter)->get_name()) << ") {" << endl;
-        }
-        indent_up();
-      }
-      indent(out) << "field.Name = \"" << (*f_iter)->get_name() << "\";" << endl;
-      indent(out) << "field.Type = " << type_to_enum((*f_iter)->get_type()) << ";" << endl;
-      indent(out) << "field.ID = " << (*f_iter)->get_key() << ";" << endl;
-      indent(out) << "oprot.WriteFieldBegin(field);" << endl;
-
-      generate_serialize_field(out, *f_iter);
-
-      indent(out) << "oprot.WriteFieldEnd();" << endl;
-      if (!is_required) {
-        indent_down();
-        indent(out) << "}" << endl;
-      }
-    }
-  }
-
-  indent(out) << "oprot.WriteFieldStop();" << endl;
-  indent(out) << "oprot.WriteStructEnd();" << endl;
-
-  scope_down(out);
-  out << indent() << "finally" << endl;
-  scope_up(out);
-  out << indent() << "oprot.DecrementRecursionDepth();" << endl;
-  scope_down(out);
-
-  indent_down();
-
-  indent(out) << "}" << endl << endl;
-}
-
-void t_csharp_generator::generate_csharp_struct_result_writer(ostream& out, t_struct* tstruct) {
-  indent(out) << "public void Write(TProtocol oprot) {" << endl;
-  indent_up();
-
-  out << indent() << "oprot.IncrementRecursionDepth();" << endl;
-  out << indent() << "try" << endl;
-  scope_up(out);
-
-  string name = tstruct->get_name();
-  const vector<t_field*>& fields = tstruct->get_sorted_members();
-  vector<t_field*>::const_iterator f_iter;
-
-  indent(out) << "TStruct struc = new TStruct(\"" << name << "\");" << endl;
-  indent(out) << "oprot.WriteStructBegin(struc);" << endl;
-
-  if (fields.size() > 0) {
-    indent(out) << "TField field = new TField();" << endl;
-    bool first = true;
-    for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
-      if (first) {
-        first = false;
-        out << endl << indent() << "if ";
-      } else {
-        out << " else if ";
-      }
-
-      if (nullable_) {
-        out << "(this." << prop_name((*f_iter)) << " != null) {" << endl;
-      } else {
-        out << "(this.__isset." << normalize_name((*f_iter)->get_name()) << ") {" << endl;
-      }
-      indent_up();
-
-      bool null_allowed = !nullable_ && type_can_be_null((*f_iter)->get_type());
-      if (null_allowed) {
-        indent(out) << "if (" << prop_name(*f_iter) << " != null) {" << endl;
-        indent_up();
-      }
-
-      indent(out) << "field.Name = \"" << prop_name(*f_iter) << "\";" << endl;
-      indent(out) << "field.Type = " << type_to_enum((*f_iter)->get_type()) << ";" << endl;
-      indent(out) << "field.ID = " << (*f_iter)->get_key() << ";" << endl;
-      indent(out) << "oprot.WriteFieldBegin(field);" << endl;
-
-      generate_serialize_field(out, *f_iter);
-
-      indent(out) << "oprot.WriteFieldEnd();" << endl;
-
-      if (null_allowed) {
-        indent_down();
-        indent(out) << "}" << endl;
-      }
-
-      indent_down();
-      indent(out) << "}";
-    }
-  }
-
-  out << endl << indent() << "oprot.WriteFieldStop();" << endl << indent()
-      << "oprot.WriteStructEnd();" << endl;
-
-  scope_down(out);
-  out << indent() << "finally" << endl;
-  scope_up(out);
-  out << indent() << "oprot.DecrementRecursionDepth();" << endl;
-  scope_down(out);
-
-  indent_down();
-
-  indent(out) << "}" << endl << endl;
-}
-
-void t_csharp_generator::generate_csharp_struct_tostring(ostream& out, t_struct* tstruct) {
-  indent(out) << "public override string ToString() {" << endl;
-  indent_up();
-
-  indent(out) << "StringBuilder __sb = new StringBuilder(\"" << tstruct->get_name() << "(\");"
-              << endl;
-
-  const vector<t_field*>& fields = tstruct->get_members();
-  vector<t_field*>::const_iterator f_iter;
-
-  bool useFirstFlag = false;
-  for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
-    if (!field_is_required((*f_iter))) {
-      indent(out) << "bool __first = true;" << endl;
-      useFirstFlag = true;
-    }
-    break;
-  }
-
-  bool had_required = false; // set to true after first required field has been processed
-
-  for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
-    bool is_required = field_is_required((*f_iter));
-    bool has_default = field_has_default((*f_iter));
-    if (nullable_ && !has_default && !is_required) {
-      indent(out) << "if (" << prop_name((*f_iter)) << " != null) {" << endl;
-      indent_up();
-    } else if (!is_required) {
-      bool null_allowed = type_can_be_null((*f_iter)->get_type());
-      if (null_allowed) {
-        indent(out) << "if (" << prop_name((*f_iter)) << " != null && __isset."
-                    << normalize_name((*f_iter)->get_name()) << ") {" << endl;
-        indent_up();
-      } else {
-        indent(out) << "if (__isset." << normalize_name((*f_iter)->get_name()) << ") {" << endl;
-        indent_up();
-      }
-    }
-
-    if (useFirstFlag && (!had_required)) {
-      indent(out) << "if(!__first) { __sb.Append(\", \"); }" << endl;
-      if (!is_required) {
-        indent(out) << "__first = false;" << endl;
-      }
-      indent(out) << "__sb.Append(\"" << prop_name((*f_iter)) << ": \");" << endl;
-    } else {
-      indent(out) << "__sb.Append(\", " << prop_name((*f_iter)) << ": \");" << endl;
-    }
-
-    t_type* ttype = (*f_iter)->get_type();
-    if (ttype->is_xception() || ttype->is_struct()) {
-      indent(out) << "__sb.Append(" << prop_name((*f_iter))
-                  << "== null ? \"<null>\" : " << prop_name((*f_iter)) << ".ToString());" << endl;
-    } else {
-      indent(out) << "__sb.Append(" << prop_name((*f_iter)) << ");" << endl;
-    }
-
-    if (!is_required) {
-      indent_down();
-      indent(out) << "}" << endl;
-    } else {
-      had_required = true; // now __first must be false, so we don't need to check it anymore
-    }
-  }
-
-  indent(out) << "__sb.Append(\")\");" << endl;
-  indent(out) << "return __sb.ToString();" << endl;
-
-  indent_down();
-  indent(out) << "}" << endl << endl;
-}
-
-void t_csharp_generator::generate_csharp_union(t_struct* tunion) {
-  string f_union_name = namespace_dir_ + "/" + (tunion->get_name()) + ".cs";
-  ofstream_with_content_based_conditional_update f_union;
-
-  f_union.open(f_union_name.c_str());
-
-  f_union << autogen_comment() << csharp_type_usings() << csharp_thrift_usings() << endl;
-
-  generate_csharp_union_definition(f_union, tunion);
-
-  f_union.close();
-}
-
-void t_csharp_generator::generate_csharp_union_definition(std::ostream& out, t_struct* tunion) {
-  // Let's define the class first
-  start_csharp_namespace(out);
-
-  indent(out) << "public abstract partial class " << tunion->get_name() << " : TAbstractBase {"
-              << endl;
-
-  indent_up();
-
-  indent(out) << "public abstract void Write(TProtocol protocol);" << endl;
-  indent(out) << "public readonly int Isset;" << endl;
-  indent(out) << "public abstract object Data { get; }" << endl;
-
-  indent(out) << "protected " << tunion->get_name() << "(int isset) {" << endl;
-  indent_up();
-  indent(out) << "Isset = isset;" << endl;
-  indent_down();
-  indent(out) << "}" << endl << endl;
-
-  indent(out) << "public class ___undefined : " << tunion->get_name() << " {" << endl;
-  indent_up();
-
-  indent(out) << "public override object Data { get { return null; } }" << endl;
-
-  indent(out) << "public ___undefined() : base(0) {}" << endl << endl;
-
-  indent(out) << "public override void Write(TProtocol protocol) {" << endl;
-  indent_up();
-  indent(out) << "throw new TProtocolException( TProtocolException.INVALID_DATA, \"Cannot persist "
-                 "an union type which is not set.\");" << endl;
-  indent_down();
-  indent(out) << "}" << endl << endl;
-
-  indent_down();
-  indent(out) << "}" << endl << endl;
-
-  const vector<t_field*>& fields = tunion->get_members();
-  vector<t_field*>::const_iterator f_iter;
-
-  for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
-    generate_csharp_union_class(out, tunion, (*f_iter));
-  }
-
-  generate_csharp_union_reader(out, tunion);
-
-  indent_down();
-  indent(out) << "}" << endl << endl;
-
-  end_csharp_namespace(out);
-}
-
-void t_csharp_generator::generate_csharp_union_class(std::ostream& out,
-                                                     t_struct* tunion,
-                                                     t_field* tfield) {
-  indent(out) << "public " << type_name(tfield->get_type()) << " As_" << tfield->get_name() << endl;
-  indent(out) << "{" << endl;
-  indent_up();
-  indent(out) << "get" << endl;
-  indent(out) << "{" << endl;
-  indent_up();
-  indent(out) << "return (" << tfield->get_key() << " == Isset) ? (" << type_name(tfield->get_type()) << ")Data : default(" << type_name(tfield->get_type()) << ");" << endl;
-  indent_down();
-  indent(out) << "}" << endl;
-  indent_down();
-  indent(out) << "}" << endl
-      << endl;
-	
-	
-  indent(out) << "public class " << tfield->get_name() << " : " << tunion->get_name() << " {"
-              << endl;
-  indent_up();
-  indent(out) << "private " << type_name(tfield->get_type()) << " _data;" << endl;
-  indent(out) << "public override object Data { get { return _data; } }" << endl;
-  indent(out) << "public " << tfield->get_name() << "(" << type_name(tfield->get_type())
-              << " data) : base("<< tfield->get_key() <<") {" << endl;
-  indent_up();
-  indent(out) << "this._data = data;" << endl;
-  indent_down();
-  indent(out) << "}" << endl;
-  indent(out) << "public override void Write(TProtocol oprot) {" << endl;
-  indent_up();
-
-  out << indent() << "oprot.IncrementRecursionDepth();" << endl;
-  out << indent() << "try" << endl;
-  scope_up(out);
-
-  indent(out) << "TStruct struc = new TStruct(\"" << tunion->get_name() << "\");" << endl;
-  indent(out) << "oprot.WriteStructBegin(struc);" << endl;
-
-  indent(out) << "TField field = new TField();" << endl;
-  indent(out) << "field.Name = \"" << tfield->get_name() << "\";" << endl;
-  indent(out) << "field.Type = " << type_to_enum(tfield->get_type()) << ";" << endl;
-  indent(out) << "field.ID = " << tfield->get_key() << ";" << endl;
-  indent(out) << "oprot.WriteFieldBegin(field);" << endl;
-
-  generate_serialize_field(out, tfield, "_data", true, true);
-
-  indent(out) << "oprot.WriteFieldEnd();" << endl;
-  indent(out) << "oprot.WriteFieldStop();" << endl;
-  indent(out) << "oprot.WriteStructEnd();" << endl;
-  indent_down();
-
-  scope_down(out);
-  out << indent() << "finally" << endl;
-  scope_up(out);
-  out << indent() << "oprot.DecrementRecursionDepth();" << endl;
-  scope_down(out);
-
-  indent(out) << "}" << endl;
-
-  indent_down();
-  indent(out) << "}" << endl << endl;
-}
-
-void t_csharp_generator::generate_csharp_struct_equals(ostream& out, t_struct* tstruct) {
-  indent(out) << "public override bool Equals(object that) {" << endl;
-  indent_up();
-
-  indent(out) << "var other = that as " << type_name(tstruct) << ";" << endl;
-  indent(out) << "if (other == null) return false;" << endl;
-  indent(out) << "if (ReferenceEquals(this, other)) return true;" << endl;
-
-  const vector<t_field*>& fields = tstruct->get_members();
-  vector<t_field*>::const_iterator f_iter;
-
-  bool first = true;
-
-  for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
-    if (first) {
-      first = false;
-      indent(out) << "return ";
-      indent_up();
-    } else {
-      out << endl;
-      indent(out) << "&& ";
-    }
-    if (!field_is_required((*f_iter)) && !(nullable_ && !field_has_default((*f_iter)))) {
-      out << "((__isset." << normalize_name((*f_iter)->get_name()) << " == other.__isset."
-          << normalize_name((*f_iter)->get_name()) << ") && ((!__isset."
-          << normalize_name((*f_iter)->get_name()) << ") || (";
-    }
-    t_type* ttype = (*f_iter)->get_type();
-    if (ttype->is_container() || ttype->is_binary()) {
-      out << "TCollections.Equals(";
-    } else {
-      out << "System.Object.Equals(";
-    }
-    out << prop_name((*f_iter)) << ", other." << prop_name((*f_iter)) << ")";
-    if (!field_is_required((*f_iter)) && !(nullable_ && !field_has_default((*f_iter)))) {
-      out << ")))";
-    }
-  }
-  if (first) {
-    indent(out) << "return true;" << endl;
-  } else {
-    out << ";" << endl;
-    indent_down();
-  }
-
-  indent_down();
-  indent(out) << "}" << endl << endl;
-}
-
-void t_csharp_generator::generate_csharp_struct_hashcode(ostream& out, t_struct* tstruct) {
-  indent(out) << "public override int GetHashCode() {" << endl;
-  indent_up();
-
-  indent(out) << "int hashcode = 0;" << endl;
-  indent(out) << "unchecked {" << endl;
-  indent_up();
-
-  const vector<t_field*>& fields = tstruct->get_members();
-  vector<t_field*>::const_iterator f_iter;
-
-  for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
-    t_type* ttype = (*f_iter)->get_type();
-    indent(out) << "hashcode = (hashcode * 397) ^ ";
-    if (field_is_required((*f_iter))) {
-      out << "(";
-    } else if (nullable_) {
-      out << "(" << prop_name((*f_iter)) << " == null ? 0 : ";
-    } else {
-      out << "(!__isset." << normalize_name((*f_iter)->get_name()) << " ? 0 : ";
-    }
-    if (ttype->is_container()) {
-      out << "(TCollections.GetHashCode(" << prop_name((*f_iter)) << "))";
-    } else {
-      out << "(" << prop_name((*f_iter)) << ".GetHashCode())";
-    }
-    out << ");" << endl;
-  }
-
-  indent_down();
-  indent(out) << "}" << endl;
-  indent(out) << "return hashcode;" << endl;
-
-  indent_down();
-  indent(out) << "}" << endl << endl;
-}
-
-void t_csharp_generator::generate_service(t_service* tservice) {
-  string f_service_name = namespace_dir_ + "/" + service_name_ + ".cs";
-  f_service_.open(f_service_name.c_str());
-
-  f_service_ << autogen_comment() << csharp_type_usings() << csharp_thrift_usings() << endl;
-
-  start_csharp_namespace(f_service_);
-
-  indent(f_service_) << "public partial class " << normalize_name(service_name_) << " {" << endl;
-  indent_up();
-
-  generate_service_interface(tservice);
-  generate_service_client(tservice);
-  generate_service_server(tservice);
-  generate_service_helpers(tservice);
-
-  indent_down();
-
-  indent(f_service_) << "}" << endl;
-  end_csharp_namespace(f_service_);
-  f_service_.close();
-}
-
-void t_csharp_generator::generate_service_interface(t_service* tservice) {
-  generate_separate_service_interfaces(tservice);
-}
-
-void t_csharp_generator::generate_separate_service_interfaces(t_service* tservice) {
-  generate_sync_service_interface(tservice);
-
-  if (async_) {
-    generate_async_service_interface(tservice);
-  }
-
-  generate_combined_service_interface(tservice);
-}
-
-void t_csharp_generator::generate_sync_service_interface(t_service* tservice) {
-  string extends = "";
-  string extends_iface = "";
-  if (tservice->get_extends() != NULL) {
-    extends = type_name(tservice->get_extends());
-    extends_iface = " : " + extends + ".ISync";
-  }
-
-  generate_csharp_doc(f_service_, tservice);
-
-  if (wcf_) {
-    indent(f_service_) << "[System.ServiceModel.ServiceContract(Namespace=\"" << wcf_namespace_ << "\")]" << endl;
-  }
-  indent(f_service_) << "public interface ISync" << extends_iface << " {" << endl;
-
-  indent_up();
-  vector<t_function*> functions = tservice->get_functions();
-  vector<t_function*>::iterator f_iter;
-  for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
-    generate_csharp_doc(f_service_, *f_iter);
-
-    // if we're using WCF, add the corresponding attributes
-    if (wcf_) {
-      indent(f_service_) << "[System.ServiceModel.OperationContract]" << endl;
-
-      const std::vector<t_field*>& xceptions = (*f_iter)->get_xceptions()->get_members();
-      vector<t_field*>::const_iterator x_iter;
-      for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) {
-        indent(f_service_) << "[System.ServiceModel.FaultContract(typeof("
-          + type_name((*x_iter)->get_type(), false, false) + "Fault))]" << endl;
-      }
-    }
-
-    indent(f_service_) << function_signature(*f_iter) << ";" << endl;
-  }
-  indent_down();
-  f_service_ << indent() << "}" << endl << endl;
-}
-
-void t_csharp_generator::generate_async_service_interface(t_service* tservice) {
-  string extends = "";
-  string extends_iface = "";
-  if (tservice->get_extends() != NULL) {
-    extends = type_name(tservice->get_extends());
-    extends_iface = " : " + extends + ".IAsync";
-  }
-
-  generate_csharp_doc(f_service_, tservice);
-
-  if (wcf_) {
-    indent(f_service_) << "[System.ServiceModel.ServiceContract(Namespace=\"" << wcf_namespace_ << "\")]" << endl;
-  }
-  indent(f_service_) << "public interface IAsync" << extends_iface << " {" << endl;
-
-  indent_up();
-  vector<t_function*> functions = tservice->get_functions();
-  vector<t_function*>::iterator f_iter;
-  for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
-    generate_csharp_doc(f_service_, *f_iter);
-
-    // if we're using WCF, add the corresponding attributes
-    if (wcf_) {
-      indent(f_service_) << "[System.ServiceModel.OperationContract]" << endl;
-
-      const std::vector<t_field*>& xceptions = (*f_iter)->get_xceptions()->get_members();
-      vector<t_field*>::const_iterator x_iter;
-      for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) {
-        indent(f_service_) << "[System.ServiceModel.FaultContract(typeof("
-          + type_name((*x_iter)->get_type(), false, false) + "Fault))]" << endl;
-      }
-    }
-
-    indent(f_service_) << function_signature_async(*f_iter) << ";" << endl;
-  }
-  indent_down();
-  f_service_ << indent() << "}" << endl << endl;
-}
-
-void t_csharp_generator::generate_combined_service_interface(t_service* tservice) {
-  string extends_iface = " : ISync";
-
-  if (async_) {
-    extends_iface += ", IAsync";
-  }
-
-  generate_csharp_doc(f_service_, tservice);
-
-  if (wcf_) {
-    indent(f_service_) << "[System.ServiceModel.ServiceContract(Namespace=\"" << wcf_namespace_ << "\")]" << endl;
-  }
-
-  indent(f_service_) << "public interface Iface" << extends_iface << " {" << endl;
-
-  indent_up();
-
-  // We need to generate extra old style async methods for silverlight. Since
-  // this isn't something you'd want to implement server-side, just put them into
-  // the main Iface interface.
-  generate_silverlight_async_methods(tservice);
-
-  indent_down();
-
-  f_service_ << indent() << "}" << endl << endl;
-}
-
-void t_csharp_generator::generate_silverlight_async_methods(t_service* tservice) {
-  vector<t_function*> functions = tservice->get_functions();
-  vector<t_function*>::iterator f_iter;
-  for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
-    generate_csharp_doc(f_service_, *f_iter);
-
-    // For backwards compatibility, include the Begin_, End_ methods if we're generating
-    // with the async flag. I'm not sure this is necessary, so someone with more knowledge
-    // can maybe remove these checks if they know it's safe.
-    if (!async_) {
-      indent(f_service_) << "#if SILVERLIGHT" << endl;
-    }
-
-    indent(f_service_) << function_signature_async_begin(*f_iter, "Begin_") << ";" << endl;
-    indent(f_service_) << function_signature_async_end(*f_iter, "End_") << ";" << endl;
-
-    if (!async_) {
-      indent(f_service_) << "#endif" << endl;
-    }
-  }
-}
-
-void t_csharp_generator::generate_service_helpers(t_service* tservice) {
-  vector<t_function*> functions = tservice->get_functions();
-  vector<t_function*>::iterator f_iter;
-
-  for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
-    t_struct* ts = (*f_iter)->get_arglist();
-    generate_csharp_struct_definition(f_service_, ts, false, true);
-    generate_function_helpers(*f_iter);
-  }
-}
-
-void t_csharp_generator::generate_service_client(t_service* tservice) {
-  string extends = "";
-  string extends_client = "";
-  if (tservice->get_extends() != NULL) {
-    extends = type_name(tservice->get_extends());
-    extends_client = extends + ".Client, ";
-  } else {
-    extends_client = "IDisposable, ";
-  }
-
-  generate_csharp_doc(f_service_, tservice);
-
-  indent(f_service_) << "public class Client : " << extends_client << "Iface {" << endl;
-  indent_up();
-  indent(f_service_) << "public Client(TProtocol prot) : this(prot, prot)" << endl;
-  scope_up(f_service_);
-  scope_down(f_service_);
-  f_service_ << endl;
-
-  indent(f_service_) << "public Client(TProtocol iprot, TProtocol oprot)";
-  if (!extends.empty()) {
-    f_service_ << " : base(iprot, oprot)";
-  }
-  f_service_ << endl;
-
-  scope_up(f_service_);
-  if (extends.empty()) {
-    f_service_ << indent() << "iprot_ = iprot;" << endl << indent() << "oprot_ = oprot;" << endl;
-  }
-  scope_down(f_service_);
-
-  f_service_ << endl;
-
-  if (extends.empty()) {
-    f_service_ << indent() << "protected TProtocol iprot_;" << endl << indent()
-               << "protected TProtocol oprot_;" << endl << indent() << "protected int seqid_;"
-               << endl << endl;
-
-    f_service_ << indent() << "public TProtocol InputProtocol" << endl;
-    scope_up(f_service_);
-    indent(f_service_) << "get { return iprot_; }" << endl;
-    scope_down(f_service_);
-
-    f_service_ << indent() << "public TProtocol OutputProtocol" << endl;
-    scope_up(f_service_);
-    indent(f_service_) << "get { return oprot_; }" << endl;
-    scope_down(f_service_);
-    f_service_ << endl << endl;
-
-    indent(f_service_) << "#region \" IDisposable Support \"" << endl;
-    indent(f_service_) << "private bool _IsDisposed;" << endl << endl;
-    indent(f_service_) << "// IDisposable" << endl;
-    indent(f_service_) << "public void Dispose()" << endl;
-    scope_up(f_service_);
-    indent(f_service_) << "Dispose(true);" << endl;
-    scope_down(f_service_);
-    indent(f_service_) << endl << endl;
-    indent(f_service_) << "protected virtual void Dispose(bool disposing)" << endl;
-    scope_up(f_service_);
-    indent(f_service_) << "if (!_IsDisposed)" << endl;
-    scope_up(f_service_);
-    indent(f_service_) << "if (disposing)" << endl;
-    scope_up(f_service_);
-    indent(f_service_) << "if (iprot_ != null)" << endl;
-    scope_up(f_service_);
-    indent(f_service_) << "((IDisposable)iprot_).Dispose();" << endl;
-    scope_down(f_service_);
-    indent(f_service_) << "if (oprot_ != null)" << endl;
-    scope_up(f_service_);
-    indent(f_service_) << "((IDisposable)oprot_).Dispose();" << endl;
-    scope_down(f_service_);
-    scope_down(f_service_);
-    scope_down(f_service_);
-    indent(f_service_) << "_IsDisposed = true;" << endl;
-    scope_down(f_service_);
-    indent(f_service_) << "#endregion" << endl;
-    f_service_ << endl << endl;
-  }
-
-  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();
-
-    indent(f_service_) << endl;
-
-    if (!async_) {
-      indent(f_service_) << "#if SILVERLIGHT" << endl;
-      indent(f_service_) << endl;
-    }
-    // Begin_
-    indent(f_service_) << "public " << function_signature_async_begin(*f_iter, "Begin_") << endl;
-    scope_up(f_service_);
-    indent(f_service_) << "return "
-                       << "send_" << funname << "(callback, state";
-
-    t_struct* arg_struct = (*f_iter)->get_arglist();
-    prepare_member_name_mapping(arg_struct);
-
-    const vector<t_field*>& fields = arg_struct->get_members();
-    vector<t_field*>::const_iterator fld_iter;
-    for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) {
-      f_service_ << ", ";
-      f_service_ << normalize_name((*fld_iter)->get_name());
-    }
-    f_service_ << ");" << endl;
-    scope_down(f_service_);
-    f_service_ << endl;
-
-    // End
-    indent(f_service_) << "public " << function_signature_async_end(*f_iter, "End_") << endl;
-    scope_up(f_service_);
-    indent(f_service_) << "oprot_.Transport.EndFlush(asyncResult);" << endl;
-    if (!(*f_iter)->is_oneway()) {
-      f_service_ << indent();
-      if (!(*f_iter)->get_returntype()->is_void()) {
-        f_service_ << "return ";
-      }
-      f_service_ << "recv_" << funname << "();" << endl;
-    }
-    scope_down(f_service_);
-    f_service_ << endl;
-
-    // async
-    bool first;
-    if (async_) {
-      indent(f_service_) << "public async " << function_signature_async(*f_iter, "") << endl;
-      scope_up(f_service_);
-
-      if (!(*f_iter)->get_returntype()->is_void()) {
-        indent(f_service_) << type_name((*f_iter)->get_returntype()) << " retval;" << endl;
-        indent(f_service_) << "retval = ";
-      } else {
-        indent(f_service_);
-      }
-      f_service_ << "await Task.Run(() =>" << endl;
-      scope_up(f_service_);
-      indent(f_service_);
-      if (!(*f_iter)->get_returntype()->is_void()) {
-        f_service_ << "return ";
-      }
-      f_service_ << funname << "(";
-      first = true;
-      for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) {
-        if (first) {
-          first = false;
-        } else {
-          f_service_ << ", ";
-        }
-        f_service_ << (*fld_iter)->get_name();
-      }
-      f_service_ << ");" << endl;
-      indent_down();
-      indent(f_service_) << "});" << endl;
-      if (!(*f_iter)->get_returntype()->is_void()) {
-        indent(f_service_) << "return retval;" << endl;
-      }
-      scope_down(f_service_);
-      f_service_ << endl;
-    }
-
-    if (!async_) {
-      indent(f_service_) << "#endif" << endl << endl;
-    }
-
-    generate_csharp_doc(f_service_, *f_iter);
-    indent(f_service_) << "public " << function_signature(*f_iter) << endl;
-    scope_up(f_service_);
-
-    // silverlight invoke
-    if (!async_) {
-      indent(f_service_) << "#if SILVERLIGHT" << endl;
-
-      indent(f_service_) << "var asyncResult = Begin_" << funname << "(null, null";
-      for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) {
-        f_service_ << ", " << normalize_name((*fld_iter)->get_name());
-      }
-      f_service_ << ");" << endl;
-      
-      if (!(*f_iter)->is_oneway()) {
-        f_service_ << indent();
-        if (!(*f_iter)->get_returntype()->is_void()) {
-          f_service_ << "return ";
-        }
-        f_service_ << "End_" << funname << "(asyncResult);" << endl;
-      }
-      f_service_ << endl;
-
-      indent(f_service_) << "#else" << endl;
-    }
-
-    // synchronous invoke
-    indent(f_service_) << "send_" << funname << "(";
-  
-    first = true;
-    for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) {
-      if (first) {
-        first = false;
-      } else {
-        f_service_ << ", ";
-      }
-      f_service_ << normalize_name((*fld_iter)->get_name());
-    }
-    f_service_ << ");" << endl;
-  
-    if (!(*f_iter)->is_oneway()) {
-      f_service_ << indent();
-      if (!(*f_iter)->get_returntype()->is_void()) {
-        f_service_ << "return ";
-      }
-      f_service_ << "recv_" << funname << "();" << endl;
-    }
-    f_service_ << endl;
-
-    if (!async_) {
-      indent(f_service_) << "#endif" << endl;
-    }
-    scope_down(f_service_);
-
-    // Send
-    t_function send_function(g_type_void,
-                             string("send_") + (*f_iter)->get_name(),
-                             (*f_iter)->get_arglist());
-
-    string argsname = (*f_iter)->get_name() + "_args";
-
-    if (!async_) {
-      indent(f_service_) << "#if SILVERLIGHT" << endl;
-    }
-
-    indent(f_service_) << "public " << function_signature_async_begin(&send_function) << endl;
-    scope_up(f_service_);
-
-    f_service_ << indent() << "oprot_.WriteMessageBegin(new TMessage(\"" << funname << "\", "
-               << ((*f_iter)->is_oneway() ? "TMessageType.Oneway" : "TMessageType.Call")
-               << ", seqid_));" << endl << indent() << argsname << " args = new " << argsname
-               << "();" << endl;
-
-    for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) {
-      f_service_ << indent() << "args." << prop_name(*fld_iter) << " = "
-                 << normalize_name((*fld_iter)->get_name()) << ";" << endl;
-    }
-
-    f_service_ << indent() << "args.Write(oprot_);" << endl << indent()
-               << "oprot_.WriteMessageEnd();" << endl;
-    indent(f_service_) << "return oprot_.Transport.BeginFlush(callback, state);" << endl;
-      
-    scope_down(f_service_);
-    f_service_ << endl;
-
-    if (!async_) {
-      indent(f_service_) << "#else" << endl;
-      f_service_ << endl;
-    }
-
-    indent(f_service_) << "public " << function_signature(&send_function) << endl;
-    scope_up(f_service_);
-
-    f_service_ << indent() << "oprot_.WriteMessageBegin(new TMessage(\"" << funname << "\", "
-               << ((*f_iter)->is_oneway() ? "TMessageType.Oneway" : "TMessageType.Call")
-               << ", seqid_));" << endl << indent() << argsname << " args = new " << argsname
-               << "();" << endl;
-
-    for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) {
-      f_service_ << indent() << "args." << prop_name(*fld_iter) << " = "
-                 << normalize_name((*fld_iter)->get_name()) << ";" << endl;
-    }
-
-    f_service_ << indent() << "args.Write(oprot_);" << endl << indent()
-               << "oprot_.WriteMessageEnd();" << endl;
-
-    indent(f_service_) << "oprot_.Transport.Flush();" << endl;
-    cleanup_member_name_mapping(arg_struct);
-    scope_down(f_service_);
-
-    if (!async_) {
-      indent(f_service_) << "#endif" << endl;
-    }
-
-    f_service_ << endl;
-
-    if (!(*f_iter)->is_oneway()) {
-      string resultname = (*f_iter)->get_name() + "_result";
-
-      t_struct noargs(program_);
-      t_function recv_function((*f_iter)->get_returntype(),
-                               string("recv_") + (*f_iter)->get_name(),
-                               &noargs,
-                               (*f_iter)->get_xceptions());
-      indent(f_service_) << "public " << function_signature(&recv_function) << endl;
-      scope_up(f_service_);
-
-      t_struct* xs = (*f_iter)->get_xceptions();
-      prepare_member_name_mapping(xs, xs->get_members(), resultname);
-
-      f_service_ << indent() << "TMessage msg = iprot_.ReadMessageBegin();" << endl << indent()
-                 << "if (msg.Type == TMessageType.Exception) {" << endl;
-      indent_up();
-      f_service_ << indent() << "TApplicationException x = TApplicationException.Read(iprot_);"
-                 << endl << indent() << "iprot_.ReadMessageEnd();" << endl << indent() << "throw x;"
-                 << endl;
-      indent_down();
-      f_service_ << indent() << "}" << endl << indent() << resultname << " result = new "
-                 << resultname << "();" << endl << indent() << "result.Read(iprot_);" << endl
-                 << indent() << "iprot_.ReadMessageEnd();" << endl;
-
-      if (!(*f_iter)->get_returntype()->is_void()) {
-        if (nullable_) {
-          if (type_can_be_null((*f_iter)->get_returntype())) {
-            f_service_ << indent() << "if (result.Success != null) {" << endl << indent()
-                       << "  return result.Success;" << endl << indent() << "}" << endl;
-          } else {
-            f_service_ << indent() << "if (result.Success.HasValue) {" << endl << indent()
-                       << "  return result.Success.Value;" << endl << indent() << "}" << endl;
-          }
-        } else {
-          f_service_ << indent() << "if (result.__isset.success) {" << endl << indent()
-                     << "  return result.Success;" << endl << indent() << "}" << endl;
-        }
-      }
-
-      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) {
-        if (nullable_) {
-          f_service_ << indent() << "if (result." << prop_name(*x_iter) << " != null) {" << endl
-                     << indent() << "  throw result." << prop_name(*x_iter) << ";" << endl
-                     << indent() << "}" << endl;
-        } else {
-          f_service_ << indent() << "if (result.__isset." << normalize_name((*x_iter)->get_name())
-                     << ") {" << endl << indent() << "  throw result." << prop_name(*x_iter) << ";"
-                     << endl << indent() << "}" << endl;
-        }
-      }
-
-      if ((*f_iter)->get_returntype()->is_void()) {
-        indent(f_service_) << "return;" << endl;
-      } else {
-        f_service_ << indent()
-                   << "throw new "
-                      "TApplicationException(TApplicationException.ExceptionType.MissingResult, \""
-                   << (*f_iter)->get_name() << " failed: unknown result\");" << endl;
-      }
-
-      cleanup_member_name_mapping((*f_iter)->get_xceptions());
-      scope_down(f_service_);
-      f_service_ << endl;
-    }
-  }
-
-  indent_down();
-  indent(f_service_) << "}" << endl;
-}
-
-void t_csharp_generator::generate_service_server(t_service* tservice) {
-  if (async_) {
-    generate_service_server_async(tservice);
-    generate_service_server_sync(tservice);
-  }
-  else {
-    generate_service_server_sync(tservice);
-  }
-}
-
-void t_csharp_generator::generate_service_server_sync(t_service* tservice) {
-  vector<t_function*> functions = tservice->get_functions();
-  vector<t_function*>::iterator f_iter;
-
-  string extends = "";
-  string extends_processor = "";
-  if (tservice->get_extends() != NULL) {
-    extends = type_name(tservice->get_extends());
-    extends_processor = extends + ".Processor, ";
-  }
-
-  indent(f_service_) << "public class Processor : " << extends_processor << "TProcessor {" << endl;
-  indent_up();
-
-  indent(f_service_) << "public Processor(ISync iface)";
-
-  if (!extends.empty()) {
-    f_service_ << " : base(iface)";
-  }
-  f_service_ << endl;
-  scope_up(f_service_);
-  f_service_ << indent() << "iface_ = iface;" << endl;
-
-  for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
-    f_service_ << indent() << "processMap_[\"" << (*f_iter)->get_name()
-      << "\"] = " << (*f_iter)->get_name() << "_Process;" << endl;
-  }
-
-  scope_down(f_service_);
-  f_service_ << endl;
-
-  if (extends.empty()) {
-    f_service_
-      << indent()
-      << "protected delegate void ProcessFunction(int seqid, TProtocol iprot, TProtocol oprot);"
-      << endl;
-  }
-
-  f_service_ << indent() << "private ISync iface_;" << endl;
-
-  if (extends.empty()) {
-    f_service_ << indent() << "protected Dictionary<string, ProcessFunction> processMap_ = new "
-      "Dictionary<string, ProcessFunction>();" << endl;
-  }
-
-  f_service_ << endl;
-
-  if (extends.empty()) {
-    indent(f_service_) << "public bool Process(TProtocol iprot, TProtocol oprot)" << endl;
-  }
-  else {
-    indent(f_service_) << "public new bool Process(TProtocol iprot, TProtocol oprot)" << endl;
-  }
-  scope_up(f_service_);
-
-  f_service_ << indent() << "try" << endl;
-  scope_up(f_service_);
-
-  f_service_ << indent() << "TMessage msg = iprot.ReadMessageBegin();" << endl;
-
-  f_service_
-    << indent() << "ProcessFunction fn;" << endl << indent()
-    << "processMap_.TryGetValue(msg.Name, out fn);" << endl << indent() << "if (fn == null) {"
-    << endl << indent() << "  TProtocolUtil.Skip(iprot, TType.Struct);" << endl << indent()
-    << "  iprot.ReadMessageEnd();" << endl << indent()
-    << "  TApplicationException x = new TApplicationException "
-    "(TApplicationException.ExceptionType.UnknownMethod, \"Invalid method name: '\" + "
-    "msg.Name + \"'\");" << endl << indent()
-    << "  oprot.WriteMessageBegin(new TMessage(msg.Name, TMessageType.Exception, msg.SeqID));"
-    << endl << indent() << "  x.Write(oprot);" << endl << indent() << "  oprot.WriteMessageEnd();"
-    << endl << indent() << "  oprot.Transport.Flush();" << endl << indent() << "  return true;"
-    << endl << indent() << "}" << endl << indent() << "fn(msg.SeqID, iprot, oprot);" << endl;
-
-  scope_down(f_service_);
-
-  f_service_ << indent() << "catch (IOException)" << endl;
-  scope_up(f_service_);
-  f_service_ << indent() << "return false;" << endl;
-  scope_down(f_service_);
-
-  f_service_ << indent() << "return true;" << endl;
-
-  scope_down(f_service_);
-  f_service_ << endl;
-
-  for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
-    generate_process_function(tservice, *f_iter);
-  }
-
-  indent_down();
-  indent(f_service_) << "}" << endl << endl;
-}
-
-void t_csharp_generator::generate_service_server_async(t_service* tservice) {
-  vector<t_function*> functions = tservice->get_functions();
-  vector<t_function*>::iterator f_iter;
-
-  string extends = "";
-  string extends_processor = "";
-  if (tservice->get_extends() != NULL) {
-    extends = type_name(tservice->get_extends());
-    extends_processor = extends + ".AsyncProcessor, ";
-  }
-
-  indent(f_service_) << "public class AsyncProcessor : " << extends_processor << "TAsyncProcessor {" << endl;
-  indent_up();
-
-  indent(f_service_) << "public AsyncProcessor(IAsync iface)";
-  if (!extends.empty()) {
-    f_service_ << " : base(iface)";
-  }
-  f_service_ << endl;
-  scope_up(f_service_);
-  f_service_ << indent() << "iface_ = iface;" << endl;
-
-  for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
-    f_service_ << indent() << "processMap_[\"" << (*f_iter)->get_name()
-      << "\"] = " << (*f_iter)->get_name() << "_ProcessAsync;" << endl;
-  }
-
-  scope_down(f_service_);
-  f_service_ << endl;
-
-  if (extends.empty()) {
-    f_service_
-      << indent()
-      << "protected delegate Task ProcessFunction(int seqid, TProtocol iprot, TProtocol oprot);"
-      << endl;
-  }
-
-  f_service_ << indent() << "private IAsync iface_;" << endl;
-
-  if (extends.empty()) {
-    f_service_ << indent() << "protected Dictionary<string, ProcessFunction> processMap_ = new "
-      "Dictionary<string, ProcessFunction>();" << endl;
-  }
-
-  f_service_ << endl;
-
-  if (extends.empty()) {
-    indent(f_service_) << "public async Task<bool> ProcessAsync(TProtocol iprot, TProtocol oprot)" << endl;
-  }
-  else {
-    indent(f_service_) << "public new async Task<bool> ProcessAsync(TProtocol iprot, TProtocol oprot)" << endl;
-  }
-  scope_up(f_service_);
-
-  f_service_ << indent() << "try" << endl;
-  scope_up(f_service_);
-
-  f_service_ << indent() << "TMessage msg = iprot.ReadMessageBegin();" << endl;
-
-  f_service_
-    << indent() << "ProcessFunction fn;" << endl << indent()
-    << "processMap_.TryGetValue(msg.Name, out fn);" << endl << indent() << "if (fn == null) {"
-    << endl << indent() << "  TProtocolUtil.Skip(iprot, TType.Struct);" << endl << indent()
-    << "  iprot.ReadMessageEnd();" << endl << indent()
-    << "  TApplicationException x = new TApplicationException "
-    "(TApplicationException.ExceptionType.UnknownMethod, \"Invalid method name: '\" + "
-    "msg.Name + \"'\");" << endl << indent()
-    << "  oprot.WriteMessageBegin(new TMessage(msg.Name, TMessageType.Exception, msg.SeqID));"
-    << endl << indent() << "  x.Write(oprot);" << endl << indent() << "  oprot.WriteMessageEnd();"
-    << endl << indent() << "  oprot.Transport.Flush();" << endl << indent() << "  return true;"
-    << endl << indent() << "}" << endl << indent() << "await fn(msg.SeqID, iprot, oprot);" << endl;
-
-  scope_down(f_service_);
-
-  f_service_ << indent() << "catch (IOException)" << endl;
-  scope_up(f_service_);
-  f_service_ << indent() << "return false;" << endl;
-  scope_down(f_service_);
-
-  f_service_ << indent() << "return true;" << endl;
-
-  scope_down(f_service_);
-  f_service_ << endl;
-
-  for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
-    generate_process_function_async(tservice, *f_iter);
-  }
-
-  indent_down();
-  indent(f_service_) << "}" << endl << endl;
-}
-
-void t_csharp_generator::generate_function_helpers(t_function* tfunction) {
-  if (tfunction->is_oneway()) {
-    return;
-  }
-
-  t_struct result(program_, tfunction->get_name() + "_result");
-  t_field success(tfunction->get_returntype(), "success", 0);
-  if (!tfunction->get_returntype()->is_void()) {
-    result.append(&success);
-  }
-
-  t_struct* xs = tfunction->get_xceptions();
-  const vector<t_field*>& fields = xs->get_members();
-  vector<t_field*>::const_iterator f_iter;
-  for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
-    result.append(*f_iter);
-  }
-
-  generate_csharp_struct_definition(f_service_, &result, false, true, true);
-}
-
-void t_csharp_generator::generate_process_function(t_service* tservice, t_function* tfunction) {
-  (void)tservice;
-  indent(f_service_) << "public void " << tfunction->get_name()
-                     << "_Process(int seqid, TProtocol iprot, TProtocol oprot)" << endl;
-  scope_up(f_service_);
-
-  string argsname = tfunction->get_name() + "_args";
-  string resultname = tfunction->get_name() + "_result";
-
-  f_service_ << indent() << argsname << " args = new " << argsname << "();" << endl
-             << indent() << "args.Read(iprot);" << endl
-             << indent() << "iprot.ReadMessageEnd();" << endl;
-
-  t_struct* xs = tfunction->get_xceptions();
-  const std::vector<t_field*>& xceptions = xs->get_members();
-  vector<t_field*>::const_iterator x_iter;
-
-  if (!tfunction->is_oneway()) {
-    f_service_ << indent() << resultname << " result = new " << resultname << "();" << endl;
-  }
-
-  f_service_ << indent() << "try" << endl
-             << indent() << "{" << endl;
-  indent_up();
-
-  if (xceptions.size() > 0) {
-    f_service_ << indent() << "try" << endl
-               << indent() << "{" << endl;
-    indent_up();
-  }
-
-  t_struct* arg_struct = tfunction->get_arglist();
-  const std::vector<t_field*>& fields = arg_struct->get_members();
-  vector<t_field*>::const_iterator f_iter;
-
-  f_service_ << indent();
-  if (!tfunction->is_oneway() && !tfunction->get_returntype()->is_void()) {
-    f_service_ << "result.Success = ";
-  }
-  f_service_ << "iface_." << normalize_name(tfunction->get_name()) << "(";
-  bool first = true;
-  prepare_member_name_mapping(arg_struct);
-  for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
-    if (first) {
-      first = false;
-    } else {
-      f_service_ << ", ";
-    }
-    f_service_ << "args." << prop_name(*f_iter);
-    if (nullable_ && !type_can_be_null((*f_iter)->get_type())) {
-      f_service_ << ".Value";
-    }
-  }
-  cleanup_member_name_mapping(arg_struct);
-  f_service_ << ");" << endl;
-
-  prepare_member_name_mapping(xs, xs->get_members(), resultname);
-  if (xceptions.size() > 0) {
-    indent_down();
-    f_service_ << indent() << "}" << endl;
-    for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) {
-      f_service_ << indent() << "catch (" << type_name((*x_iter)->get_type(), false, false) << " "
-                 << (*x_iter)->get_name() << ")" << endl
-                 << indent() << "{" << endl;
-      if (!tfunction->is_oneway()) {
-        indent_up();
-        f_service_ << indent() << "result." << prop_name(*x_iter) << " = " << (*x_iter)->get_name()
-                   << ";" << endl;
-        indent_down();
-      }
-      f_service_ << indent() << "}" << endl;
-    }
-  }
-  if (!tfunction->is_oneway()) {
-    f_service_ << indent() << "oprot.WriteMessageBegin(new TMessage(\"" << tfunction->get_name()
-               << "\", TMessageType.Reply, seqid)); " << endl;
-    f_service_ << indent() << "result.Write(oprot);" << endl;
-  }
-  indent_down();
-
-  cleanup_member_name_mapping(xs);
-
-  f_service_ << indent() << "}" << endl
-             << indent() << "catch (TTransportException)" << endl
-             << indent() << "{" << endl
-             << indent() << "  throw;" << endl
-             << indent() << "}" << endl
-             << indent() << "catch (Exception ex)" << endl
-             << indent() << "{" << endl
-             << indent() << "  Console.Error.WriteLine(\"Error occurred in processor:\");" << endl
-             << indent() << "  Console.Error.WriteLine(ex.ToString());" << endl;
-
-  if (tfunction->is_oneway()) {
-    f_service_ << indent() << "}" << endl;
-  } else {
-    f_service_ << indent() << "  TApplicationException x = new TApplicationException" << indent()
-               << "(TApplicationException.ExceptionType.InternalError,\" Internal error.\");"
-               << endl
-               << indent() << "  oprot.WriteMessageBegin(new TMessage(\"" << tfunction->get_name()
-               << "\", TMessageType.Exception, seqid));" << endl
-               << indent() << "  x.Write(oprot);" << endl
-               << indent() << "}" << endl;
-    f_service_ << indent() << "oprot.WriteMessageEnd();" << endl
-               << indent() << "oprot.Transport.Flush();" << endl;
-  }
-
-  scope_down(f_service_);
-
-  f_service_ << endl;
-}
-
-void t_csharp_generator::generate_process_function_async(t_service* tservice, t_function* tfunction) {
-  (void)tservice;
-  indent(f_service_) << "public async Task " << tfunction->get_name()
-    << "_ProcessAsync(int seqid, TProtocol iprot, TProtocol oprot)" << endl;
-  scope_up(f_service_);
-
-  string argsname = tfunction->get_name() + "_args";
-  string resultname = tfunction->get_name() + "_result";
-
-  f_service_ << indent() << argsname << " args = new " << argsname << "();" << endl
-    << indent() << "args.Read(iprot);" << endl
-    << indent() << "iprot.ReadMessageEnd();" << endl;
-
-  t_struct* xs = tfunction->get_xceptions();
-  const std::vector<t_field*>& xceptions = xs->get_members();
-  vector<t_field*>::const_iterator x_iter;
-
-  if (!tfunction->is_oneway()) {
-    f_service_ << indent() << resultname << " result = new " << resultname << "();" << endl;
-  }
-
-  f_service_ << indent() << "try" << endl
-    << indent() << "{" << endl;
-  indent_up();
-
-  if (xceptions.size() > 0) {
-    f_service_ << indent() << "try" << endl
-      << indent() << "{" << endl;
-    indent_up();
-  }
-
-  t_struct* arg_struct = tfunction->get_arglist();
-  const std::vector<t_field*>& fields = arg_struct->get_members();
-  vector<t_field*>::const_iterator f_iter;
-
-  f_service_ << indent();
-  if (!tfunction->is_oneway() && !tfunction->get_returntype()->is_void()) {
-    f_service_ << "result.Success = ";
-  }
-  f_service_ << "await iface_." << normalize_name(tfunction->get_name()) << "Async(";
-  bool first = true;
-  prepare_member_name_mapping(arg_struct);
-  for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
-    if (first) {
-      first = false;
-    }
-    else {
-      f_service_ << ", ";
-    }
-    f_service_ << "args." << prop_name(*f_iter);
-    if (nullable_ && !type_can_be_null((*f_iter)->get_type())) {
-      f_service_ << ".Value";
-    }
-  }
-  cleanup_member_name_mapping(arg_struct);
-  f_service_ << ");" << endl;
-
-  prepare_member_name_mapping(xs, xs->get_members(), resultname);
-  if (xceptions.size() > 0) {
-    indent_down();
-    f_service_ << indent() << "}" << endl;
-    for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) {
-      f_service_ << indent() << "catch (" << type_name((*x_iter)->get_type(), false, false) << " "
-        << (*x_iter)->get_name() << ")" << endl
-        << indent() << "{" << endl;
-      if (!tfunction->is_oneway()) {
-        indent_up();
-        f_service_ << indent() << "result." << prop_name(*x_iter) << " = " << (*x_iter)->get_name()
-          << ";" << endl;
-        indent_down();
-      }
-      f_service_ << indent() << "}" << endl;
-    }
-  }
-  if (!tfunction->is_oneway()) {
-    f_service_ << indent() << "oprot.WriteMessageBegin(new TMessage(\"" << tfunction->get_name()
-      << "\", TMessageType.Reply, seqid)); " << endl;
-    f_service_ << indent() << "result.Write(oprot);" << endl;
-  }
-  indent_down();
-
-  cleanup_member_name_mapping(xs);
-
-  f_service_ << indent() << "}" << endl
-    << indent() << "catch (TTransportException)" << endl
-    << indent() << "{" << endl
-    << indent() << "  throw;" << endl
-    << indent() << "}" << endl
-    << indent() << "catch (Exception ex)" << endl
-    << indent() << "{" << endl
-    << indent() << "  Console.Error.WriteLine(\"Error occurred in processor:\");" << endl
-    << indent() << "  Console.Error.WriteLine(ex.ToString());" << endl;
-
-  if (tfunction->is_oneway()) {
-    f_service_ << indent() << "}" << endl;
-  }
-  else {
-    f_service_ << indent() << "  TApplicationException x = new TApplicationException" << indent()
-      << "(TApplicationException.ExceptionType.InternalError,\" Internal error.\");"
-      << endl
-      << indent() << "  oprot.WriteMessageBegin(new TMessage(\"" << tfunction->get_name()
-      << "\", TMessageType.Exception, seqid));" << endl
-      << indent() << "  x.Write(oprot);" << endl
-      << indent() << "}" << endl;
-    f_service_ << indent() << "oprot.WriteMessageEnd();" << endl
-      << indent() << "oprot.Transport.Flush();" << endl;
-  }
-
-  scope_down(f_service_);
-
-  f_service_ << endl;
-}
-
-void t_csharp_generator::generate_csharp_union_reader(std::ostream& out, t_struct* tunion) {
-  // Thanks to THRIFT-1768, we don't need to check for required fields in the union
-  const vector<t_field*>& fields = tunion->get_members();
-  vector<t_field*>::const_iterator f_iter;
-
-  indent(out) << "public static " << tunion->get_name() << " Read(TProtocol iprot)" << endl;
-  scope_up(out);
-
-  out << indent() << "iprot.IncrementRecursionDepth();" << endl;
-  out << indent() << "try" << endl;
-  scope_up(out);
-
-  indent(out) << tunion->get_name() << " retval;" << endl;
-  indent(out) << "iprot.ReadStructBegin();" << endl;
-  indent(out) << "TField field = iprot.ReadFieldBegin();" << endl;
-  // we cannot have the first field be a stop -- we must have a single field defined
-  indent(out) << "if (field.Type == TType.Stop)" << endl;
-  scope_up(out);
-  indent(out) << "iprot.ReadFieldEnd();" << endl;
-  indent(out) << "retval = new ___undefined();" << endl;
-  scope_down(out);
-  indent(out) << "else" << endl;
-  scope_up(out);
-  indent(out) << "switch (field.ID)" << endl;
-  scope_up(out);
-
-  for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
-    indent(out) << "case " << (*f_iter)->get_key() << ":" << endl;
-    indent_up();
-    indent(out) << "if (field.Type == " << type_to_enum((*f_iter)->get_type()) << ") {" << endl;
-    indent_up();
-
-    indent(out) << type_name((*f_iter)->get_type()) << " temp;" << endl;
-    generate_deserialize_field(out, (*f_iter), "temp", true);
-    indent(out) << "retval = new " << (*f_iter)->get_name() << "(temp);" << endl;
-
-    indent_down();
-    out << indent() << "} else { " << endl << indent() << "  TProtocolUtil.Skip(iprot, field.Type);"
-        << endl << indent() << "  retval = new ___undefined();" << endl << indent() << "}" << endl
-        << indent() << "break;" << endl;
-    indent_down();
-  }
-
-  indent(out) << "default: " << endl;
-  indent_up();
-  indent(out) << "TProtocolUtil.Skip(iprot, field.Type);" << endl << indent()
-              << "retval = new ___undefined();" << endl;
-  indent(out) << "break;" << endl;
-  indent_down();
-
-  scope_down(out);
-
-  indent(out) << "iprot.ReadFieldEnd();" << endl;
-
-  indent(out) << "if (iprot.ReadFieldBegin().Type != TType.Stop)" << endl;
-  scope_up(out);
-  indent(out) << "throw new TProtocolException(TProtocolException.INVALID_DATA);" << endl;
-  scope_down(out);
-
-  // end of else for TStop
-  scope_down(out);
-  indent(out) << "iprot.ReadStructEnd();" << endl;
-  indent(out) << "return retval;" << endl;
-  indent_down();
-
-  scope_down(out);
-  out << indent() << "finally" << endl;
-  scope_up(out);
-  out << indent() << "iprot.DecrementRecursionDepth();" << endl;
-  scope_down(out);
-
-  indent(out) << "}" << endl << endl;
-}
-
-void t_csharp_generator::generate_deserialize_field(ostream& out,
-                                                    t_field* tfield,
-                                                    string prefix,
-                                                    bool is_propertyless) {
-  t_type* type = tfield->get_type();
-  while (type->is_typedef()) {
-    type = ((t_typedef*)type)->get_type();
-  }
-
-  if (type->is_void()) {
-    throw "CANNOT GENERATE DESERIALIZE CODE FOR void TYPE: " + prefix + tfield->get_name();
-  }
-
-  string name = prefix + (is_propertyless ? "" : prop_name(tfield));
-
-  if (type->is_struct() || type->is_xception()) {
-    generate_deserialize_struct(out, (t_struct*)type, name);
-  } else if (type->is_container()) {
-    generate_deserialize_container(out, type, name);
-  } else if (type->is_base_type() || type->is_enum()) {
-    indent(out) << name << " = ";
-
-    if (type->is_enum()) {
-      out << "(" << type_name(type, false, true) << ")";
-    }
-
-    out << "iprot.";
-
-    if (type->is_base_type()) {
-      t_base_type::t_base tbase = ((t_base_type*)type)->get_base();
-      switch (tbase) {
-      case t_base_type::TYPE_VOID:
-        throw "compiler error: cannot serialize void field in a struct: " + name;
-        break;
-      case t_base_type::TYPE_STRING:
-        if (type->is_binary()) {
-          out << "ReadBinary();";
-        } else {
-          out << "ReadString();";
-        }
-        break;
-      case t_base_type::TYPE_BOOL:
-        out << "ReadBool();";
-        break;
-      case t_base_type::TYPE_I8:
-        out << "ReadByte();";
-        break;
-      case t_base_type::TYPE_I16:
-        out << "ReadI16();";
-        break;
-      case t_base_type::TYPE_I32:
-        out << "ReadI32();";
-        break;
-      case t_base_type::TYPE_I64:
-        out << "ReadI64();";
-        break;
-      case t_base_type::TYPE_DOUBLE:
-        out << "ReadDouble();";
-        break;
-      default:
-        throw "compiler error: no C# name for base type " + t_base_type::t_base_name(tbase);
-      }
-    } else if (type->is_enum()) {
-      out << "ReadI32();";
-    }
-    out << endl;
-  } else {
-    printf("DO NOT KNOW HOW TO DESERIALIZE FIELD '%s' TYPE '%s'\n",
-           tfield->get_name().c_str(),
-           type_name(type).c_str());
-  }
-}
-
-void t_csharp_generator::generate_deserialize_struct(ostream& out,
-                                                     t_struct* tstruct,
-                                                     string prefix) {
-  if (union_ && tstruct->is_union()) {
-    out << indent() << prefix << " = " << type_name(tstruct) << ".Read(iprot);" << endl;
-  } else {
-    out << indent() << prefix << " = new " << type_name(tstruct) << "();" << endl << indent()
-        << prefix << ".Read(iprot);" << endl;
-  }
-}
-
-void t_csharp_generator::generate_deserialize_container(ostream& out,
-                                                        t_type* ttype,
-                                                        string prefix) {
-  scope_up(out);
-
-  string obj;
-
-  if (ttype->is_map()) {
-    obj = tmp("_map");
-  } else if (ttype->is_set()) {
-    obj = tmp("_set");
-  } else if (ttype->is_list()) {
-    obj = tmp("_list");
-  }
-
-  indent(out) << prefix << " = new " << type_name(ttype, false, true) << "();" << endl;
-  if (ttype->is_map()) {
-    out << indent() << "TMap " << obj << " = iprot.ReadMapBegin();" << endl;
-  } else if (ttype->is_set()) {
-    out << indent() << "TSet " << obj << " = iprot.ReadSetBegin();" << endl;
-  } else if (ttype->is_list()) {
-    out << indent() << "TList " << obj << " = iprot.ReadListBegin();" << endl;
-  }
-
-  string i = tmp("_i");
-  indent(out) << "for( int " << i << " = 0; " << i << " < " << obj << ".Count"
-              << "; "
-              << "++" << i << ")" << endl;
-  scope_up(out);
-
-  if (ttype->is_map()) {
-    generate_deserialize_map_element(out, (t_map*)ttype, prefix);
-  } else if (ttype->is_set()) {
-    generate_deserialize_set_element(out, (t_set*)ttype, prefix);
-  } else if (ttype->is_list()) {
-    generate_deserialize_list_element(out, (t_list*)ttype, prefix);
-  }
-
-  scope_down(out);
-
-  if (ttype->is_map()) {
-    indent(out) << "iprot.ReadMapEnd();" << endl;
-  } else if (ttype->is_set()) {
-    indent(out) << "iprot.ReadSetEnd();" << endl;
-  } else if (ttype->is_list()) {
-    indent(out) << "iprot.ReadListEnd();" << endl;
-  }
-
-  scope_down(out);
-}
-
-void t_csharp_generator::generate_deserialize_map_element(ostream& out,
-                                                          t_map* tmap,
-                                                          string prefix) {
-  string key = tmp("_key");
-  string val = tmp("_val");
-
-  t_field fkey(tmap->get_key_type(), key);
-  t_field fval(tmap->get_val_type(), val);
-
-  indent(out) << declare_field(&fkey) << endl;
-  indent(out) << declare_field(&fval) << endl;
-
-  generate_deserialize_field(out, &fkey);
-  generate_deserialize_field(out, &fval);
-
-  indent(out) << prefix << "[" << key << "] = " << val << ";" << endl;
-}
-
-void t_csharp_generator::generate_deserialize_set_element(ostream& out,
-                                                          t_set* tset,
-                                                          string prefix) {
-  string elem = tmp("_elem");
-  t_field felem(tset->get_elem_type(), elem);
-
-  indent(out) << declare_field(&felem) << endl;
-
-  generate_deserialize_field(out, &felem);
-
-  indent(out) << prefix << ".Add(" << elem << ");" << endl;
-}
-
-void t_csharp_generator::generate_deserialize_list_element(ostream& out,
-                                                           t_list* tlist,
-                                                           string prefix) {
-  string elem = tmp("_elem");
-  t_field felem(tlist->get_elem_type(), elem);
-
-  indent(out) << declare_field(&felem) << endl;
-
-  generate_deserialize_field(out, &felem);
-
-  indent(out) << prefix << ".Add(" << elem << ");" << endl;
-}
-
-void t_csharp_generator::generate_serialize_field(ostream& out,
-                                                  t_field* tfield,
-                                                  string prefix,
-                                                  bool is_element,
-                                                  bool is_propertyless) {
-  t_type* type = tfield->get_type();
-  while (type->is_typedef()) {
-    type = ((t_typedef*)type)->get_type();
-  }
-
-  string name = prefix + (is_propertyless ? "" : prop_name(tfield));
-
-  if (type->is_void()) {
-    throw "CANNOT GENERATE SERIALIZE CODE FOR void TYPE: " + name;
-  }
-
-  if (type->is_struct() || type->is_xception()) {
-    generate_serialize_struct(out, (t_struct*)type, name);
-  } else if (type->is_container()) {
-    generate_serialize_container(out, type, name);
-  } else if (type->is_base_type() || type->is_enum()) {
-    indent(out) << "oprot.";
-
-    string nullable_name = nullable_ && !is_element && !field_is_required(tfield) ? name + ".Value"
-                                                                                  : name;
-
-    if (type->is_base_type()) {
-      t_base_type::t_base tbase = ((t_base_type*)type)->get_base();
-      switch (tbase) {
-      case t_base_type::TYPE_VOID:
-        throw "compiler error: cannot serialize void field in a struct: " + name;
-        break;
-      case t_base_type::TYPE_STRING:
-        if (type->is_binary()) {
-          out << "WriteBinary(";
-        } else {
-          out << "WriteString(";
-        }
-        out << name << ");";
-        break;
-      case t_base_type::TYPE_BOOL:
-        out << "WriteBool(" << nullable_name << ");";
-        break;
-      case t_base_type::TYPE_I8:
-        out << "WriteByte(" << nullable_name << ");";
-        break;
-      case t_base_type::TYPE_I16:
-        out << "WriteI16(" << nullable_name << ");";
-        break;
-      case t_base_type::TYPE_I32:
-        out << "WriteI32(" << nullable_name << ");";
-        break;
-      case t_base_type::TYPE_I64:
-        out << "WriteI64(" << nullable_name << ");";
-        break;
-      case t_base_type::TYPE_DOUBLE:
-        out << "WriteDouble(" << nullable_name << ");";
-        break;
-      default:
-        throw "compiler error: no C# name for base type " + t_base_type::t_base_name(tbase);
-      }
-    } else if (type->is_enum()) {
-      out << "WriteI32((int)" << nullable_name << ");";
-    }
-    out << endl;
-  } else {
-    printf("DO NOT KNOW HOW TO SERIALIZE '%s%s' TYPE '%s'\n",
-           prefix.c_str(),
-           tfield->get_name().c_str(),
-           type_name(type).c_str());
-  }
-}
-
-void t_csharp_generator::generate_serialize_struct(ostream& out,
-                                                   t_struct* tstruct,
-                                                   string prefix) {
-  (void)tstruct;
-  out << indent() << prefix << ".Write(oprot);" << endl;
-}
-
-void t_csharp_generator::generate_serialize_container(ostream& out, t_type* ttype, string prefix) {
-  scope_up(out);
-
-  if (ttype->is_map()) {
-    indent(out) << "oprot.WriteMapBegin(new TMap(" << type_to_enum(((t_map*)ttype)->get_key_type())
-                << ", " << type_to_enum(((t_map*)ttype)->get_val_type()) << ", " << prefix
-                << ".Count));" << endl;
-  } else if (ttype->is_set()) {
-    indent(out) << "oprot.WriteSetBegin(new TSet(" << type_to_enum(((t_set*)ttype)->get_elem_type())
-                << ", " << prefix << ".Count));" << endl;
-  } else if (ttype->is_list()) {
-    indent(out) << "oprot.WriteListBegin(new TList("
-                << type_to_enum(((t_list*)ttype)->get_elem_type()) << ", " << prefix << ".Count));"
-                << endl;
-  }
-
-  string iter = tmp("_iter");
-  if (ttype->is_map()) {
-    indent(out) << "foreach (" << type_name(((t_map*)ttype)->get_key_type()) << " " << iter
-                << " in " << prefix << ".Keys)";
-  } else if (ttype->is_set()) {
-    indent(out) << "foreach (" << type_name(((t_set*)ttype)->get_elem_type()) << " " << iter
-                << " in " << prefix << ")";
-  } else if (ttype->is_list()) {
-    indent(out) << "foreach (" << type_name(((t_list*)ttype)->get_elem_type()) << " " << iter
-                << " in " << prefix << ")";
-  }
-
-  out << endl;
-  scope_up(out);
-
-  if (ttype->is_map()) {
-    generate_serialize_map_element(out, (t_map*)ttype, iter, prefix);
-  } else if (ttype->is_set()) {
-    generate_serialize_set_element(out, (t_set*)ttype, iter);
-  } else if (ttype->is_list()) {
-    generate_serialize_list_element(out, (t_list*)ttype, iter);
-  }
-
-  scope_down(out);
-
-  if (ttype->is_map()) {
-    indent(out) << "oprot.WriteMapEnd();" << endl;
-  } else if (ttype->is_set()) {
-    indent(out) << "oprot.WriteSetEnd();" << endl;
-  } else if (ttype->is_list()) {
-    indent(out) << "oprot.WriteListEnd();" << endl;
-  }
-
-  scope_down(out);
-}
-
-void t_csharp_generator::generate_serialize_map_element(ostream& out,
-                                                        t_map* tmap,
-                                                        string iter,
-                                                        string map) {
-  t_field kfield(tmap->get_key_type(), iter);
-  generate_serialize_field(out, &kfield, "", true);
-  t_field vfield(tmap->get_val_type(), map + "[" + iter + "]");
-  generate_serialize_field(out, &vfield, "", true);
-}
-
-void t_csharp_generator::generate_serialize_set_element(ostream& out, t_set* tset, string iter) {
-  t_field efield(tset->get_elem_type(), iter);
-  generate_serialize_field(out, &efield, "", true);
-}
-
-void t_csharp_generator::generate_serialize_list_element(ostream& out,
-                                                         t_list* tlist,
-                                                         string iter) {
-  t_field efield(tlist->get_elem_type(), iter);
-  generate_serialize_field(out, &efield, "", true);
-}
-
-void t_csharp_generator::generate_property(ostream& out,
-                                           t_field* tfield,
-                                           bool isPublic,
-                                           bool generateIsset) {
-  generate_csharp_property(out, tfield, isPublic, generateIsset, "_");
-}
-void t_csharp_generator::generate_csharp_property(ostream& out,
-                                                  t_field* tfield,
-                                                  bool isPublic,
-                                                  bool generateIsset,
-                                                  std::string fieldPrefix) {
-  if ((serialize_ || wcf_) && isPublic) {
-    indent(out) << "[DataMember(Order = 0)]" << endl;
-  }
-  bool has_default = field_has_default(tfield);
-  bool is_required = field_is_required(tfield);
-  if ((nullable_ && !has_default) || (is_required)) {
-    indent(out) << (isPublic ? "public " : "private ")
-                << type_name(tfield->get_type(), false, false, true, is_required) << " "
-                << prop_name(tfield) << " { get; set; }" << endl;
-  } else {
-    indent(out) << (isPublic ? "public " : "private ")
-                << type_name(tfield->get_type(), false, false, true) << " " << prop_name(tfield)
-                << endl;
-    scope_up(out);
-    indent(out) << "get" << endl;
-    scope_up(out);
-    bool use_nullable = false;
-    if (nullable_) {
-      t_type* ttype = tfield->get_type();
-      while (ttype->is_typedef()) {
-        ttype = ((t_typedef*)ttype)->get_type();
-      }
-      if (ttype->is_base_type()) {
-        use_nullable = ((t_base_type*)ttype)->get_base() != t_base_type::TYPE_STRING;
-      } else if (ttype->is_enum()) {
-        use_nullable = true;
-      }
-    }
-    indent(out) << "return " << fieldPrefix + tfield->get_name() << ";" << endl;
-    scope_down(out);
-    indent(out) << "set" << endl;
-    scope_up(out);
-    if (use_nullable) {
-      if (generateIsset) {
-        indent(out) << "__isset." << normalize_name(tfield->get_name()) << " = value.HasValue;"
-                    << endl;
-      }
-      indent(out) << "if (value.HasValue) this." << fieldPrefix + tfield->get_name()
-                  << " = value.Value;" << endl;
-    } else {
-      if (generateIsset) {
-        indent(out) << "__isset." << normalize_name(tfield->get_name()) << " = true;" << endl;
-      }
-      indent(out) << "this." << fieldPrefix + tfield->get_name() << " = value;" << endl;
-    }
-    scope_down(out);
-    scope_down(out);
-  }
-  out << endl;
-}
-
-std::string t_csharp_generator::make_valid_csharp_identifier(std::string const& fromName) {
-  std::string str = fromName;
-  if (str.empty()) {
-    return str;
-  }
-
-  // tests rely on this
-  assert(('A' < 'Z') && ('a' < 'z') && ('0' < '9'));
-
-  // if the first letter is a number, we add an additional underscore in front of it
-  char c = str.at(0);
-  if (('0' <= c) && (c <= '9')) {
-    str = "_" + str;
-  }
-
-  // following chars: letter, number or underscore
-  for (size_t i = 0; i < str.size(); ++i) {
-    c = str.at(i);
-    if ((('A' > c) || (c > 'Z')) && (('a' > c) || (c > 'z')) && (('0' > c) || (c > '9'))
-        && ('_' != c)) {
-      str.replace(i, 1, "_");
-    }
-  }
-
-  return str;
-}
-
-void t_csharp_generator::cleanup_member_name_mapping(void* scope) {
-  if( member_mapping_scopes.empty()) {
-    throw "internal error: cleanup_member_name_mapping() no scope active";
-  }
-
-  member_mapping_scope& active = member_mapping_scopes.back();
-  if (active.scope_member != scope) {
-    throw "internal error: cleanup_member_name_mapping() called for wrong struct";
-  }
-
-  member_mapping_scopes.pop_back();
-}
-
-string t_csharp_generator::get_mapped_member_name(string name) {
-  if( ! member_mapping_scopes.empty()) {
-    member_mapping_scope& active = member_mapping_scopes.back();
-    map<string, string>::iterator iter = active.mapping_table.find(name);
-    if (active.mapping_table.end() != iter) {
-      return iter->second;
-    }
-  }
-
-  pverbose("no mapping for member %s\n", name.c_str());
-  return name;
-}
-
-void t_csharp_generator::prepare_member_name_mapping(t_struct* tstruct) {
-  prepare_member_name_mapping(tstruct, tstruct->get_members(), tstruct->get_name());
-}
-
-void t_csharp_generator::prepare_member_name_mapping(void* scope,
-                                                     const vector<t_field*>& members,
-                                                     const string& structname) {
-  // begin new scope
-  member_mapping_scope dummy;
-  dummy.scope_member = 0;
-  member_mapping_scopes.push_back(dummy);
-  member_mapping_scope& active = member_mapping_scopes.back();
-  active.scope_member = scope;
-
-  // current C# generator policy:
-  // - prop names are always rendered with an Uppercase first letter
-  // - struct names are used as given
-  std::set<std::string> used_member_names;
-  vector<t_field*>::const_iterator iter;
-
-  // prevent name conflicts with struct (CS0542 error)
-  used_member_names.insert(structname);
-
-  // prevent name conflicts with known methods (THRIFT-2942)
-  used_member_names.insert("Read");
-  used_member_names.insert("Write");
-
-  for (iter = members.begin(); iter != members.end(); ++iter) {
-    string oldname = (*iter)->get_name();
-    string newname = prop_name(*iter, true);
-    while (true) {
-
-      // new name conflicts with another member
-      if (used_member_names.find(newname) != used_member_names.end()) {
-        pverbose("struct %s: member %s conflicts with another member\n",
-                 structname.c_str(),
-                 newname.c_str());
-        newname += '_';
-        continue;
-      }
-
-      // add always, this helps us to detect edge cases like
-      // different spellings ("foo" and "Foo") within the same struct
-      pverbose("struct %s: member mapping %s => %s\n",
-               structname.c_str(),
-               oldname.c_str(),
-               newname.c_str());
-      active.mapping_table[oldname] = newname;
-      used_member_names.insert(newname);
-      break;
-    }
-  }
-}
-
-std::string t_csharp_generator::prop_name(t_field* tfield, bool suppress_mapping) {
-  string name(tfield->get_name());
-  if (suppress_mapping) {
-    name[0] = toupper(name[0]);
-  } else {
-    name = get_mapped_member_name(name);
-  }
-  return name;
-}
-
-string t_csharp_generator::type_name(t_type* ttype,
-                                     bool in_container,
-                                     bool in_init,
-                                     bool in_param,
-                                     bool is_required) {
-  (void)in_init;
-  while (ttype->is_typedef()) {
-    ttype = ((t_typedef*)ttype)->get_type();
-  }
-
-  if (ttype->is_base_type()) {
-    return base_type_name((t_base_type*)ttype, in_container, in_param, is_required);
-  } else if (ttype->is_map()) {
-    t_map* tmap = (t_map*)ttype;
-    return "Dictionary<" + type_name(tmap->get_key_type(), true) + ", "
-           + type_name(tmap->get_val_type(), true) + ">";
-  } else if (ttype->is_set()) {
-    t_set* tset = (t_set*)ttype;
-    return "THashSet<" + type_name(tset->get_elem_type(), true) + ">";
-  } else if (ttype->is_list()) {
-    t_list* tlist = (t_list*)ttype;
-    return "List<" + type_name(tlist->get_elem_type(), true) + ">";
-  }
-
-  t_program* program = ttype->get_program();
-  string postfix = (!is_required && nullable_ && in_param && ttype->is_enum()) ? "?" : "";
-  if (program != NULL && program != program_) {
-    string ns = program->get_namespace("csharp");
-    if (!ns.empty()) {
-      return ns + "." + normalize_name(ttype->get_name()) + postfix;
-    }
-  }
-
-  return normalize_name(ttype->get_name()) + postfix;
-}
-
-string t_csharp_generator::base_type_name(t_base_type* tbase,
-                                          bool in_container,
-                                          bool in_param,
-                                          bool is_required) {
-  (void)in_container;
-  string postfix = (!is_required && nullable_ && in_param) ? "?" : "";
-  switch (tbase->get_base()) {
-  case t_base_type::TYPE_VOID:
-    return "void";
-  case t_base_type::TYPE_STRING:
-    if (tbase->is_binary()) {
-      return "byte[]";
-    } else {
-      return "string";
-    }
-  case t_base_type::TYPE_BOOL:
-    return "bool" + postfix;
-  case t_base_type::TYPE_I8:
-    return "sbyte" + postfix;
-  case t_base_type::TYPE_I16:
-    return "short" + postfix;
-  case t_base_type::TYPE_I32:
-    return "int" + postfix;
-  case t_base_type::TYPE_I64:
-    return "long" + postfix;
-  case t_base_type::TYPE_DOUBLE:
-    return "double" + postfix;
-  default:
-    throw "compiler error: no C# name for base type " + t_base_type::t_base_name(tbase->get_base());
-  }
-}
-
-string t_csharp_generator::declare_field(t_field* tfield, bool init, std::string prefix) {
-  string result = type_name(tfield->get_type()) + " " + prefix + tfield->get_name();
-  if (init) {
-    t_type* ttype = tfield->get_type();
-    while (ttype->is_typedef()) {
-      ttype = ((t_typedef*)ttype)->get_type();
-    }
-    if (ttype->is_base_type() && field_has_default(tfield)) {
-      std::ofstream dummy;
-      result += " = " + render_const_value(dummy, tfield->get_name(), ttype, tfield->get_value());
-    } else if (ttype->is_base_type()) {
-      t_base_type::t_base tbase = ((t_base_type*)ttype)->get_base();
-      switch (tbase) {
-      case t_base_type::TYPE_VOID:
-        throw "NO T_VOID CONSTRUCT";
-      case t_base_type::TYPE_STRING:
-        result += " = null";
-        break;
-      case t_base_type::TYPE_BOOL:
-        result += " = false";
-        break;
-      case t_base_type::TYPE_I8:
-      case t_base_type::TYPE_I16:
-      case t_base_type::TYPE_I32:
-      case t_base_type::TYPE_I64:
-        result += " = 0";
-        break;
-      case t_base_type::TYPE_DOUBLE:
-        result += " = (double)0";
-        break;
-      }
-    } else if (ttype->is_enum()) {
-      result += " = (" + type_name(ttype, false, true) + ")0";
-    } else if (ttype->is_container()) {
-      result += " = new " + type_name(ttype, false, true) + "()";
-    } else {
-      result += " = new " + type_name(ttype, false, true) + "()";
-    }
-  }
-  return result + ";";
-}
-
-string t_csharp_generator::function_signature(t_function* tfunction, string prefix) {
-  t_type* ttype = tfunction->get_returntype();
-  return type_name(ttype) + " " + normalize_name(prefix + tfunction->get_name()) + "("
-         + argument_list(tfunction->get_arglist()) + ")";
-}
-
-string t_csharp_generator::function_signature_async_begin(t_function* tfunction, string prefix) {
-  string comma = (tfunction->get_arglist()->get_members().size() > 0 ? ", " : "");
-  return "IAsyncResult " + normalize_name(prefix + tfunction->get_name())
-         + "(AsyncCallback callback, object state" + comma + argument_list(tfunction->get_arglist())
-         + ")";
-}
-
-string t_csharp_generator::function_signature_async_end(t_function* tfunction, string prefix) {
-  t_type* ttype = tfunction->get_returntype();
-  return type_name(ttype) + " " + normalize_name(prefix + tfunction->get_name())
-         + "(IAsyncResult asyncResult)";
-}
-
-string t_csharp_generator::function_signature_async(t_function* tfunction, string prefix) {
-  t_type* ttype = tfunction->get_returntype();
-  string task = "Task";
-  if (!ttype->is_void())
-    task += "<" + type_name(ttype) + ">";
-  return task + " " + normalize_name(prefix + tfunction->get_name()) + "Async("
-         + argument_list(tfunction->get_arglist()) + ")";
-}
-
-string t_csharp_generator::argument_list(t_struct* tstruct) {
-  string result = "";
-  const vector<t_field*>& fields = tstruct->get_members();
-  vector<t_field*>::const_iterator f_iter;
-  bool first = true;
-  for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
-    if (first) {
-      first = false;
-    } else {
-      result += ", ";
-    }
-    result += type_name((*f_iter)->get_type()) + " " + normalize_name((*f_iter)->get_name());
-  }
-  return result;
-}
-
-string t_csharp_generator::type_to_enum(t_type* type) {
-  while (type->is_typedef()) {
-    type = ((t_typedef*)type)->get_type();
-  }
-
-  if (type->is_base_type()) {
-    t_base_type::t_base tbase = ((t_base_type*)type)->get_base();
-    switch (tbase) {
-    case t_base_type::TYPE_VOID:
-      throw "NO T_VOID CONSTRUCT";
-    case t_base_type::TYPE_STRING:
-      return "TType.String";
-    case t_base_type::TYPE_BOOL:
-      return "TType.Bool";
-    case t_base_type::TYPE_I8:
-      return "TType.Byte";
-    case t_base_type::TYPE_I16:
-      return "TType.I16";
-    case t_base_type::TYPE_I32:
-      return "TType.I32";
-    case t_base_type::TYPE_I64:
-      return "TType.I64";
-    case t_base_type::TYPE_DOUBLE:
-      return "TType.Double";
-    }
-  } else if (type->is_enum()) {
-    return "TType.I32";
-  } else if (type->is_struct() || type->is_xception()) {
-    return "TType.Struct";
-  } else if (type->is_map()) {
-    return "TType.Map";
-  } else if (type->is_set()) {
-    return "TType.Set";
-  } else if (type->is_list()) {
-    return "TType.List";
-  }
-
-  throw "INVALID TYPE IN type_to_enum: " + type->get_name();
-}
-
-void t_csharp_generator::generate_csharp_docstring_comment(ostream& out, string contents) {
-  generate_docstring_comment(out, "/// <summary>\n", "/// ", contents, "/// </summary>\n");
-}
-
-void t_csharp_generator::generate_csharp_doc(ostream& out, t_field* field) {
-  if (field->get_type()->is_enum()) {
-    string combined_message = field->get_doc() + "\n<seealso cref=\""
-                              + get_enum_class_name(field->get_type()) + "\"/>";
-    generate_csharp_docstring_comment(out, combined_message);
-  } else {
-    generate_csharp_doc(out, (t_doc*)field);
-  }
-}
-
-void t_csharp_generator::generate_csharp_doc(ostream& out, t_doc* tdoc) {
-  if (tdoc->has_doc()) {
-    generate_csharp_docstring_comment(out, tdoc->get_doc());
-  }
-}
-
-void t_csharp_generator::generate_csharp_doc(ostream& out, t_function* tfunction) {
-  if (tfunction->has_doc()) {
-    stringstream ps;
-    const vector<t_field*>& fields = tfunction->get_arglist()->get_members();
-    vector<t_field*>::const_iterator p_iter;
-    for (p_iter = fields.begin(); p_iter != fields.end(); ++p_iter) {
-      t_field* p = *p_iter;
-      ps << "\n<param name=\"" << p->get_name() << "\">";
-      if (p->has_doc()) {
-        std::string str = p->get_doc();
-        str.erase(std::remove(str.begin(), str.end(), '\n'),
-                  str.end()); // remove the newlines that appear from the parser
-        ps << str;
-      }
-      ps << "</param>";
-    }
-    generate_docstring_comment(out,
-                               "",
-                               "/// ",
-                               "<summary>\n" + tfunction->get_doc() + "</summary>" + ps.str(),
-                               "");
-  }
-}
-
-std::string t_csharp_generator::get_enum_class_name(t_type* type) {
-  string package = "";
-  t_program* program = type->get_program();
-  if (program != NULL && program != program_) {
-    package = program->get_namespace("csharp") + ".";
-  }
-  return package + type->get_name();
-}
-
-
-THRIFT_REGISTER_GENERATOR(
-    csharp,
-    "C#",
-    "    async:           Adds Async support using Task.Run.\n"
-    "    wcf:             Adds bindings for WCF to generated classes.\n"
-    "    serial:          Add serialization support to generated classes.\n"
-    "    nullable:        Use nullable types for properties.\n"
-    "    hashcode:        Generate a hashcode and equals implementation for classes.\n"
-    "    union:           Use new union typing, which includes a static read function for union "
-    "types.\n")
diff --git a/compiler/cpp/src/thrift/generate/t_generator.cc b/compiler/cpp/src/thrift/generate/t_generator.cc
index 77afeba..3059fb1 100644
--- a/compiler/cpp/src/thrift/generate/t_generator.cc
+++ b/compiler/cpp/src/thrift/generate/t_generator.cc
@@ -234,10 +234,7 @@
   gen_map_t& the_map = get_generator_map();
   gen_map_t::iterator iter = the_map.find(language);
 
-  if (language == "csharp") {
-    pwarning(1, "The '%s' target is deprecated. Consider moving to 'netstd' instead.", language.c_str());
-  }
-  else if (language == "netcore") {
+  if ((language == "csharp") || (language == "netcore")) {
     failure("The '%s' target is no longer available. Use 'netstd' instead.", language.c_str());
   }
   else if (language == "as3") {
diff --git a/compiler/cpp/src/thrift/main.cc b/compiler/cpp/src/thrift/main.cc
index 1ba8234..50bdcea 100644
--- a/compiler/cpp/src/thrift/main.cc
+++ b/compiler/cpp/src/thrift/main.cc
@@ -656,7 +656,7 @@
  * Prints the version number
  */
 void version() {
-  printf("Thrift version %s (custom build)\n", THRIFT_VERSION);
+  printf("Thrift version %s\n", THRIFT_VERSION);
 }
 
 /**
diff --git a/compiler/cpp/src/thrift/thriftl.ll b/compiler/cpp/src/thrift/thriftl.ll
index bdb4fb0..3773516 100644
--- a/compiler/cpp/src/thrift/thriftl.ll
+++ b/compiler/cpp/src/thrift/thriftl.ll
@@ -207,7 +207,6 @@
 "cpp_include"        { return tok_cpp_include;          }
 "cpp_type"           { return tok_cpp_type;             }
 "java_package"       { error_unsupported_namespace_decl("java_package", "java"); /* do nothing */ }
-"csharp_namespace"   { error_unsupported_namespace_decl("csharp"); /* do nothing */ }
 "delphi_namespace"   { error_unsupported_namespace_decl("delphi"); /* do nothing */ }
 "php_namespace"      { error_unsupported_namespace_decl("php"); /* do nothing */ }
 "py_module"          { error_unsupported_namespace_decl("py_module", "py"); /* do nothing */ }
diff --git a/compiler/cpp/tests/CMakeLists.txt b/compiler/cpp/tests/CMakeLists.txt
index 7798c15..924e167 100644
--- a/compiler/cpp/tests/CMakeLists.txt
+++ b/compiler/cpp/tests/CMakeLists.txt
@@ -101,7 +101,6 @@
 THRIFT_ADD_COMPILER(c_glib  "Enable compiler for C with Glib" OFF)
 THRIFT_ADD_COMPILER(cl      "Enable compiler for Common LISP" OFF)
 THRIFT_ADD_COMPILER(cpp     "Enable compiler for C++" OFF)
-THRIFT_ADD_COMPILER(csharp  "Enable compiler for C#" OFF)
 THRIFT_ADD_COMPILER(d       "Enable compiler for D" OFF)
 THRIFT_ADD_COMPILER(dart    "Enable compiler for Dart" OFF)
 THRIFT_ADD_COMPILER(delphi  "Enable compiler for Delphi" OFF)
diff --git a/lib/csharp/Makefile.am b/lib/csharp/Makefile.am
deleted file mode 100644
index cc2bbc9..0000000
--- a/lib/csharp/Makefile.am
+++ /dev/null
@@ -1,114 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-
-SUBDIRS = . test/Multiplex
-
-THRIFTCODE = \
-            src/Collections/THashSet.cs \
-            src/Collections/TCollections.cs \
-            src/Properties/AssemblyInfo.cs \
-            src/Protocol/TAbstractBase.cs \
-            src/Protocol/TBase.cs \
-            src/Protocol/TBase64Utils.cs \
-            src/Protocol/TJSONProtocol.cs \
-            src/Protocol/TProtocolException.cs \
-            src/Protocol/TProtocolFactory.cs \
-            src/Protocol/TList.cs \
-            src/Protocol/TSet.cs \
-            src/Protocol/TMap.cs \
-            src/Protocol/TProtocolUtil.cs \
-            src/Protocol/TMessageType.cs \
-            src/Protocol/TProtocol.cs \
-            src/Protocol/TProtocolDecorator.cs \
-            src/Protocol/TMultiplexedProtocol.cs \
-            src/Protocol/TMultiplexedProcessor.cs \
-            src/Protocol/TType.cs \
-            src/Protocol/TField.cs \
-            src/Protocol/TMessage.cs \
-            src/Protocol/TStruct.cs \
-            src/Protocol/TBinaryProtocol.cs \
-            src/Protocol/TCompactProtocol.cs \
-            src/Server/TThreadedServer.cs \
-            src/Server/TThreadPoolServer.cs \
-            src/Server/TSimpleServer.cs \
-            src/Server/TServer.cs \
-            src/Server/TServerEventHandler.cs \
-            src/Transport/TBufferedTransport.cs \
-            src/Transport/TTransport.cs \
-            src/Transport/TSocket.cs \
-            src/Transport/TSocketVersionizer.cs \
-            src/Transport/TTransportException.cs \
-            src/Transport/TStreamTransport.cs \
-            src/Transport/TFramedTransport.cs \
-            src/Transport/TServerTransport.cs \
-            src/Transport/TServerSocket.cs \
-            src/Transport/TTransportFactory.cs \
-            src/Transport/THttpClient.cs \
-            src/Transport/THttpHandler.cs \
-            src/Transport/TMemoryBuffer.cs \
-            src/Transport/TNamedPipeClientTransport.cs \
-            src/Transport/TNamedPipeServerTransport.cs \
-            src/Transport/TTLSSocket.cs \
-            src/Transport/TTLSServerSocket.cs \
-            src/TProcessor.cs \
-            src/TProcessorFactory.cs \
-            src/TSingletonProcessorFactory.cs \
-            src/TPrototypeProcessorFactory.cs \
-            src/TControllingHandler.cs \
-            src/TException.cs \
-            src/TApplicationException.cs
-
-if MONO_MCS
-export CSC = mcs
-else
-export CSC = gmcs
-endif
-
-if NET_2_0
-export CSC_DEFINES = -d:NET_2_0
-endif
-
-all-local: Thrift.dll Thrift.45.dll
-
-Thrift.dll: $(THRIFTCODE)
-	$(CSC) $(CSC_DEFINES) -out:$@ -target:library -reference:System.Web $(THRIFTCODE)
-
-Thrift.45.dll: $(THRIFTCODE)
-	$(CSC) $(CSC_DEFINES) -out:$@ -target:library -reference:System.Web $(THRIFTCODE)
-
-CLEANFILES = \
-	Thrift.dll \
-	Thrift.45.dll
-
-DISTCLEANFILES = \
-	Makefile.in
-
-EXTRA_DIST = \
-	$(THRIFTCODE) \
-	ThriftMSBuildTask \
-	src/Thrift.csproj \
-	src/Thrift.45.csproj \
-	src/Thrift.sln \
-	src/Net35/ExtensionsNet35.cs \
-	src/Transport/TSilverlightSocket.cs \
-	src/Transport/THttpTaskAsyncHandler.cs \
-	src/TAsyncProcessor.cs \
-	test \
-	coding_standards.md \
-	README.md
diff --git a/lib/csharp/README.md b/lib/csharp/README.md
deleted file mode 100644
index 5fc14cb..0000000
--- a/lib/csharp/README.md
+++ /dev/null
@@ -1,32 +0,0 @@
-Thrift C# Software Library
-
-Deprecation notice
-=======
-
-Per [THRIFT-4723](https://issues.apache.org/jira/browse/THRIFT-4723), both CSharp and Netcore targets are deprecated 
-and will be removed with the next release. Migrate to the [NetStd language target](../netstd/README.md) instead.
-
-License
-=======
-
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements. See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership. The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License. You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied. See the License for the
-specific language governing permissions and limitations
-under the License.
-
-Using Thrift with C#
-====================
-
-Thrift requires Mono >= 1.2.6 or .NET framework >= 3.5
diff --git a/lib/csharp/ThriftMSBuildTask/Properties/AssemblyInfo.cs b/lib/csharp/ThriftMSBuildTask/Properties/AssemblyInfo.cs
deleted file mode 100644
index f5f0000..0000000
--- a/lib/csharp/ThriftMSBuildTask/Properties/AssemblyInfo.cs
+++ /dev/null
@@ -1,60 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- * Contains some contributions under the Thrift Software License.
- * Please see doc/old-thrift-license.txt in the Thrift distribution for
- * details.
- */
-
-using System.Reflection;
-using System.Runtime.CompilerServices;
-using System.Runtime.InteropServices;
-
-// General Information about an assembly is controlled through the following
-// set of attributes. Change these attribute values to modify the information
-// associated with an assembly.
-[assembly: AssemblyTitle("ThriftMSBuildTask")]
-[assembly: AssemblyDescription("MSBuild Task to generate csharp from .thrift files, and compile the code into a library: ThriftImpl.dll")]
-[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("The Apache Software Foundation")]
-[assembly: AssemblyProduct("ThriftMSBuildTask")]
-[assembly: AssemblyCopyright("The Apache Software Foundation")]
-[assembly: AssemblyTrademark("")]
-[assembly: AssemblyCulture("")]
-//@TODO where to put License information?
-
-// Setting ComVisible to false makes the types in this assembly not visible
-// to COM components.  If you need to access a type in this assembly from
-// COM, set the ComVisible attribute to true on that type.
-[assembly: ComVisible(false)]
-
-// The following GUID is for the ID of the typelib if this project is exposed to COM
-[assembly: Guid("5095e09d-7b95-4be1-b250-e1c1db1c485e")]
-
-// Version information for an assembly consists of the following four values:
-//
-//      Major Version
-//      Minor Version
-//      Build Number
-//      Revision
-//
-// You can specify all the values or you can default the Build and Revision Numbers
-// by using the '*' as shown below:
-// [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("0.14.0.*")]
-[assembly: AssemblyFileVersion("0.14.0.*")]
diff --git a/lib/csharp/ThriftMSBuildTask/ThriftBuild.cs b/lib/csharp/ThriftMSBuildTask/ThriftBuild.cs
deleted file mode 100644
index 4e6d301..0000000
--- a/lib/csharp/ThriftMSBuildTask/ThriftBuild.cs
+++ /dev/null
@@ -1,246 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- * Contains some contributions under the Thrift Software License.
- * Please see doc/old-thrift-license.txt in the Thrift distribution for
- * details.
- */
-
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using Microsoft.Build.Framework;
-using Microsoft.Build.Utilities;
-using Microsoft.Build.Tasks;
-using System.IO;
-using System.Diagnostics;
-
-namespace ThriftMSBuildTask
-{
-    /// <summary>
-    /// MSBuild Task to generate csharp from .thrift files, and compile the code into a library: ThriftImpl.dll
-    /// </summary>
-    public class ThriftBuild : Task
-    {
-        /// <summary>
-        /// The full path to the thrift.exe compiler
-        /// </summary>
-        [Required]
-        public ITaskItem ThriftExecutable
-        {
-            get;
-            set;
-        }
-
-        /// <summary>
-        /// The full path to a thrift.dll C# library
-        /// </summary>
-        [Required]
-        public ITaskItem ThriftLibrary
-        {
-            get;
-            set;
-        }
-
-        /// <summary>
-        /// A direcotry containing .thrift files
-        /// </summary>
-        [Required]
-        public ITaskItem ThriftDefinitionDir
-        {
-            get;
-            set;
-        }
-
-        /// <summary>
-        /// The name of the auto-gen and compiled thrift library. It will placed in
-        /// the same directory as ThriftLibrary
-        /// </summary>
-        [Required]
-        public ITaskItem OutputName
-        {
-            get;
-            set;
-        }
-
-        /// <summary>
-        /// The full path to the compiled ThriftLibrary. This allows msbuild tasks to use this
-        /// output as a variable for use elsewhere.
-        /// </summary>
-        [Output]
-        public ITaskItem ThriftImplementation
-        {
-            get { return thriftImpl; }
-        }
-
-        private ITaskItem thriftImpl;
-        private const string lastCompilationName = "LAST_COMP_TIMESTAMP";
-
-        //use the Message Build Task to write something to build log
-        private void LogMessage(string text, MessageImportance importance)
-        {
-            Message m = new Message();
-            m.Text = text;
-            m.Importance = importance.ToString();
-            m.BuildEngine = this.BuildEngine;
-            m.Execute();
-        }
-
-        //recursively find .cs files in srcDir, paths should initially be non-null and empty
-        private void FindSourcesHelper(string srcDir, List<string> paths)
-        {
-            string[] files = Directory.GetFiles(srcDir, "*.cs");
-            foreach (string f in files)
-            {
-                paths.Add(f);
-            }
-            string[] dirs = Directory.GetDirectories(srcDir);
-            foreach (string dir in dirs)
-            {
-                FindSourcesHelper(dir, paths);
-            }
-        }
-
-        /// <summary>
-        /// Quote paths with spaces
-        /// </summary>
-        private string SafePath(string path)
-        {
-            if (path.Contains(' ') && !path.StartsWith("\""))
-            {
-                return "\"" + path + "\"";
-            }
-            return path;
-        }
-
-        private ITaskItem[] FindSources(string srcDir)
-        {
-            List<string> files = new List<string>();
-            FindSourcesHelper(srcDir, files);
-            ITaskItem[] items = new ITaskItem[files.Count];
-            for (int i = 0; i < items.Length; i++)
-            {
-                items[i] = new TaskItem(files[i]);
-            }
-            return items;
-        }
-
-        private string LastWriteTime(string defDir)
-        {
-            string[] files = Directory.GetFiles(defDir, "*.thrift");
-            DateTime d = (new DirectoryInfo(defDir)).LastWriteTime;
-            foreach(string file in files)
-            {
-                FileInfo f = new FileInfo(file);
-                DateTime curr = f.LastWriteTime;
-                if (DateTime.Compare(curr, d) > 0)
-                {
-                    d = curr;
-                }
-            }
-            return d.ToFileTimeUtc().ToString();
-        }
-
-        public override bool Execute()
-        {
-            string defDir = SafePath(ThriftDefinitionDir.ItemSpec);
-            //look for last compilation timestamp
-            string lastBuildPath = Path.Combine(defDir, lastCompilationName);
-            DirectoryInfo defDirInfo = new DirectoryInfo(defDir);
-            string lastWrite = LastWriteTime(defDir);
-            if (File.Exists(lastBuildPath))
-            {
-                string lastComp = File.ReadAllText(lastBuildPath);
-                //don't recompile if the thrift library has been updated since lastComp
-                FileInfo f = new FileInfo(ThriftLibrary.ItemSpec);
-                string thriftLibTime = f.LastWriteTimeUtc.ToFileTimeUtc().ToString();
-                if (lastComp.CompareTo(thriftLibTime) < 0)
-                {
-                    //new thrift library, do a compile
-                    lastWrite = thriftLibTime;
-                }
-                else if (lastComp == lastWrite || (lastComp == thriftLibTime && lastComp.CompareTo(lastWrite) > 0))
-                {
-                    //the .thrift dir hasn't been written to since last compilation, don't need to do anything
-                    LogMessage("ThriftImpl up-to-date", MessageImportance.High);
-                    return true;
-                }
-            }
-
-            //find the directory of the thriftlibrary (that's where output will go)
-            FileInfo thriftLibInfo = new FileInfo(SafePath(ThriftLibrary.ItemSpec));
-            string thriftDir = thriftLibInfo.Directory.FullName;
-
-            string genDir = Path.Combine(thriftDir, "gen-csharp");
-            if (Directory.Exists(genDir))
-            {
-                try
-                {
-                    Directory.Delete(genDir, true);
-                }
-                catch { /*eh i tried, just over-write now*/}
-            }
-
-            //run the thrift executable to generate C#
-            foreach (string thriftFile in Directory.GetFiles(defDir, "*.thrift"))
-            {
-                LogMessage("Generating code for: " + thriftFile, MessageImportance.Normal);
-                Process p = new Process();
-                p.StartInfo.FileName = SafePath(ThriftExecutable.ItemSpec);
-                p.StartInfo.Arguments = "--gen csharp -o " + SafePath(thriftDir) + " -r " + thriftFile;
-                p.StartInfo.UseShellExecute = false;
-                p.StartInfo.CreateNoWindow = true;
-                p.StartInfo.RedirectStandardOutput = false;
-                p.Start();
-                p.WaitForExit();
-                if (p.ExitCode != 0)
-                {
-                    LogMessage("thrift.exe failed to compile " + thriftFile, MessageImportance.High);
-                    return false;
-                }
-                if (p.ExitCode != 0)
-                {
-                    LogMessage("thrift.exe failed to compile " + thriftFile, MessageImportance.High);
-                    return false;
-                }
-            }
-
-            Csc csc = new Csc();
-            csc.TargetType = "library";
-            csc.References = new ITaskItem[] { new TaskItem(ThriftLibrary.ItemSpec) };
-            csc.EmitDebugInformation = true;
-            string outputPath = Path.Combine(thriftDir, OutputName.ItemSpec);
-            csc.OutputAssembly = new TaskItem(outputPath);
-            csc.Sources = FindSources(Path.Combine(thriftDir, "gen-csharp"));
-            csc.BuildEngine = this.BuildEngine;
-            LogMessage("Compiling generated cs...", MessageImportance.Normal);
-            if (!csc.Execute())
-            {
-                return false;
-            }
-
-            //write file to defDir to indicate a build was successfully completed
-            File.WriteAllText(lastBuildPath, lastWrite);
-
-            thriftImpl = new TaskItem(outputPath);
-
-            return true;
-        }
-    }
-}
diff --git a/lib/csharp/ThriftMSBuildTask/ThriftMSBuildTask.csproj b/lib/csharp/ThriftMSBuildTask/ThriftMSBuildTask.csproj
deleted file mode 100644
index 2589970..0000000
--- a/lib/csharp/ThriftMSBuildTask/ThriftMSBuildTask.csproj
+++ /dev/null
@@ -1,118 +0,0 @@
-﻿<?xml version="1.0" encoding="utf-8"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements. See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership. The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License. You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied. See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <PropertyGroup>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <ProductVersion>9.0.21022</ProductVersion>
-    <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{EC0A0231-66EA-4593-A792-C6CA3BB8668E}</ProjectGuid>
-    <OutputType>Library</OutputType>
-    <AppDesignerFolder>Properties</AppDesignerFolder>
-    <RootNamespace>ThriftMSBuildTask</RootNamespace>
-    <AssemblyName>ThriftMSBuildTask</AssemblyName>
-    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
-    <FileAlignment>512</FileAlignment>
-    <FileUpgradeFlags>
-    </FileUpgradeFlags>
-    <OldToolsVersion>3.5</OldToolsVersion>
-    <UpgradeBackupLocation />
-    <PublishUrl>publish\</PublishUrl>
-    <Install>true</Install>
-    <InstallFrom>Disk</InstallFrom>
-    <UpdateEnabled>false</UpdateEnabled>
-    <UpdateMode>Foreground</UpdateMode>
-    <UpdateInterval>7</UpdateInterval>
-    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
-    <UpdatePeriodically>false</UpdatePeriodically>
-    <UpdateRequired>false</UpdateRequired>
-    <MapFileExtensions>true</MapFileExtensions>
-    <ApplicationRevision>0</ApplicationRevision>
-    <ApplicationVersion>0.14.0.0</ApplicationVersion>
-    <IsWebBootstrapper>false</IsWebBootstrapper>
-    <UseApplicationTrust>false</UseApplicationTrust>
-    <BootstrapperEnabled>true</BootstrapperEnabled>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
-    <DebugSymbols>true</DebugSymbols>
-    <DebugType>full</DebugType>
-    <Optimize>false</Optimize>
-    <OutputPath>bin\Debug\</OutputPath>
-    <DefineConstants>DEBUG;TRACE</DefineConstants>
-    <ErrorReport>prompt</ErrorReport>
-    <WarningLevel>4</WarningLevel>
-    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
-    <DebugType>pdbonly</DebugType>
-    <Optimize>true</Optimize>
-    <OutputPath>bin\Release\</OutputPath>
-    <DefineConstants>TRACE</DefineConstants>
-    <ErrorReport>prompt</ErrorReport>
-    <WarningLevel>4</WarningLevel>
-    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="Microsoft.Build.Framework" />
-    <Reference Include="Microsoft.Build.Tasks" />
-    <Reference Include="Microsoft.Build.Utilities" />
-    <Reference Include="System" />
-    <Reference Include="System.Core">
-      <RequiredTargetFramework>3.5</RequiredTargetFramework>
-    </Reference>
-    <Reference Include="System.Xml.Linq">
-      <RequiredTargetFramework>3.5</RequiredTargetFramework>
-    </Reference>
-    <Reference Include="System.Data.DataSetExtensions">
-      <RequiredTargetFramework>3.5</RequiredTargetFramework>
-    </Reference>
-    <Reference Include="System.Data" />
-    <Reference Include="System.Xml" />
-  </ItemGroup>
-  <ItemGroup>
-    <Compile Include="ThriftBuild.cs" />
-    <Compile Include="Properties\AssemblyInfo.cs" />
-  </ItemGroup>
-  <ItemGroup>
-    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
-      <Visible>False</Visible>
-      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
-      <Install>false</Install>
-    </BootstrapperPackage>
-    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
-      <Visible>False</Visible>
-      <ProductName>.NET Framework 3.5 SP1</ProductName>
-      <Install>true</Install>
-    </BootstrapperPackage>
-    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
-      <Visible>False</Visible>
-      <ProductName>Windows Installer 3.1</ProductName>
-      <Install>true</Install>
-    </BootstrapperPackage>
-  </ItemGroup>
-  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
-  <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
-       Other similar extension points exist, see Microsoft.Common.targets.
-  <Target Name="BeforeBuild">
-  </Target>
-  <Target Name="AfterBuild">
-  </Target>
-  -->
-</Project>
diff --git a/lib/csharp/coding_standards.md b/lib/csharp/coding_standards.md
deleted file mode 100644
index dc87190..0000000
--- a/lib/csharp/coding_standards.md
+++ /dev/null
@@ -1,6 +0,0 @@
-## C# Coding Standards
-
-Please follow:
- * [Thrift General Coding Standards](/doc/coding_standards.md)
- * [MSDN C# Coding Conventions](http://msdn.microsoft.com/en-us/library/ff926074.aspx)
- * [C# Coding Guidelines](http://csharpguidelines.codeplex.com/)
diff --git a/lib/csharp/src/Collections/TCollections.cs b/lib/csharp/src/Collections/TCollections.cs
deleted file mode 100644
index 84afb6a..0000000
--- a/lib/csharp/src/Collections/TCollections.cs
+++ /dev/null
@@ -1,94 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-using System;
-using System.Collections;
-
-namespace Thrift.Collections
-{
-    public class TCollections
-    {
-        /// <summary>
-        /// This will return true if the two collections are value-wise the same.
-        /// If the collection contains a collection, the collections will be compared using this method.
-        /// </summary>
-        public static bool Equals (IEnumerable first, IEnumerable second)
-        {
-            if (first == null && second == null)
-            {
-                return true;
-            }
-            if (first == null || second == null)
-            {
-                return false;
-            }
-            IEnumerator fiter = first.GetEnumerator ();
-            IEnumerator siter = second.GetEnumerator ();
-
-            bool fnext = fiter.MoveNext ();
-            bool snext = siter.MoveNext ();
-            while (fnext && snext)
-            {
-                IEnumerable fenum = fiter.Current as IEnumerable;
-                IEnumerable senum = siter.Current as IEnumerable;
-                if (fenum != null && senum != null)
-                {
-                    if (!Equals(fenum, senum))
-                    {
-                        return false;
-                    }
-                }
-                else if (fenum == null ^ senum == null)
-                {
-                    return false;
-                }
-                else if (!Equals(fiter.Current, siter.Current))
-                {
-                    return false;
-                }
-                fnext = fiter.MoveNext();
-                snext = siter.MoveNext();
-            }
-
-            return fnext == snext;
-        }
-
-        /// <summary>
-        /// This returns a hashcode based on the value of the enumerable.
-        /// </summary>
-        public static int GetHashCode (IEnumerable enumerable)
-        {
-            if (enumerable == null)
-            {
-                return 0;
-            }
-
-            int hashcode = 0;
-            foreach (object obj in enumerable)
-            {
-                IEnumerable enum2 = obj as IEnumerable;
-                int objHash = enum2 == null ? obj.GetHashCode () : GetHashCode (enum2);
-                unchecked
-                {
-                    hashcode = (hashcode * 397) ^ (objHash);
-                }
-            }
-            return hashcode;
-        }
-    }
-}
diff --git a/lib/csharp/src/Collections/THashSet.cs b/lib/csharp/src/Collections/THashSet.cs
deleted file mode 100644
index e29271a..0000000
--- a/lib/csharp/src/Collections/THashSet.cs
+++ /dev/null
@@ -1,160 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-using System;
-using System.Collections;
-using System.Collections.Generic;
-
-#if SILVERLIGHT
-using System.Runtime.Serialization;
-#endif
-
-namespace Thrift.Collections
-{
-#if SILVERLIGHT
-    [DataContract]
-#else
-    [Serializable]
-#endif
-    public class THashSet<T> : ICollection<T>
-    {
-#if NET_2_0 || SILVERLIGHT
-#if SILVERLIGHT
-        [DataMember]
-#endif
-        TDictSet<T> set = new TDictSet<T>();
-#else
-        HashSet<T> set = new HashSet<T>();
-#endif
-        public int Count
-        {
-            get { return set.Count; }
-        }
-
-        public bool IsReadOnly
-        {
-            get { return false; }
-        }
-
-        public void Add(T item)
-        {
-            set.Add(item);
-        }
-
-        public void Clear()
-        {
-            set.Clear();
-        }
-
-        public bool Contains(T item)
-        {
-            return set.Contains(item);
-        }
-
-        public void CopyTo(T[] array, int arrayIndex)
-        {
-            set.CopyTo(array, arrayIndex);
-        }
-
-        public IEnumerator GetEnumerator()
-        {
-            return set.GetEnumerator();
-        }
-
-        IEnumerator<T> IEnumerable<T>.GetEnumerator()
-        {
-            return ((IEnumerable<T>)set).GetEnumerator();
-        }
-
-        public bool Remove(T item)
-        {
-            return set.Remove(item);
-        }
-
-#if NET_2_0 || SILVERLIGHT
-#if SILVERLIGHT
-        [DataContract]
-#endif
-        private class TDictSet<V> : ICollection<V>
-        {
-#if SILVERLIGHT
-            [DataMember]
-#endif
-            Dictionary<V, TDictSet<V>> dict = new Dictionary<V, TDictSet<V>>();
-
-            public int Count
-            {
-                get { return dict.Count; }
-            }
-
-            public bool IsReadOnly
-            {
-                get { return false; }
-            }
-
-            public IEnumerator GetEnumerator()
-            {
-                return ((IEnumerable)dict.Keys).GetEnumerator();
-            }
-
-            IEnumerator<V> IEnumerable<V>.GetEnumerator()
-            {
-                return dict.Keys.GetEnumerator();
-            }
-
-            public bool Add(V item)
-            {
-                if (!dict.ContainsKey(item))
-                {
-                    dict[item] = this;
-                    return true;
-                }
-
-                return false;
-            }
-
-            void ICollection<V>.Add(V item)
-            {
-                Add(item);
-            }
-
-            public void Clear()
-            {
-                dict.Clear();
-            }
-
-            public bool Contains(V item)
-            {
-                return dict.ContainsKey(item);
-            }
-
-            public void CopyTo(V[] array, int arrayIndex)
-            {
-                dict.Keys.CopyTo(array, arrayIndex);
-            }
-
-            public bool Remove(V item)
-            {
-                return dict.Remove(item);
-            }
-        }
-#endif
-    }
-
-}
diff --git a/lib/csharp/src/Net35/ExtensionsNet35.cs b/lib/csharp/src/Net35/ExtensionsNet35.cs
deleted file mode 100644
index 73a4232..0000000
--- a/lib/csharp/src/Net35/ExtensionsNet35.cs
+++ /dev/null
@@ -1,31 +0,0 @@
-﻿using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Linq;
-using System.Text;
-
-#if (!NET45)
-namespace Thrift
-{
-    static class StreamExtensionsNet35
-    {
-        // CopyTo() has been added in 4.0
-        public static long CopyTo(this Stream source, Stream target)
-        {
-            byte[] buffer = new byte[8192];  // multiple of 4096
-            long nTotal = 0;
-            while (true)
-            {
-                int nRead = source.Read(buffer, 0, buffer.Length);
-                if (nRead <= 0)  // done?
-                    return nTotal;
-
-                target.Write(buffer, 0, nRead);
-                nTotal += nRead;
-            }
-        }
-    }
-
-}
-#endif
-
diff --git a/lib/csharp/src/Properties/AssemblyInfo.cs b/lib/csharp/src/Properties/AssemblyInfo.cs
deleted file mode 100644
index c8f51b5..0000000
--- a/lib/csharp/src/Properties/AssemblyInfo.cs
+++ /dev/null
@@ -1,55 +0,0 @@
-﻿/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-using System.Reflection;
-using System.Runtime.CompilerServices;
-using System.Runtime.InteropServices;
-
-// General Information about an assembly is controlled through the following
-// set of attributes. Change these attribute values to modify the information
-// associated with an assembly.
-[assembly: AssemblyTitle("Thrift")]
-[assembly: AssemblyDescription("C# bindings for the Apache Thrift RPC system")]
-[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("The Apache Software Foundation")]
-[assembly: AssemblyProduct("Thrift")]
-[assembly: AssemblyCopyright("The Apache Software Foundation")]
-[assembly: AssemblyTrademark("")]
-[assembly: AssemblyCulture("")]
-//@TODO where to put License information?
-
-// Setting ComVisible to false makes the types in this assembly not visible
-// to COM components.  If you need to access a type in this assembly from
-// COM, set the ComVisible attribute to true on that type.
-[assembly: ComVisible(false)]
-
-// The following GUID is for the ID of the typelib if this project is exposed to COM
-[assembly: Guid("df3f8ef0-e0a3-4c86-a65b-8ec84e016b1d")]
-
-// Version information for an assembly consists of the following four values:
-//
-//      Major Version
-//      Minor Version
-//      Build Number
-//      Revision
-//
-// You can specify all the values or you can default the Build and Revision Numbers
-// by using the '*' as shown below:
-[assembly: AssemblyVersion("0.14.0.0")]
-[assembly: AssemblyFileVersion("0.14.0.0")]
diff --git a/lib/csharp/src/Protocol/TAbstractBase.cs b/lib/csharp/src/Protocol/TAbstractBase.cs
deleted file mode 100644
index f5a61cd..0000000
--- a/lib/csharp/src/Protocol/TAbstractBase.cs
+++ /dev/null
@@ -1,29 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-namespace Thrift.Protocol
-{
-    public interface TAbstractBase
-    {
-        /// <summary>
-        /// Writes the objects out to the protocol.
-        /// </summary>
-        void Write(TProtocol tProtocol);
-    }
-}
diff --git a/lib/csharp/src/Protocol/TBase.cs b/lib/csharp/src/Protocol/TBase.cs
deleted file mode 100644
index 411e4d9..0000000
--- a/lib/csharp/src/Protocol/TBase.cs
+++ /dev/null
@@ -1,29 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-namespace Thrift.Protocol
-{
-    public interface TBase : TAbstractBase
-    {
-        /// <summary>
-        /// Reads the TObject from the given input protocol.
-        /// </summary>
-        void Read(TProtocol tProtocol);
-    }
-}
diff --git a/lib/csharp/src/Protocol/TBase64Utils.cs b/lib/csharp/src/Protocol/TBase64Utils.cs
deleted file mode 100644
index 9eaaebd..0000000
--- a/lib/csharp/src/Protocol/TBase64Utils.cs
+++ /dev/null
@@ -1,100 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-using System;
-
-namespace Thrift.Protocol
-{
-    internal static class TBase64Utils
-    {
-        internal const string ENCODE_TABLE =
-            "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
-
-        internal static void encode(byte[] src, int srcOff, int len, byte[] dst,
-                                int dstOff)
-        {
-            dst[dstOff] = (byte)ENCODE_TABLE[(src[srcOff] >> 2) & 0x3F];
-            if (len == 3)
-            {
-                dst[dstOff + 1] =
-                    (byte)ENCODE_TABLE[
-                        ((src[srcOff] << 4) & 0x30) | ((src[srcOff + 1] >> 4) & 0x0F)];
-                dst[dstOff + 2] =
-                    (byte)ENCODE_TABLE[
-                        ((src[srcOff + 1] << 2) & 0x3C) | ((src[srcOff + 2] >> 6) & 0x03)];
-                dst[dstOff + 3] =
-                    (byte)ENCODE_TABLE[src[srcOff + 2] & 0x3F];
-            }
-            else if (len == 2)
-            {
-                dst[dstOff + 1] =
-                    (byte)ENCODE_TABLE[
-                        ((src[srcOff] << 4) & 0x30) | ((src[srcOff + 1] >> 4) & 0x0F)];
-                dst[dstOff + 2] =
-                    (byte)ENCODE_TABLE[(src[srcOff + 1] << 2) & 0x3C];
-
-            }
-            else
-            { // len == 1) {
-                dst[dstOff + 1] =
-                    (byte)ENCODE_TABLE[(src[srcOff] << 4) & 0x30];
-            }
-        }
-
-        private static int[] DECODE_TABLE = {
-            -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-            -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-            -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,62,-1,-1,-1,63,
-            52,53,54,55,56,57,58,59,60,61,-1,-1,-1,-1,-1,-1,
-            -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,
-            15,16,17,18,19,20,21,22,23,24,25,-1,-1,-1,-1,-1,
-            -1,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,
-            41,42,43,44,45,46,47,48,49,50,51,-1,-1,-1,-1,-1,
-            -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-            -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-            -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-            -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-            -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-            -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-            -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-            -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-        };
-
-        internal static void decode(byte[] src, int srcOff, int len, byte[] dst,
-                                 int dstOff)
-        {
-            dst[dstOff] = (byte)
-                ((DECODE_TABLE[src[srcOff] & 0x0FF] << 2) |
-                (DECODE_TABLE[src[srcOff + 1] & 0x0FF] >> 4));
-            if (len > 2)
-            {
-                dst[dstOff + 1] = (byte)
-                    (((DECODE_TABLE[src[srcOff + 1] & 0x0FF] << 4) & 0xF0) |
-                    (DECODE_TABLE[src[srcOff + 2] & 0x0FF] >> 2));
-                if (len > 3)
-                {
-                    dst[dstOff + 2] = (byte)
-                        (((DECODE_TABLE[src[srcOff + 2] & 0x0FF] << 6) & 0xC0) |
-                        DECODE_TABLE[src[srcOff + 3] & 0x0FF]);
-                }
-            }
-        }
-
-    }
-}
diff --git a/lib/csharp/src/Protocol/TBinaryProtocol.cs b/lib/csharp/src/Protocol/TBinaryProtocol.cs
deleted file mode 100644
index a4faa94..0000000
--- a/lib/csharp/src/Protocol/TBinaryProtocol.cs
+++ /dev/null
@@ -1,395 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- * Contains some contributions under the Thrift Software License.
- * Please see doc/old-thrift-license.txt in the Thrift distribution for
- * details.
- */
-
-using System;
-using System.Text;
-using Thrift.Transport;
-
-namespace Thrift.Protocol
-{
-    public class TBinaryProtocol : TProtocol
-    {
-        protected const uint VERSION_MASK = 0xffff0000;
-        protected const uint VERSION_1 = 0x80010000;
-
-        protected bool strictRead_ = false;
-        protected bool strictWrite_ = true;
-
-        #region BinaryProtocol Factory
-
-        public class Factory : TProtocolFactory
-        {
-            protected bool strictRead_ = false;
-            protected bool strictWrite_ = true;
-
-            public Factory()
-                : this(false, true)
-            {
-            }
-
-            public Factory(bool strictRead, bool strictWrite)
-            {
-                strictRead_ = strictRead;
-                strictWrite_ = strictWrite;
-            }
-
-            public TProtocol GetProtocol(TTransport trans)
-            {
-                return new TBinaryProtocol(trans, strictRead_, strictWrite_);
-            }
-        }
-
-        #endregion
-
-        public TBinaryProtocol(TTransport trans)
-            : this(trans, false, true)
-        {
-        }
-
-        public TBinaryProtocol(TTransport trans, bool strictRead, bool strictWrite)
-            : base(trans)
-        {
-            strictRead_ = strictRead;
-            strictWrite_ = strictWrite;
-        }
-
-        #region Write Methods
-
-        public override void WriteMessageBegin(TMessage message)
-        {
-            if (strictWrite_)
-            {
-                uint version = VERSION_1 | (uint)(message.Type);
-                WriteI32((int)version);
-                WriteString(message.Name);
-                WriteI32(message.SeqID);
-            }
-            else
-            {
-                WriteString(message.Name);
-                WriteByte((sbyte)message.Type);
-                WriteI32(message.SeqID);
-            }
-        }
-
-        public override void WriteMessageEnd()
-        {
-        }
-
-        public override void WriteStructBegin(TStruct struc)
-        {
-        }
-
-        public override void WriteStructEnd()
-        {
-        }
-
-        public override void WriteFieldBegin(TField field)
-        {
-            WriteByte((sbyte)field.Type);
-            WriteI16(field.ID);
-        }
-
-        public override void WriteFieldEnd()
-        {
-        }
-
-        public override void WriteFieldStop()
-        {
-            WriteByte((sbyte)TType.Stop);
-        }
-
-        public override void WriteMapBegin(TMap map)
-        {
-            WriteByte((sbyte)map.KeyType);
-            WriteByte((sbyte)map.ValueType);
-            WriteI32(map.Count);
-        }
-
-        public override void WriteMapEnd()
-        {
-        }
-
-        public override void WriteListBegin(TList list)
-        {
-            WriteByte((sbyte)list.ElementType);
-            WriteI32(list.Count);
-        }
-
-        public override void WriteListEnd()
-        {
-        }
-
-        public override void WriteSetBegin(TSet set)
-        {
-            WriteByte((sbyte)set.ElementType);
-            WriteI32(set.Count);
-        }
-
-        public override void WriteSetEnd()
-        {
-        }
-
-        public override void WriteBool(bool b)
-        {
-            WriteByte(b ? (sbyte)1 : (sbyte)0);
-        }
-
-        private byte[] bout = new byte[1];
-        public override void WriteByte(sbyte b)
-        {
-            bout[0] = (byte)b;
-            trans.Write(bout, 0, 1);
-        }
-
-        private byte[] i16out = new byte[2];
-        public override void WriteI16(short s)
-        {
-            i16out[0] = (byte)(0xff & (s >> 8));
-            i16out[1] = (byte)(0xff & s);
-            trans.Write(i16out, 0, 2);
-        }
-
-        private byte[] i32out = new byte[4];
-        public override void WriteI32(int i32)
-        {
-            i32out[0] = (byte)(0xff & (i32 >> 24));
-            i32out[1] = (byte)(0xff & (i32 >> 16));
-            i32out[2] = (byte)(0xff & (i32 >> 8));
-            i32out[3] = (byte)(0xff & i32);
-            trans.Write(i32out, 0, 4);
-        }
-
-        private byte[] i64out = new byte[8];
-        public override void WriteI64(long i64)
-        {
-            i64out[0] = (byte)(0xff & (i64 >> 56));
-            i64out[1] = (byte)(0xff & (i64 >> 48));
-            i64out[2] = (byte)(0xff & (i64 >> 40));
-            i64out[3] = (byte)(0xff & (i64 >> 32));
-            i64out[4] = (byte)(0xff & (i64 >> 24));
-            i64out[5] = (byte)(0xff & (i64 >> 16));
-            i64out[6] = (byte)(0xff & (i64 >> 8));
-            i64out[7] = (byte)(0xff & i64);
-            trans.Write(i64out, 0, 8);
-        }
-
-        public override void WriteDouble(double d)
-        {
-#if !SILVERLIGHT
-            WriteI64(BitConverter.DoubleToInt64Bits(d));
-#else
-            var bytes = BitConverter.GetBytes(d);
-            WriteI64(BitConverter.ToInt64(bytes, 0));
-#endif
-        }
-
-        public override void WriteBinary(byte[] b)
-        {
-            WriteI32(b.Length);
-            trans.Write(b, 0, b.Length);
-        }
-
-        #endregion
-
-        #region ReadMethods
-
-        public override TMessage ReadMessageBegin()
-        {
-            TMessage message = new TMessage();
-            int size = ReadI32();
-            if (size < 0)
-            {
-                uint version = (uint)size & VERSION_MASK;
-                if (version != VERSION_1)
-                {
-                    throw new TProtocolException(TProtocolException.BAD_VERSION, "Bad version in ReadMessageBegin: " + version);
-                }
-                message.Type = (TMessageType)(size & 0x000000ff);
-                message.Name = ReadString();
-                message.SeqID = ReadI32();
-            }
-            else
-            {
-                if (strictRead_)
-                {
-                    throw new TProtocolException(TProtocolException.BAD_VERSION, "Missing version in readMessageBegin, old client?");
-                }
-                message.Name = ReadStringBody(size);
-                message.Type = (TMessageType)ReadByte();
-                message.SeqID = ReadI32();
-            }
-            return message;
-        }
-
-        public override void ReadMessageEnd()
-        {
-        }
-
-        public override TStruct ReadStructBegin()
-        {
-            return new TStruct();
-        }
-
-        public override void ReadStructEnd()
-        {
-        }
-
-        public override TField ReadFieldBegin()
-        {
-            TField field = new TField();
-            field.Type = (TType)ReadByte();
-
-            if (field.Type != TType.Stop)
-            {
-                field.ID = ReadI16();
-            }
-
-            return field;
-        }
-
-        public override void ReadFieldEnd()
-        {
-        }
-
-        public override TMap ReadMapBegin()
-        {
-            TMap map = new TMap();
-            map.KeyType = (TType)ReadByte();
-            map.ValueType = (TType)ReadByte();
-            map.Count = ReadI32();
-
-            return map;
-        }
-
-        public override void ReadMapEnd()
-        {
-        }
-
-        public override TList ReadListBegin()
-        {
-            TList list = new TList();
-            list.ElementType = (TType)ReadByte();
-            list.Count = ReadI32();
-
-            return list;
-        }
-
-        public override void ReadListEnd()
-        {
-        }
-
-        public override TSet ReadSetBegin()
-        {
-            TSet set = new TSet();
-            set.ElementType = (TType)ReadByte();
-            set.Count = ReadI32();
-
-            return set;
-        }
-
-        public override void ReadSetEnd()
-        {
-        }
-
-        public override bool ReadBool()
-        {
-            return ReadByte() == 1;
-        }
-
-        private byte[] bin = new byte[1];
-        public override sbyte ReadByte()
-        {
-            ReadAll(bin, 0, 1);
-            return (sbyte)bin[0];
-        }
-
-        private byte[] i16in = new byte[2];
-        public override short ReadI16()
-        {
-            ReadAll(i16in, 0, 2);
-            return (short)(((i16in[0] & 0xff) << 8) | ((i16in[1] & 0xff)));
-        }
-
-        private byte[] i32in = new byte[4];
-        public override int ReadI32()
-        {
-            ReadAll(i32in, 0, 4);
-            return (int)(((i32in[0] & 0xff) << 24) | ((i32in[1] & 0xff) << 16) | ((i32in[2] & 0xff) << 8) | ((i32in[3] & 0xff)));
-        }
-
-#pragma warning disable 675
-
-        private byte[] i64in = new byte[8];
-        public override long ReadI64()
-        {
-            ReadAll(i64in, 0, 8);
-            unchecked
-            {
-                return (long)(
-                    ((long)(i64in[0] & 0xff) << 56) |
-                    ((long)(i64in[1] & 0xff) << 48) |
-                    ((long)(i64in[2] & 0xff) << 40) |
-                    ((long)(i64in[3] & 0xff) << 32) |
-                    ((long)(i64in[4] & 0xff) << 24) |
-                    ((long)(i64in[5] & 0xff) << 16) |
-                    ((long)(i64in[6] & 0xff) << 8) |
-                    ((long)(i64in[7] & 0xff)));
-            }
-        }
-
-#pragma warning restore 675
-
-        public override double ReadDouble()
-        {
-#if !SILVERLIGHT
-            return BitConverter.Int64BitsToDouble(ReadI64());
-#else
-            var value = ReadI64();
-            var bytes = BitConverter.GetBytes(value);
-            return BitConverter.ToDouble(bytes, 0);
-#endif
-        }
-
-        public override byte[] ReadBinary()
-        {
-            int size = ReadI32();
-            byte[] buf = new byte[size];
-            trans.ReadAll(buf, 0, size);
-            return buf;
-        }
-        private string ReadStringBody(int size)
-        {
-            byte[] buf = new byte[size];
-            trans.ReadAll(buf, 0, size);
-            return Encoding.UTF8.GetString(buf, 0, buf.Length);
-        }
-
-        private int ReadAll(byte[] buf, int off, int len)
-        {
-            return trans.ReadAll(buf, off, len);
-        }
-
-        #endregion
-    }
-}
diff --git a/lib/csharp/src/Protocol/TCompactProtocol.cs b/lib/csharp/src/Protocol/TCompactProtocol.cs
deleted file mode 100644
index ff67397..0000000
--- a/lib/csharp/src/Protocol/TCompactProtocol.cs
+++ /dev/null
@@ -1,849 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- * Contains some contributions under the Thrift Software License.
- * Please see doc/old-thrift-license.txt in the Thrift distribution for
- * details.
- */
-
-using System;
-using System.Text;
-using Thrift.Transport;
-using System.Collections;
-using System.IO;
-using System.Collections.Generic;
-
-namespace Thrift.Protocol
-{
-    public class TCompactProtocol : TProtocol
-    {
-        private static TStruct ANONYMOUS_STRUCT = new TStruct("");
-        private static TField TSTOP = new TField("", TType.Stop, (short)0);
-
-        private static byte[] ttypeToCompactType = new byte[16];
-
-        private const byte PROTOCOL_ID = 0x82;
-        private const byte VERSION = 1;
-        private const byte VERSION_MASK = 0x1f; // 0001 1111
-        private const byte TYPE_MASK = 0xE0; // 1110 0000
-        private const byte TYPE_BITS = 0x07; // 0000 0111
-        private const int TYPE_SHIFT_AMOUNT = 5;
-
-        /// <summary>
-        /// All of the on-wire type codes.
-        /// </summary>
-        private static class Types
-        {
-            public const byte STOP = 0x00;
-            public const byte BOOLEAN_TRUE = 0x01;
-            public const byte BOOLEAN_FALSE = 0x02;
-            public const byte BYTE = 0x03;
-            public const byte I16 = 0x04;
-            public const byte I32 = 0x05;
-            public const byte I64 = 0x06;
-            public const byte DOUBLE = 0x07;
-            public const byte BINARY = 0x08;
-            public const byte LIST = 0x09;
-            public const byte SET = 0x0A;
-            public const byte MAP = 0x0B;
-            public const byte STRUCT = 0x0C;
-        }
-
-        /// <summary>
-        /// Used to keep track of the last field for the current and previous structs,
-        /// so we can do the delta stuff.
-        /// </summary>
-        private Stack<short> lastField_ = new Stack<short>(15);
-
-        private short lastFieldId_ = 0;
-
-        /// <summary>
-        /// If we encounter a boolean field begin, save the TField here so it can
-        /// have the value incorporated.
-        /// </summary>
-        private Nullable<TField> booleanField_;
-
-        /// <summary>
-        /// If we Read a field header, and it's a boolean field, save the boolean
-        /// value here so that ReadBool can use it.
-        /// </summary>
-        private Nullable<Boolean> boolValue_;
-
-
-        #region CompactProtocol Factory
-
-        public class Factory : TProtocolFactory
-        {
-            public Factory() { }
-
-            public TProtocol GetProtocol(TTransport trans)
-            {
-                return new TCompactProtocol(trans);
-            }
-        }
-
-        #endregion
-
-        public TCompactProtocol(TTransport trans)
-            : base(trans)
-        {
-            ttypeToCompactType[(int)TType.Stop] = Types.STOP;
-            ttypeToCompactType[(int)TType.Bool] = Types.BOOLEAN_TRUE;
-            ttypeToCompactType[(int)TType.Byte] = Types.BYTE;
-            ttypeToCompactType[(int)TType.I16] = Types.I16;
-            ttypeToCompactType[(int)TType.I32] = Types.I32;
-            ttypeToCompactType[(int)TType.I64] = Types.I64;
-            ttypeToCompactType[(int)TType.Double] = Types.DOUBLE;
-            ttypeToCompactType[(int)TType.String] = Types.BINARY;
-            ttypeToCompactType[(int)TType.List] = Types.LIST;
-            ttypeToCompactType[(int)TType.Set] = Types.SET;
-            ttypeToCompactType[(int)TType.Map] = Types.MAP;
-            ttypeToCompactType[(int)TType.Struct] = Types.STRUCT;
-        }
-
-        public void reset()
-        {
-            lastField_.Clear();
-            lastFieldId_ = 0;
-        }
-
-        #region Write Methods
-
-        /// <summary>
-        /// Writes a byte without any possibility of all that field header nonsense.
-        /// Used internally by other writing methods that know they need to Write a byte.
-        /// </summary>
-        private byte[] byteDirectBuffer = new byte[1];
-
-        private void WriteByteDirect(byte b)
-        {
-            byteDirectBuffer[0] = b;
-            trans.Write(byteDirectBuffer);
-        }
-
-        /// <summary>
-        /// Writes a byte without any possibility of all that field header nonsense.
-        /// </summary>
-        private void WriteByteDirect(int n)
-        {
-            WriteByteDirect((byte)n);
-        }
-
-        /// <summary>
-        /// Write an i32 as a varint. Results in 1-5 bytes on the wire.
-        /// TODO: make a permanent buffer like WriteVarint64?
-        /// </summary>
-        byte[] i32buf = new byte[5];
-
-        private void WriteVarint32(uint n)
-        {
-            int idx = 0;
-            while (true)
-            {
-                if ((n & ~0x7F) == 0)
-                {
-                    i32buf[idx++] = (byte)n;
-                    // WriteByteDirect((byte)n);
-                    break;
-                    // return;
-                }
-                else
-                {
-                    i32buf[idx++] = (byte)((n & 0x7F) | 0x80);
-                    // WriteByteDirect((byte)((n & 0x7F) | 0x80));
-                    n >>= 7;
-                }
-            }
-            trans.Write(i32buf, 0, idx);
-        }
-
-        /// <summary>
-        /// Write a message header to the wire. Compact Protocol messages contain the
-        /// protocol version so we can migrate forwards in the future if need be.
-        /// </summary>
-        public override void WriteMessageBegin(TMessage message)
-        {
-            WriteByteDirect(PROTOCOL_ID);
-            WriteByteDirect((byte)((VERSION & VERSION_MASK) | ((((uint)message.Type) << TYPE_SHIFT_AMOUNT) & TYPE_MASK)));
-            WriteVarint32((uint)message.SeqID);
-            WriteString(message.Name);
-        }
-
-        /// <summary>
-        /// Write a struct begin. This doesn't actually put anything on the wire. We
-        /// use it as an opportunity to put special placeholder markers on the field
-        /// stack so we can get the field id deltas correct.
-        /// </summary>
-        public override void WriteStructBegin(TStruct strct)
-        {
-            lastField_.Push(lastFieldId_);
-            lastFieldId_ = 0;
-        }
-
-        /// <summary>
-        /// Write a struct end. This doesn't actually put anything on the wire. We use
-        /// this as an opportunity to pop the last field from the current struct off
-        /// of the field stack.
-        /// </summary>
-        public override void WriteStructEnd()
-        {
-            lastFieldId_ = lastField_.Pop();
-        }
-
-        /// <summary>
-        /// Write a field header containing the field id and field type. If the
-        /// difference between the current field id and the last one is small (&lt; 15),
-        /// then the field id will be encoded in the 4 MSB as a delta. Otherwise, the
-        /// field id will follow the type header as a zigzag varint.
-        /// </summary>
-        public override void WriteFieldBegin(TField field)
-        {
-            if (field.Type == TType.Bool)
-            {
-                // we want to possibly include the value, so we'll wait.
-                booleanField_ = field;
-            }
-            else
-            {
-                WriteFieldBeginInternal(field, 0xFF);
-            }
-        }
-
-        /// <summary>
-        /// The workhorse of WriteFieldBegin. It has the option of doing a
-        /// 'type override' of the type header. This is used specifically in the
-        /// boolean field case.
-        /// </summary>
-        private void WriteFieldBeginInternal(TField field, byte typeOverride)
-        {
-            // short lastField = lastField_.Pop();
-
-            // if there's a type override, use that.
-            byte typeToWrite = typeOverride == 0xFF ? getCompactType(field.Type) : typeOverride;
-
-            // check if we can use delta encoding for the field id
-            if (field.ID > lastFieldId_ && field.ID - lastFieldId_ <= 15)
-            {
-                // Write them together
-                WriteByteDirect((field.ID - lastFieldId_) << 4 | typeToWrite);
-            }
-            else
-            {
-                // Write them separate
-                WriteByteDirect(typeToWrite);
-                WriteI16(field.ID);
-            }
-
-            lastFieldId_ = field.ID;
-            // lastField_.push(field.id);
-        }
-
-        /// <summary>
-        /// Write the STOP symbol so we know there are no more fields in this struct.
-        /// </summary>
-        public override void WriteFieldStop()
-        {
-            WriteByteDirect(Types.STOP);
-        }
-
-        /// <summary>
-        /// Write a map header. If the map is empty, omit the key and value type
-        /// headers, as we don't need any additional information to skip it.
-        /// </summary>
-        public override void WriteMapBegin(TMap map)
-        {
-            if (map.Count == 0)
-            {
-                WriteByteDirect(0);
-            }
-            else
-            {
-                WriteVarint32((uint)map.Count);
-                WriteByteDirect(getCompactType(map.KeyType) << 4 | getCompactType(map.ValueType));
-            }
-        }
-
-        /// <summary>
-        /// Write a list header.
-        /// </summary>
-        public override void WriteListBegin(TList list)
-        {
-            WriteCollectionBegin(list.ElementType, list.Count);
-        }
-
-        /// <summary>
-        /// Write a set header.
-        /// </summary>
-        public override void WriteSetBegin(TSet set)
-        {
-            WriteCollectionBegin(set.ElementType, set.Count);
-        }
-
-        /// <summary>
-        /// Write a boolean value. Potentially, this could be a boolean field, in
-        /// which case the field header info isn't written yet. If so, decide what the
-        /// right type header is for the value and then Write the field header.
-        /// Otherwise, Write a single byte.
-        /// </summary>
-        public override void WriteBool(Boolean b)
-        {
-            if (booleanField_ != null)
-            {
-                // we haven't written the field header yet
-                WriteFieldBeginInternal(booleanField_.Value, b ? Types.BOOLEAN_TRUE : Types.BOOLEAN_FALSE);
-                booleanField_ = null;
-            }
-            else
-            {
-                // we're not part of a field, so just Write the value.
-                WriteByteDirect(b ? Types.BOOLEAN_TRUE : Types.BOOLEAN_FALSE);
-            }
-        }
-
-        /// <summary>
-        /// Write a byte. Nothing to see here!
-        /// </summary>
-        public override void WriteByte(sbyte b)
-        {
-            WriteByteDirect((byte)b);
-        }
-
-        /// <summary>
-        /// Write an I16 as a zigzag varint.
-        /// </summary>
-        public override void WriteI16(short i16)
-        {
-            WriteVarint32(intToZigZag(i16));
-        }
-
-        /// <summary>
-        /// Write an i32 as a zigzag varint.
-        /// </summary>
-        public override void WriteI32(int i32)
-        {
-            WriteVarint32(intToZigZag(i32));
-        }
-
-        /// <summary>
-        /// Write an i64 as a zigzag varint.
-        /// </summary>
-        public override void WriteI64(long i64)
-        {
-            WriteVarint64(longToZigzag(i64));
-        }
-
-        /// <summary>
-        /// Write a double to the wire as 8 bytes.
-        /// </summary>
-        public override void WriteDouble(double dub)
-        {
-            byte[] data = new byte[] { 0, 0, 0, 0, 0, 0, 0, 0 };
-            fixedLongToBytes(BitConverter.DoubleToInt64Bits(dub), data, 0);
-            trans.Write(data);
-        }
-
-        /// <summary>
-        /// Write a string to the wire with a varint size preceding.
-        /// </summary>
-        public override void WriteString(string str)
-        {
-            byte[] bytes = UTF8Encoding.UTF8.GetBytes(str);
-            WriteBinary(bytes, 0, bytes.Length);
-        }
-
-        /// <summary>
-        /// Write a byte array, using a varint for the size.
-        /// </summary>
-        public override void WriteBinary(byte[] bin)
-        {
-            WriteBinary(bin, 0, bin.Length);
-        }
-
-        private void WriteBinary(byte[] buf, int offset, int length)
-        {
-            WriteVarint32((uint)length);
-            trans.Write(buf, offset, length);
-        }
-
-        //
-        // These methods are called by structs, but don't actually have any wire
-        // output or purpose.
-        //
-
-        public override void WriteMessageEnd() { }
-        public override void WriteMapEnd() { }
-        public override void WriteListEnd() { }
-        public override void WriteSetEnd() { }
-        public override void WriteFieldEnd() { }
-
-        //
-        // Internal writing methods
-        //
-
-        /// <summary>
-        /// Abstract method for writing the start of lists and sets. List and sets on
-        /// the wire differ only by the type indicator.
-        /// </summary>
-        protected void WriteCollectionBegin(TType elemType, int size)
-        {
-            if (size <= 14)
-            {
-                WriteByteDirect(size << 4 | getCompactType(elemType));
-            }
-            else
-            {
-                WriteByteDirect(0xf0 | getCompactType(elemType));
-                WriteVarint32((uint)size);
-            }
-        }
-
-        /// <summary>
-        /// Write an i64 as a varint. Results in 1-10 bytes on the wire.
-        /// </summary>
-        byte[] varint64out = new byte[10];
-        private void WriteVarint64(ulong n)
-        {
-            int idx = 0;
-            while (true)
-            {
-                if ((n & ~(ulong)0x7FL) == 0)
-                {
-                    varint64out[idx++] = (byte)n;
-                    break;
-                }
-                else
-                {
-                    varint64out[idx++] = ((byte)((n & 0x7F) | 0x80));
-                    n >>= 7;
-                }
-            }
-            trans.Write(varint64out, 0, idx);
-        }
-
-        /// <summary>
-        /// Convert l into a zigzag long. This allows negative numbers to be
-        /// represented compactly as a varint.
-        /// </summary>
-        private ulong longToZigzag(long n)
-        {
-            return (ulong)(n << 1) ^ (ulong)(n >> 63);
-        }
-
-        /// <summary>
-        /// Convert n into a zigzag int. This allows negative numbers to be
-        /// represented compactly as a varint.
-        /// </summary>
-        private uint intToZigZag(int n)
-        {
-            return (uint)(n << 1) ^ (uint)(n >> 31);
-        }
-
-        /// <summary>
-        /// Convert a long into little-endian bytes in buf starting at off and going
-        /// until off+7.
-        /// </summary>
-        private void fixedLongToBytes(long n, byte[] buf, int off)
-        {
-            buf[off + 0] = (byte)(n & 0xff);
-            buf[off + 1] = (byte)((n >> 8) & 0xff);
-            buf[off + 2] = (byte)((n >> 16) & 0xff);
-            buf[off + 3] = (byte)((n >> 24) & 0xff);
-            buf[off + 4] = (byte)((n >> 32) & 0xff);
-            buf[off + 5] = (byte)((n >> 40) & 0xff);
-            buf[off + 6] = (byte)((n >> 48) & 0xff);
-            buf[off + 7] = (byte)((n >> 56) & 0xff);
-        }
-
-        #endregion
-
-        #region ReadMethods
-
-        /// <summary>
-        /// Read a message header.
-        /// </summary>
-        public override TMessage ReadMessageBegin()
-        {
-            byte protocolId = (byte)ReadByte();
-            if (protocolId != PROTOCOL_ID)
-            {
-                throw new TProtocolException("Expected protocol id " + PROTOCOL_ID.ToString("X") + " but got " + protocolId.ToString("X"));
-            }
-            byte versionAndType = (byte)ReadByte();
-            byte version = (byte)(versionAndType & VERSION_MASK);
-            if (version != VERSION)
-            {
-                throw new TProtocolException("Expected version " + VERSION + " but got " + version);
-            }
-            byte type = (byte)((versionAndType >> TYPE_SHIFT_AMOUNT) & TYPE_BITS);
-            int seqid = (int)ReadVarint32();
-            string messageName = ReadString();
-            return new TMessage(messageName, (TMessageType)type, seqid);
-        }
-
-        /// <summary>
-        /// Read a struct begin. There's nothing on the wire for this, but it is our
-        /// opportunity to push a new struct begin marker onto the field stack.
-        /// </summary>
-        public override TStruct ReadStructBegin()
-        {
-            lastField_.Push(lastFieldId_);
-            lastFieldId_ = 0;
-            return ANONYMOUS_STRUCT;
-        }
-
-        /// <summary>
-        /// Doesn't actually consume any wire data, just removes the last field for
-        /// this struct from the field stack.
-        /// </summary>
-        public override void ReadStructEnd()
-        {
-            // consume the last field we Read off the wire.
-            lastFieldId_ = lastField_.Pop();
-        }
-
-        /// <summary>
-        /// Read a field header off the wire.
-        /// </summary>
-        public override TField ReadFieldBegin()
-        {
-            byte type = (byte)ReadByte();
-
-            // if it's a stop, then we can return immediately, as the struct is over.
-            if (type == Types.STOP)
-            {
-                return TSTOP;
-            }
-
-            short fieldId;
-
-            // mask off the 4 MSB of the type header. it could contain a field id delta.
-            short modifier = (short)((type & 0xf0) >> 4);
-            if (modifier == 0)
-            {
-                // not a delta. look ahead for the zigzag varint field id.
-                fieldId = ReadI16();
-            }
-            else
-            {
-                // has a delta. add the delta to the last Read field id.
-                fieldId = (short)(lastFieldId_ + modifier);
-            }
-
-            TField field = new TField("", getTType((byte)(type & 0x0f)), fieldId);
-
-            // if this happens to be a boolean field, the value is encoded in the type
-            if (isBoolType(type))
-            {
-                // save the boolean value in a special instance variable.
-                boolValue_ = (byte)(type & 0x0f) == Types.BOOLEAN_TRUE ? true : false;
-            }
-
-            // push the new field onto the field stack so we can keep the deltas going.
-            lastFieldId_ = field.ID;
-            return field;
-        }
-
-        /// <summary>
-        /// Read a map header off the wire. If the size is zero, skip Reading the key
-        /// and value type. This means that 0-length maps will yield TMaps without the
-        /// "correct" types.
-        /// </summary>
-        public override TMap ReadMapBegin()
-        {
-            int size = (int)ReadVarint32();
-            byte keyAndValueType = size == 0 ? (byte)0 : (byte)ReadByte();
-            return new TMap(getTType((byte)(keyAndValueType >> 4)), getTType((byte)(keyAndValueType & 0xf)), size);
-        }
-
-        /// <summary>
-        /// Read a list header off the wire. If the list size is 0-14, the size will
-        /// be packed into the element type header. If it's a longer list, the 4 MSB
-        /// of the element type header will be 0xF, and a varint will follow with the
-        /// true size.
-        /// </summary>
-        public override TList ReadListBegin()
-        {
-            byte size_and_type = (byte)ReadByte();
-            int size = (size_and_type >> 4) & 0x0f;
-            if (size == 15)
-            {
-                size = (int)ReadVarint32();
-            }
-            TType type = getTType(size_and_type);
-            return new TList(type, size);
-        }
-
-        /// <summary>
-        /// Read a set header off the wire. If the set size is 0-14, the size will
-        /// be packed into the element type header. If it's a longer set, the 4 MSB
-        /// of the element type header will be 0xF, and a varint will follow with the
-        /// true size.
-        /// </summary>
-        public override TSet ReadSetBegin()
-        {
-            return new TSet(ReadListBegin());
-        }
-
-        /// <summary>
-        /// Read a boolean off the wire. If this is a boolean field, the value should
-        /// already have been Read during ReadFieldBegin, so we'll just consume the
-        /// pre-stored value. Otherwise, Read a byte.
-        /// </summary>
-        public override Boolean ReadBool()
-        {
-            if (boolValue_ != null)
-            {
-                bool result = boolValue_.Value;
-                boolValue_ = null;
-                return result;
-            }
-            return ReadByte() == Types.BOOLEAN_TRUE;
-        }
-
-        byte[] byteRawBuf = new byte[1];
-        /// <summary>
-        /// Read a single byte off the wire. Nothing interesting here.
-        /// </summary>
-        public override sbyte ReadByte()
-        {
-            trans.ReadAll(byteRawBuf, 0, 1);
-            return (sbyte)byteRawBuf[0];
-        }
-
-        /// <summary>
-        /// Read an i16 from the wire as a zigzag varint.
-        /// </summary>
-        public override short ReadI16()
-        {
-            return (short)zigzagToInt(ReadVarint32());
-        }
-
-        /// <summary>
-        /// Read an i32 from the wire as a zigzag varint.
-        /// </summary>
-        public override int ReadI32()
-        {
-            return zigzagToInt(ReadVarint32());
-        }
-
-        /// <summary>
-        /// Read an i64 from the wire as a zigzag varint.
-        /// </summary>
-        public override long ReadI64()
-        {
-            return zigzagToLong(ReadVarint64());
-        }
-
-        /// <summary>
-        /// No magic here - just Read a double off the wire.
-        /// </summary>
-        public override double ReadDouble()
-        {
-            byte[] longBits = new byte[8];
-            trans.ReadAll(longBits, 0, 8);
-            return BitConverter.Int64BitsToDouble(bytesToLong(longBits));
-        }
-
-        /// <summary>
-        /// Reads a byte[] (via ReadBinary), and then UTF-8 decodes it.
-        /// </summary>
-        public override string ReadString()
-        {
-            int length = (int)ReadVarint32();
-
-            if (length == 0)
-            {
-                return "";
-            }
-
-            return Encoding.UTF8.GetString(ReadBinary(length));
-        }
-
-        /// <summary>
-        /// Read a byte[] from the wire.
-        /// </summary>
-        public override byte[] ReadBinary()
-        {
-            int length = (int)ReadVarint32();
-            if (length == 0) return new byte[0];
-
-            byte[] buf = new byte[length];
-            trans.ReadAll(buf, 0, length);
-            return buf;
-        }
-
-        /// <summary>
-        /// Read a byte[] of a known length from the wire.
-        /// </summary>
-        private byte[] ReadBinary(int length)
-        {
-            if (length == 0) return new byte[0];
-
-            byte[] buf = new byte[length];
-            trans.ReadAll(buf, 0, length);
-            return buf;
-        }
-
-        //
-        // These methods are here for the struct to call, but don't have any wire
-        // encoding.
-        //
-        public override void ReadMessageEnd() { }
-        public override void ReadFieldEnd() { }
-        public override void ReadMapEnd() { }
-        public override void ReadListEnd() { }
-        public override void ReadSetEnd() { }
-
-        //
-        // Internal Reading methods
-        //
-
-        /// <summary>
-        /// Read an i32 from the wire as a varint. The MSB of each byte is set
-        /// if there is another byte to follow. This can Read up to 5 bytes.
-        /// </summary>
-        private uint ReadVarint32()
-        {
-            uint result = 0;
-            int shift = 0;
-            while (true)
-            {
-                byte b = (byte)ReadByte();
-                result |= (uint)(b & 0x7f) << shift;
-                if ((b & 0x80) != 0x80) break;
-                shift += 7;
-            }
-            return result;
-        }
-
-        /// <summary>
-        /// Read an i64 from the wire as a proper varint. The MSB of each byte is set
-        /// if there is another byte to follow. This can Read up to 10 bytes.
-        /// </summary>
-        private ulong ReadVarint64()
-        {
-            int shift = 0;
-            ulong result = 0;
-            while (true)
-            {
-                byte b = (byte)ReadByte();
-                result |= (ulong)(b & 0x7f) << shift;
-                if ((b & 0x80) != 0x80) break;
-                shift += 7;
-            }
-
-            return result;
-        }
-
-        #endregion
-
-        //
-        // encoding helpers
-        //
-
-        /// <summary>
-        /// Convert from zigzag int to int.
-        /// </summary>
-        private int zigzagToInt(uint n)
-        {
-            return (int)(n >> 1) ^ (-(int)(n & 1));
-        }
-
-        /// <summary>
-        /// Convert from zigzag long to long.
-        /// </summary>
-        private long zigzagToLong(ulong n)
-        {
-            return (long)(n >> 1) ^ (-(long)(n & 1));
-        }
-
-        /// <summary>
-        /// Note that it's important that the mask bytes are long literals,
-        /// otherwise they'll default to ints, and when you shift an int left 56 bits,
-        /// you just get a messed up int.
-        /// </summary>
-        private long bytesToLong(byte[] bytes)
-        {
-            return
-              ((bytes[7] & 0xffL) << 56) |
-              ((bytes[6] & 0xffL) << 48) |
-              ((bytes[5] & 0xffL) << 40) |
-              ((bytes[4] & 0xffL) << 32) |
-              ((bytes[3] & 0xffL) << 24) |
-              ((bytes[2] & 0xffL) << 16) |
-              ((bytes[1] & 0xffL) << 8) |
-              ((bytes[0] & 0xffL));
-        }
-
-        //
-        // type testing and converting
-        //
-
-        private Boolean isBoolType(byte b)
-        {
-            int lowerNibble = b & 0x0f;
-            return lowerNibble == Types.BOOLEAN_TRUE || lowerNibble == Types.BOOLEAN_FALSE;
-        }
-
-        /// <summary>
-        /// Given a TCompactProtocol.Types constant, convert it to its corresponding
-        /// TType value.
-        /// </summary>
-        private TType getTType(byte type)
-        {
-            switch ((byte)(type & 0x0f))
-            {
-                case Types.STOP:
-                    return TType.Stop;
-                case Types.BOOLEAN_FALSE:
-                case Types.BOOLEAN_TRUE:
-                    return TType.Bool;
-                case Types.BYTE:
-                    return TType.Byte;
-                case Types.I16:
-                    return TType.I16;
-                case Types.I32:
-                    return TType.I32;
-                case Types.I64:
-                    return TType.I64;
-                case Types.DOUBLE:
-                    return TType.Double;
-                case Types.BINARY:
-                    return TType.String;
-                case Types.LIST:
-                    return TType.List;
-                case Types.SET:
-                    return TType.Set;
-                case Types.MAP:
-                    return TType.Map;
-                case Types.STRUCT:
-                    return TType.Struct;
-                default:
-                    throw new TProtocolException("don't know what type: " + (byte)(type & 0x0f));
-            }
-        }
-
-        /// <summary>
-        /// Given a TType value, find the appropriate TCompactProtocol.Types constant.
-        /// </summary>
-        private byte getCompactType(TType ttype)
-        {
-            return ttypeToCompactType[(int)ttype];
-        }
-    }
-}
diff --git a/lib/csharp/src/Protocol/TField.cs b/lib/csharp/src/Protocol/TField.cs
deleted file mode 100644
index 8179557..0000000
--- a/lib/csharp/src/Protocol/TField.cs
+++ /dev/null
@@ -1,62 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- * Contains some contributions under the Thrift Software License.
- * Please see doc/old-thrift-license.txt in the Thrift distribution for
- * details.
- */
-
-using System;
-using System.Collections.Generic;
-using System.Text;
-
-namespace Thrift.Protocol
-{
-    public struct TField
-    {
-        private string name;
-        private TType type;
-        private short id;
-
-        public TField(string name, TType type, short id)
-            :this()
-        {
-            this.name = name;
-            this.type = type;
-            this.id = id;
-        }
-
-        public string Name
-        {
-            get { return name; }
-            set { name = value; }
-        }
-
-        public TType Type
-        {
-            get { return type; }
-            set { type = value; }
-        }
-
-        public short ID
-        {
-            get { return id; }
-            set { id = value; }
-        }
-    }
-}
diff --git a/lib/csharp/src/Protocol/TJSONProtocol.cs b/lib/csharp/src/Protocol/TJSONProtocol.cs
deleted file mode 100644
index 9dbdea9..0000000
--- a/lib/csharp/src/Protocol/TJSONProtocol.cs
+++ /dev/null
@@ -1,1124 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-using System;
-using System.IO;
-using System.Text;
-using System.Collections.Generic;
-
-using Thrift.Transport;
-using System.Globalization;
-
-namespace Thrift.Protocol
-{
-    /// <summary>
-    /// JSON protocol implementation for thrift.
-    /// <para/>
-    /// This is a full-featured protocol supporting Write and Read.
-    /// <para/>
-    /// Please see the C++ class header for a detailed description of the
-    /// protocol's wire format.
-    /// <para/>
-    /// Adapted from the Java version.
-    /// </summary>
-    public class TJSONProtocol : TProtocol
-    {
-        /// <summary>
-        /// Factory for JSON protocol objects.
-        /// </summary>
-        public class Factory : TProtocolFactory
-        {
-            public TProtocol GetProtocol(TTransport trans)
-            {
-                return new TJSONProtocol(trans);
-            }
-        }
-
-        private static byte[] COMMA = new byte[] { (byte)',' };
-        private static byte[] COLON = new byte[] { (byte)':' };
-        private static byte[] LBRACE = new byte[] { (byte)'{' };
-        private static byte[] RBRACE = new byte[] { (byte)'}' };
-        private static byte[] LBRACKET = new byte[] { (byte)'[' };
-        private static byte[] RBRACKET = new byte[] { (byte)']' };
-        private static byte[] QUOTE = new byte[] { (byte)'"' };
-        private static byte[] BACKSLASH = new byte[] { (byte)'\\' };
-
-        private byte[] ESCSEQ = new byte[] { (byte)'\\', (byte)'u', (byte)'0', (byte)'0' };
-
-        private const long VERSION = 1;
-        private byte[] JSON_CHAR_TABLE = {
-    0,  0,  0,  0,  0,  0,  0,  0,(byte)'b',(byte)'t',(byte)'n',  0,(byte)'f',(byte)'r',  0,  0,
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
-    1,  1,(byte)'"',  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
-  };
-
-        private char[] ESCAPE_CHARS = "\"\\/bfnrt".ToCharArray();
-
-        private byte[] ESCAPE_CHAR_VALS = {
-    (byte)'"', (byte)'\\', (byte)'/', (byte)'\b', (byte)'\f', (byte)'\n', (byte)'\r', (byte)'\t',
-  };
-
-        private const int DEF_STRING_SIZE = 16;
-
-        private static byte[] NAME_BOOL = new byte[] { (byte)'t', (byte)'f' };
-        private static byte[] NAME_BYTE = new byte[] { (byte)'i', (byte)'8' };
-        private static byte[] NAME_I16 = new byte[] { (byte)'i', (byte)'1', (byte)'6' };
-        private static byte[] NAME_I32 = new byte[] { (byte)'i', (byte)'3', (byte)'2' };
-        private static byte[] NAME_I64 = new byte[] { (byte)'i', (byte)'6', (byte)'4' };
-        private static byte[] NAME_DOUBLE = new byte[] { (byte)'d', (byte)'b', (byte)'l' };
-        private static byte[] NAME_STRUCT = new byte[] { (byte)'r', (byte)'e', (byte)'c' };
-        private static byte[] NAME_STRING = new byte[] { (byte)'s', (byte)'t', (byte)'r' };
-        private static byte[] NAME_MAP = new byte[] { (byte)'m', (byte)'a', (byte)'p' };
-        private static byte[] NAME_LIST = new byte[] { (byte)'l', (byte)'s', (byte)'t' };
-        private static byte[] NAME_SET = new byte[] { (byte)'s', (byte)'e', (byte)'t' };
-
-        private static byte[] GetTypeNameForTypeID(TType typeID)
-        {
-            switch (typeID)
-            {
-                case TType.Bool:
-                    return NAME_BOOL;
-                case TType.Byte:
-                    return NAME_BYTE;
-                case TType.I16:
-                    return NAME_I16;
-                case TType.I32:
-                    return NAME_I32;
-                case TType.I64:
-                    return NAME_I64;
-                case TType.Double:
-                    return NAME_DOUBLE;
-                case TType.String:
-                    return NAME_STRING;
-                case TType.Struct:
-                    return NAME_STRUCT;
-                case TType.Map:
-                    return NAME_MAP;
-                case TType.Set:
-                    return NAME_SET;
-                case TType.List:
-                    return NAME_LIST;
-                default:
-                    throw new TProtocolException(TProtocolException.NOT_IMPLEMENTED,
-                                                 "Unrecognized type");
-            }
-        }
-
-        private static TType GetTypeIDForTypeName(byte[] name)
-        {
-            TType result = TType.Stop;
-            if (name.Length > 1)
-            {
-                switch (name[0])
-                {
-                    case (byte)'d':
-                        result = TType.Double;
-                        break;
-                    case (byte)'i':
-                        switch (name[1])
-                        {
-                            case (byte)'8':
-                                result = TType.Byte;
-                                break;
-                            case (byte)'1':
-                                result = TType.I16;
-                                break;
-                            case (byte)'3':
-                                result = TType.I32;
-                                break;
-                            case (byte)'6':
-                                result = TType.I64;
-                                break;
-                        }
-                        break;
-                    case (byte)'l':
-                        result = TType.List;
-                        break;
-                    case (byte)'m':
-                        result = TType.Map;
-                        break;
-                    case (byte)'r':
-                        result = TType.Struct;
-                        break;
-                    case (byte)'s':
-                        if (name[1] == (byte)'t')
-                        {
-                            result = TType.String;
-                        }
-                        else if (name[1] == (byte)'e')
-                        {
-                            result = TType.Set;
-                        }
-                        break;
-                    case (byte)'t':
-                        result = TType.Bool;
-                        break;
-                }
-            }
-            if (result == TType.Stop)
-            {
-                throw new TProtocolException(TProtocolException.NOT_IMPLEMENTED,
-                                             "Unrecognized type");
-            }
-            return result;
-        }
-
-        /// <summary>
-        /// Base class for tracking JSON contexts that may require
-        /// inserting/Reading additional JSON syntax characters
-        /// This base context does nothing.
-        /// </summary>
-        protected class JSONBaseContext
-        {
-            protected TJSONProtocol proto;
-
-            public JSONBaseContext(TJSONProtocol proto)
-            {
-                this.proto = proto;
-            }
-
-            public virtual void Write() { }
-
-            public virtual void Read() { }
-
-            public virtual bool EscapeNumbers() { return false; }
-        }
-
-        /// <summary>
-        /// Context for JSON lists. Will insert/Read commas before each item except
-        /// for the first one
-        /// </summary>
-        protected class JSONListContext : JSONBaseContext
-        {
-            public JSONListContext(TJSONProtocol protocol)
-                : base(protocol)
-            {
-
-            }
-
-            private bool first = true;
-
-            public override void Write()
-            {
-                if (first)
-                {
-                    first = false;
-                }
-                else
-                {
-                    proto.trans.Write(COMMA);
-                }
-            }
-
-            public override void Read()
-            {
-                if (first)
-                {
-                    first = false;
-                }
-                else
-                {
-                    proto.ReadJSONSyntaxChar(COMMA);
-                }
-            }
-        }
-
-        /// <summary>
-        /// Context for JSON records. Will insert/Read colons before the value portion
-        /// of each record pair, and commas before each key except the first. In
-        /// addition, will indicate that numbers in the key position need to be
-        /// escaped in quotes (since JSON keys must be strings).
-        /// </summary>
-        protected class JSONPairContext : JSONBaseContext
-        {
-            public JSONPairContext(TJSONProtocol proto)
-                : base(proto)
-            {
-
-            }
-
-            private bool first = true;
-            private bool colon = true;
-
-            public override void Write()
-            {
-                if (first)
-                {
-                    first = false;
-                    colon = true;
-                }
-                else
-                {
-                    proto.trans.Write(colon ? COLON : COMMA);
-                    colon = !colon;
-                }
-            }
-
-            public override void Read()
-            {
-                if (first)
-                {
-                    first = false;
-                    colon = true;
-                }
-                else
-                {
-                    proto.ReadJSONSyntaxChar(colon ? COLON : COMMA);
-                    colon = !colon;
-                }
-            }
-
-            public override bool EscapeNumbers()
-            {
-                return colon;
-            }
-        }
-
-        /// <summary>
-        /// Holds up to one byte from the transport
-        /// </summary>
-        protected class LookaheadReader
-        {
-            protected TJSONProtocol proto;
-
-            public LookaheadReader(TJSONProtocol proto)
-            {
-                this.proto = proto;
-            }
-
-            private bool hasData;
-            private byte[] data = new byte[1];
-
-            /// <summary>
-            /// Return and consume the next byte to be Read, either taking it from the
-            /// data buffer if present or getting it from the transport otherwise.
-            /// </summary>
-            public byte Read()
-            {
-                if (hasData)
-                {
-                    hasData = false;
-                }
-                else
-                {
-                    proto.trans.ReadAll(data, 0, 1);
-                }
-                return data[0];
-            }
-
-            /// <summary>
-            /// Return the next byte to be Read without consuming, filling the data
-            /// buffer if it has not been filled alReady.
-            /// </summary>
-            public byte Peek()
-            {
-                if (!hasData)
-                {
-                    proto.trans.ReadAll(data, 0, 1);
-                }
-                hasData = true;
-                return data[0];
-            }
-        }
-
-        // Default encoding
-        protected Encoding utf8Encoding = UTF8Encoding.UTF8;
-
-        // Stack of nested contexts that we may be in
-        protected Stack<JSONBaseContext> contextStack = new Stack<JSONBaseContext>();
-
-        // Current context that we are in
-        protected JSONBaseContext context;
-
-        // Reader that manages a 1-byte buffer
-        protected LookaheadReader reader;
-
-        /// <summary>
-        /// Push a new JSON context onto the stack.
-        /// </summary>
-        protected void PushContext(JSONBaseContext c)
-        {
-            contextStack.Push(context);
-            context = c;
-        }
-
-        /// <summary>
-        /// Pop the last JSON context off the stack
-        /// </summary>
-        protected void PopContext()
-        {
-            context = contextStack.Pop();
-        }
-
-        /// <summary>
-        /// TJSONProtocol Constructor
-        /// </summary>
-        public TJSONProtocol(TTransport trans)
-            : base(trans)
-        {
-            context = new JSONBaseContext(this);
-            reader = new LookaheadReader(this);
-        }
-
-        // Temporary buffer used by several methods
-        private byte[] tempBuffer = new byte[4];
-
-        /// <summary>
-        /// Read a byte that must match b[0]; otherwise an exception is thrown.
-        /// Marked protected to avoid synthetic accessor in JSONListContext.Read
-        /// and JSONPairContext.Read
-        /// </summary>
-        protected void ReadJSONSyntaxChar(byte[] b)
-        {
-            byte ch = reader.Read();
-            if (ch != b[0])
-            {
-                throw new TProtocolException(TProtocolException.INVALID_DATA,
-                                             "Unexpected character:" + (char)ch);
-            }
-        }
-
-        /// <summary>
-        /// Convert a byte containing a hex char ('0'-'9' or 'a'-'f') into its
-        /// corresponding hex value
-        /// </summary>
-        private static byte HexVal(byte ch)
-        {
-            if ((ch >= '0') && (ch <= '9'))
-            {
-                return (byte)((char)ch - '0');
-            }
-            else if ((ch >= 'a') && (ch <= 'f'))
-            {
-                ch += 10;
-                return (byte)((char)ch - 'a');
-            }
-            else
-            {
-                throw new TProtocolException(TProtocolException.INVALID_DATA,
-                                             "Expected hex character");
-            }
-        }
-
-        /// <summary>
-        /// Convert a byte containing a hex value to its corresponding hex character
-        /// </summary>
-        private static byte HexChar(byte val)
-        {
-            val &= 0x0F;
-            if (val < 10)
-            {
-                return (byte)((char)val + '0');
-            }
-            else
-            {
-                val -= 10;
-                return (byte)((char)val + 'a');
-            }
-        }
-
-        /// <summary>
-        /// Write the bytes in array buf as a JSON characters, escaping as needed
-        /// </summary>
-        private void WriteJSONString(byte[] b)
-        {
-            context.Write();
-            trans.Write(QUOTE);
-            int len = b.Length;
-            for (int i = 0; i < len; i++)
-            {
-                if ((b[i] & 0x00FF) >= 0x30)
-                {
-                    if (b[i] == BACKSLASH[0])
-                    {
-                        trans.Write(BACKSLASH);
-                        trans.Write(BACKSLASH);
-                    }
-                    else
-                    {
-                        trans.Write(b, i, 1);
-                    }
-                }
-                else
-                {
-                    tempBuffer[0] = JSON_CHAR_TABLE[b[i]];
-                    if (tempBuffer[0] == 1)
-                    {
-                        trans.Write(b, i, 1);
-                    }
-                    else if (tempBuffer[0] > 1)
-                    {
-                        trans.Write(BACKSLASH);
-                        trans.Write(tempBuffer, 0, 1);
-                    }
-                    else
-                    {
-                        trans.Write(ESCSEQ);
-                        tempBuffer[0] = HexChar((byte)(b[i] >> 4));
-                        tempBuffer[1] = HexChar(b[i]);
-                        trans.Write(tempBuffer, 0, 2);
-                    }
-                }
-            }
-            trans.Write(QUOTE);
-        }
-
-        /// <summary>
-        /// Write out number as a JSON value. If the context dictates so, it will be
-        /// wrapped in quotes to output as a JSON string.
-        /// </summary>
-        private void WriteJSONInteger(long num)
-        {
-            context.Write();
-            string str = num.ToString();
-
-            bool escapeNum = context.EscapeNumbers();
-            if (escapeNum)
-                trans.Write(QUOTE);
-
-            trans.Write(utf8Encoding.GetBytes(str));
-
-            if (escapeNum)
-                trans.Write(QUOTE);
-        }
-
-        /// <summary>
-        /// Write out a double as a JSON value. If it is NaN or infinity or if the
-        /// context dictates escaping, Write out as JSON string.
-        /// </summary>
-        private void WriteJSONDouble(double num)
-        {
-            context.Write();
-            string str = num.ToString("G17", CultureInfo.InvariantCulture);
-            bool special = false;
-
-            switch (str[0])
-            {
-                case 'N': // NaN
-                case 'I': // Infinity
-                    special = true;
-                    break;
-                case '-':
-                    if (str[1] == 'I')
-                    { // -Infinity
-                        special = true;
-                    }
-                    break;
-            }
-
-            bool escapeNum = special || context.EscapeNumbers();
-
-            if (escapeNum)
-                trans.Write(QUOTE);
-
-            trans.Write(utf8Encoding.GetBytes(str));
-
-            if (escapeNum)
-                trans.Write(QUOTE);
-        }
-        /// <summary>
-        /// Write out contents of byte array b as a JSON string with base-64 encoded
-        /// data
-        /// </summary>
-        private void WriteJSONBase64(byte[] b)
-        {
-            context.Write();
-            trans.Write(QUOTE);
-
-            int len = b.Length;
-            int off = 0;
-
-            while (len >= 3)
-            {
-                // Encode 3 bytes at a time
-                TBase64Utils.encode(b, off, 3, tempBuffer, 0);
-                trans.Write(tempBuffer, 0, 4);
-                off += 3;
-                len -= 3;
-            }
-            if (len > 0)
-            {
-                // Encode remainder
-                TBase64Utils.encode(b, off, len, tempBuffer, 0);
-                trans.Write(tempBuffer, 0, len + 1);
-            }
-
-            trans.Write(QUOTE);
-        }
-
-        private void WriteJSONObjectStart()
-        {
-            context.Write();
-            trans.Write(LBRACE);
-            PushContext(new JSONPairContext(this));
-        }
-
-        private void WriteJSONObjectEnd()
-        {
-            PopContext();
-            trans.Write(RBRACE);
-        }
-
-        private void WriteJSONArrayStart()
-        {
-            context.Write();
-            trans.Write(LBRACKET);
-            PushContext(new JSONListContext(this));
-        }
-
-        private void WriteJSONArrayEnd()
-        {
-            PopContext();
-            trans.Write(RBRACKET);
-        }
-
-        public override void WriteMessageBegin(TMessage message)
-        {
-            WriteJSONArrayStart();
-            WriteJSONInteger(VERSION);
-
-            byte[] b = utf8Encoding.GetBytes(message.Name);
-            WriteJSONString(b);
-
-            WriteJSONInteger((long)message.Type);
-            WriteJSONInteger(message.SeqID);
-        }
-
-        public override void WriteMessageEnd()
-        {
-            WriteJSONArrayEnd();
-        }
-
-        public override void WriteStructBegin(TStruct str)
-        {
-            WriteJSONObjectStart();
-        }
-
-        public override void WriteStructEnd()
-        {
-            WriteJSONObjectEnd();
-        }
-
-        public override void WriteFieldBegin(TField field)
-        {
-            WriteJSONInteger(field.ID);
-            WriteJSONObjectStart();
-            WriteJSONString(GetTypeNameForTypeID(field.Type));
-        }
-
-        public override void WriteFieldEnd()
-        {
-            WriteJSONObjectEnd();
-        }
-
-        public override void WriteFieldStop() { }
-
-        public override void WriteMapBegin(TMap map)
-        {
-            WriteJSONArrayStart();
-            WriteJSONString(GetTypeNameForTypeID(map.KeyType));
-            WriteJSONString(GetTypeNameForTypeID(map.ValueType));
-            WriteJSONInteger(map.Count);
-            WriteJSONObjectStart();
-        }
-
-        public override void WriteMapEnd()
-        {
-            WriteJSONObjectEnd();
-            WriteJSONArrayEnd();
-        }
-
-        public override void WriteListBegin(TList list)
-        {
-            WriteJSONArrayStart();
-            WriteJSONString(GetTypeNameForTypeID(list.ElementType));
-            WriteJSONInteger(list.Count);
-        }
-
-        public override void WriteListEnd()
-        {
-            WriteJSONArrayEnd();
-        }
-
-        public override void WriteSetBegin(TSet set)
-        {
-            WriteJSONArrayStart();
-            WriteJSONString(GetTypeNameForTypeID(set.ElementType));
-            WriteJSONInteger(set.Count);
-        }
-
-        public override void WriteSetEnd()
-        {
-            WriteJSONArrayEnd();
-        }
-
-        public override void WriteBool(bool b)
-        {
-            WriteJSONInteger(b ? (long)1 : (long)0);
-        }
-
-        public override void WriteByte(sbyte b)
-        {
-            WriteJSONInteger((long)b);
-        }
-
-        public override void WriteI16(short i16)
-        {
-            WriteJSONInteger((long)i16);
-        }
-
-        public override void WriteI32(int i32)
-        {
-            WriteJSONInteger((long)i32);
-        }
-
-        public override void WriteI64(long i64)
-        {
-            WriteJSONInteger(i64);
-        }
-
-        public override void WriteDouble(double dub)
-        {
-            WriteJSONDouble(dub);
-        }
-
-        public override void WriteString(string str)
-        {
-            byte[] b = utf8Encoding.GetBytes(str);
-            WriteJSONString(b);
-        }
-
-        public override void WriteBinary(byte[] bin)
-        {
-            WriteJSONBase64(bin);
-        }
-
-        /**
-         * Reading methods.
-         */
-
-        /// <summary>
-        /// Read in a JSON string, unescaping as appropriate.. Skip Reading from the
-        /// context if skipContext is true.
-        /// </summary>
-        private byte[] ReadJSONString(bool skipContext)
-        {
-            MemoryStream buffer = new MemoryStream();
-            List<char> codeunits = new List<char>();
-
-
-            if (!skipContext)
-            {
-                context.Read();
-            }
-            ReadJSONSyntaxChar(QUOTE);
-            while (true)
-            {
-                byte ch = reader.Read();
-                if (ch == QUOTE[0])
-                {
-                    break;
-                }
-
-                // escaped?
-                if (ch != ESCSEQ[0])
-                {
-                    buffer.Write(new byte[] { (byte)ch }, 0, 1);
-                    continue;
-                }
-
-                // distinguish between \uXXXX and \?
-                ch = reader.Read();
-                if (ch != ESCSEQ[1])  // control chars like \n
-                {
-                    int off = Array.IndexOf(ESCAPE_CHARS, (char)ch);
-                    if (off == -1)
-                    {
-                        throw new TProtocolException(TProtocolException.INVALID_DATA,
-                                                        "Expected control char");
-                    }
-                    ch = ESCAPE_CHAR_VALS[off];
-                    buffer.Write(new byte[] { (byte)ch }, 0, 1);
-                    continue;
-                }
-
-
-                // it's \uXXXX
-                trans.ReadAll(tempBuffer, 0, 4);
-                var wch = (short)((HexVal((byte)tempBuffer[0]) << 12) +
-                                  (HexVal((byte)tempBuffer[1]) << 8) +
-                                  (HexVal((byte)tempBuffer[2]) << 4) +
-                                   HexVal(tempBuffer[3]));
-                if (Char.IsHighSurrogate((char)wch))
-                {
-                    if (codeunits.Count > 0)
-                    {
-                        throw new TProtocolException(TProtocolException.INVALID_DATA,
-                                                        "Expected low surrogate char");
-                    }
-                    codeunits.Add((char)wch);
-                }
-                else if (Char.IsLowSurrogate((char)wch))
-                {
-                    if (codeunits.Count == 0)
-                    {
-                        throw new TProtocolException(TProtocolException.INVALID_DATA,
-                                                        "Expected high surrogate char");
-                    }
-                    codeunits.Add((char)wch);
-                    var tmp = utf8Encoding.GetBytes(codeunits.ToArray());
-                    buffer.Write(tmp, 0, tmp.Length);
-                    codeunits.Clear();
-                }
-                else
-                {
-                    var tmp = utf8Encoding.GetBytes(new char[] { (char)wch });
-                    buffer.Write(tmp, 0, tmp.Length);
-                }
-            }
-
-
-            if (codeunits.Count > 0)
-            {
-                throw new TProtocolException(TProtocolException.INVALID_DATA,
-                                                "Expected low surrogate char");
-            }
-
-            return buffer.ToArray();
-        }
-
-        /// <summary>
-        /// Return true if the given byte could be a valid part of a JSON number.
-        /// </summary>
-        private bool IsJSONNumeric(byte b)
-        {
-            switch (b)
-            {
-                case (byte)'+':
-                case (byte)'-':
-                case (byte)'.':
-                case (byte)'0':
-                case (byte)'1':
-                case (byte)'2':
-                case (byte)'3':
-                case (byte)'4':
-                case (byte)'5':
-                case (byte)'6':
-                case (byte)'7':
-                case (byte)'8':
-                case (byte)'9':
-                case (byte)'E':
-                case (byte)'e':
-                    return true;
-            }
-            return false;
-        }
-
-        /// <summary>
-        /// Read in a sequence of characters that are all valid in JSON numbers. Does
-        /// not do a complete regex check to validate that this is actually a number.
-        /// </summary>
-        private string ReadJSONNumericChars()
-        {
-            StringBuilder strbld = new StringBuilder();
-            while (true)
-            {
-                byte ch = reader.Peek();
-                if (!IsJSONNumeric(ch))
-                {
-                    break;
-                }
-                strbld.Append((char)reader.Read());
-            }
-            return strbld.ToString();
-        }
-
-        /// <summary>
-        /// Read in a JSON number. If the context dictates, Read in enclosing quotes.
-        /// </summary>
-        private long ReadJSONInteger()
-        {
-            context.Read();
-            if (context.EscapeNumbers())
-            {
-                ReadJSONSyntaxChar(QUOTE);
-            }
-
-            string str = ReadJSONNumericChars();
-            if (context.EscapeNumbers())
-            {
-                ReadJSONSyntaxChar(QUOTE);
-            }
-
-            try
-            {
-                return Int64.Parse(str);
-            }
-            catch (FormatException fex)
-            {
-                throw new TProtocolException(TProtocolException.INVALID_DATA,
-                                             "Bad data encounted in numeric data", fex);
-            }
-        }
-
-        /// <summary>
-        /// Read in a JSON double value. Throw if the value is not wrapped in quotes
-        /// when expected or if wrapped in quotes when not expected.
-        /// </summary>
-        private double ReadJSONDouble()
-        {
-            context.Read();
-            if (reader.Peek() == QUOTE[0])
-            {
-                byte[] arr = ReadJSONString(true);
-                double dub = Double.Parse(utf8Encoding.GetString(arr, 0, arr.Length), CultureInfo.InvariantCulture);
-
-                if (!context.EscapeNumbers() && !Double.IsNaN(dub) && !Double.IsInfinity(dub))
-                {
-                    // Throw exception -- we should not be in a string in this case
-                    throw new TProtocolException(TProtocolException.INVALID_DATA,
-                                                 "Numeric data unexpectedly quoted");
-                }
-                return dub;
-            }
-            else
-            {
-                if (context.EscapeNumbers())
-                {
-                    // This will throw - we should have had a quote if escapeNum == true
-                    ReadJSONSyntaxChar(QUOTE);
-                }
-                try
-                {
-                    return Double.Parse(ReadJSONNumericChars(), CultureInfo.InvariantCulture);
-                }
-                catch (FormatException fex)
-                {
-                    throw new TProtocolException(TProtocolException.INVALID_DATA,
-                                                 "Bad data encounted in numeric data", fex);
-                }
-            }
-        }
-
-        /// <summary>
-        /// Read in a JSON string containing base-64 encoded data and decode it.
-        /// </summary>
-        private byte[] ReadJSONBase64()
-        {
-            byte[] b = ReadJSONString(false);
-            int len = b.Length;
-            int off = 0;
-            int size = 0;
-            // reduce len to ignore fill bytes
-            while ((len > 0) && (b[len - 1] == '='))
-            {
-                --len;
-            }
-            // read & decode full byte triplets = 4 source bytes
-            while (len > 4)
-            {
-                // Decode 4 bytes at a time
-                TBase64Utils.decode(b, off, 4, b, size); // NB: decoded in place
-                off += 4;
-                len -= 4;
-                size += 3;
-            }
-            // Don't decode if we hit the end or got a single leftover byte (invalid
-            // base64 but legal for skip of regular string type)
-            if (len > 1)
-            {
-                // Decode remainder
-                TBase64Utils.decode(b, off, len, b, size); // NB: decoded in place
-                size += len - 1;
-            }
-            // Sadly we must copy the byte[] (any way around this?)
-            byte[] result = new byte[size];
-            Array.Copy(b, 0, result, 0, size);
-            return result;
-        }
-
-        private void ReadJSONObjectStart()
-        {
-            context.Read();
-            ReadJSONSyntaxChar(LBRACE);
-            PushContext(new JSONPairContext(this));
-        }
-
-        private void ReadJSONObjectEnd()
-        {
-            ReadJSONSyntaxChar(RBRACE);
-            PopContext();
-        }
-
-        private void ReadJSONArrayStart()
-        {
-            context.Read();
-            ReadJSONSyntaxChar(LBRACKET);
-            PushContext(new JSONListContext(this));
-        }
-
-        private void ReadJSONArrayEnd()
-        {
-            ReadJSONSyntaxChar(RBRACKET);
-            PopContext();
-        }
-
-        public override TMessage ReadMessageBegin()
-        {
-            TMessage message = new TMessage();
-            ReadJSONArrayStart();
-            if (ReadJSONInteger() != VERSION)
-            {
-                throw new TProtocolException(TProtocolException.BAD_VERSION,
-                                             "Message contained bad version.");
-            }
-
-            var buf = ReadJSONString(false);
-            message.Name = utf8Encoding.GetString(buf, 0, buf.Length);
-            message.Type = (TMessageType)ReadJSONInteger();
-            message.SeqID = (int)ReadJSONInteger();
-            return message;
-        }
-
-        public override void ReadMessageEnd()
-        {
-            ReadJSONArrayEnd();
-        }
-
-        public override TStruct ReadStructBegin()
-        {
-            ReadJSONObjectStart();
-            return new TStruct();
-        }
-
-        public override void ReadStructEnd()
-        {
-            ReadJSONObjectEnd();
-        }
-
-        public override TField ReadFieldBegin()
-        {
-            TField field = new TField();
-            byte ch = reader.Peek();
-            if (ch == RBRACE[0])
-            {
-                field.Type = TType.Stop;
-            }
-            else
-            {
-                field.ID = (short)ReadJSONInteger();
-                ReadJSONObjectStart();
-                field.Type = GetTypeIDForTypeName(ReadJSONString(false));
-            }
-            return field;
-        }
-
-        public override void ReadFieldEnd()
-        {
-            ReadJSONObjectEnd();
-        }
-
-        public override TMap ReadMapBegin()
-        {
-            TMap map = new TMap();
-            ReadJSONArrayStart();
-            map.KeyType = GetTypeIDForTypeName(ReadJSONString(false));
-            map.ValueType = GetTypeIDForTypeName(ReadJSONString(false));
-            map.Count = (int)ReadJSONInteger();
-            ReadJSONObjectStart();
-            return map;
-        }
-
-        public override void ReadMapEnd()
-        {
-            ReadJSONObjectEnd();
-            ReadJSONArrayEnd();
-        }
-
-        public override TList ReadListBegin()
-        {
-            TList list = new TList();
-            ReadJSONArrayStart();
-            list.ElementType = GetTypeIDForTypeName(ReadJSONString(false));
-            list.Count = (int)ReadJSONInteger();
-            return list;
-        }
-
-        public override void ReadListEnd()
-        {
-            ReadJSONArrayEnd();
-        }
-
-        public override TSet ReadSetBegin()
-        {
-            TSet set = new TSet();
-            ReadJSONArrayStart();
-            set.ElementType = GetTypeIDForTypeName(ReadJSONString(false));
-            set.Count = (int)ReadJSONInteger();
-            return set;
-        }
-
-        public override void ReadSetEnd()
-        {
-            ReadJSONArrayEnd();
-        }
-
-        public override bool ReadBool()
-        {
-            return (ReadJSONInteger() == 0 ? false : true);
-        }
-
-        public override sbyte ReadByte()
-        {
-            return (sbyte)ReadJSONInteger();
-        }
-
-        public override short ReadI16()
-        {
-            return (short)ReadJSONInteger();
-        }
-
-        public override int ReadI32()
-        {
-            return (int)ReadJSONInteger();
-        }
-
-        public override long ReadI64()
-        {
-            return (long)ReadJSONInteger();
-        }
-
-        public override double ReadDouble()
-        {
-            return ReadJSONDouble();
-        }
-
-        public override string ReadString()
-        {
-            var buf = ReadJSONString(false);
-            return utf8Encoding.GetString(buf, 0, buf.Length);
-        }
-
-        public override byte[] ReadBinary()
-        {
-            return ReadJSONBase64();
-        }
-
-    }
-}
diff --git a/lib/csharp/src/Protocol/TList.cs b/lib/csharp/src/Protocol/TList.cs
deleted file mode 100644
index 0c8f214..0000000
--- a/lib/csharp/src/Protocol/TList.cs
+++ /dev/null
@@ -1,54 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- * Contains some contributions under the Thrift Software License.
- * Please see doc/old-thrift-license.txt in the Thrift distribution for
- * details.
- */
-
-using System;
-using System.Collections.Generic;
-using System.Text;
-
-namespace Thrift.Protocol
-{
-    public struct TList
-    {
-        private TType elementType;
-        private int count;
-
-        public TList(TType elementType, int count)
-            :this()
-        {
-            this.elementType = elementType;
-            this.count = count;
-        }
-
-        public TType ElementType
-        {
-            get { return elementType; }
-            set { elementType = value; }
-        }
-
-        public int Count
-        {
-            get { return count; }
-            set { count = value; }
-        }
-    }
-}
diff --git a/lib/csharp/src/Protocol/TMap.cs b/lib/csharp/src/Protocol/TMap.cs
deleted file mode 100644
index aba9d3a..0000000
--- a/lib/csharp/src/Protocol/TMap.cs
+++ /dev/null
@@ -1,62 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- * Contains some contributions under the Thrift Software License.
- * Please see doc/old-thrift-license.txt in the Thrift distribution for
- * details.
- */
-
-using System;
-using System.Collections.Generic;
-using System.Text;
-
-namespace Thrift.Protocol
-{
-    public struct TMap
-    {
-        private TType keyType;
-        private TType valueType;
-        private int count;
-
-        public TMap(TType keyType, TType valueType, int count)
-            :this()
-        {
-            this.keyType = keyType;
-            this.valueType = valueType;
-            this.count = count;
-        }
-
-        public TType KeyType
-        {
-            get { return keyType; }
-            set { keyType = value; }
-        }
-
-        public TType ValueType
-        {
-            get { return valueType; }
-            set { valueType = value; }
-        }
-
-        public int Count
-        {
-            get { return count; }
-            set { count = value; }
-        }
-    }
-}
diff --git a/lib/csharp/src/Protocol/TMessage.cs b/lib/csharp/src/Protocol/TMessage.cs
deleted file mode 100644
index 348263c..0000000
--- a/lib/csharp/src/Protocol/TMessage.cs
+++ /dev/null
@@ -1,62 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- * Contains some contributions under the Thrift Software License.
- * Please see doc/old-thrift-license.txt in the Thrift distribution for
- * details.
- */
-
-using System;
-using System.Collections.Generic;
-using System.Text;
-
-namespace Thrift.Protocol
-{
-    public struct TMessage
-    {
-        private string name;
-        private TMessageType type;
-        private int seqID;
-
-        public TMessage(string name, TMessageType type, int seqid)
-            :this()
-        {
-            this.name = name;
-            this.type = type;
-            this.seqID = seqid;
-        }
-
-        public string Name
-        {
-            get { return name; }
-            set { name = value; }
-        }
-
-        public TMessageType Type
-        {
-            get { return type; }
-            set { type = value; }
-        }
-
-        public int SeqID
-        {
-            get { return seqID; }
-            set { seqID = value; }
-        }
-    }
-}
diff --git a/lib/csharp/src/Protocol/TMessageType.cs b/lib/csharp/src/Protocol/TMessageType.cs
deleted file mode 100644
index c7091fe..0000000
--- a/lib/csharp/src/Protocol/TMessageType.cs
+++ /dev/null
@@ -1,31 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-using System;
-
-namespace Thrift.Protocol
-{
-    public enum TMessageType
-    {
-        Call = 1,
-        Reply = 2,
-        Exception = 3,
-        Oneway = 4
-    }
-}
diff --git a/lib/csharp/src/Protocol/TMultiplexedProcessor.cs b/lib/csharp/src/Protocol/TMultiplexedProcessor.cs
deleted file mode 100644
index aa91c52..0000000
--- a/lib/csharp/src/Protocol/TMultiplexedProcessor.cs
+++ /dev/null
@@ -1,183 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- * Contains some contributions under the Thrift Software License.
- * Please see doc/old-thrift-license.txt in the Thrift distribution for
- * details.
- */
-
-using System;
-using System.Text;
-using Thrift.Transport;
-using System.Collections.Generic;
-using System.IO;
-
-namespace Thrift.Protocol
-{
-    /// <summary>
-    /// <see cref="TMultiplexedProcessor"/> is a <see cref="TProcessor"/> allowing a single <see cref="Thrift.Server.TServer"/>
-    /// to provide multiple services.
-    /// <para/>
-    /// To do so, you instantiate the processor and then register additional processors with it,
-    /// as shown in the following example:
-    /// <para/>
-    /// <code>
-    ///     TMultiplexedProcessor processor = new TMultiplexedProcessor();
-    ///
-    ///     processor.registerProcessor(
-    ///         "Calculator",
-    ///         new Calculator.Processor(new CalculatorHandler()));
-    ///
-    ///     processor.registerProcessor(
-    ///         "WeatherReport",
-    ///         new WeatherReport.Processor(new WeatherReportHandler()));
-    ///
-    ///     TServerTransport t = new TServerSocket(9090);
-    ///     TSimpleServer server = new TSimpleServer(processor, t);
-    ///
-    ///     server.serve();
-    /// </code>
-    /// </summary>
-    public class TMultiplexedProcessor : TProcessor
-    {
-        private Dictionary<string, TProcessor> ServiceProcessorMap = new Dictionary<string, TProcessor>();
-
-        /// <summary>
-        /// 'Register' a service with this TMultiplexedProcessor. This allows us to broker
-        /// requests to individual services by using the service name to select them at request time.
-        ///
-        /// Args:
-        /// - serviceName    Name of a service, has to be identical to the name
-        ///                  declared in the Thrift IDL, e.g. "WeatherReport".
-        /// - processor      Implementation of a service, usually referred to as "handlers",
-        ///                  e.g. WeatherReportHandler implementing WeatherReport.Iface.
-        /// </summary>
-        public void RegisterProcessor(string serviceName, TProcessor processor)
-        {
-            ServiceProcessorMap.Add(serviceName, processor);
-        }
-
-
-        private void Fail(TProtocol oprot, TMessage message, TApplicationException.ExceptionType extype, string etxt)
-        {
-            TApplicationException appex = new TApplicationException(extype, etxt);
-
-            TMessage newMessage = new TMessage(message.Name, TMessageType.Exception, message.SeqID);
-
-            oprot.WriteMessageBegin(newMessage);
-            appex.Write(oprot);
-            oprot.WriteMessageEnd();
-            oprot.Transport.Flush();
-        }
-
-
-        /// <summary>
-        /// This implementation of process performs the following steps:
-        ///
-        /// - Read the beginning of the message.
-        /// - Extract the service name from the message.
-        /// - Using the service name to locate the appropriate processor.
-        /// - Dispatch to the processor, with a decorated instance of TProtocol
-        ///    that allows readMessageBegin() to return the original TMessage.
-        /// <para/>
-        /// Throws an exception if
-        /// - the message type is not CALL or ONEWAY,
-        /// - the service name was not found in the message, or
-        /// - the service name has not been RegisterProcessor()ed.
-        /// </summary>
-        public bool Process(TProtocol iprot, TProtocol oprot)
-        {
-            /*  Use the actual underlying protocol (e.g. TBinaryProtocol) to read the
-                message header.  This pulls the message "off the wire", which we'll
-                deal with at the end of this method. */
-
-            try
-            {
-                TMessage message = iprot.ReadMessageBegin();
-
-                if ((message.Type != TMessageType.Call) && (message.Type != TMessageType.Oneway))
-                {
-                    Fail(oprot, message,
-                          TApplicationException.ExceptionType.InvalidMessageType,
-                          "Message type CALL or ONEWAY expected");
-                    return false;
-                }
-
-                // Extract the service name
-                int index = message.Name.IndexOf(TMultiplexedProtocol.SEPARATOR);
-                if (index < 0)
-                {
-                    Fail(oprot, message,
-                          TApplicationException.ExceptionType.InvalidProtocol,
-                          "Service name not found in message name: " + message.Name + ". " +
-                          "Did you forget to use a TMultiplexProtocol in your client?");
-                    return false;
-                }
-
-                // Create a new TMessage, something that can be consumed by any TProtocol
-                string serviceName = message.Name.Substring(0, index);
-                TProcessor actualProcessor;
-                if (!ServiceProcessorMap.TryGetValue(serviceName, out actualProcessor))
-                {
-                    Fail(oprot, message,
-                          TApplicationException.ExceptionType.InternalError,
-                          "Service name not found: " + serviceName + ". " +
-                          "Did you forget to call RegisterProcessor()?");
-                    return false;
-                }
-
-                // Create a new TMessage, removing the service name
-                TMessage newMessage = new TMessage(
-                        message.Name.Substring(serviceName.Length + TMultiplexedProtocol.SEPARATOR.Length),
-                        message.Type,
-                        message.SeqID);
-
-                // Dispatch processing to the stored processor
-                return actualProcessor.Process(new StoredMessageProtocol(iprot, newMessage), oprot);
-
-            }
-            catch (IOException)
-            {
-                return false;  // similar to all other processors
-            }
-
-        }
-
-        /// <summary>
-        ///  Our goal was to work with any protocol.  In order to do that, we needed
-        ///  to allow them to call readMessageBegin() and get a TMessage in exactly
-        ///  the standard format, without the service name prepended to TMessage.name.
-        /// </summary>
-        private class StoredMessageProtocol : TProtocolDecorator
-        {
-            TMessage MsgBegin;
-
-            public StoredMessageProtocol(TProtocol protocol, TMessage messageBegin)
-                : base(protocol)
-            {
-                this.MsgBegin = messageBegin;
-            }
-
-            public override TMessage ReadMessageBegin()
-            {
-                return MsgBegin;
-            }
-        }
-
-    }
-}
diff --git a/lib/csharp/src/Protocol/TMultiplexedProtocol.cs b/lib/csharp/src/Protocol/TMultiplexedProtocol.cs
deleted file mode 100644
index 1bd420f..0000000
--- a/lib/csharp/src/Protocol/TMultiplexedProtocol.cs
+++ /dev/null
@@ -1,103 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- * Contains some contributions under the Thrift Software License.
- * Please see doc/old-thrift-license.txt in the Thrift distribution for
- * details.
- */
-
-using System;
-using System.Text;
-using Thrift.Transport;
-using System.Collections.Generic;
-
-namespace Thrift.Protocol
-{
-
-    /// <summary>
-    /// TMultiplexedProtocol is a protocol-independent concrete decorator that allows a Thrift
-    /// client to communicate with a multiplexing Thrift server, by prepending the service name
-    /// to the function name during function calls.
-    /// <para/>
-    /// NOTE: THIS IS NOT TO BE USED BY SERVERS.
-    /// On the server, use TMultiplexedProcessor to handle requests from a multiplexing client.
-    /// <para/>
-    /// This example uses a single socket transport to invoke two services:
-    /// <code>
-    ///     TSocket transport = new TSocket("localhost", 9090);
-    ///     transport.open();
-    ///
-    ///     TBinaryProtocol protocol = new TBinaryProtocol(transport);
-    ///
-    ///     TMultiplexedProtocol mp = new TMultiplexedProtocol(protocol, "Calculator");
-    ///     Calculator.Client service = new Calculator.Client(mp);
-    ///
-    ///     TMultiplexedProtocol mp2 = new TMultiplexedProtocol(protocol, "WeatherReport");
-    ///     WeatherReport.Client service2 = new WeatherReport.Client(mp2);
-    ///
-    ///     System.out.println(service.add(2,2));
-    ///     System.out.println(service2.getTemperature());
-    /// </code>
-    /// </summary>
-    public class TMultiplexedProtocol : TProtocolDecorator
-    {
-
-        /// <summary>
-        /// Used to delimit the service name from the function name.
-        /// </summary>
-        public static string SEPARATOR = ":";
-
-        private string ServiceName;
-
-        /// <summary>
-        /// Wrap the specified protocol, allowing it to be used to communicate with a
-        /// multiplexing server.  The <paramref name="serviceName"/> is required as it is
-        /// prepended to the message header so that the multiplexing server can broker
-        /// the function call to the proper service.
-        /// </summary>
-        /// <param name="protocol">Your communication protocol of choice, e.g. <see cref="TBinaryProtocol"/>.</param>
-        /// <param name="serviceName">The service name of the service communicating via this protocol.</param>
-        public TMultiplexedProtocol(TProtocol protocol, string serviceName)
-            : base(protocol)
-        {
-            ServiceName = serviceName;
-        }
-
-        /// <summary>
-        /// Prepends the service name to the function name, separated by TMultiplexedProtocol.SEPARATOR.
-        /// </summary>
-        /// <param name="tMessage">The original message.</param>
-        public override void WriteMessageBegin(TMessage tMessage)
-        {
-            switch (tMessage.Type)
-            {
-                case TMessageType.Call:
-                case TMessageType.Oneway:
-                    base.WriteMessageBegin(new TMessage(
-                        ServiceName + SEPARATOR + tMessage.Name,
-                        tMessage.Type,
-                        tMessage.SeqID));
-                    break;
-
-                default:
-                    base.WriteMessageBegin(tMessage);
-                    break;
-            }
-        }
-    }
-}
diff --git a/lib/csharp/src/Protocol/TProtocol.cs b/lib/csharp/src/Protocol/TProtocol.cs
deleted file mode 100644
index dd7a6e0..0000000
--- a/lib/csharp/src/Protocol/TProtocol.cs
+++ /dev/null
@@ -1,142 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- * Contains some contributions under the Thrift Software License.
- * Please see doc/old-thrift-license.txt in the Thrift distribution for
- * details.
- */
-
-using System;
-using System.Text;
-using Thrift.Transport;
-
-namespace Thrift.Protocol
-{
-    public abstract class TProtocol : IDisposable
-    {
-        private const int DEFAULT_RECURSION_DEPTH = 64;
-
-        protected TTransport trans;
-        protected int recursionLimit;
-        protected int recursionDepth;
-
-        protected TProtocol(TTransport trans)
-        {
-            this.trans = trans;
-            this.recursionLimit = DEFAULT_RECURSION_DEPTH;
-            this.recursionDepth = 0;
-        }
-
-        public TTransport Transport
-        {
-            get { return trans; }
-        }
-
-        public int RecursionLimit
-        {
-            get { return recursionLimit; }
-            set { recursionLimit = value; }
-        }
-
-        public void IncrementRecursionDepth()
-        {
-            if (recursionDepth < recursionLimit)
-                ++recursionDepth;
-            else
-                throw new TProtocolException(TProtocolException.DEPTH_LIMIT, "Depth limit exceeded");
-        }
-
-        public void DecrementRecursionDepth()
-        {
-            --recursionDepth;
-        }
-
-        #region " IDisposable Support "
-        private bool _IsDisposed;
-
-        // IDisposable
-        public void Dispose()
-        {
-            Dispose(true);
-        }
-
-        protected virtual void Dispose(bool disposing)
-        {
-            if (!_IsDisposed)
-            {
-                if (disposing)
-                {
-                    if (trans is IDisposable)
-                        (trans as IDisposable).Dispose();
-                }
-            }
-            _IsDisposed = true;
-        }
-        #endregion
-
-        public abstract void WriteMessageBegin(TMessage message);
-        public abstract void WriteMessageEnd();
-        public abstract void WriteStructBegin(TStruct struc);
-        public abstract void WriteStructEnd();
-        public abstract void WriteFieldBegin(TField field);
-        public abstract void WriteFieldEnd();
-        public abstract void WriteFieldStop();
-        public abstract void WriteMapBegin(TMap map);
-        public abstract void WriteMapEnd();
-        public abstract void WriteListBegin(TList list);
-        public abstract void WriteListEnd();
-        public abstract void WriteSetBegin(TSet set);
-        public abstract void WriteSetEnd();
-        public abstract void WriteBool(bool b);
-        public abstract void WriteByte(sbyte b);
-        public abstract void WriteI16(short i16);
-        public abstract void WriteI32(int i32);
-        public abstract void WriteI64(long i64);
-        public abstract void WriteDouble(double d);
-        public virtual void WriteString(string s)
-        {
-            WriteBinary(Encoding.UTF8.GetBytes(s));
-        }
-        public abstract void WriteBinary(byte[] b);
-
-        public abstract TMessage ReadMessageBegin();
-        public abstract void ReadMessageEnd();
-        public abstract TStruct ReadStructBegin();
-        public abstract void ReadStructEnd();
-        public abstract TField ReadFieldBegin();
-        public abstract void ReadFieldEnd();
-        public abstract TMap ReadMapBegin();
-        public abstract void ReadMapEnd();
-        public abstract TList ReadListBegin();
-        public abstract void ReadListEnd();
-        public abstract TSet ReadSetBegin();
-        public abstract void ReadSetEnd();
-        public abstract bool ReadBool();
-        public abstract sbyte ReadByte();
-        public abstract short ReadI16();
-        public abstract int ReadI32();
-        public abstract long ReadI64();
-        public abstract double ReadDouble();
-        public virtual string ReadString()
-        {
-            var buf = ReadBinary();
-            return Encoding.UTF8.GetString(buf, 0, buf.Length);
-        }
-        public abstract byte[] ReadBinary();
-    }
-}
diff --git a/lib/csharp/src/Protocol/TProtocolDecorator.cs b/lib/csharp/src/Protocol/TProtocolDecorator.cs
deleted file mode 100644
index 8600002..0000000
--- a/lib/csharp/src/Protocol/TProtocolDecorator.cs
+++ /dev/null
@@ -1,261 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- * Contains some contributions under the Thrift Software License.
- * Please see doc/old-thrift-license.txt in the Thrift distribution for
- * details.
- */
-
-using System;
-using System.Text;
-using Thrift.Transport;
-using System.Collections.Generic;
-
-namespace Thrift.Protocol
-{
-    /// <summary>
-    /// <see cref="TProtocolDecorator"/> forwards all requests to an enclosed <see cref="TProtocol"/> instance,
-    /// providing a way to author concise concrete decorator subclasses. While it has
-    /// no abstract methods, it is marked abstract as a reminder that by itself,
-    /// it does not modify the behaviour of the enclosed <see cref="TProtocol"/>.
-    /// <para/>
-    /// See p.175 of Design Patterns (by Gamma et al.)
-    /// </summary>
-    /// <seealso cref="TMultiplexedProtocol"/>
-    public abstract class TProtocolDecorator : TProtocol
-    {
-        private TProtocol WrappedProtocol;
-
-        /// <summary>
-        /// Encloses the specified protocol.
-        /// </summary>
-        /// <param name="protocol">All operations will be forward to this protocol.  Must be non-null.</param>
-        public TProtocolDecorator(TProtocol protocol)
-            : base(protocol.Transport)
-        {
-
-            WrappedProtocol = protocol;
-        }
-
-        public override void WriteMessageBegin(TMessage tMessage)
-        {
-            WrappedProtocol.WriteMessageBegin(tMessage);
-        }
-
-        public override void WriteMessageEnd()
-        {
-            WrappedProtocol.WriteMessageEnd();
-        }
-
-        public override void WriteStructBegin(TStruct tStruct)
-        {
-            WrappedProtocol.WriteStructBegin(tStruct);
-        }
-
-        public override void WriteStructEnd()
-        {
-            WrappedProtocol.WriteStructEnd();
-        }
-
-        public override void WriteFieldBegin(TField tField)
-        {
-            WrappedProtocol.WriteFieldBegin(tField);
-        }
-
-        public override void WriteFieldEnd()
-        {
-            WrappedProtocol.WriteFieldEnd();
-        }
-
-        public override void WriteFieldStop()
-        {
-            WrappedProtocol.WriteFieldStop();
-        }
-
-        public override void WriteMapBegin(TMap tMap)
-        {
-            WrappedProtocol.WriteMapBegin(tMap);
-        }
-
-        public override void WriteMapEnd()
-        {
-            WrappedProtocol.WriteMapEnd();
-        }
-
-        public override void WriteListBegin(TList tList)
-        {
-            WrappedProtocol.WriteListBegin(tList);
-        }
-
-        public override void WriteListEnd()
-        {
-            WrappedProtocol.WriteListEnd();
-        }
-
-        public override void WriteSetBegin(TSet tSet)
-        {
-            WrappedProtocol.WriteSetBegin(tSet);
-        }
-
-        public override void WriteSetEnd()
-        {
-            WrappedProtocol.WriteSetEnd();
-        }
-
-        public override void WriteBool(bool b)
-        {
-            WrappedProtocol.WriteBool(b);
-        }
-
-        public override void WriteByte(sbyte b)
-        {
-            WrappedProtocol.WriteByte(b);
-        }
-
-        public override void WriteI16(short i)
-        {
-            WrappedProtocol.WriteI16(i);
-        }
-
-        public override void WriteI32(int i)
-        {
-            WrappedProtocol.WriteI32(i);
-        }
-
-        public override void WriteI64(long l)
-        {
-            WrappedProtocol.WriteI64(l);
-        }
-
-        public override void WriteDouble(double v)
-        {
-            WrappedProtocol.WriteDouble(v);
-        }
-
-        public override void WriteString(string s)
-        {
-            WrappedProtocol.WriteString(s);
-        }
-
-        public override void WriteBinary(byte[] bytes)
-        {
-            WrappedProtocol.WriteBinary(bytes);
-        }
-
-        public override TMessage ReadMessageBegin()
-        {
-            return WrappedProtocol.ReadMessageBegin();
-        }
-
-        public override void ReadMessageEnd()
-        {
-            WrappedProtocol.ReadMessageEnd();
-        }
-
-        public override TStruct ReadStructBegin()
-        {
-            return WrappedProtocol.ReadStructBegin();
-        }
-
-        public override void ReadStructEnd()
-        {
-            WrappedProtocol.ReadStructEnd();
-        }
-
-        public override TField ReadFieldBegin()
-        {
-            return WrappedProtocol.ReadFieldBegin();
-        }
-
-        public override void ReadFieldEnd()
-        {
-            WrappedProtocol.ReadFieldEnd();
-        }
-
-        public override TMap ReadMapBegin()
-        {
-            return WrappedProtocol.ReadMapBegin();
-        }
-
-        public override void ReadMapEnd()
-        {
-            WrappedProtocol.ReadMapEnd();
-        }
-
-        public override TList ReadListBegin()
-        {
-            return WrappedProtocol.ReadListBegin();
-        }
-
-        public override void ReadListEnd()
-        {
-            WrappedProtocol.ReadListEnd();
-        }
-
-        public override TSet ReadSetBegin()
-        {
-            return WrappedProtocol.ReadSetBegin();
-        }
-
-        public override void ReadSetEnd()
-        {
-            WrappedProtocol.ReadSetEnd();
-        }
-
-        public override bool ReadBool()
-        {
-            return WrappedProtocol.ReadBool();
-        }
-
-        public override sbyte ReadByte()
-        {
-            return WrappedProtocol.ReadByte();
-        }
-
-        public override short ReadI16()
-        {
-            return WrappedProtocol.ReadI16();
-        }
-
-        public override int ReadI32()
-        {
-            return WrappedProtocol.ReadI32();
-        }
-
-        public override long ReadI64()
-        {
-            return WrappedProtocol.ReadI64();
-        }
-
-        public override double ReadDouble()
-        {
-            return WrappedProtocol.ReadDouble();
-        }
-
-        public override string ReadString()
-        {
-            return WrappedProtocol.ReadString();
-        }
-
-        public override byte[] ReadBinary()
-        {
-            return WrappedProtocol.ReadBinary();
-        }
-    }
-
-}
diff --git a/lib/csharp/src/Protocol/TProtocolException.cs b/lib/csharp/src/Protocol/TProtocolException.cs
deleted file mode 100644
index 7bef236..0000000
--- a/lib/csharp/src/Protocol/TProtocolException.cs
+++ /dev/null
@@ -1,67 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- * Contains some contributions under the Thrift Software License.
- * Please see doc/old-thrift-license.txt in the Thrift distribution for
- * details.
- */
-
-using System;
-
-namespace Thrift.Protocol
-{
-    public class TProtocolException : TException
-    {
-        public const int UNKNOWN = 0;
-        public const int INVALID_DATA = 1;
-        public const int NEGATIVE_SIZE = 2;
-        public const int SIZE_LIMIT = 3;
-        public const int BAD_VERSION = 4;
-        public const int NOT_IMPLEMENTED = 5;
-        public const int DEPTH_LIMIT = 6;
-
-        protected int type_ = UNKNOWN;
-
-        public TProtocolException()
-            : base()
-        {
-        }
-
-        public TProtocolException(int type, Exception inner = null)
-            : base(string.Empty, inner)
-        {
-            type_ = type;
-        }
-
-        public TProtocolException(int type, string message, Exception inner = null)
-            : base(message, inner)
-        {
-            type_ = type;
-        }
-
-        public TProtocolException(string message, Exception inner = null)
-            : base(message, inner)
-        {
-        }
-
-        public int getType()
-        {
-            return type_;
-        }
-    }
-}
diff --git a/lib/csharp/src/Protocol/TProtocolFactory.cs b/lib/csharp/src/Protocol/TProtocolFactory.cs
deleted file mode 100644
index 71360a1..0000000
--- a/lib/csharp/src/Protocol/TProtocolFactory.cs
+++ /dev/null
@@ -1,33 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- * Contains some contributions under the Thrift Software License.
- * Please see doc/old-thrift-license.txt in the Thrift distribution for
- * details.
- */
-
-using System;
-using Thrift.Transport;
-
-namespace Thrift.Protocol
-{
-    public interface TProtocolFactory
-    {
-        TProtocol GetProtocol(TTransport trans);
-    }
-}
diff --git a/lib/csharp/src/Protocol/TProtocolUtil.cs b/lib/csharp/src/Protocol/TProtocolUtil.cs
deleted file mode 100644
index d995c6c..0000000
--- a/lib/csharp/src/Protocol/TProtocolUtil.cs
+++ /dev/null
@@ -1,108 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- * Contains some contributions under the Thrift Software License.
- * Please see doc/old-thrift-license.txt in the Thrift distribution for
- * details.
- */
-
-using System;
-
-namespace Thrift.Protocol
-{
-    public static class TProtocolUtil
-    {
-        public static void Skip(TProtocol prot, TType type)
-        {
-            prot.IncrementRecursionDepth();
-            try
-            {
-                switch (type)
-                {
-                    case TType.Bool:
-                        prot.ReadBool();
-                        break;
-                    case TType.Byte:
-                        prot.ReadByte();
-                        break;
-                    case TType.I16:
-                        prot.ReadI16();
-                        break;
-                    case TType.I32:
-                        prot.ReadI32();
-                        break;
-                    case TType.I64:
-                        prot.ReadI64();
-                        break;
-                    case TType.Double:
-                        prot.ReadDouble();
-                        break;
-                    case TType.String:
-                        // Don't try to decode the string, just skip it.
-                        prot.ReadBinary();
-                        break;
-                    case TType.Struct:
-                        prot.ReadStructBegin();
-                        while (true)
-                        {
-                            TField field = prot.ReadFieldBegin();
-                            if (field.Type == TType.Stop)
-                            {
-                                break;
-                            }
-                            Skip(prot, field.Type);
-                            prot.ReadFieldEnd();
-                        }
-                        prot.ReadStructEnd();
-                        break;
-                    case TType.Map:
-                        TMap map = prot.ReadMapBegin();
-                        for (int i = 0; i < map.Count; i++)
-                        {
-                            Skip(prot, map.KeyType);
-                            Skip(prot, map.ValueType);
-                        }
-                        prot.ReadMapEnd();
-                        break;
-                    case TType.Set:
-                        TSet set = prot.ReadSetBegin();
-                        for (int i = 0; i < set.Count; i++)
-                        {
-                            Skip(prot, set.ElementType);
-                        }
-                        prot.ReadSetEnd();
-                        break;
-                    case TType.List:
-                        TList list = prot.ReadListBegin();
-                        for (int i = 0; i < list.Count; i++)
-                        {
-                            Skip(prot, list.ElementType);
-                        }
-                        prot.ReadListEnd();
-                        break;
-                    default:
-                        throw new TProtocolException(TProtocolException.INVALID_DATA, "Unknown data type " + type.ToString("d"));
-                }
-            }
-            finally
-            {
-                prot.DecrementRecursionDepth();
-            }
-        }
-    }
-}
diff --git a/lib/csharp/src/Protocol/TSet.cs b/lib/csharp/src/Protocol/TSet.cs
deleted file mode 100644
index a918ab5..0000000
--- a/lib/csharp/src/Protocol/TSet.cs
+++ /dev/null
@@ -1,59 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- * Contains some contributions under the Thrift Software License.
- * Please see doc/old-thrift-license.txt in the Thrift distribution for
- * details.
- */
-
-using System;
-using System.Collections.Generic;
-using System.Text;
-
-namespace Thrift.Protocol
-{
-    public struct TSet
-    {
-        private TType elementType;
-        private int count;
-
-        public TSet(TType elementType, int count)
-            :this()
-        {
-            this.elementType = elementType;
-            this.count = count;
-        }
-
-        public TSet(TList list)
-            : this(list.ElementType, list.Count)
-        {
-        }
-
-        public TType ElementType
-        {
-            get { return elementType; }
-            set { elementType = value; }
-        }
-
-        public int Count
-        {
-            get { return count; }
-            set { count = value; }
-        }
-    }
-}
diff --git a/lib/csharp/src/Protocol/TStruct.cs b/lib/csharp/src/Protocol/TStruct.cs
deleted file mode 100644
index f4844a4..0000000
--- a/lib/csharp/src/Protocol/TStruct.cs
+++ /dev/null
@@ -1,46 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- * Contains some contributions under the Thrift Software License.
- * Please see doc/old-thrift-license.txt in the Thrift distribution for
- * details.
- */
-
-using System;
-using System.Collections.Generic;
-using System.Text;
-
-namespace Thrift.Protocol
-{
-    public struct TStruct
-    {
-        private string name;
-
-        public TStruct(string name)
-            :this()
-        {
-            this.name = name;
-        }
-
-        public string Name
-        {
-            get { return name; }
-            set { name = value; }
-        }
-    }
-}
diff --git a/lib/csharp/src/Protocol/TType.cs b/lib/csharp/src/Protocol/TType.cs
deleted file mode 100644
index 9ce915e..0000000
--- a/lib/csharp/src/Protocol/TType.cs
+++ /dev/null
@@ -1,44 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- * Contains some contributions under the Thrift Software License.
- * Please see doc/old-thrift-license.txt in the Thrift distribution for
- * details.
- */
-
-using System;
-
-namespace Thrift.Protocol
-{
-    public enum TType : byte
-    {
-        Stop = 0,
-        Void = 1,
-        Bool = 2,
-        Byte = 3,
-        Double = 4,
-        I16 = 6,
-        I32 = 8,
-        I64 = 10,
-        String = 11,
-        Struct = 12,
-        Map = 13,
-        Set = 14,
-        List = 15
-    }
-}
diff --git a/lib/csharp/src/Server/TServer.cs b/lib/csharp/src/Server/TServer.cs
deleted file mode 100644
index 2bc04f3..0000000
--- a/lib/csharp/src/Server/TServer.cs
+++ /dev/null
@@ -1,155 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- * Contains some contributions under the Thrift Software License.
- * Please see doc/old-thrift-license.txt in the Thrift distribution for
- * details.
- */
-
-using System;
-using Thrift.Protocol;
-using Thrift.Transport;
-using System.IO;
-
-namespace Thrift.Server
-{
-    public abstract class TServer
-    {
-        //Attributes
-        protected TProcessorFactory processorFactory;
-        protected TServerTransport serverTransport;
-        protected TTransportFactory inputTransportFactory;
-        protected TTransportFactory outputTransportFactory;
-        protected TProtocolFactory inputProtocolFactory;
-        protected TProtocolFactory outputProtocolFactory;
-        protected TServerEventHandler serverEventHandler = null;
-
-        //Methods
-        public void setEventHandler(TServerEventHandler seh)
-        {
-            serverEventHandler = seh;
-        }
-        public TServerEventHandler getEventHandler()
-        {
-            return serverEventHandler;
-        }
-
-        //Log delegation
-        public delegate void LogDelegate(string str);
-        private LogDelegate _logDelegate;
-        protected LogDelegate logDelegate
-        {
-            get { return _logDelegate; }
-            set { _logDelegate = (value != null) ? value : DefaultLogDelegate; }
-        }
-        protected static void DefaultLogDelegate(string s)
-        {
-            Console.Error.WriteLine(s);
-        }
-
-        //Construction
-        public TServer(TProcessor processor,
-                  TServerTransport serverTransport)
-          : this(processor, serverTransport,
-             new TTransportFactory(),
-             new TTransportFactory(),
-             new TBinaryProtocol.Factory(),
-             new TBinaryProtocol.Factory(),
-             DefaultLogDelegate)
-        {
-        }
-
-        public TServer(TProcessor processor,
-                TServerTransport serverTransport,
-                LogDelegate logDelegate)
-          : this(processor,
-             serverTransport,
-             new TTransportFactory(),
-             new TTransportFactory(),
-             new TBinaryProtocol.Factory(),
-             new TBinaryProtocol.Factory(),
-             logDelegate)
-        {
-        }
-
-        public TServer(TProcessor processor,
-                  TServerTransport serverTransport,
-                  TTransportFactory transportFactory)
-          : this(processor,
-             serverTransport,
-             transportFactory,
-             transportFactory,
-             new TBinaryProtocol.Factory(),
-             new TBinaryProtocol.Factory(),
-             DefaultLogDelegate)
-        {
-        }
-
-        public TServer(TProcessor processor,
-                  TServerTransport serverTransport,
-                  TTransportFactory transportFactory,
-                  TProtocolFactory protocolFactory)
-          : this(processor,
-             serverTransport,
-             transportFactory,
-             transportFactory,
-             protocolFactory,
-             protocolFactory,
-               DefaultLogDelegate)
-        {
-        }
-
-        public TServer(TProcessor processor,
-            TServerTransport serverTransport,
-            TTransportFactory inputTransportFactory,
-            TTransportFactory outputTransportFactory,
-            TProtocolFactory inputProtocolFactory,
-            TProtocolFactory outputProtocolFactory,
-            LogDelegate logDelegate)
-        {
-            this.processorFactory = new TSingletonProcessorFactory(processor);
-            this.serverTransport = serverTransport;
-            this.inputTransportFactory = inputTransportFactory;
-            this.outputTransportFactory = outputTransportFactory;
-            this.inputProtocolFactory = inputProtocolFactory;
-            this.outputProtocolFactory = outputProtocolFactory;
-            this.logDelegate = (logDelegate != null) ? logDelegate : DefaultLogDelegate;
-        }
-
-        public TServer(TProcessorFactory processorFactory,
-                  TServerTransport serverTransport,
-                  TTransportFactory inputTransportFactory,
-                  TTransportFactory outputTransportFactory,
-                  TProtocolFactory inputProtocolFactory,
-                  TProtocolFactory outputProtocolFactory,
-                  LogDelegate logDelegate)
-        {
-            this.processorFactory = processorFactory;
-            this.serverTransport = serverTransport;
-            this.inputTransportFactory = inputTransportFactory;
-            this.outputTransportFactory = outputTransportFactory;
-            this.inputProtocolFactory = inputProtocolFactory;
-            this.outputProtocolFactory = outputProtocolFactory;
-            this.logDelegate = (logDelegate != null) ? logDelegate : DefaultLogDelegate;
-        }
-
-        //Abstract Interface
-        public abstract void Serve();
-        public abstract void Stop();
-    }
-}
diff --git a/lib/csharp/src/Server/TServerEventHandler.cs b/lib/csharp/src/Server/TServerEventHandler.cs
deleted file mode 100644
index e81efc6..0000000
--- a/lib/csharp/src/Server/TServerEventHandler.cs
+++ /dev/null
@@ -1,53 +0,0 @@
-﻿/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- * Contains some contributions under the Thrift Software License.
- * Please see doc/old-thrift-license.txt in the Thrift distribution for
- * details.
- */
-
-using System;
-
-namespace Thrift.Server
-{
-    /// <summary>
-    /// Interface implemented by server users to handle events from the server.
-    /// </summary>
-    public interface TServerEventHandler
-    {
-        /// <summary>
-        /// Called before the server begins.
-        /// </summary>
-        void preServe();
-
-        /// <summary>
-        /// Called when a new client has connected and is about to being processing.
-        /// </summary>
-        object createContext(Thrift.Protocol.TProtocol input, Thrift.Protocol.TProtocol output);
-
-        /// <summary>
-        /// Called when a client has finished request-handling to delete server context.
-        /// </summary>
-        void deleteContext(object serverContext, Thrift.Protocol.TProtocol input, Thrift.Protocol.TProtocol output);
-
-        /// <summary>
-        /// Called when a client is about to call the processor.
-        /// </summary>
-        void processContext(object serverContext, Thrift.Transport.TTransport transport);
-    };
-}
diff --git a/lib/csharp/src/Server/TSimpleServer.cs b/lib/csharp/src/Server/TSimpleServer.cs
deleted file mode 100644
index 4e7ea96..0000000
--- a/lib/csharp/src/Server/TSimpleServer.cs
+++ /dev/null
@@ -1,180 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- * Contains some contributions under the Thrift Software License.
- * Please see doc/old-thrift-license.txt in the Thrift distribution for
- * details.
- */
-
-using System;
-using Thrift.Transport;
-using Thrift.Protocol;
-
-namespace Thrift.Server
-{
-    /// <summary>
-    /// Simple single-threaded server for testing.
-    /// </summary>
-    public class TSimpleServer : TServer
-    {
-        private bool stop = false;
-
-        public TSimpleServer(TProcessor processor,
-                  TServerTransport serverTransport)
-          : base(processor, serverTransport, new TTransportFactory(), new TTransportFactory(), new TBinaryProtocol.Factory(), new TBinaryProtocol.Factory(), DefaultLogDelegate)
-        {
-        }
-
-        public TSimpleServer(TProcessor processor,
-                  TServerTransport serverTransport,
-                  LogDelegate logDel)
-          : base(processor, serverTransport, new TTransportFactory(), new TTransportFactory(), new TBinaryProtocol.Factory(), new TBinaryProtocol.Factory(), logDel)
-        {
-        }
-
-        public TSimpleServer(TProcessor processor,
-                  TServerTransport serverTransport,
-                  TTransportFactory transportFactory)
-          : base(processor,
-             serverTransport,
-             transportFactory,
-             transportFactory,
-             new TBinaryProtocol.Factory(),
-             new TBinaryProtocol.Factory(),
-               DefaultLogDelegate)
-        {
-        }
-
-        public TSimpleServer(TProcessor processor,
-            TServerTransport serverTransport,
-            TTransportFactory transportFactory,
-            TProtocolFactory protocolFactory)
-            : base(processor,
-               serverTransport,
-               transportFactory,
-               transportFactory,
-               protocolFactory,
-               protocolFactory,
-               DefaultLogDelegate)
-        {
-        }
-
-        public TSimpleServer(TProcessorFactory processorFactory,
-                  TServerTransport serverTransport,
-                  TTransportFactory transportFactory,
-                  TProtocolFactory protocolFactory)
-          : base(processorFactory,
-             serverTransport,
-             transportFactory,
-             transportFactory,
-             protocolFactory,
-             protocolFactory,
-             DefaultLogDelegate)
-        {
-        }
-
-        public override void Serve()
-        {
-            try
-            {
-                serverTransport.Listen();
-            }
-            catch (TTransportException ttx)
-            {
-                logDelegate(ttx.ToString());
-                return;
-            }
-
-            //Fire the preServe server event when server is up but before any client connections
-            if (serverEventHandler != null)
-                serverEventHandler.preServe();
-
-            while (!stop)
-            {
-                TProcessor processor = null;
-                TTransport client = null;
-                TTransport inputTransport = null;
-                TTransport outputTransport = null;
-                TProtocol inputProtocol = null;
-                TProtocol outputProtocol = null;
-                object connectionContext = null;
-                try
-                {
-                    using (client = serverTransport.Accept())
-                    {
-                        processor = processorFactory.GetProcessor(client);
-                        if (client != null)
-                        {
-                            using (inputTransport = inputTransportFactory.GetTransport(client))
-                            {
-                                using (outputTransport = outputTransportFactory.GetTransport(client))
-                                {
-                                    inputProtocol = inputProtocolFactory.GetProtocol(inputTransport);
-                                    outputProtocol = outputProtocolFactory.GetProtocol(outputTransport);
-
-                                    //Recover event handler (if any) and fire createContext server event when a client connects
-                                    if (serverEventHandler != null)
-                                        connectionContext = serverEventHandler.createContext(inputProtocol, outputProtocol);
-
-                                    //Process client requests until client disconnects
-                                    while (!stop)
-                                    {
-                                        if (!inputTransport.Peek())
-                                            break;
-
-                                        //Fire processContext server event
-                                        //N.B. This is the pattern implemented in C++ and the event fires provisionally.
-                                        //That is to say it may be many minutes between the event firing and the client request
-                                        //actually arriving or the client may hang up without ever makeing a request.
-                                        if (serverEventHandler != null)
-                                            serverEventHandler.processContext(connectionContext, inputTransport);
-                                        //Process client request (blocks until transport is readable)
-                                        if (!processor.Process(inputProtocol, outputProtocol))
-                                            break;
-                                    }
-                                }
-                            }
-                        }
-                    }
-                }
-                catch (TTransportException ttx)
-                {
-                    if (!stop || ttx.Type != TTransportException.ExceptionType.Interrupted)
-                    {
-                        logDelegate(ttx.ToString());
-                    }
-                }
-                catch (Exception x)
-                {
-                    //Unexpected
-                    logDelegate(x.ToString());
-                }
-
-                //Fire deleteContext server event after client disconnects
-                if (serverEventHandler != null)
-                    serverEventHandler.deleteContext(connectionContext, inputProtocol, outputProtocol);
-            }
-        }
-
-        public override void Stop()
-        {
-            stop = true;
-            serverTransport.Close();
-        }
-    }
-}
diff --git a/lib/csharp/src/Server/TThreadPoolServer.cs b/lib/csharp/src/Server/TThreadPoolServer.cs
deleted file mode 100644
index a494ce7..0000000
--- a/lib/csharp/src/Server/TThreadPoolServer.cs
+++ /dev/null
@@ -1,295 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- * Contains some contributions under the Thrift Software License.
- * Please see doc/old-thrift-license.txt in the Thrift distribution for
- * details.
- */
-
-using System;
-using System.Threading;
-using Thrift.Protocol;
-using Thrift.Transport;
-
-namespace Thrift.Server
-{
-    /// <summary>
-    /// Server that uses C# built-in ThreadPool to spawn threads when handling requests.
-    /// </summary>
-    public class TThreadPoolServer : TServer
-    {
-        private const int DEFAULT_MIN_THREADS = -1;  // use .NET ThreadPool defaults
-        private const int DEFAULT_MAX_THREADS = -1;  // use .NET ThreadPool defaults
-        private volatile bool stop = false;
-
-        public struct Configuration
-        {
-            public int MinWorkerThreads;
-            public int MaxWorkerThreads;
-            public int MinIOThreads;
-            public int MaxIOThreads;
-
-            public Configuration(int min = DEFAULT_MIN_THREADS, int max = DEFAULT_MAX_THREADS)
-            {
-                MinWorkerThreads = min;
-                MaxWorkerThreads = max;
-                MinIOThreads = min;
-                MaxIOThreads = max;
-            }
-
-            public Configuration(int minWork, int maxWork, int minIO, int maxIO)
-            {
-                MinWorkerThreads = minWork;
-                MaxWorkerThreads = maxWork;
-                MinIOThreads = minIO;
-                MaxIOThreads = maxIO;
-            }
-        }
-
-        public TThreadPoolServer(TProcessor processor, TServerTransport serverTransport)
-            : this(new TSingletonProcessorFactory(processor), serverTransport,
-             new TTransportFactory(), new TTransportFactory(),
-             new TBinaryProtocol.Factory(), new TBinaryProtocol.Factory(),
-             new Configuration(), DefaultLogDelegate)
-        {
-        }
-
-        public TThreadPoolServer(TProcessor processor, TServerTransport serverTransport, LogDelegate logDelegate)
-            : this(new TSingletonProcessorFactory(processor), serverTransport,
-             new TTransportFactory(), new TTransportFactory(),
-             new TBinaryProtocol.Factory(), new TBinaryProtocol.Factory(),
-             new Configuration(), logDelegate)
-        {
-        }
-
-        public TThreadPoolServer(TProcessor processor,
-         TServerTransport serverTransport,
-         TTransportFactory transportFactory,
-         TProtocolFactory protocolFactory)
-            : this(new TSingletonProcessorFactory(processor), serverTransport,
-               transportFactory, transportFactory,
-               protocolFactory, protocolFactory,
-               new Configuration(), DefaultLogDelegate)
-        {
-        }
-
-        public TThreadPoolServer(TProcessorFactory processorFactory,
-                     TServerTransport serverTransport,
-                     TTransportFactory transportFactory,
-                     TProtocolFactory protocolFactory)
-            : this(processorFactory, serverTransport,
-             transportFactory, transportFactory,
-             protocolFactory, protocolFactory,
-             new Configuration(), DefaultLogDelegate)
-        {
-        }
-
-        public TThreadPoolServer(TProcessorFactory processorFactory,
-                     TServerTransport serverTransport,
-                     TTransportFactory inputTransportFactory,
-                     TTransportFactory outputTransportFactory,
-                     TProtocolFactory inputProtocolFactory,
-                     TProtocolFactory outputProtocolFactory,
-                     int minThreadPoolThreads, int maxThreadPoolThreads, LogDelegate logDel)
-            : this(processorFactory, serverTransport, inputTransportFactory, outputTransportFactory,
-             inputProtocolFactory, outputProtocolFactory,
-             new Configuration(minThreadPoolThreads, maxThreadPoolThreads),
-             logDel)
-        {
-        }
-
-        public TThreadPoolServer(TProcessorFactory processorFactory,
-                     TServerTransport serverTransport,
-                     TTransportFactory inputTransportFactory,
-                     TTransportFactory outputTransportFactory,
-                     TProtocolFactory inputProtocolFactory,
-                     TProtocolFactory outputProtocolFactory,
-                     Configuration threadConfig,
-                     LogDelegate logDel)
-            : base(processorFactory, serverTransport, inputTransportFactory, outputTransportFactory,
-            inputProtocolFactory, outputProtocolFactory, logDel)
-        {
-            lock (typeof(TThreadPoolServer))
-            {
-                if ((threadConfig.MaxWorkerThreads > 0) || (threadConfig.MaxIOThreads > 0))
-                {
-                    int work, comm;
-                    ThreadPool.GetMaxThreads(out work, out comm);
-                    if (threadConfig.MaxWorkerThreads > 0)
-                        work = threadConfig.MaxWorkerThreads;
-                    if (threadConfig.MaxIOThreads > 0)
-                        comm = threadConfig.MaxIOThreads;
-                    if (!ThreadPool.SetMaxThreads(work, comm))
-                        throw new Exception("Error: could not SetMaxThreads in ThreadPool");
-                }
-
-                if ((threadConfig.MinWorkerThreads > 0) || (threadConfig.MinIOThreads > 0))
-                {
-                    int work, comm;
-                    ThreadPool.GetMinThreads(out work, out comm);
-                    if (threadConfig.MinWorkerThreads > 0)
-                        work = threadConfig.MinWorkerThreads;
-                    if (threadConfig.MinIOThreads > 0)
-                        comm = threadConfig.MinIOThreads;
-                    if (!ThreadPool.SetMinThreads(work, comm))
-                        throw new Exception("Error: could not SetMinThreads in ThreadPool");
-                }
-            }
-        }
-
-
-        /// <summary>
-        /// Use new ThreadPool thread for each new client connection.
-        /// </summary>
-        public override void Serve()
-        {
-            try
-            {
-                serverTransport.Listen();
-            }
-            catch (TTransportException ttx)
-            {
-                logDelegate("Error, could not listen on ServerTransport: " + ttx);
-                return;
-            }
-
-            //Fire the preServe server event when server is up but before any client connections
-            if (serverEventHandler != null)
-                serverEventHandler.preServe();
-
-            while (!stop)
-            {
-                int failureCount = 0;
-                try
-                {
-                    TTransport client = serverTransport.Accept();
-                    ThreadPool.QueueUserWorkItem(this.Execute, client);
-                }
-                catch (TTransportException ttx)
-                {
-                    if (!stop || ttx.Type != TTransportException.ExceptionType.Interrupted)
-                    {
-                        ++failureCount;
-                        logDelegate(ttx.ToString());
-                    }
-
-                }
-            }
-
-            if (stop)
-            {
-                try
-                {
-                    serverTransport.Close();
-                }
-                catch (TTransportException ttx)
-                {
-                    logDelegate("TServerTransport failed on close: " + ttx.Message);
-                }
-                stop = false;
-            }
-        }
-
-        /// <summary>
-        /// Loops on processing a client forever
-        /// threadContext will be a TTransport instance
-        /// </summary>
-        /// <param name="threadContext"></param>
-        private void Execute(object threadContext)
-        {
-            using (TTransport client = (TTransport)threadContext)
-            {
-                TProcessor processor = processorFactory.GetProcessor(client, this);
-                TTransport inputTransport = null;
-                TTransport outputTransport = null;
-                TProtocol inputProtocol = null;
-                TProtocol outputProtocol = null;
-                object connectionContext = null;
-                try
-                {
-                    try
-                    {
-                        inputTransport = inputTransportFactory.GetTransport(client);
-                        outputTransport = outputTransportFactory.GetTransport(client);
-                        inputProtocol = inputProtocolFactory.GetProtocol(inputTransport);
-                        outputProtocol = outputProtocolFactory.GetProtocol(outputTransport);
-
-                        //Recover event handler (if any) and fire createContext server event when a client connects
-                        if (serverEventHandler != null)
-                            connectionContext = serverEventHandler.createContext(inputProtocol, outputProtocol);
-
-                        //Process client requests until client disconnects
-                        while (!stop)
-                        {
-                            if (!inputTransport.Peek())
-                                break;
-
-                            //Fire processContext server event
-                            //N.B. This is the pattern implemented in C++ and the event fires provisionally.
-                            //That is to say it may be many minutes between the event firing and the client request
-                            //actually arriving or the client may hang up without ever makeing a request.
-                            if (serverEventHandler != null)
-                                serverEventHandler.processContext(connectionContext, inputTransport);
-                            //Process client request (blocks until transport is readable)
-                            if (!processor.Process(inputProtocol, outputProtocol))
-                                break;
-                        }
-                    }
-                    catch (TTransportException)
-                    {
-                        //Usually a client disconnect, expected
-                    }
-                    catch (Exception x)
-                    {
-                        //Unexpected
-                        logDelegate("Error: " + x);
-                    }
-
-                    //Fire deleteContext server event after client disconnects
-                    if (serverEventHandler != null)
-                        serverEventHandler.deleteContext(connectionContext, inputProtocol, outputProtocol);
-
-                }
-                finally
-                {
-                    //Close transports
-                    if (inputTransport != null)
-                        inputTransport.Close();
-                    if (outputTransport != null)
-                        outputTransport.Close();
-
-                    // disposable stuff should be disposed
-                    if (inputProtocol != null)
-                        inputProtocol.Dispose();
-                    if (outputProtocol != null)
-                        outputProtocol.Dispose();
-                    if (inputTransport != null)
-                        inputTransport.Dispose();
-                    if (outputTransport != null)
-                        outputTransport.Dispose();
-                }
-            }
-        }
-
-        public override void Stop()
-        {
-            stop = true;
-            serverTransport.Close();
-        }
-    }
-}
diff --git a/lib/csharp/src/Server/TThreadedServer.cs b/lib/csharp/src/Server/TThreadedServer.cs
deleted file mode 100644
index cc051a3..0000000
--- a/lib/csharp/src/Server/TThreadedServer.cs
+++ /dev/null
@@ -1,282 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-using System;
-using System.Collections.Generic;
-using System.Threading;
-using Thrift.Collections;
-using Thrift.Protocol;
-using Thrift.Transport;
-
-namespace Thrift.Server
-{
-    /// <summary>
-    /// Server that uses C# threads (as opposed to the ThreadPool) when handling requests.
-    /// </summary>
-    public class TThreadedServer : TServer
-    {
-        private const int DEFAULT_MAX_THREADS = 100;
-        private volatile bool stop = false;
-        private readonly int maxThreads;
-
-        private Queue<TTransport> clientQueue;
-        private THashSet<Thread> clientThreads;
-        private object clientLock;
-        private Thread workerThread;
-
-        public int ClientThreadsCount
-        {
-            get { return clientThreads.Count; }
-        }
-
-        public TThreadedServer(TProcessor processor, TServerTransport serverTransport)
-            : this(new TSingletonProcessorFactory(processor), serverTransport,
-             new TTransportFactory(), new TTransportFactory(),
-             new TBinaryProtocol.Factory(), new TBinaryProtocol.Factory(),
-             DEFAULT_MAX_THREADS, DefaultLogDelegate)
-        {
-        }
-
-        public TThreadedServer(TProcessor processor, TServerTransport serverTransport, LogDelegate logDelegate)
-            : this(new TSingletonProcessorFactory(processor), serverTransport,
-             new TTransportFactory(), new TTransportFactory(),
-             new TBinaryProtocol.Factory(), new TBinaryProtocol.Factory(),
-             DEFAULT_MAX_THREADS, logDelegate)
-        {
-        }
-
-
-        public TThreadedServer(TProcessor processor,
-                     TServerTransport serverTransport,
-                     TTransportFactory transportFactory,
-                     TProtocolFactory protocolFactory)
-            : this(new TSingletonProcessorFactory(processor), serverTransport,
-             transportFactory, transportFactory,
-             protocolFactory, protocolFactory,
-             DEFAULT_MAX_THREADS, DefaultLogDelegate)
-        {
-        }
-
-        public TThreadedServer(TProcessorFactory processorFactory,
-               TServerTransport serverTransport,
-               TTransportFactory transportFactory,
-               TProtocolFactory protocolFactory)
-            : this(processorFactory, serverTransport,
-             transportFactory, transportFactory,
-             protocolFactory, protocolFactory,
-             DEFAULT_MAX_THREADS, DefaultLogDelegate)
-        {
-        }
-        public TThreadedServer(TProcessorFactory processorFactory,
-                     TServerTransport serverTransport,
-                     TTransportFactory inputTransportFactory,
-                     TTransportFactory outputTransportFactory,
-                     TProtocolFactory inputProtocolFactory,
-                     TProtocolFactory outputProtocolFactory,
-                     int maxThreads, LogDelegate logDel)
-          : base(processorFactory, serverTransport, inputTransportFactory, outputTransportFactory,
-              inputProtocolFactory, outputProtocolFactory, logDel)
-        {
-            this.maxThreads = maxThreads;
-            clientQueue = new Queue<TTransport>();
-            clientLock = new object();
-            clientThreads = new THashSet<Thread>();
-        }
-
-        /// <summary>
-        /// Use new Thread for each new client connection. block until numConnections &lt; maxThreads.
-        /// </summary>
-        public override void Serve()
-        {
-            try
-            {
-                //start worker thread
-                workerThread = new Thread(new ThreadStart(Execute));
-                workerThread.Start();
-                serverTransport.Listen();
-            }
-            catch (TTransportException ttx)
-            {
-                logDelegate("Error, could not listen on ServerTransport: " + ttx);
-                return;
-            }
-
-            //Fire the preServe server event when server is up but before any client connections
-            if (serverEventHandler != null)
-                serverEventHandler.preServe();
-
-            while (!stop)
-            {
-                int failureCount = 0;
-                try
-                {
-                    TTransport client = serverTransport.Accept();
-                    lock (clientLock)
-                    {
-                        clientQueue.Enqueue(client);
-                        Monitor.Pulse(clientLock);
-                    }
-                }
-                catch (TTransportException ttx)
-                {
-                    if (!stop || ttx.Type != TTransportException.ExceptionType.Interrupted)
-                    {
-                        ++failureCount;
-                        logDelegate(ttx.ToString());
-                    }
-
-                }
-            }
-
-            if (stop)
-            {
-                try
-                {
-                    serverTransport.Close();
-                }
-                catch (TTransportException ttx)
-                {
-                    logDelegate("TServeTransport failed on close: " + ttx.Message);
-                }
-                stop = false;
-            }
-        }
-
-        /// <summary>
-        /// Loops on processing a client forever
-        /// </summary>
-        private void Execute()
-        {
-            while (!stop)
-            {
-                TTransport client;
-                Thread t;
-                lock (clientLock)
-                {
-                    //don't dequeue if too many connections
-                    while (clientThreads.Count >= maxThreads)
-                    {
-                        Monitor.Wait(clientLock);
-                    }
-
-                    while (clientQueue.Count == 0)
-                    {
-                        Monitor.Wait(clientLock);
-                    }
-
-                    client = clientQueue.Dequeue();
-                    t = new Thread(new ParameterizedThreadStart(ClientWorker));
-                    clientThreads.Add(t);
-                }
-                //start processing requests from client on new thread
-                t.Start(client);
-            }
-        }
-
-        private void ClientWorker(object context)
-        {
-            using (TTransport client = (TTransport)context)
-            {
-                TProcessor processor = processorFactory.GetProcessor(client);
-                TTransport inputTransport = null;
-                TTransport outputTransport = null;
-                TProtocol inputProtocol = null;
-                TProtocol outputProtocol = null;
-                object connectionContext = null;
-                try
-                {
-                    try
-                    {
-                        inputTransport = inputTransportFactory.GetTransport(client);
-                        outputTransport = outputTransportFactory.GetTransport(client);
-                        inputProtocol = inputProtocolFactory.GetProtocol(inputTransport);
-                        outputProtocol = outputProtocolFactory.GetProtocol(outputTransport);
-
-                        //Recover event handler (if any) and fire createContext server event when a client connects
-                        if (serverEventHandler != null)
-                            connectionContext = serverEventHandler.createContext(inputProtocol, outputProtocol);
-
-                        //Process client requests until client disconnects
-                        while (!stop)
-                        {
-                            if (!inputTransport.Peek())
-                                break;
-
-                            //Fire processContext server event
-                            //N.B. This is the pattern implemented in C++ and the event fires provisionally.
-                            //That is to say it may be many minutes between the event firing and the client request
-                            //actually arriving or the client may hang up without ever makeing a request.
-                            if (serverEventHandler != null)
-                                serverEventHandler.processContext(connectionContext, inputTransport);
-                            //Process client request (blocks until transport is readable)
-                            if (!processor.Process(inputProtocol, outputProtocol))
-                                break;
-                        }
-                    }
-                    catch (TTransportException)
-                    {
-                        //Usually a client disconnect, expected
-                    }
-                    catch (Exception x)
-                    {
-                        //Unexpected
-                        logDelegate("Error: " + x);
-                    }
-
-                    //Fire deleteContext server event after client disconnects
-                    if (serverEventHandler != null)
-                        serverEventHandler.deleteContext(connectionContext, inputProtocol, outputProtocol);
-
-                    lock (clientLock)
-                    {
-                        clientThreads.Remove(Thread.CurrentThread);
-                        Monitor.Pulse(clientLock);
-                    }
-
-                }
-                finally
-                {
-                    //Close transports
-                    if (inputTransport != null)
-                        inputTransport.Close();
-                    if (outputTransport != null)
-                        outputTransport.Close();
-
-                    // disposable stuff should be disposed
-                    if (inputProtocol != null)
-                        inputProtocol.Dispose();
-                    if (outputProtocol != null)
-                        outputProtocol.Dispose();
-                }
-            }
-        }
-
-        public override void Stop()
-        {
-            stop = true;
-            serverTransport.Close();
-            //clean up all the threads myself
-            workerThread.Abort();
-            foreach (Thread t in clientThreads)
-            {
-                t.Abort();
-            }
-        }
-    }
-}
diff --git a/lib/csharp/src/TApplicationException.cs b/lib/csharp/src/TApplicationException.cs
deleted file mode 100644
index 8dd7ae5..0000000
--- a/lib/csharp/src/TApplicationException.cs
+++ /dev/null
@@ -1,146 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- * Contains some contributions under the Thrift Software License.
- * Please see doc/old-thrift-license.txt in the Thrift distribution for
- * details.
- */
-
-using System;
-using Thrift.Protocol;
-
-namespace Thrift
-{
-    public class TApplicationException : TException
-    {
-        protected ExceptionType type;
-
-        public TApplicationException()
-        {
-        }
-
-        public TApplicationException(ExceptionType type)
-        {
-            this.type = type;
-        }
-
-        public TApplicationException(ExceptionType type, string message)
-            : base(message, null) // TApplicationException is serializable, but we never serialize InnerException
-        {
-            this.type = type;
-        }
-
-        public static TApplicationException Read(TProtocol iprot)
-        {
-            TField field;
-
-            string message = null;
-            ExceptionType type = ExceptionType.Unknown;
-
-            iprot.ReadStructBegin();
-            while (true)
-            {
-                field = iprot.ReadFieldBegin();
-                if (field.Type == TType.Stop)
-                {
-                    break;
-                }
-
-                switch (field.ID)
-                {
-                    case 1:
-                        if (field.Type == TType.String)
-                        {
-                            message = iprot.ReadString();
-                        }
-                        else
-                        {
-                            TProtocolUtil.Skip(iprot, field.Type);
-                        }
-                        break;
-                    case 2:
-                        if (field.Type == TType.I32)
-                        {
-                            type = (ExceptionType)iprot.ReadI32();
-                        }
-                        else
-                        {
-                            TProtocolUtil.Skip(iprot, field.Type);
-                        }
-                        break;
-                    default:
-                        TProtocolUtil.Skip(iprot, field.Type);
-                        break;
-                }
-
-                iprot.ReadFieldEnd();
-            }
-
-            iprot.ReadStructEnd();
-
-            return new TApplicationException(type, message);
-        }
-
-        public void Write(TProtocol oprot)
-        {
-            TStruct struc = new TStruct("TApplicationException");
-            TField field = new TField();
-
-            oprot.WriteStructBegin(struc);
-
-            if (!string.IsNullOrEmpty(Message))
-            {
-                field.Name = "message";
-                field.Type = TType.String;
-                field.ID = 1;
-                oprot.WriteFieldBegin(field);
-                oprot.WriteString(Message);
-                oprot.WriteFieldEnd();
-            }
-
-            field.Name = "type";
-            field.Type = TType.I32;
-            field.ID = 2;
-            oprot.WriteFieldBegin(field);
-            oprot.WriteI32((int)type);
-            oprot.WriteFieldEnd();
-            oprot.WriteFieldStop();
-            oprot.WriteStructEnd();
-        }
-
-        public enum ExceptionType
-        {
-            Unknown,
-            UnknownMethod,
-            InvalidMessageType,
-            WrongMethodName,
-            BadSequenceID,
-            MissingResult,
-            InternalError,
-            ProtocolError,
-            InvalidTransform,
-            InvalidProtocol,
-            UnsupportedClientType
-        }
-
-        public ExceptionType Type
-        {
-            get { return type; }
-        }
-    }
-}
diff --git a/lib/csharp/src/TAsyncProcessor.cs b/lib/csharp/src/TAsyncProcessor.cs
deleted file mode 100644
index ab43225..0000000
--- a/lib/csharp/src/TAsyncProcessor.cs
+++ /dev/null
@@ -1,38 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-using System.Threading.Tasks;
-using Thrift.Protocol;
-
-namespace Thrift
-{
-    /// <summary>
-    /// Processes a message asynchronously.
-    /// </summary>
-    public interface TAsyncProcessor
-    {
-        /// <summary>
-        /// Processes the next part of the message.
-        /// </summary>
-        /// <param name="iprot">The input protocol.</param>
-        /// <param name="oprot">The output protocol.</param>
-        /// <returns>true if there's more to process, false otherwise.</returns>
-        Task<bool> ProcessAsync(TProtocol iprot, TProtocol oprot);
-    }
-}
diff --git a/lib/csharp/src/TControllingHandler.cs b/lib/csharp/src/TControllingHandler.cs
deleted file mode 100644
index 7b5203a..0000000
--- a/lib/csharp/src/TControllingHandler.cs
+++ /dev/null
@@ -1,29 +0,0 @@
-﻿/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-using System;
-using Thrift.Server;
-
-namespace Thrift
-{
-    public interface TControllingHandler
-    {
-        TServer server { get; set; }
-    }
-}
diff --git a/lib/csharp/src/TException.cs b/lib/csharp/src/TException.cs
deleted file mode 100644
index b9fae6e..0000000
--- a/lib/csharp/src/TException.cs
+++ /dev/null
@@ -1,40 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- * Contains some contributions under the Thrift Software License.
- * Please see doc/old-thrift-license.txt in the Thrift distribution for
- * details.
- */
-
-using System;
-
-namespace Thrift
-{
-    public class TException : Exception
-    {
-        public TException()
-        {
-        }
-
-        public TException(string message, Exception inner = null)
-            : base(message, inner)
-        {
-        }
-
-    }
-}
diff --git a/lib/csharp/src/TProcessor.cs b/lib/csharp/src/TProcessor.cs
deleted file mode 100644
index 71ce755..0000000
--- a/lib/csharp/src/TProcessor.cs
+++ /dev/null
@@ -1,33 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- * Contains some contributions under the Thrift Software License.
- * Please see doc/old-thrift-license.txt in the Thrift distribution for
- * details.
- */
-
-using System;
-using Thrift.Protocol;
-
-namespace Thrift
-{
-    public interface TProcessor
-    {
-        bool Process(TProtocol iprot, TProtocol oprot);
-    }
-}
diff --git a/lib/csharp/src/TProcessorFactory.cs b/lib/csharp/src/TProcessorFactory.cs
deleted file mode 100644
index fdf631b..0000000
--- a/lib/csharp/src/TProcessorFactory.cs
+++ /dev/null
@@ -1,30 +0,0 @@
-﻿/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-using System;
-using Thrift.Server;
-using Thrift.Transport;
-
-namespace Thrift
-{
-    public interface TProcessorFactory
-    {
-        TProcessor GetProcessor(TTransport trans, TServer server = null);
-    }
-}
diff --git a/lib/csharp/src/TPrototypeProcessorFactory.cs b/lib/csharp/src/TPrototypeProcessorFactory.cs
deleted file mode 100644
index 0b47261..0000000
--- a/lib/csharp/src/TPrototypeProcessorFactory.cs
+++ /dev/null
@@ -1,55 +0,0 @@
-﻿/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using Thrift.Server;
-using Thrift.Transport;
-
-namespace Thrift
-{
-    public class TPrototypeProcessorFactory<P, H> : TProcessorFactory where P : TProcessor
-    {
-        object[] handlerArgs = null;
-
-        public TPrototypeProcessorFactory()
-        {
-            handlerArgs = new object[0];
-        }
-
-        public TPrototypeProcessorFactory(params object[] handlerArgs)
-        {
-            this.handlerArgs = handlerArgs;
-        }
-
-        public TProcessor GetProcessor(TTransport trans, TServer server = null)
-        {
-            H handler = (H)Activator.CreateInstance(typeof(H), handlerArgs);
-
-            TControllingHandler handlerServerRef = handler as TControllingHandler;
-            if (handlerServerRef != null)
-            {
-                handlerServerRef.server = server;
-            }
-            return Activator.CreateInstance(typeof(P), new object[] { handler }) as TProcessor;
-        }
-    }
-}
diff --git a/lib/csharp/src/TSingletonProcessorFactory.cs b/lib/csharp/src/TSingletonProcessorFactory.cs
deleted file mode 100644
index ed2897b..0000000
--- a/lib/csharp/src/TSingletonProcessorFactory.cs
+++ /dev/null
@@ -1,43 +0,0 @@
-﻿/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using Thrift.Server;
-using Thrift.Transport;
-
-namespace Thrift
-{
-    public class TSingletonProcessorFactory : TProcessorFactory
-    {
-        private readonly TProcessor processor_;
-
-        public TSingletonProcessorFactory(TProcessor processor)
-        {
-            processor_ = processor;
-        }
-
-        public TProcessor GetProcessor(TTransport trans, TServer server = null)
-        {
-            return processor_;
-        }
-    }
-}
diff --git a/lib/csharp/src/Thrift.45.csproj b/lib/csharp/src/Thrift.45.csproj
deleted file mode 100644
index 146e7f8..0000000
--- a/lib/csharp/src/Thrift.45.csproj
+++ /dev/null
@@ -1,138 +0,0 @@
-﻿<?xml version="1.0" encoding="utf-8"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements. See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership. The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License. You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied. See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <PropertyGroup>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <ProjectGuid>{EBCE35DA-CF6A-42BC-A357-A9C09B534299}</ProjectGuid>
-    <OutputType>Library</OutputType>
-    <AppDesignerFolder>Properties</AppDesignerFolder>
-    <RootNamespace>Thrift</RootNamespace>
-    <AssemblyName>Thrift45</AssemblyName>
-    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
-    <FileAlignment>512</FileAlignment>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
-    <DebugSymbols>true</DebugSymbols>
-    <DebugType>portable</DebugType>
-    <Optimize>false</Optimize>
-    <OutputPath>bin\Debug\</OutputPath>
-    <DefineConstants>TRACE;DEBUG;NET45</DefineConstants>
-    <ErrorReport>prompt</ErrorReport>
-    <WarningLevel>4</WarningLevel>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
-    <DebugType>portable</DebugType>
-    <Optimize>true</Optimize>
-    <OutputPath>bin\Release\</OutputPath>
-    <DefineConstants>TRACE;NET45</DefineConstants>
-    <ErrorReport>prompt</ErrorReport>
-    <WarningLevel>4</WarningLevel>
-  </PropertyGroup>
-  <PropertyGroup>
-    <SignAssembly>true</SignAssembly>
-  </PropertyGroup>
-  <PropertyGroup>
-    <AssemblyOriginatorKeyFile>thrift.snk</AssemblyOriginatorKeyFile>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="System" />
-    <Reference Include="System.Core" />
-    <Reference Include="System.Web" />
-    <Reference Include="System.Xml.Linq" />
-    <Reference Include="System.Data.DataSetExtensions" />
-    <Reference Include="Microsoft.CSharp" />
-    <Reference Include="System.Data" />
-    <Reference Include="System.Xml" />
-  </ItemGroup>
-  <ItemGroup>
-    <Compile Include="Collections\TCollections.cs" />
-    <Compile Include="Collections\THashSet.cs" />
-    <Compile Include="Properties\AssemblyInfo.cs" />
-    <Compile Include="Protocol\TAbstractBase.cs" />
-    <Compile Include="Protocol\TBase.cs" />
-    <Compile Include="Protocol\TBase64Utils.cs" />
-    <Compile Include="Protocol\TBinaryProtocol.cs" />
-    <Compile Include="Protocol\TCompactProtocol.cs" />
-    <Compile Include="Protocol\TField.cs" />
-    <Compile Include="Protocol\TJSONProtocol.cs" />
-    <Compile Include="Protocol\TList.cs" />
-    <Compile Include="Protocol\TMap.cs" />
-    <Compile Include="Protocol\TMessage.cs" />
-    <Compile Include="Protocol\TMessageType.cs" />
-    <Compile Include="Protocol\TMultiplexedProcessor.cs" />
-    <Compile Include="Protocol\TMultiplexedProtocol.cs" />
-    <Compile Include="Protocol\TProtocol.cs" />
-    <Compile Include="Protocol\TProtocolDecorator.cs" />
-    <Compile Include="Protocol\TProtocolException.cs" />
-    <Compile Include="Protocol\TProtocolFactory.cs" />
-    <Compile Include="Protocol\TProtocolUtil.cs" />
-    <Compile Include="Protocol\TSet.cs" />
-    <Compile Include="Protocol\TStruct.cs" />
-    <Compile Include="Protocol\TType.cs" />
-    <Compile Include="Server\TServer.cs" />
-    <Compile Include="Server\TServerEventHandler.cs" />
-    <Compile Include="Server\TSimpleServer.cs" />
-    <Compile Include="Server\TThreadedServer.cs" />
-    <Compile Include="Server\TThreadPoolServer.cs" />
-    <Compile Include="TApplicationException.cs" />
-    <Compile Include="TAsyncProcessor.cs" />
-    <Compile Include="TControllingHandler.cs" />
-    <Compile Include="TException.cs" />
-    <Compile Include="TProcessor.cs" />
-    <Compile Include="TProcessorFactory.cs" />
-    <Compile Include="TPrototypeProcessorFactory.cs" />
-    <Compile Include="Transport\TBufferedTransport.cs" />
-    <Compile Include="Transport\TFramedTransport.cs" />
-    <Compile Include="Transport\THttpClient.cs" />
-    <Compile Include="Transport\THttpHandler.cs" />
-    <Compile Include="Transport\THttpTaskAsyncHandler.cs" />
-    <Compile Include="Transport\TMemoryBuffer.cs" />
-    <Compile Include="Transport\TNamedPipeClientTransport.cs" />
-    <Compile Include="Transport\TNamedPipeServerTransport.cs" />
-    <Compile Include="Transport\TServerSocket.cs" />
-    <Compile Include="Transport\TServerTransport.cs" />
-    <Compile Include="Transport\TSilverlightSocket.cs" />
-    <Compile Include="Transport\TSocket.cs" />
-    <Compile Include="Transport\TSocketVersionizer.cs" />
-    <Compile Include="Transport\TStreamTransport.cs" />
-    <Compile Include="Transport\TTLSServerSocket.cs" />
-    <Compile Include="Transport\TTLSSocket.cs" />
-    <Compile Include="Transport\TTransport.cs" />
-    <Compile Include="Transport\TTransportException.cs" />
-    <Compile Include="Transport\TTransportFactory.cs" />
-    <Compile Include="TSingletonProcessorFactory.cs" />
-  </ItemGroup>
-  <ItemGroup>
-    <Folder Include="Server\Collections\" />
-    <Folder Include="Server\Protocol\" />
-  </ItemGroup>
-  <ItemGroup>
-    <None Include="thrift.snk" />
-  </ItemGroup>
-  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
-  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
-       Other similar extension points exist, see Microsoft.Common.targets.
-  <Target Name="BeforeBuild">
-  </Target>
-  <Target Name="AfterBuild">
-  </Target>
-  -->
-</Project>
\ No newline at end of file
diff --git a/lib/csharp/src/Thrift.csproj b/lib/csharp/src/Thrift.csproj
deleted file mode 100644
index 1305482..0000000
--- a/lib/csharp/src/Thrift.csproj
+++ /dev/null
@@ -1,166 +0,0 @@
-﻿<?xml version="1.0" encoding="utf-8"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements. See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership. The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License. You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied. See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <PropertyGroup>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <ProjectGuid>{499EB63C-D74C-47E8-AE48-A2FC94538E9D}</ProjectGuid>
-    <ProductVersion>9.0.21022</ProductVersion>
-    <SchemaVersion>2.0</SchemaVersion>
-    <OutputType>Library</OutputType>
-    <NoStandardLibraries>false</NoStandardLibraries>
-    <AssemblyName>Thrift</AssemblyName>
-    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
-    <FileAlignment>512</FileAlignment>
-    <RootNamespace>Thrift</RootNamespace>
-    <FileUpgradeFlags>
-    </FileUpgradeFlags>
-    <OldToolsVersion>3.5</OldToolsVersion>
-    <UpgradeBackupLocation />
-    <PublishUrl>publish\</PublishUrl>
-    <Install>true</Install>
-    <InstallFrom>Disk</InstallFrom>
-    <UpdateEnabled>false</UpdateEnabled>
-    <UpdateMode>Foreground</UpdateMode>
-    <UpdateInterval>7</UpdateInterval>
-    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
-    <UpdatePeriodically>false</UpdatePeriodically>
-    <UpdateRequired>false</UpdateRequired>
-    <MapFileExtensions>true</MapFileExtensions>
-    <ApplicationRevision>0</ApplicationRevision>
-    <ApplicationVersion>0.14.0.0</ApplicationVersion>
-    <IsWebBootstrapper>false</IsWebBootstrapper>
-    <UseApplicationTrust>false</UseApplicationTrust>
-    <BootstrapperEnabled>true</BootstrapperEnabled>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
-    <DebugSymbols>true</DebugSymbols>
-    <DebugType>portable</DebugType>
-    <Optimize>false</Optimize>
-    <OutputPath>bin\Debug\</OutputPath>
-    <DefineConstants>TRACE;DEBUG</DefineConstants>
-    <ErrorReport>prompt</ErrorReport>
-    <WarningLevel>4</WarningLevel>
-    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
-    <DebugType>portable</DebugType>
-    <Optimize>true</Optimize>
-    <OutputPath>bin\Release\</OutputPath>
-    <DefineConstants>
-    </DefineConstants>
-    <ErrorReport>prompt</ErrorReport>
-    <WarningLevel>4</WarningLevel>
-    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
-  </PropertyGroup>
-  <PropertyGroup>
-    <SignAssembly>true</SignAssembly>
-  </PropertyGroup>
-  <PropertyGroup>
-    <AssemblyOriginatorKeyFile>thrift.snk</AssemblyOriginatorKeyFile>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="System" />
-    <Reference Include="System.Core">
-      <RequiredTargetFramework>3.5</RequiredTargetFramework>
-    </Reference>
-    <Reference Include="System.Web" />
-  </ItemGroup>
-  <ItemGroup>
-    <Compile Include="Collections\TCollections.cs" />
-    <Compile Include="Collections\THashSet.cs" />
-    <Compile Include="Net35\ExtensionsNet35.cs" />
-    <Compile Include="Properties\AssemblyInfo.cs" />
-    <Compile Include="Protocol\TAbstractBase.cs" />
-    <Compile Include="Protocol\TBase.cs" />
-    <Compile Include="Protocol\TBase64Utils.cs" />
-    <Compile Include="Protocol\TBinaryProtocol.cs" />
-    <Compile Include="Protocol\TCompactProtocol.cs" />
-    <Compile Include="Protocol\TField.cs" />
-    <Compile Include="Protocol\TJSONProtocol.cs" />
-    <Compile Include="Protocol\TList.cs" />
-    <Compile Include="Protocol\TMap.cs" />
-    <Compile Include="Protocol\TMessage.cs" />
-    <Compile Include="Protocol\TMessageType.cs" />
-    <Compile Include="Protocol\TMultiplexedProcessor.cs" />
-    <Compile Include="Protocol\TMultiplexedProtocol.cs" />
-    <Compile Include="Protocol\TProtocol.cs" />
-    <Compile Include="Protocol\TProtocolDecorator.cs" />
-    <Compile Include="Protocol\TProtocolException.cs" />
-    <Compile Include="Protocol\TProtocolFactory.cs" />
-    <Compile Include="Protocol\TProtocolUtil.cs" />
-    <Compile Include="Protocol\TSet.cs" />
-    <Compile Include="Protocol\TStruct.cs" />
-    <Compile Include="Protocol\TType.cs" />
-    <Compile Include="Server\TServer.cs" />
-    <Compile Include="Server\TServerEventHandler.cs" />
-    <Compile Include="Server\TSimpleServer.cs" />
-    <Compile Include="Server\TThreadedServer.cs" />
-    <Compile Include="Server\TThreadPoolServer.cs" />
-    <Compile Include="TApplicationException.cs" />
-    <Compile Include="TControllingHandler.cs" />
-    <Compile Include="TException.cs" />
-    <Compile Include="TProcessor.cs" />
-    <Compile Include="TProcessorFactory.cs" />
-    <Compile Include="TPrototypeProcessorFactory.cs" />
-    <Compile Include="Transport\TBufferedTransport.cs" />
-    <Compile Include="Transport\TFramedTransport.cs" />
-    <Compile Include="Transport\THttpClient.cs" />
-    <Compile Include="Transport\THttpHandler.cs" />
-    <Compile Include="Transport\TMemoryBuffer.cs" />
-    <Compile Include="Transport\TNamedPipeClientTransport.cs" />
-    <Compile Include="Transport\TNamedPipeServerTransport.cs" />
-    <Compile Include="Transport\TServerSocket.cs" />
-    <Compile Include="Transport\TServerTransport.cs" />
-    <Compile Include="Transport\TSocket.cs" />
-    <Compile Include="Transport\TSocketVersionizer.cs" />
-    <Compile Include="Transport\TStreamTransport.cs" />
-    <Compile Include="Transport\TTLSServerSocket.cs" />
-    <Compile Include="Transport\TTLSSocket.cs" />
-    <Compile Include="Transport\TTransport.cs" />
-    <Compile Include="Transport\TTransportException.cs" />
-    <Compile Include="Transport\TTransportFactory.cs" />
-    <Compile Include="TSingletonProcessorFactory.cs" />
-  </ItemGroup>
-  <ItemGroup>
-    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
-      <Visible>False</Visible>
-      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
-      <Install>false</Install>
-    </BootstrapperPackage>
-    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
-      <Visible>False</Visible>
-      <ProductName>.NET Framework 3.5 SP1</ProductName>
-      <Install>true</Install>
-    </BootstrapperPackage>
-    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
-      <Visible>False</Visible>
-      <ProductName>Windows Installer 3.1</ProductName>
-      <Install>true</Install>
-    </BootstrapperPackage>
-  </ItemGroup>
-  <ItemGroup>
-    <None Include="thrift.snk" />
-  </ItemGroup>
-  <Import Project="$(MSBuildBinPath)\Microsoft.CSHARP.Targets" />
-  <ProjectExtensions>
-    <VisualStudio AllowExistingFolder="true" />
-  </ProjectExtensions>
-</Project>
\ No newline at end of file
diff --git a/lib/csharp/src/Thrift.sln b/lib/csharp/src/Thrift.sln
deleted file mode 100644
index a29e468..0000000
--- a/lib/csharp/src/Thrift.sln
+++ /dev/null
@@ -1,47 +0,0 @@
-﻿
-Microsoft Visual Studio Solution File, Format Version 11.00
-# Visual Studio 2010
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Thrift", "Thrift.csproj", "{499EB63C-D74C-47E8-AE48-A2FC94538E9D}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ThriftTest", "..\test\ThriftTest\ThriftTest.csproj", "{48DD757F-CA95-4DD7-BDA4-58DB6F108C2C}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ThriftMSBuildTask", "..\ThriftMSBuildTask\ThriftMSBuildTask.csproj", "{EC0A0231-66EA-4593-A792-C6CA3BB8668E}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Thrift.45", "Thrift.45.csproj", "{EBCE35DA-CF6A-42BC-A357-A9C09B534299}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ThriftMVCTest", "..\test\ThriftMVCTest\ThriftMVCTest.csproj", "{891B4487-C7BA-427E-BBC8-4C596C229A10}"
-EndProject
-Global
-	GlobalSection(SolutionConfigurationPlatforms) = preSolution
-		Debug|Any CPU = Debug|Any CPU
-		Release|Any CPU = Release|Any CPU
-	EndGlobalSection
-	GlobalSection(ProjectConfigurationPlatforms) = postSolution
-		{499EB63C-D74C-47E8-AE48-A2FC94538E9D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{499EB63C-D74C-47E8-AE48-A2FC94538E9D}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{499EB63C-D74C-47E8-AE48-A2FC94538E9D}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{499EB63C-D74C-47E8-AE48-A2FC94538E9D}.Release|Any CPU.Build.0 = Release|Any CPU
-		{48DD757F-CA95-4DD7-BDA4-58DB6F108C2C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{48DD757F-CA95-4DD7-BDA4-58DB6F108C2C}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{48DD757F-CA95-4DD7-BDA4-58DB6F108C2C}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{48DD757F-CA95-4DD7-BDA4-58DB6F108C2C}.Release|Any CPU.Build.0 = Release|Any CPU
-		{EC0A0231-66EA-4593-A792-C6CA3BB8668E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{EC0A0231-66EA-4593-A792-C6CA3BB8668E}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{EC0A0231-66EA-4593-A792-C6CA3BB8668E}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{EC0A0231-66EA-4593-A792-C6CA3BB8668E}.Release|Any CPU.Build.0 = Release|Any CPU
-		{EBCE35DA-CF6A-42BC-A357-A9C09B534299}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{EBCE35DA-CF6A-42BC-A357-A9C09B534299}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{EBCE35DA-CF6A-42BC-A357-A9C09B534299}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{EBCE35DA-CF6A-42BC-A357-A9C09B534299}.Release|Any CPU.Build.0 = Release|Any CPU
-		{891B4487-C7BA-427E-BBC8-4C596C229A10}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{891B4487-C7BA-427E-BBC8-4C596C229A10}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{891B4487-C7BA-427E-BBC8-4C596C229A10}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{891B4487-C7BA-427E-BBC8-4C596C229A10}.Release|Any CPU.Build.0 = Release|Any CPU
-	EndGlobalSection
-	GlobalSection(SolutionProperties) = preSolution
-		HideSolutionNode = FALSE
-	EndGlobalSection
-	GlobalSection(MonoDevelopProperties) = preSolution
-		        StartupItem = Thrift.csproj
-	EndGlobalSection
-EndGlobal
diff --git a/lib/csharp/src/Transport/TBufferedTransport.cs b/lib/csharp/src/Transport/TBufferedTransport.cs
deleted file mode 100644
index 8870988..0000000
--- a/lib/csharp/src/Transport/TBufferedTransport.cs
+++ /dev/null
@@ -1,194 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-using System;
-using System.IO;
-
-namespace Thrift.Transport
-{
-    public class TBufferedTransport : TTransport, IDisposable
-    {
-        private readonly int bufSize;
-        private readonly MemoryStream inputBuffer = new MemoryStream(0);
-        private readonly MemoryStream outputBuffer = new MemoryStream(0);
-        private readonly TTransport transport;
-
-        public TBufferedTransport(TTransport transport, int bufSize = 1024)
-        {
-            if (transport == null)
-                throw new ArgumentNullException("transport");
-            if (bufSize <= 0)
-                throw new ArgumentException("bufSize", "Buffer size must be a positive number.");
-            this.transport = transport;
-            this.bufSize = bufSize;
-        }
-
-        public TTransport UnderlyingTransport
-        {
-            get
-            {
-                CheckNotDisposed();
-                return transport;
-            }
-        }
-
-        public override bool IsOpen
-        {
-            get
-            {
-                // We can legitimately throw here but be nice a bit.
-                // CheckNotDisposed();
-                return !_IsDisposed && transport.IsOpen;
-            }
-        }
-
-        public override void Open()
-        {
-            CheckNotDisposed();
-            transport.Open();
-        }
-
-        public override void Close()
-        {
-            CheckNotDisposed();
-            transport.Close();
-        }
-
-        public override int Read(byte[] buf, int off, int len)
-        {
-            CheckNotDisposed();
-            ValidateBufferArgs(buf, off, len);
-            if (!IsOpen)
-                throw new TTransportException(TTransportException.ExceptionType.NotOpen);
-
-            if (inputBuffer.Capacity < bufSize)
-                inputBuffer.Capacity = bufSize;
-
-            while (true)
-            {
-                int got = inputBuffer.Read(buf, off, len);
-                if (got > 0)
-                    return got;
-
-                inputBuffer.Seek(0, SeekOrigin.Begin);
-                inputBuffer.SetLength(inputBuffer.Capacity);
-                int filled = transport.Read(inputBuffer.GetBuffer(), 0, (int)inputBuffer.Length);
-                inputBuffer.SetLength(filled);
-                if (filled == 0)
-                    return 0;
-            }
-        }
-
-        public override void Write(byte[] buf, int off, int len)
-        {
-            CheckNotDisposed();
-            ValidateBufferArgs(buf, off, len);
-            if (!IsOpen)
-                throw new TTransportException(TTransportException.ExceptionType.NotOpen);
-            // Relative offset from "off" argument
-            int offset = 0;
-            if (outputBuffer.Length > 0)
-            {
-                int capa = (int)(outputBuffer.Capacity - outputBuffer.Length);
-                int writeSize = capa <= len ? capa : len;
-                outputBuffer.Write(buf, off, writeSize);
-                offset += writeSize;
-                if (writeSize == capa)
-                {
-                    transport.Write(outputBuffer.GetBuffer(), 0, (int)outputBuffer.Length);
-                    outputBuffer.SetLength(0);
-                }
-            }
-            while (len - offset >= bufSize)
-            {
-                transport.Write(buf, off + offset, bufSize);
-                offset += bufSize;
-            }
-            int remain = len - offset;
-            if (remain > 0)
-            {
-                if (outputBuffer.Capacity < bufSize)
-                    outputBuffer.Capacity = bufSize;
-                outputBuffer.Write(buf, off + offset, remain);
-            }
-        }
-
-        private void InternalFlush()
-        {
-            if (!IsOpen)
-                throw new TTransportException(TTransportException.ExceptionType.NotOpen);
-            if (outputBuffer.Length > 0)
-            {
-                transport.Write(outputBuffer.GetBuffer(), 0, (int)outputBuffer.Length);
-                outputBuffer.SetLength(0);
-            }
-        }
-
-        public override void Flush()
-        {
-            CheckNotDisposed();
-            InternalFlush();
-
-            transport.Flush();
-        }
-
-        public override IAsyncResult BeginFlush(AsyncCallback callback, object state)
-        {
-            CheckNotDisposed();
-            InternalFlush();
-
-            return transport.BeginFlush( callback, state);
-        }
-
-        public override void EndFlush(IAsyncResult asyncResult)
-        {
-            transport.EndFlush( asyncResult);
-        }
-
-
-
-        protected void CheckNotDisposed()
-        {
-            if (_IsDisposed)
-                throw new ObjectDisposedException("TBufferedTransport");
-        }
-
-        #region " IDisposable Support "
-        protected bool _IsDisposed { get; private set; }
-
-        // IDisposable
-        protected override void Dispose(bool disposing)
-        {
-            if (!_IsDisposed)
-            {
-                if (disposing)
-                {
-                    if (inputBuffer != null)
-                        inputBuffer.Dispose();
-                    if (outputBuffer != null)
-                        outputBuffer.Dispose();
-                    if (transport != null)
-                        transport.Dispose();
-                }
-            }
-            _IsDisposed = true;
-        }
-        #endregion
-    }
-}
diff --git a/lib/csharp/src/Transport/TFramedTransport.cs b/lib/csharp/src/Transport/TFramedTransport.cs
deleted file mode 100644
index a746a32..0000000
--- a/lib/csharp/src/Transport/TFramedTransport.cs
+++ /dev/null
@@ -1,205 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-using System;
-using System.IO;
-
-namespace Thrift.Transport
-{
-    public class TFramedTransport : TTransport, IDisposable
-    {
-        private readonly TTransport transport;
-        private readonly MemoryStream writeBuffer = new MemoryStream(1024);
-        private readonly MemoryStream readBuffer = new MemoryStream(1024);
-
-        private const int HeaderSize = 4;
-        private readonly byte[] headerBuf = new byte[HeaderSize];
-
-        public class Factory : TTransportFactory
-        {
-            public override TTransport GetTransport(TTransport trans)
-            {
-                return new TFramedTransport(trans);
-            }
-        }
-
-        public TFramedTransport(TTransport transport)
-        {
-            if (transport == null)
-                throw new ArgumentNullException("transport");
-            this.transport = transport;
-            InitWriteBuffer();
-        }
-
-        public override void Open()
-        {
-            CheckNotDisposed();
-            transport.Open();
-        }
-
-        public override bool IsOpen
-        {
-            get
-            {
-                // We can legitimately throw here but be nice a bit.
-                // CheckNotDisposed();
-                return !_IsDisposed && transport.IsOpen;
-            }
-        }
-
-        public override void Close()
-        {
-            CheckNotDisposed();
-            transport.Close();
-        }
-
-        public override int Read(byte[] buf, int off, int len)
-        {
-            CheckNotDisposed();
-            ValidateBufferArgs(buf, off, len);
-            if (!IsOpen)
-                throw new TTransportException(TTransportException.ExceptionType.NotOpen);
-            int got = readBuffer.Read(buf, off, len);
-            if (got > 0)
-            {
-                return got;
-            }
-
-            // Read another frame of data
-            ReadFrame();
-
-            return readBuffer.Read(buf, off, len);
-        }
-
-        private void ReadFrame()
-        {
-            transport.ReadAll(headerBuf, 0, HeaderSize);
-            int size = DecodeFrameSize(headerBuf);
-
-            readBuffer.SetLength(size);
-            readBuffer.Seek(0, SeekOrigin.Begin);
-            byte[] buff = readBuffer.GetBuffer();
-            transport.ReadAll(buff, 0, size);
-        }
-
-        public override void Write(byte[] buf, int off, int len)
-        {
-            CheckNotDisposed();
-            ValidateBufferArgs(buf, off, len);
-            if (!IsOpen)
-                throw new TTransportException(TTransportException.ExceptionType.NotOpen);
-            if (writeBuffer.Length + (long)len > (long)int.MaxValue)
-                Flush();
-            writeBuffer.Write(buf, off, len);
-        }
-
-        private void InternalFlush()
-        {
-            CheckNotDisposed();
-            if (!IsOpen)
-                throw new TTransportException(TTransportException.ExceptionType.NotOpen);
-            byte[] buf = writeBuffer.GetBuffer();
-            int len = (int)writeBuffer.Length;
-            int data_len = len - HeaderSize;
-            if (data_len < 0)
-                throw new System.InvalidOperationException(); // logic error actually
-
-            // Inject message header into the reserved buffer space
-            EncodeFrameSize(data_len, buf);
-
-            // Send the entire message at once
-            transport.Write(buf, 0, len);
-
-            InitWriteBuffer();
-        }
-
-        public override void Flush()
-        {
-            CheckNotDisposed();
-            InternalFlush();
-
-            transport.Flush();
-        }
-
-        public override IAsyncResult BeginFlush(AsyncCallback callback, object state)
-        {
-            CheckNotDisposed();
-            InternalFlush();
-
-            return transport.BeginFlush( callback, state);
-        }
-
-        public override void EndFlush(IAsyncResult asyncResult)
-        {
-            transport.EndFlush( asyncResult);
-        }
-
-        private void InitWriteBuffer()
-        {
-            // Reserve space for message header to be put right before sending it out
-            writeBuffer.SetLength(HeaderSize);
-            writeBuffer.Seek(0, SeekOrigin.End);
-        }
-
-        private static void EncodeFrameSize(int frameSize, byte[] buf)
-        {
-            buf[0] = (byte)(0xff & (frameSize >> 24));
-            buf[1] = (byte)(0xff & (frameSize >> 16));
-            buf[2] = (byte)(0xff & (frameSize >> 8));
-            buf[3] = (byte)(0xff & (frameSize));
-        }
-
-        private static int DecodeFrameSize(byte[] buf)
-        {
-            return
-                ((buf[0] & 0xff) << 24) |
-                ((buf[1] & 0xff) << 16) |
-                ((buf[2] & 0xff) << 8) |
-                ((buf[3] & 0xff));
-        }
-
-
-        private void CheckNotDisposed()
-        {
-            if (_IsDisposed)
-                throw new ObjectDisposedException("TFramedTransport");
-        }
-
-        #region " IDisposable Support "
-        private bool _IsDisposed;
-
-        // IDisposable
-        protected override void Dispose(bool disposing)
-        {
-            if (!_IsDisposed)
-            {
-                if (disposing)
-                {
-                    if (readBuffer != null)
-                        readBuffer.Dispose();
-                    if (writeBuffer != null)
-                        writeBuffer.Dispose();
-                    if (transport != null)
-                        transport.Dispose();
-                }
-            }
-            _IsDisposed = true;
-        }
-        #endregion
-    }
-}
diff --git a/lib/csharp/src/Transport/THttpClient.cs b/lib/csharp/src/Transport/THttpClient.cs
deleted file mode 100644
index 986799c..0000000
--- a/lib/csharp/src/Transport/THttpClient.cs
+++ /dev/null
@@ -1,486 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- *
- */
-
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Net;
-using System.Threading;
-using System.Linq;
-using System.Security.Cryptography.X509Certificates;
-using System.IO.Compression;
-
-namespace Thrift.Transport
-{
-    public class THttpClient : TTransport, IDisposable
-    {
-        private readonly Uri uri;
-        private readonly X509Certificate[] certificates;
-        private Stream inputStream;
-        private MemoryStream outputStream = new MemoryStream();
-
-        // Timeouts in milliseconds
-        private int connectTimeout = 30000;
-
-        private int readTimeout = 30000;
-
-        private IDictionary<string, string> customHeaders = new Dictionary<string, string>();
-        private string userAgent = "C#/THttpClient";
-
-#if !SILVERLIGHT
-        private IWebProxy proxy = WebRequest.DefaultWebProxy;
-#endif
-
-        public THttpClient(Uri u)
-            : this(u, Enumerable.Empty<X509Certificate>())
-        {
-        }
-        public THttpClient(Uri u, string userAgent)
-            : this(u, userAgent, Enumerable.Empty<X509Certificate>())
-        {
-        }
-
-        public THttpClient(Uri u, IEnumerable<X509Certificate> certificates)
-        {
-            uri = u;
-            this.certificates = (certificates ?? Enumerable.Empty<X509Certificate>()).ToArray();
-        }
-        public THttpClient(Uri u, string userAgent, IEnumerable<X509Certificate> certificates)
-        {
-            uri = u;
-            this.userAgent = userAgent;
-            this.certificates = (certificates ?? Enumerable.Empty<X509Certificate>()).ToArray();
-        }
-
-        public int ConnectTimeout
-        {
-            set
-            {
-                connectTimeout = value;
-            }
-        }
-
-        public int ReadTimeout
-        {
-            set
-            {
-                readTimeout = value;
-            }
-        }
-
-        public IDictionary<string, string> CustomHeaders
-        {
-            get
-            {
-                return customHeaders;
-            }
-        }
-
-#if !SILVERLIGHT
-        public IWebProxy Proxy
-        {
-            set
-            {
-                proxy = value;
-            }
-        }
-#endif
-
-        public override bool IsOpen
-        {
-            get
-            {
-                return true;
-            }
-        }
-
-        public override void Open()
-        {
-        }
-
-        public override void Close()
-        {
-            if (inputStream != null)
-            {
-                inputStream.Close();
-                inputStream = null;
-            }
-            if (outputStream != null)
-            {
-                outputStream.Close();
-                outputStream = null;
-            }
-        }
-
-        public override int Read(byte[] buf, int off, int len)
-        {
-            if (inputStream == null)
-            {
-                throw new TTransportException(TTransportException.ExceptionType.NotOpen, "No request has been sent");
-            }
-
-            try
-            {
-                int ret = inputStream.Read(buf, off, len);
-
-                if (ret == -1)
-                {
-                    throw new TTransportException(TTransportException.ExceptionType.EndOfFile, "No more data available");
-                }
-
-                return ret;
-            }
-            catch (IOException iox)
-            {
-                throw new TTransportException(TTransportException.ExceptionType.Unknown, iox.ToString(), iox);
-            }
-        }
-
-        public override void Write(byte[] buf, int off, int len)
-        {
-            outputStream.Write(buf, off, len);
-        }
-
-#if !SILVERLIGHT
-        public override void Flush()
-        {
-            try
-            {
-                SendRequest();
-            }
-            finally
-            {
-                outputStream = new MemoryStream();
-            }
-        }
-
-        private void SendRequest()
-        {
-            try
-            {
-                HttpWebRequest connection = CreateRequest();
-                connection.Headers.Add("Accept-Encoding", "gzip, deflate");
-
-                byte[] data = outputStream.ToArray();
-                connection.ContentLength = data.Length;
-
-                using (Stream requestStream = connection.GetRequestStream())
-                {
-                    requestStream.Write(data, 0, data.Length);
-
-                    // Resolve HTTP hang that can happens after successive calls by making sure
-                    // that we release the response and response stream. To support this, we copy
-                    // the response to a memory stream.
-                    using (var response = connection.GetResponse())
-                    {
-                        using (var responseStream = response.GetResponseStream())
-                        {
-                            // Copy the response to a memory stream so that we can
-                            // cleanly close the response and response stream.
-                            inputStream = new MemoryStream();
-                            byte[] buffer = new byte[8192];  // multiple of 4096
-                            int bytesRead;
-                            while ((bytesRead = responseStream.Read(buffer, 0, buffer.Length)) > 0)
-                            {
-                                inputStream.Write(buffer, 0, bytesRead);
-                            }
-                            inputStream.Seek(0, 0);
-                        }
-
-                        var encodings = response.Headers.GetValues("Content-Encoding");
-                        if (encodings != null)
-                        {
-                            foreach (var encoding in encodings)
-                            {
-                                switch (encoding)
-                                {
-                                    case "gzip":
-                                        DecompressGZipped(ref inputStream);
-                                        break;
-                                    case "deflate":
-                                        DecompressDeflated(ref inputStream);
-                                        break;
-                                    default:
-                                        break;
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-            catch (IOException iox)
-            {
-                throw new TTransportException(TTransportException.ExceptionType.Unknown, iox.ToString(), iox);
-            }
-            catch (WebException wx)
-            {
-                throw new TTransportException(TTransportException.ExceptionType.Unknown, "Couldn't connect to server: " + wx, wx);
-            }
-        }
-
-        private void DecompressDeflated(ref Stream inputStream)
-        {
-            var tmp = new MemoryStream();
-            using (var decomp = new DeflateStream(inputStream, CompressionMode.Decompress))
-            {
-                decomp.CopyTo(tmp);
-            }
-            inputStream.Dispose();
-            inputStream = tmp;
-            inputStream.Seek(0, 0);
-        }
-
-        private void DecompressGZipped(ref Stream inputStream)
-        {
-            var tmp = new MemoryStream();
-            using (var decomp = new GZipStream(inputStream, CompressionMode.Decompress))
-            {
-                decomp.CopyTo(tmp);
-            }
-            inputStream.Dispose();
-            inputStream = tmp;
-            inputStream.Seek(0, 0);
-        }
-#endif
-        private HttpWebRequest CreateRequest()
-        {
-            HttpWebRequest connection = (HttpWebRequest)WebRequest.Create(uri);
-
-
-#if !SILVERLIGHT
-            // Adding certificates through code is not supported with WP7 Silverlight
-            // see "Windows Phone 7 and Certificates_FINAL_121610.pdf"
-            connection.ClientCertificates.AddRange(certificates);
-
-            if (connectTimeout > 0)
-            {
-                connection.Timeout = connectTimeout;
-            }
-            if (readTimeout > 0)
-            {
-                connection.ReadWriteTimeout = readTimeout;
-            }
-#endif
-            // Make the request
-            connection.ContentType = "application/x-thrift";
-            connection.Accept = "application/x-thrift";
-            connection.UserAgent = userAgent;
-            connection.Method = "POST";
-#if !SILVERLIGHT
-            connection.ProtocolVersion = HttpVersion.Version10;
-#endif
-
-            //add custom headers here
-            foreach (KeyValuePair<string, string> item in customHeaders)
-            {
-#if !SILVERLIGHT
-                connection.Headers.Add(item.Key, item.Value);
-#else
-                connection.Headers[item.Key] = item.Value;
-#endif
-            }
-
-#if !SILVERLIGHT
-            connection.Proxy = proxy;
-#endif
-
-            return connection;
-        }
-
-        public override IAsyncResult BeginFlush(AsyncCallback callback, object state)
-        {
-            // Extract request and reset buffer
-            var data = outputStream.ToArray();
-
-            //requestBuffer_ = new MemoryStream();
-
-            try
-            {
-                // Create connection object
-                var flushAsyncResult = new FlushAsyncResult(callback, state);
-                flushAsyncResult.Connection = CreateRequest();
-
-                flushAsyncResult.Data = data;
-
-
-                flushAsyncResult.Connection.BeginGetRequestStream(GetRequestStreamCallback, flushAsyncResult);
-                return flushAsyncResult;
-
-            }
-            catch (IOException iox)
-            {
-                throw new TTransportException(iox.ToString(), iox);
-            }
-        }
-
-        public override void EndFlush(IAsyncResult asyncResult)
-        {
-            try
-            {
-                var flushAsyncResult = (FlushAsyncResult)asyncResult;
-
-                if (!flushAsyncResult.IsCompleted)
-                {
-                    var waitHandle = flushAsyncResult.AsyncWaitHandle;
-                    waitHandle.WaitOne();  // blocking INFINITEly
-                    waitHandle.Close();
-                }
-
-                if (flushAsyncResult.AsyncException != null)
-                {
-                    throw flushAsyncResult.AsyncException;
-                }
-            }
-            finally
-            {
-                outputStream = new MemoryStream();
-            }
-
-        }
-
-        private void GetRequestStreamCallback(IAsyncResult asynchronousResult)
-        {
-            var flushAsyncResult = (FlushAsyncResult)asynchronousResult.AsyncState;
-            try
-            {
-                var reqStream = flushAsyncResult.Connection.EndGetRequestStream(asynchronousResult);
-                reqStream.Write(flushAsyncResult.Data, 0, flushAsyncResult.Data.Length);
-                reqStream.Flush();
-                reqStream.Close();
-
-                // Start the asynchronous operation to get the response
-                flushAsyncResult.Connection.BeginGetResponse(GetResponseCallback, flushAsyncResult);
-            }
-            catch (Exception exception)
-            {
-                flushAsyncResult.AsyncException = new TTransportException(exception.ToString(), exception);
-                flushAsyncResult.UpdateStatusToComplete();
-                flushAsyncResult.NotifyCallbackWhenAvailable();
-            }
-        }
-
-        private void GetResponseCallback(IAsyncResult asynchronousResult)
-        {
-            var flushAsyncResult = (FlushAsyncResult)asynchronousResult.AsyncState;
-            try
-            {
-                inputStream = flushAsyncResult.Connection.EndGetResponse(asynchronousResult).GetResponseStream();
-            }
-            catch (Exception exception)
-            {
-                flushAsyncResult.AsyncException = new TTransportException(exception.ToString(), exception);
-            }
-            flushAsyncResult.UpdateStatusToComplete();
-            flushAsyncResult.NotifyCallbackWhenAvailable();
-        }
-
-        // Based on http://msmvps.com/blogs/luisabreu/archive/2009/06/15/multithreading-implementing-the-iasyncresult-interface.aspx
-        class FlushAsyncResult : IAsyncResult
-        {
-            private volatile Boolean _isCompleted;
-            private ManualResetEvent _evt;
-            private readonly AsyncCallback _cbMethod;
-            private readonly object _state;
-
-            public FlushAsyncResult(AsyncCallback cbMethod, object state)
-            {
-                _cbMethod = cbMethod;
-                _state = state;
-            }
-
-            internal byte[] Data { get; set; }
-            internal HttpWebRequest Connection { get; set; }
-            internal TTransportException AsyncException { get; set; }
-
-            public object AsyncState
-            {
-                get { return _state; }
-            }
-            public WaitHandle AsyncWaitHandle
-            {
-                get { return GetEvtHandle(); }
-            }
-            public bool CompletedSynchronously
-            {
-                get { return false; }
-            }
-            public bool IsCompleted
-            {
-                get { return _isCompleted; }
-            }
-            private readonly object _locker = new object();
-            private ManualResetEvent GetEvtHandle()
-            {
-                lock (_locker)
-                {
-                    if (_evt == null)
-                    {
-                        _evt = new ManualResetEvent(false);
-                    }
-                    if (_isCompleted)
-                    {
-                        _evt.Set();
-                    }
-                }
-                return _evt;
-            }
-            internal void UpdateStatusToComplete()
-            {
-                _isCompleted = true; //1. set _iscompleted to true
-                lock (_locker)
-                {
-                    if (_evt != null)
-                    {
-                        _evt.Set(); //2. set the event, when it exists
-                    }
-                }
-            }
-
-            internal void NotifyCallbackWhenAvailable()
-            {
-                if (_cbMethod != null)
-                {
-                    _cbMethod(this);
-                }
-            }
-        }
-
-        #region " IDisposable Support "
-        private bool _IsDisposed;
-
-        // IDisposable
-        protected override void Dispose(bool disposing)
-        {
-            if (!_IsDisposed)
-            {
-                if (disposing)
-                {
-                    if (inputStream != null)
-                        inputStream.Dispose();
-                    if (outputStream != null)
-                        outputStream.Dispose();
-                }
-            }
-            _IsDisposed = true;
-        }
-        #endregion
-    }
-}
diff --git a/lib/csharp/src/Transport/THttpHandler.cs b/lib/csharp/src/Transport/THttpHandler.cs
deleted file mode 100644
index 4115ef9..0000000
--- a/lib/csharp/src/Transport/THttpHandler.cs
+++ /dev/null
@@ -1,102 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- *
- */
-
-using System;
-using System.Web;
-using System.Net;
-using System.IO;
-
-using Thrift.Protocol;
-
-namespace Thrift.Transport
-{
-    public class THttpHandler : IHttpHandler
-    {
-        protected TProcessor processor;
-
-        protected TProtocolFactory inputProtocolFactory;
-        protected TProtocolFactory outputProtocolFactory;
-
-        protected const string contentType = "application/x-thrift";
-        protected System.Text.Encoding encoding = System.Text.Encoding.UTF8;
-
-        public THttpHandler(TProcessor processor)
-            : this(processor, new TBinaryProtocol.Factory())
-        {
-
-        }
-
-        public THttpHandler(TProcessor processor, TProtocolFactory protocolFactory)
-            : this(processor, protocolFactory, protocolFactory)
-        {
-
-        }
-
-        public THttpHandler(TProcessor processor, TProtocolFactory inputProtocolFactory, TProtocolFactory outputProtocolFactory)
-        {
-            this.processor = processor;
-            this.inputProtocolFactory = inputProtocolFactory;
-            this.outputProtocolFactory = outputProtocolFactory;
-        }
-
-        public void ProcessRequest(HttpListenerContext context)
-        {
-            context.Response.ContentType = contentType;
-            context.Response.ContentEncoding = encoding;
-            ProcessRequest(context.Request.InputStream, context.Response.OutputStream);
-        }
-
-        public void ProcessRequest(HttpContext context)
-        {
-            context.Response.ContentType = contentType;
-            context.Response.ContentEncoding = encoding;
-            ProcessRequest(context.Request.InputStream, context.Response.OutputStream);
-        }
-
-        public void ProcessRequest(Stream input, Stream output)
-        {
-            TTransport transport = new TStreamTransport(input,output);
-
-            try
-            {
-                var inputProtocol = inputProtocolFactory.GetProtocol(transport);
-                var outputProtocol = outputProtocolFactory.GetProtocol(transport);
-
-                while (processor.Process(inputProtocol, outputProtocol))
-                {
-                }
-            }
-            catch (TTransportException)
-            {
-                // Client died, just move on
-            }
-            finally
-            {
-                transport.Close();
-            }
-        }
-
-        public bool IsReusable
-        {
-            get { return true; }
-        }
-    }
-}
diff --git a/lib/csharp/src/Transport/THttpTaskAsyncHandler.cs b/lib/csharp/src/Transport/THttpTaskAsyncHandler.cs
deleted file mode 100644
index e491f32..0000000
--- a/lib/csharp/src/Transport/THttpTaskAsyncHandler.cs
+++ /dev/null
@@ -1,97 +0,0 @@
-﻿/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- * Contains some contributions under the Thrift Software License.
- * Please see doc/old-thrift-license.txt in the Thrift distribution for
- * details.
- */
-
-using System.Threading.Tasks;
-using System.Web;
-using Thrift.Protocol;
-
-namespace Thrift.Transport
-{
-    /// <summary>
-    /// An async task based HTTP handler for processing thrift services.
-    /// </summary>
-    public class THttpTaskAsyncHandler : HttpTaskAsyncHandler
-    {
-        private readonly TAsyncProcessor _processor;
-        private readonly TProtocolFactory _inputProtocolFactory;
-        private readonly TProtocolFactory _outputProtocolFactory;
-
-        /// <summary>
-        /// Initializes a new instance of the <see cref="THttpTaskAsyncHandler"/> class
-        /// using the <see cref="TBinaryProtocol.Factory"/> for both input and output streams.
-        /// </summary>
-        /// <param name="processor">The async processor implementation.</param>
-        public THttpTaskAsyncHandler(TAsyncProcessor processor)
-            : this(processor, new TBinaryProtocol.Factory())
-        {
-        }
-
-        /// <summary>
-        /// Initializes a new instance of the <see cref="THttpTaskAsyncHandler"/> class
-        /// using <paramref name="protocolFactory"/> for both input and output streams.
-        /// </summary>
-        /// <param name="processor">The async processor implementation.</param>
-        /// <param name="protocolFactory">The protocol factory.</param>
-        public THttpTaskAsyncHandler(TAsyncProcessor processor, TProtocolFactory protocolFactory)
-            : this(processor, protocolFactory, protocolFactory)
-        {
-        }
-
-        /// <summary>
-        /// Initializes a new instance of the <see cref="THttpTaskAsyncHandler"/> class.
-        /// </summary>
-        /// <param name="processor">The async processor implementation.</param>
-        /// <param name="inputProtocolFactory">The input protocol factory.</param>
-        /// <param name="outputProtocolFactory">The output protocol factory.</param>
-        public THttpTaskAsyncHandler(TAsyncProcessor processor, TProtocolFactory inputProtocolFactory,
-            TProtocolFactory outputProtocolFactory)
-        {
-            _processor = processor;
-            _inputProtocolFactory = inputProtocolFactory;
-            _outputProtocolFactory = outputProtocolFactory;
-        }
-
-        public override async Task ProcessRequestAsync(HttpContext context)
-        {
-            var transport = new TStreamTransport(context.Request.InputStream, context.Response.OutputStream);
-
-            try
-            {
-                var input = _inputProtocolFactory.GetProtocol(transport);
-                var output = _outputProtocolFactory.GetProtocol(transport);
-
-                while (await _processor.ProcessAsync(input, output))
-                {
-                }
-            }
-            catch (TTransportException)
-            {
-                // Client died, just move on
-            }
-            finally
-            {
-                transport.Close();
-            }
-        }
-    }
-}
diff --git a/lib/csharp/src/Transport/TMemoryBuffer.cs b/lib/csharp/src/Transport/TMemoryBuffer.cs
deleted file mode 100644
index 303d083..0000000
--- a/lib/csharp/src/Transport/TMemoryBuffer.cs
+++ /dev/null
@@ -1,117 +0,0 @@
-﻿/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-using System;
-using System.IO;
-using System.Reflection;
-using Thrift.Protocol;
-
-namespace Thrift.Transport
-{
-    public class TMemoryBuffer : TTransport
-    {
-
-        private readonly MemoryStream byteStream;
-
-        public TMemoryBuffer()
-        {
-            byteStream = new MemoryStream();
-        }
-
-        public TMemoryBuffer(byte[] buf)
-        {
-            byteStream = new MemoryStream(buf);
-        }
-
-        public override void Open()
-        {
-            /** do nothing **/
-        }
-
-        public override void Close()
-        {
-            /** do nothing **/
-        }
-
-        public override int Read(byte[] buf, int off, int len)
-        {
-            return byteStream.Read(buf, off, len);
-        }
-
-        public override void Write(byte[] buf, int off, int len)
-        {
-            byteStream.Write(buf, off, len);
-        }
-
-        public byte[] GetBuffer()
-        {
-            return byteStream.ToArray();
-        }
-
-
-        public override bool IsOpen
-        {
-            get { return true; }
-        }
-
-        public static byte[] Serialize(TAbstractBase s)
-        {
-            var t = new TMemoryBuffer();
-            var p = new TBinaryProtocol(t);
-
-            s.Write(p);
-
-            return t.GetBuffer();
-        }
-
-        public static T DeSerialize<T>(byte[] buf) where T : TAbstractBase
-        {
-            var trans = new TMemoryBuffer(buf);
-            var p = new TBinaryProtocol(trans);
-            if (typeof(TBase).IsAssignableFrom(typeof(T)))
-            {
-                var method = typeof(T).GetMethod("Read", BindingFlags.Instance | BindingFlags.Public);
-                var t = Activator.CreateInstance<T>();
-                method.Invoke(t, new object[] { p });
-                return t;
-            }
-            else
-            {
-                var method = typeof(T).GetMethod("Read", BindingFlags.Static | BindingFlags.Public);
-                return (T)method.Invoke(null, new object[] { p });
-            }
-        }
-
-        private bool _IsDisposed;
-
-        // IDisposable
-        protected override void Dispose(bool disposing)
-        {
-            if (!_IsDisposed)
-            {
-                if (disposing)
-                {
-                    if (byteStream != null)
-                        byteStream.Dispose();
-                }
-            }
-            _IsDisposed = true;
-        }
-    }
-}
diff --git a/lib/csharp/src/Transport/TNamedPipeClientTransport.cs b/lib/csharp/src/Transport/TNamedPipeClientTransport.cs
deleted file mode 100644
index 49a50aa..0000000
--- a/lib/csharp/src/Transport/TNamedPipeClientTransport.cs
+++ /dev/null
@@ -1,111 +0,0 @@
-﻿/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- * Contains some contributions under the Thrift Software License.
- * Please see doc/old-thrift-license.txt in the Thrift distribution for
- * details.
- */
-
-using System;
-using System.IO.Pipes;
-using System.Threading;
-
-namespace Thrift.Transport
-{
-    public class TNamedPipeClientTransport : TTransport
-    {
-        private NamedPipeClientStream client;
-        private string ServerName;
-        private string PipeName;
-        private int ConnectTimeout;
-
-        public TNamedPipeClientTransport(string pipe, int timeout = Timeout.Infinite)
-        {
-            ServerName = ".";
-            PipeName = pipe;
-            ConnectTimeout = timeout;
-        }
-
-        public TNamedPipeClientTransport(string server, string pipe, int timeout = Timeout.Infinite)
-        {
-            ServerName = (server != "") ? server : ".";
-            PipeName = pipe;
-            ConnectTimeout = timeout;
-        }
-
-        public override bool IsOpen
-        {
-            get { return client != null && client.IsConnected; }
-        }
-
-        public override void Open()
-        {
-            if (IsOpen)
-            {
-                throw new TTransportException(TTransportException.ExceptionType.AlreadyOpen);
-            }
-            client = new NamedPipeClientStream(ServerName, PipeName, PipeDirection.InOut, PipeOptions.None);
-            client.Connect(ConnectTimeout);
-        }
-
-        public override void Close()
-        {
-            if (client != null)
-            {
-                client.Close();
-                client = null;
-            }
-        }
-
-        public override int Read(byte[] buf, int off, int len)
-        {
-            if (client == null)
-            {
-                throw new TTransportException(TTransportException.ExceptionType.NotOpen);
-            }
-
-            return client.Read(buf, off, len);
-        }
-
-        public override void Write(byte[] buf, int off, int len)
-        {
-            if (client == null)
-            {
-                throw new TTransportException(TTransportException.ExceptionType.NotOpen);
-            }
-
-            // if necessary, send the data in chunks
-            // there's a system limit around 0x10000 bytes that we hit otherwise
-            // MSDN: "Pipe write operations across a network are limited to 65,535 bytes per write. For more information regarding pipes, see the Remarks section."
-            var nBytes = Math.Min(len, 15 * 4096);  // 16 would exceed the limit
-            while (nBytes > 0)
-            {
-                client.Write(buf, off, nBytes);
-
-                off += nBytes;
-                len -= nBytes;
-                nBytes = Math.Min(len, nBytes);
-            }
-        }
-
-        protected override void Dispose(bool disposing)
-        {
-            client.Dispose();
-        }
-    }
-}
diff --git a/lib/csharp/src/Transport/TNamedPipeServerTransport.cs b/lib/csharp/src/Transport/TNamedPipeServerTransport.cs
deleted file mode 100644
index 32215cf..0000000
--- a/lib/csharp/src/Transport/TNamedPipeServerTransport.cs
+++ /dev/null
@@ -1,296 +0,0 @@
-﻿/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- * Contains some contributions under the Thrift Software License.
- * Please see doc/old-thrift-license.txt in the Thrift distribution for
- * details.
- */
-
-using System;
-using System.IO.Pipes;
-using System.Threading;
-using System.Security.Principal;
-
-namespace Thrift.Transport
-{
-    public class TNamedPipeServerTransport : TServerTransport
-    {
-        /// <summary>
-        /// This is the address of the Pipe on the localhost.
-        /// </summary>
-        private readonly string pipeAddress;
-        private NamedPipeServerStream stream = null;
-        private bool asyncMode = true;
-
-        public TNamedPipeServerTransport(string pipeAddress)
-        {
-            this.pipeAddress = pipeAddress;
-        }
-
-        public override void Listen()
-        {
-            // nothing to do here
-        }
-
-        public override void Close()
-        {
-            if (stream != null)
-            {
-                try
-                {
-                    stream.Close();
-                    stream.Dispose();
-                }
-                finally
-                {
-                    stream = null;
-                }
-            }
-        }
-
-        private void EnsurePipeInstance()
-        {
-            if (stream == null)
-            {
-                var direction = PipeDirection.InOut;
-                var maxconn = NamedPipeServerStream.MaxAllowedServerInstances;
-                var mode = PipeTransmissionMode.Byte;
-                var options = asyncMode ? PipeOptions.Asynchronous : PipeOptions.None;
-                const int INBUF_SIZE = 4096;
-                const int OUTBUF_SIZE = 4096;
-
-                // security
-                var security = new PipeSecurity();
-                security.AddAccessRule(
-                    new PipeAccessRule(
-                        new SecurityIdentifier(WellKnownSidType.WorldSid, null),
-                        PipeAccessRights.Read | PipeAccessRights.Write | PipeAccessRights.Synchronize | PipeAccessRights.CreateNewInstance,
-                        System.Security.AccessControl.AccessControlType.Allow
-                    )
-                );
-
-                try
-                {
-                    stream = new NamedPipeServerStream(pipeAddress, direction, maxconn, mode, options, INBUF_SIZE, OUTBUF_SIZE, security);
-                }
-                catch (NotImplementedException)  // Mono still does not support async, fallback to sync
-                {
-                    if (asyncMode)
-                    {
-                        options &= (~PipeOptions.Asynchronous);
-                        stream = new NamedPipeServerStream(pipeAddress, direction, maxconn, mode, options, INBUF_SIZE, OUTBUF_SIZE, security);
-                        asyncMode = false;
-                    }
-                    else
-                    {
-                        throw;
-                    }
-                }
-
-            }
-        }
-
-        protected override TTransport AcceptImpl()
-        {
-            try
-            {
-                EnsurePipeInstance();
-
-                if (asyncMode)
-                {
-                    var evt = new ManualResetEvent(false);
-                    Exception eOuter = null;
-
-                    stream.BeginWaitForConnection(asyncResult =>
-                    {
-                        try
-                        {
-                            if (stream != null)
-                                stream.EndWaitForConnection(asyncResult);
-                            else
-                                eOuter = new TTransportException(TTransportException.ExceptionType.Interrupted);
-                        }
-                        catch (Exception e)
-                        {
-                            if (stream != null)
-                                eOuter = e;
-                            else
-                                eOuter = new TTransportException(TTransportException.ExceptionType.Interrupted, e.Message, e);
-                        }
-                        evt.Set();
-                    }, null);
-
-                    evt.WaitOne();
-
-                    if (eOuter != null)
-                        throw eOuter; // rethrow exception
-                }
-                else
-                {
-                    stream.WaitForConnection();
-                }
-
-                var trans = new ServerTransport(stream,asyncMode);
-                stream = null;  // pass ownership to ServerTransport
-                return trans;
-            }
-            catch (TTransportException)
-            {
-                Close();
-                throw;
-            }
-            catch (Exception e)
-            {
-                Close();
-                throw new TTransportException(TTransportException.ExceptionType.NotOpen, e.Message, e);
-            }
-        }
-
-        private class ServerTransport : TTransport
-        {
-            private NamedPipeServerStream stream;
-            private bool asyncMode;
-
-            public ServerTransport(NamedPipeServerStream stream, bool asyncMode)
-            {
-                this.stream = stream;
-                this.asyncMode = asyncMode;
-            }
-
-            public override bool IsOpen
-            {
-                get { return stream != null && stream.IsConnected; }
-            }
-
-            public override void Open()
-            {
-            }
-
-            public override void Close()
-            {
-                if (stream != null)
-                    stream.Close();
-            }
-
-            public override int Read(byte[] buf, int off, int len)
-            {
-                if (stream == null)
-                {
-                    throw new TTransportException(TTransportException.ExceptionType.NotOpen);
-                }
-
-                if (asyncMode)
-                {
-                    Exception eOuter = null;
-                    var evt = new ManualResetEvent(false);
-                    int retval = 0;
-
-                    stream.BeginRead(buf, off, len, asyncResult =>
-                    {
-                        try
-                        {
-                            if (stream != null)
-                                retval = stream.EndRead(asyncResult);
-                            else
-                                eOuter = new TTransportException(TTransportException.ExceptionType.Interrupted);
-                        }
-                        catch (Exception e)
-                        {
-                            if (stream != null)
-                                eOuter = e;
-                            else
-                                eOuter = new TTransportException(TTransportException.ExceptionType.Interrupted, e.Message, e);
-                        }
-                        evt.Set();
-                    }, null);
-
-                    evt.WaitOne();
-
-                    if (eOuter != null)
-                        throw eOuter; // rethrow exception
-                    else
-                        return retval;
-                }
-                else
-                {
-                    return stream.Read(buf, off, len);
-                }
-            }
-
-            public override void Write(byte[] buf, int off, int len)
-            {
-                if (stream == null)
-                {
-                    throw new TTransportException(TTransportException.ExceptionType.NotOpen);
-                }
-
-                // if necessary, send the data in chunks
-                // there's a system limit around 0x10000 bytes that we hit otherwise
-                // MSDN: "Pipe write operations across a network are limited to 65,535 bytes per write. For more information regarding pipes, see the Remarks section."
-                var nBytes = Math.Min(len, 15 * 4096);  // 16 would exceed the limit
-                while (nBytes > 0)
-                {
-
-                    if (asyncMode)
-                    {
-                        Exception eOuter = null;
-                        var evt = new ManualResetEvent(false);
-
-                        stream.BeginWrite(buf, off, nBytes, asyncResult =>
-                        {
-                            try
-                            {
-                                if (stream != null)
-                                    stream.EndWrite(asyncResult);
-                                else
-                                    eOuter = new TTransportException(TTransportException.ExceptionType.Interrupted);
-                            }
-                            catch (Exception e)
-                            {
-                                if (stream != null)
-                                    eOuter = e;
-                                else
-                                    eOuter = new TTransportException(TTransportException.ExceptionType.Interrupted, e.Message, e);
-                            }
-                            evt.Set();
-                        }, null);
-
-                        evt.WaitOne();
-
-                        if (eOuter != null)
-                            throw eOuter; // rethrow exception
-                    }
-                    else
-                    {
-                        stream.Write(buf, off, nBytes);
-                    }
-
-                    off += nBytes;
-                    len -= nBytes;
-                    nBytes = Math.Min(len, nBytes);
-                }
-            }
-
-            protected override void Dispose(bool disposing)
-            {
-                if (stream != null)
-                    stream.Dispose();
-            }
-        }
-    }
-}
\ No newline at end of file
diff --git a/lib/csharp/src/Transport/TServerSocket.cs b/lib/csharp/src/Transport/TServerSocket.cs
deleted file mode 100644
index d8ec62a..0000000
--- a/lib/csharp/src/Transport/TServerSocket.cs
+++ /dev/null
@@ -1,176 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- * Contains some contributions under the Thrift Software License.
- * Please see doc/old-thrift-license.txt in the Thrift distribution for
- * details.
- */
-
-using System;
-using System.Net.Sockets;
-
-
-namespace Thrift.Transport
-{
-    public class TServerSocket : TServerTransport
-    {
-        /// <summary>
-        /// Underlying server with socket.
-        /// </summary>
-        private TcpListener server = null;
-
-        /// <summary>
-        /// Port to listen on.
-        /// </summary>
-        private int port = 0;
-
-        /// <summary>
-        /// Timeout for client sockets from accept.
-        /// </summary>
-        private int clientTimeout = 0;
-
-        /// <summary>
-        /// Whether or not to wrap new TSocket connections in buffers.
-        /// </summary>
-        private bool useBufferedSockets = false;
-
-        /// <summary>
-        /// Creates a server socket from underlying socket object.
-        /// </summary>
-        public TServerSocket(TcpListener listener)
-            : this(listener, 0)
-        {
-        }
-
-        /// <summary>
-        /// Creates a server socket from underlying socket object.
-        /// </summary>
-        public TServerSocket(TcpListener listener, int clientTimeout)
-        {
-            this.server = listener;
-            this.clientTimeout = clientTimeout;
-        }
-
-        /// <summary>
-        /// Creates just a port listening server socket.
-        /// </summary>
-        public TServerSocket(int port)
-            : this(port, 0)
-        {
-        }
-
-        /// <summary>
-        /// Creates just a port listening server socket.
-        /// </summary>
-        public TServerSocket(int port, int clientTimeout)
-            : this(port, clientTimeout, false)
-        {
-        }
-
-        public TServerSocket(int port, int clientTimeout, bool useBufferedSockets)
-        {
-            this.port = port;
-            this.clientTimeout = clientTimeout;
-            this.useBufferedSockets = useBufferedSockets;
-            try
-            {
-                // Make server socket
-                this.server = TSocketVersionizer.CreateTcpListener(this.port);
-                this.server.Server.NoDelay = true;
-            }
-            catch (Exception ex)
-            {
-                server = null;
-                throw new TTransportException("Could not create ServerSocket on port " + this.port + ".", ex);
-            }
-        }
-
-        public override void Listen()
-        {
-            // Make sure not to block on accept
-            if (server != null)
-            {
-                try
-                {
-                    server.Start();
-                }
-                catch (SocketException sx)
-                {
-                    throw new TTransportException("Could not accept on listening socket: " + sx.Message, sx);
-                }
-            }
-        }
-
-        protected override TTransport AcceptImpl()
-        {
-            if (server == null)
-            {
-                throw new TTransportException(TTransportException.ExceptionType.NotOpen, "No underlying server socket.");
-            }
-            try
-            {
-                TSocket result2 = null;
-                TcpClient result = server.AcceptTcpClient();
-                try
-                {
-                    result2 = new TSocket(result);
-                    result2.Timeout = clientTimeout;
-                    if (useBufferedSockets)
-                    {
-                        TBufferedTransport result3 = new TBufferedTransport(result2);
-                        return result3;
-                    }
-                    else
-                    {
-                        return result2;
-                    }
-                }
-                catch (System.Exception)
-                {
-                    // If a TSocket was successfully created, then let
-                    // it do proper cleanup of the TcpClient object.
-                    if (result2 != null)
-                        result2.Dispose();
-                    else //  Otherwise, clean it up ourselves.
-                        ((IDisposable)result).Dispose();
-                    throw;
-                }
-            }
-            catch (Exception ex)
-            {
-                throw new TTransportException(ex.ToString(), ex);
-            }
-        }
-
-        public override void Close()
-        {
-            if (server != null)
-            {
-                try
-                {
-                    server.Stop();
-                }
-                catch (Exception ex)
-                {
-                    throw new TTransportException("WARNING: Could not close server socket: " + ex, ex);
-                }
-                server = null;
-            }
-        }
-    }
-}
diff --git a/lib/csharp/src/Transport/TServerTransport.cs b/lib/csharp/src/Transport/TServerTransport.cs
deleted file mode 100644
index e63880b..0000000
--- a/lib/csharp/src/Transport/TServerTransport.cs
+++ /dev/null
@@ -1,44 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- * Contains some contributions under the Thrift Software License.
- * Please see doc/old-thrift-license.txt in the Thrift distribution for
- * details.
- */
-
-using System;
-
-namespace Thrift.Transport
-{
-    public abstract class TServerTransport
-    {
-        public abstract void Listen();
-        public abstract void Close();
-        protected abstract TTransport AcceptImpl();
-
-        public TTransport Accept()
-        {
-            TTransport transport = AcceptImpl();
-            if (transport == null)
-            {
-                throw new TTransportException("accept() may not return NULL");
-            }
-            return transport;
-        }
-    }
-}
diff --git a/lib/csharp/src/Transport/TSilverlightSocket.cs b/lib/csharp/src/Transport/TSilverlightSocket.cs
deleted file mode 100644
index 40469ab..0000000
--- a/lib/csharp/src/Transport/TSilverlightSocket.cs
+++ /dev/null
@@ -1,393 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- * Contains some contributions under the Thrift Software License.
- * Please see doc/old-thrift-license.txt in the Thrift distribution for
- * details.
- */
-
-/* only for silverlight */
-#if SILVERLIGHT
-
-using System;
-using System.Net.Sockets;
-using System.IO;
-using System.Net;
-using System.Threading;
-
-namespace Thrift.Transport
-{
-    public class TSilverlightSocket : TTransport
-    {
-        Socket socket = null;
-        static ManualResetEvent readAsyncComplete = new ManualResetEvent(false);
-        public event EventHandler<SocketAsyncEventArgs> connectHandler = null;
-
-        // memory stream for write cache.
-        private MemoryStream outputStream = new MemoryStream();
-
-        private string host = null;
-        private int port = 0;
-        private int timeout = 0;
-
-        // constructor
-        public TSilverlightSocket(string host, int port)
-            : this(host, port, 0)
-        {
-        }
-
-        // constructor
-        public TSilverlightSocket(string host, int port, int timeout)
-        {
-            this.host = host;
-            this.port = port;
-            this.timeout = timeout;
-
-            InitSocket();
-        }
-
-        private void InitSocket()
-        {
-            // Create a stream-based, TCP socket using the InterNetwork Address Family.
-            socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
-            socket.NoDelay = true;
-        }
-
-        public int Timeout
-        {
-            set
-            {
-                timeout = value;
-            }
-        }
-
-        public string Host
-        {
-            get
-            {
-                return host;
-            }
-        }
-
-        public int Port
-        {
-            get
-            {
-                return port;
-            }
-        }
-
-        public override bool IsOpen
-        {
-            get
-            {
-                if (socket == null)
-                {
-                    return false;
-                }
-
-                return socket.Connected;
-            }
-        }
-
-        public override void Open()
-        {
-            if (IsOpen)
-            {
-                throw new TTransportException(TTransportException.ExceptionType.AlreadyOpen, "Socket already connected");
-            }
-
-            if (string.IsNullOrEmpty(host))
-            {
-                throw new TTransportException(TTransportException.ExceptionType.NotOpen, "Cannot open null host");
-            }
-
-            if (port <= 0)
-            {
-                throw new TTransportException(TTransportException.ExceptionType.NotOpen, "Cannot open without port");
-            }
-
-            if (socket == null)
-            {
-                InitSocket();
-            }
-
-            if (timeout == 0)     // no timeout -> infinite
-            {
-                timeout = 10000;  // set a default timeout for WP.
-            }
-
-            {
-                // Create DnsEndPoint. The hostName and port are passed in to this method.
-                DnsEndPoint hostEntry = new DnsEndPoint(this.host, this.port);
-
-                // Create a SocketAsyncEventArgs object to be used in the connection request
-                SocketAsyncEventArgs socketEventArg = new SocketAsyncEventArgs();
-                socketEventArg.RemoteEndPoint = hostEntry;
-
-                // Inline event handler for the Completed event.
-                // Note: This event handler was implemented inline in order to make this method self-contained.
-                socketEventArg.Completed += new EventHandler<SocketAsyncEventArgs>(delegate(object s, SocketAsyncEventArgs e)
-                {
-                    if (connectHandler != null)
-                    {
-                        connectHandler(this, e);
-                    }
-                });
-
-                // Make an asynchronous Connect request over the socket
-                socket.ConnectAsync(socketEventArg);
-            }
-        }
-
-        public override int Read(byte[] buf, int off, int len)
-        {
-            bool _timeout = true;
-            string _error = null;
-            int _recvBytes = -1;
-
-            if (socket == null)
-            {
-                throw new TTransportException(TTransportException.ExceptionType.NotOpen, "Socket is not open");
-            }
-
-            // Create SocketAsyncEventArgs context object
-            SocketAsyncEventArgs socketEventArg = new SocketAsyncEventArgs();
-            socketEventArg.RemoteEndPoint = socket.RemoteEndPoint;
-
-            // Setup the buffer to receive the data
-            socketEventArg.SetBuffer(buf, off, len);
-
-            // Inline event handler for the Completed event.
-            // Note: This even handler was implemented inline in order to make
-            // this method self-contained.
-            socketEventArg.Completed += new EventHandler<SocketAsyncEventArgs>(delegate(object s, SocketAsyncEventArgs e)
-            {
-                _timeout = false;
-
-                if (e.SocketError == SocketError.Success)
-                {
-                    _recvBytes = e.BytesTransferred;
-                }
-                else
-                {
-                    _error = e.SocketError.ToString();
-                }
-
-                readAsyncComplete.Set();
-            });
-
-            // Sets the state of the event to nonsignaled, causing threads to block
-            readAsyncComplete.Reset();
-
-            // Make an asynchronous Receive request over the socket
-            socket.ReceiveAsync(socketEventArg);
-
-            // Block the UI thread for a maximum of TIMEOUT_MILLISECONDS milliseconds.
-            // If no response comes back within this time then proceed
-            readAsyncComplete.WaitOne(this.timeout);
-
-            if (_timeout)
-            {
-                throw new TTransportException(TTransportException.ExceptionType.TimedOut, "Socket recv timeout");
-            }
-
-            if (_error != null)
-            {
-                throw new TTransportException(TTransportException.ExceptionType.Unknown, _error);
-            }
-
-            return _recvBytes;
-        }
-
-        public override void Write(byte[] buf, int off, int len)
-        {
-            outputStream.Write(buf, off, len);
-        }
-
-        private void beginFlush_Completed(object sender, SocketAsyncEventArgs e)
-        {
-            FlushAsyncResult flushAsyncResult = e.UserToken as FlushAsyncResult;
-            flushAsyncResult.UpdateStatusToComplete();
-            flushAsyncResult.NotifyCallbackWhenAvailable();
-
-            if (e.SocketError != SocketError.Success)
-            {
-                throw new TTransportException(TTransportException.ExceptionType.Unknown, e.SocketError.ToString());
-            }
-        }
-
-        public override IAsyncResult BeginFlush(AsyncCallback callback, object state)
-        {
-            // Extract request and reset buffer
-            byte[] data = outputStream.ToArray();
-
-            FlushAsyncResult flushAsyncResult = new FlushAsyncResult(callback, state);
-
-            SocketAsyncEventArgs socketEventArg = new SocketAsyncEventArgs();
-            socketEventArg.RemoteEndPoint = socket.RemoteEndPoint;
-            socketEventArg.UserToken = flushAsyncResult;
-
-            socketEventArg.Completed += beginFlush_Completed;
-            socketEventArg.SetBuffer(data, 0, data.Length);
-
-            socket.SendAsync(socketEventArg);
-
-            return flushAsyncResult;
-        }
-
-        public override void EndFlush(IAsyncResult asyncResult)
-        {
-            try
-            {
-                var flushAsyncResult = (FlushAsyncResult)asyncResult;
-
-                if (!flushAsyncResult.IsCompleted)
-                {
-                    var waitHandle = flushAsyncResult.AsyncWaitHandle;
-                    waitHandle.WaitOne();
-                    waitHandle.Close();
-                }
-
-                if (flushAsyncResult.AsyncException != null)
-                {
-                    throw flushAsyncResult.AsyncException;
-                }
-            }
-            finally
-            {
-                outputStream = new MemoryStream();
-            }
-        }
-
-        // Copy from impl from THttpClient.cs
-        // Based on http://msmvps.com/blogs/luisabreu/archive/2009/06/15/multithreading-implementing-the-iasyncresult-interface.aspx
-        class FlushAsyncResult : IAsyncResult
-        {
-            private volatile Boolean _isCompleted;
-            private ManualResetEvent _evt;
-            private readonly AsyncCallback _cbMethod;
-            private readonly object _state;
-
-            public FlushAsyncResult(AsyncCallback cbMethod, object state)
-            {
-                _cbMethod = cbMethod;
-                _state = state;
-            }
-
-            internal byte[] Data { get; set; }
-            internal Socket Connection { get; set; }
-            internal TTransportException AsyncException { get; set; }
-
-            public object AsyncState
-            {
-                get { return _state; }
-            }
-
-            public WaitHandle AsyncWaitHandle
-            {
-                get { return GetEvtHandle(); }
-            }
-
-            public bool CompletedSynchronously
-            {
-                get { return false; }
-            }
-
-            public bool IsCompleted
-            {
-                get { return _isCompleted; }
-            }
-
-            private readonly object _locker = new object();
-
-            private ManualResetEvent GetEvtHandle()
-            {
-                lock (_locker)
-                {
-                    if (_evt == null)
-                    {
-                        _evt = new ManualResetEvent(false);
-                    }
-                    if (_isCompleted)
-                    {
-                        _evt.Set();
-                    }
-                }
-                return _evt;
-            }
-
-            internal void UpdateStatusToComplete()
-            {
-                _isCompleted = true; //1. set _iscompleted to true
-                lock (_locker)
-                {
-                    if (_evt != null)
-                    {
-                        _evt.Set(); //2. set the event, when it exists
-                    }
-                }
-            }
-
-            internal void NotifyCallbackWhenAvailable()
-            {
-                if (_cbMethod != null)
-                {
-                    _cbMethod(this);
-                }
-            }
-        }
-
-        public override void Close()
-        {
-            if (socket != null)
-            {
-                socket.Close();
-                socket = null;
-            }
-        }
-
-#region " IDisposable Support "
-        private bool _IsDisposed;
-
-        // IDisposable
-        protected override void Dispose(bool disposing)
-        {
-            if (!_IsDisposed)
-            {
-                if (disposing)
-                {
-                    if (outputStream != null)
-                    {
-                        outputStream.Dispose();
-                    }
-                    outputStream = null;
-                    if (socket != null)
-                    {
-                        ((IDisposable)socket).Dispose();
-                    }
-                }
-            }
-            _IsDisposed = true;
-        }
-#endregion
-    }
-}
-
-
-#endif
diff --git a/lib/csharp/src/Transport/TSocket.cs b/lib/csharp/src/Transport/TSocket.cs
deleted file mode 100644
index d8fa335..0000000
--- a/lib/csharp/src/Transport/TSocket.cs
+++ /dev/null
@@ -1,245 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- * Contains some contributions under the Thrift Software License.
- * Please see doc/old-thrift-license.txt in the Thrift distribution for
- * details.
- */
-
-using System;
-using System.Net.Sockets;
-
-namespace Thrift.Transport
-{
-    public class TSocket : TStreamTransport
-    {
-        private TcpClient client = null;
-        private string host = null;
-        private int port = 0;
-        private int timeout = 0;
-
-        public TSocket(TcpClient client)
-        {
-            this.client = client;
-
-            if (IsOpen)
-            {
-                inputStream = client.GetStream();
-                outputStream = client.GetStream();
-            }
-        }
-
-        public TSocket(string host, int port)
-            : this(host, port, 0)
-        {
-        }
-
-        public TSocket(string host, int port, int timeout)
-        {
-            this.host = host;
-            this.port = port;
-            this.timeout = timeout;
-
-            InitSocket();
-        }
-
-        private void InitSocket()
-        {
-            this.client = TSocketVersionizer.CreateTcpClient();
-            this.client.ReceiveTimeout = client.SendTimeout = timeout;
-            this.client.Client.NoDelay = true;
-        }
-
-        public int Timeout
-        {
-            set
-            {
-                client.ReceiveTimeout = client.SendTimeout = timeout = value;
-            }
-        }
-
-        public TcpClient TcpClient
-        {
-            get
-            {
-                return client;
-            }
-        }
-
-        public string Host
-        {
-            get
-            {
-                return host;
-            }
-        }
-
-        public int Port
-        {
-            get
-            {
-                return port;
-            }
-        }
-
-        public override bool IsOpen
-        {
-            get
-            {
-                if (client == null)
-                {
-                    return false;
-                }
-
-                return client.Connected;
-            }
-        }
-
-        public override void Open()
-        {
-            if (IsOpen)
-            {
-                throw new TTransportException(TTransportException.ExceptionType.AlreadyOpen, "Socket already connected");
-            }
-
-            if (string.IsNullOrEmpty(host))
-            {
-                throw new TTransportException(TTransportException.ExceptionType.NotOpen, "Cannot open null host");
-            }
-
-            if (port <= 0)
-            {
-                throw new TTransportException(TTransportException.ExceptionType.NotOpen, "Cannot open without port");
-            }
-
-            if (client == null)
-            {
-                InitSocket();
-            }
-
-            if (timeout == 0)            // no timeout -> infinite
-            {
-                client.Connect(host, port);
-            }
-            else                        // we have a timeout -> use it
-            {
-                ConnectHelper hlp = new ConnectHelper(client);
-                IAsyncResult asyncres = client.BeginConnect(host, port, new AsyncCallback(ConnectCallback), hlp);
-                bool bConnected = asyncres.AsyncWaitHandle.WaitOne(timeout) && client.Connected;
-                if (!bConnected)
-                {
-                    lock (hlp.Mutex)
-                    {
-                        if (hlp.CallbackDone)
-                        {
-                            asyncres.AsyncWaitHandle.Close();
-                            client.Close();
-                        }
-                        else
-                        {
-                            hlp.DoCleanup = true;
-                            client = null;
-                        }
-                    }
-                    throw new TTransportException(TTransportException.ExceptionType.TimedOut, "Connect timed out");
-                }
-            }
-
-            inputStream = client.GetStream();
-            outputStream = client.GetStream();
-        }
-
-
-        static void ConnectCallback(IAsyncResult asyncres)
-        {
-            ConnectHelper hlp = asyncres.AsyncState as ConnectHelper;
-            lock (hlp.Mutex)
-            {
-                hlp.CallbackDone = true;
-
-                try
-                {
-                    if (hlp.Client.Client != null)
-                        hlp.Client.EndConnect(asyncres);
-                }
-                catch (Exception)
-                {
-                    // catch that away
-                }
-
-                if (hlp.DoCleanup)
-                {
-                    try
-                    {
-                        asyncres.AsyncWaitHandle.Close();
-                    }
-                    catch (Exception) { }
-
-                    try
-                    {
-                        if (hlp.Client is IDisposable)
-                            ((IDisposable)hlp.Client).Dispose();
-                    }
-                    catch (Exception) { }
-                    hlp.Client = null;
-                }
-            }
-        }
-
-        private class ConnectHelper
-        {
-            public object Mutex = new object();
-            public bool DoCleanup = false;
-            public bool CallbackDone = false;
-            public TcpClient Client;
-            public ConnectHelper(TcpClient client)
-            {
-                Client = client;
-            }
-        }
-
-        public override void Close()
-        {
-            base.Close();
-            if (client != null)
-            {
-                client.Close();
-                client = null;
-            }
-        }
-
-        #region " IDisposable Support "
-        private bool _IsDisposed;
-
-        // IDisposable
-        protected override void Dispose(bool disposing)
-        {
-            if (!_IsDisposed)
-            {
-                if (disposing)
-                {
-                    if (client != null)
-                        ((IDisposable)client).Dispose();
-                    base.Dispose(disposing);
-                }
-            }
-            _IsDisposed = true;
-        }
-        #endregion
-    }
-}
diff --git a/lib/csharp/src/Transport/TSocketVersionizer.cs b/lib/csharp/src/Transport/TSocketVersionizer.cs
deleted file mode 100644
index 8c2f8e9..0000000
--- a/lib/csharp/src/Transport/TSocketVersionizer.cs
+++ /dev/null
@@ -1,78 +0,0 @@
-﻿/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- * Contains some contributions under the Thrift Software License.
- * Please see doc/old-thrift-license.txt in the Thrift distribution for
- * details.
- */
-
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Net.Sockets;
-using System.Reflection;
-using System.Text;
-#if NET45
-using System.Threading.Tasks;
-#endif
-
-namespace Thrift.Transport
-{
-    /// <summary>
-    /// PropertyInfo for the DualMode property of the System.Net.Sockets.Socket class. Used to determine if the sockets are capable of
-    /// automatic IPv4 and IPv6 handling. If DualMode is present the sockets automatically handle IPv4 and IPv6 connections.
-    /// If the DualMode is not available the system configuration determines whether IPv4 or IPv6 is used.
-    /// </summary>
-    internal static class TSocketVersionizer
-    {
-        /// <summary>
-        /// Creates a TcpClient according to the capabilities of the used framework.
-        /// </summary>
-        internal static TcpClient CreateTcpClient()
-        {
-            TcpClient client = null;
-
-#if NET45
-            client = new TcpClient(AddressFamily.InterNetworkV6);
-            client.Client.DualMode = true;
-#else
-            client = new TcpClient(AddressFamily.InterNetwork);
-#endif
-
-            return client;
-        }
-
-        /// <summary>
-        /// Creates a TcpListener according to the capabilities of the used framework.
-        /// </summary>
-        internal static TcpListener CreateTcpListener(Int32 port)
-        {
-            TcpListener listener = null;
-
-#if NET45
-            listener = new TcpListener(System.Net.IPAddress.IPv6Any, port);
-            listener.Server.DualMode = true;
-#else
-
-            listener = new TcpListener(System.Net.IPAddress.Any, port);
-#endif
-
-            return listener;
-        }
-    }
-}
diff --git a/lib/csharp/src/Transport/TStreamTransport.cs b/lib/csharp/src/Transport/TStreamTransport.cs
deleted file mode 100644
index 304599f..0000000
--- a/lib/csharp/src/Transport/TStreamTransport.cs
+++ /dev/null
@@ -1,128 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- * Contains some contributions under the Thrift Software License.
- * Please see doc/old-thrift-license.txt in the Thrift distribution for
- * details.
- */
-
-using System;
-using System.IO;
-
-namespace Thrift.Transport
-{
-    public class TStreamTransport : TTransport
-    {
-        protected Stream inputStream;
-        protected Stream outputStream;
-
-        protected TStreamTransport()
-        {
-        }
-
-        public TStreamTransport(Stream inputStream, Stream outputStream)
-        {
-            this.inputStream = inputStream;
-            this.outputStream = outputStream;
-        }
-
-        public Stream OutputStream
-        {
-            get { return outputStream; }
-        }
-
-        public Stream InputStream
-        {
-            get { return inputStream; }
-        }
-
-        public override bool IsOpen
-        {
-            get { return true; }
-        }
-
-        public override void Open()
-        {
-        }
-
-        public override void Close()
-        {
-            if (inputStream != null)
-            {
-                inputStream.Close();
-                inputStream = null;
-            }
-            if (outputStream != null)
-            {
-                outputStream.Close();
-                outputStream = null;
-            }
-        }
-
-        public override int Read(byte[] buf, int off, int len)
-        {
-            if (inputStream == null)
-            {
-                throw new TTransportException(TTransportException.ExceptionType.NotOpen, "Cannot read from null inputstream");
-            }
-
-            return inputStream.Read(buf, off, len);
-        }
-
-        public override void Write(byte[] buf, int off, int len)
-        {
-            if (outputStream == null)
-            {
-                throw new TTransportException(TTransportException.ExceptionType.NotOpen, "Cannot write to null outputstream");
-            }
-
-            outputStream.Write(buf, off, len);
-        }
-
-        public override void Flush()
-        {
-            if (outputStream == null)
-            {
-                throw new TTransportException(TTransportException.ExceptionType.NotOpen, "Cannot flush null outputstream");
-            }
-
-            outputStream.Flush();
-        }
-
-
-        #region " IDisposable Support "
-        private bool _IsDisposed;
-
-        // IDisposable
-        protected override void Dispose(bool disposing)
-        {
-            if (!_IsDisposed)
-            {
-                if (disposing)
-                {
-                    if (InputStream != null)
-                        InputStream.Dispose();
-                    if (OutputStream != null)
-                        OutputStream.Dispose();
-                }
-            }
-            _IsDisposed = true;
-        }
-        #endregion
-    }
-}
diff --git a/lib/csharp/src/Transport/TTLSServerSocket.cs b/lib/csharp/src/Transport/TTLSServerSocket.cs
deleted file mode 100644
index 716a97c..0000000
--- a/lib/csharp/src/Transport/TTLSServerSocket.cs
+++ /dev/null
@@ -1,223 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-using System;
-using System.Net.Security;
-using System.Net.Sockets;
-using System.Security.Authentication;
-using System.Security.Cryptography.X509Certificates;
-
-namespace Thrift.Transport
-{
-    /// <summary>
-    /// SSL Server Socket Wrapper Class
-    /// </summary>
-    public class TTLSServerSocket : TServerTransport
-    {
-        /// <summary>
-        /// Underlying tcp server
-        /// </summary>
-        private TcpListener server = null;
-
-        /// <summary>
-        /// The port where the socket listen
-        /// </summary>
-        private int port = 0;
-
-        /// <summary>
-        /// Timeout for the created server socket
-        /// </summary>
-        private readonly int clientTimeout;
-
-        /// <summary>
-        /// Whether or not to wrap new TSocket connections in buffers
-        /// </summary>
-        private bool useBufferedSockets = false;
-
-        /// <summary>
-        /// The servercertificate with the private- and public-key
-        /// </summary>
-        private X509Certificate serverCertificate;
-
-        /// <summary>
-        /// The function to validate the client certificate.
-        /// </summary>
-        private RemoteCertificateValidationCallback clientCertValidator;
-
-        /// <summary>
-        /// The function to determine which certificate to use.
-        /// </summary>
-        private LocalCertificateSelectionCallback localCertificateSelectionCallback;
-
-        /// <summary>
-        /// The SslProtocols value that represents the protocol used for authentication.
-        /// </summary>
-        private readonly SslProtocols sslProtocols;
-
-        /// <summary>
-        /// Initializes a new instance of the <see cref="TTLSServerSocket" /> class.
-        /// </summary>
-        /// <param name="port">The port where the server runs.</param>
-        /// <param name="certificate">The certificate object.</param>
-        public TTLSServerSocket(int port, X509Certificate2 certificate)
-            : this(port, 0, certificate)
-        {
-        }
-
-        /// <summary>
-        /// Initializes a new instance of the <see cref="TTLSServerSocket" /> class.
-        /// </summary>
-        /// <param name="port">The port where the server runs.</param>
-        /// <param name="clientTimeout">Send/receive timeout.</param>
-        /// <param name="certificate">The certificate object.</param>
-        public TTLSServerSocket(int port, int clientTimeout, X509Certificate2 certificate)
-            : this(port, clientTimeout, false, certificate)
-        {
-        }
-
-        /// <summary>
-        /// Initializes a new instance of the <see cref="TTLSServerSocket" /> class.
-        /// </summary>
-        /// <param name="port">The port where the server runs.</param>
-        /// <param name="clientTimeout">Send/receive timeout.</param>
-        /// <param name="useBufferedSockets">If set to <c>true</c> [use buffered sockets].</param>
-        /// <param name="certificate">The certificate object.</param>
-        /// <param name="clientCertValidator">The certificate validator.</param>
-        /// <param name="localCertificateSelectionCallback">The callback to select which certificate to use.</param>
-        /// <param name="sslProtocols">The SslProtocols value that represents the protocol used for authentication.</param>
-        public TTLSServerSocket(
-            int port,
-            int clientTimeout,
-            bool useBufferedSockets,
-            X509Certificate2 certificate,
-            RemoteCertificateValidationCallback clientCertValidator = null,
-            LocalCertificateSelectionCallback localCertificateSelectionCallback = null,
-            // TODO: Enable Tls11 and Tls12 (TLS 1.1 and 1.2) by default once we start using .NET 4.5+.
-            SslProtocols sslProtocols = SslProtocols.Tls)
-        {
-            if (!certificate.HasPrivateKey)
-            {
-                throw new TTransportException(TTransportException.ExceptionType.Unknown, "Your server-certificate needs to have a private key");
-            }
-
-            this.port = port;
-            this.clientTimeout = clientTimeout;
-            this.serverCertificate = certificate;
-            this.useBufferedSockets = useBufferedSockets;
-            this.clientCertValidator = clientCertValidator;
-            this.localCertificateSelectionCallback = localCertificateSelectionCallback;
-            this.sslProtocols = sslProtocols;
-            try
-            {
-                // Create server socket
-                this.server = TSocketVersionizer.CreateTcpListener(this.port);
-                this.server.Server.NoDelay = true;
-            }
-            catch (Exception ex)
-            {
-                server = null;
-                throw new TTransportException("Could not create ServerSocket on port " + this.port + ".", ex);
-            }
-        }
-
-        /// <summary>
-        /// Starts the server.
-        /// </summary>
-        public override void Listen()
-        {
-            // Make sure accept is not blocking
-            if (this.server != null)
-            {
-                try
-                {
-                    this.server.Start();
-                }
-                catch (SocketException sx)
-                {
-                    throw new TTransportException("Could not accept on listening socket: " + sx.Message, sx);
-                }
-            }
-        }
-
-        /// <summary>
-        /// Callback for Accept Implementation
-        /// </summary>
-        /// <returns>
-        /// TTransport-object.
-        /// </returns>
-        protected override TTransport AcceptImpl()
-        {
-            if (this.server == null)
-            {
-                throw new TTransportException(TTransportException.ExceptionType.NotOpen, "No underlying server socket.");
-            }
-
-            try
-            {
-                TcpClient client = this.server.AcceptTcpClient();
-                client.SendTimeout = client.ReceiveTimeout = this.clientTimeout;
-
-                //wrap the client in an SSL Socket passing in the SSL cert
-                TTLSSocket socket = new TTLSSocket(
-                    client,
-                    this.serverCertificate,
-                    true,
-                    this.clientCertValidator,
-                    this.localCertificateSelectionCallback,
-                    this.sslProtocols);
-
-                socket.setupTLS();
-
-                if (useBufferedSockets)
-                {
-                    TBufferedTransport trans = new TBufferedTransport(socket);
-                    return trans;
-                }
-                else
-                {
-                    return socket;
-                }
-
-            }
-            catch (Exception ex)
-            {
-                throw new TTransportException(ex.ToString(), ex);
-            }
-        }
-
-        /// <summary>
-        /// Stops the Server
-        /// </summary>
-        public override void Close()
-        {
-            if (this.server != null)
-            {
-                try
-                {
-                    this.server.Stop();
-                }
-                catch (Exception ex)
-                {
-                    throw new TTransportException("WARNING: Could not close server socket: " + ex, ex);
-                }
-                this.server = null;
-            }
-        }
-    }
-}
diff --git a/lib/csharp/src/Transport/TTLSSocket.cs b/lib/csharp/src/Transport/TTLSSocket.cs
deleted file mode 100644
index 06286dc..0000000
--- a/lib/csharp/src/Transport/TTLSSocket.cs
+++ /dev/null
@@ -1,445 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-using System;
-using System.Net.Security;
-using System.Net.Sockets;
-using System.Security.Authentication;
-using System.Security.Cryptography.X509Certificates;
-
-namespace Thrift.Transport
-{
-    /// <summary>
-    /// SSL Socket Wrapper class
-    /// </summary>
-    public class TTLSSocket : TStreamTransport
-    {
-        /// <summary>
-        /// Internal TCP Client
-        /// </summary>
-        private TcpClient client;
-
-        /// <summary>
-        /// The host
-        /// </summary>
-        private string host;
-
-        /// <summary>
-        /// The port
-        /// </summary>
-        private int port;
-
-        /// <summary>
-        /// The timeout for the connection
-        /// </summary>
-        private int timeout;
-
-        /// <summary>
-        /// Internal SSL Stream for IO
-        /// </summary>
-        private SslStream secureStream;
-
-        /// <summary>
-        /// Defines wheter or not this socket is a server socket<br/>
-        /// This is used for the TLS-authentication
-        /// </summary>
-        private bool isServer;
-
-        /// <summary>
-        /// The certificate
-        /// </summary>
-        private X509Certificate certificate;
-
-        /// <summary>
-        /// User defined certificate validator.
-        /// </summary>
-        private RemoteCertificateValidationCallback certValidator;
-
-        /// <summary>
-        /// The function to determine which certificate to use.
-        /// </summary>
-        private LocalCertificateSelectionCallback localCertificateSelectionCallback;
-
-        /// <summary>
-        /// The SslProtocols value that represents the protocol used for authentication.SSL protocols to be used.
-        /// </summary>
-        private readonly SslProtocols sslProtocols;
-
-        /// <summary>
-        /// Initializes a new instance of the <see cref="TTLSSocket"/> class.
-        /// </summary>
-        /// <param name="client">An already created TCP-client</param>
-        /// <param name="certificate">The certificate.</param>
-        /// <param name="isServer">if set to <c>true</c> [is server].</param>
-        /// <param name="certValidator">User defined cert validator.</param>
-        /// <param name="localCertificateSelectionCallback">The callback to select which certificate to use.</param>
-        /// <param name="sslProtocols">The SslProtocols value that represents the protocol used for authentication.</param>
-        public TTLSSocket(
-            TcpClient client,
-            X509Certificate certificate,
-            bool isServer = false,
-            RemoteCertificateValidationCallback certValidator = null,
-            LocalCertificateSelectionCallback localCertificateSelectionCallback = null,
-            // TODO: Enable Tls11 and Tls12 (TLS 1.1 and 1.2) by default once we start using .NET 4.5+.
-            SslProtocols sslProtocols = SslProtocols.Tls)
-        {
-            this.client = client;
-            this.certificate = certificate;
-            this.certValidator = certValidator;
-            this.localCertificateSelectionCallback = localCertificateSelectionCallback;
-            this.sslProtocols = sslProtocols;
-            this.isServer = isServer;
-            if (isServer && certificate == null)
-            {
-                throw new ArgumentException("TTLSSocket needs certificate to be used for server", "certificate");
-            }
-
-            if (IsOpen)
-            {
-                base.inputStream = client.GetStream();
-                base.outputStream = client.GetStream();
-            }
-        }
-
-        /// <summary>
-        /// Initializes a new instance of the <see cref="TTLSSocket"/> class.
-        /// </summary>
-        /// <param name="host">The host, where the socket should connect to.</param>
-        /// <param name="port">The port.</param>
-        /// <param name="certificatePath">The certificate path.</param>
-        /// <param name="certValidator">User defined cert validator.</param>
-        /// <param name="localCertificateSelectionCallback">The callback to select which certificate to use.</param>
-        /// <param name="sslProtocols">The SslProtocols value that represents the protocol used for authentication.</param>
-        public TTLSSocket(
-            string host,
-            int port,
-            string certificatePath,
-            RemoteCertificateValidationCallback certValidator = null,
-            LocalCertificateSelectionCallback localCertificateSelectionCallback = null,
-            SslProtocols sslProtocols = SslProtocols.Tls)
-            : this(host, port, 0, X509Certificate.CreateFromCertFile(certificatePath), certValidator, localCertificateSelectionCallback, sslProtocols)
-        {
-        }
-
-        /// <summary>
-        /// Initializes a new instance of the <see cref="TTLSSocket"/> class.
-        /// </summary>
-        /// <param name="host">The host, where the socket should connect to.</param>
-        /// <param name="port">The port.</param>
-        /// <param name="certificate">The certificate.</param>
-        /// <param name="certValidator">User defined cert validator.</param>
-        /// <param name="localCertificateSelectionCallback">The callback to select which certificate to use.</param>
-        /// <param name="sslProtocols">The SslProtocols value that represents the protocol used for authentication.</param>
-        public TTLSSocket(
-            string host,
-            int port,
-            X509Certificate certificate = null,
-            RemoteCertificateValidationCallback certValidator = null,
-            LocalCertificateSelectionCallback localCertificateSelectionCallback = null,
-            SslProtocols sslProtocols = SslProtocols.Tls)
-            : this(host, port, 0, certificate, certValidator, localCertificateSelectionCallback, sslProtocols)
-        {
-        }
-
-        /// <summary>
-        /// Initializes a new instance of the <see cref="TTLSSocket"/> class.
-        /// </summary>
-        /// <param name="host">The host, where the socket should connect to.</param>
-        /// <param name="port">The port.</param>
-        /// <param name="timeout">The timeout.</param>
-        /// <param name="certificate">The certificate.</param>
-        /// <param name="certValidator">User defined cert validator.</param>
-        /// <param name="localCertificateSelectionCallback">The callback to select which certificate to use.</param>
-        /// <param name="sslProtocols">The SslProtocols value that represents the protocol used for authentication.</param>
-        public TTLSSocket(
-            string host,
-            int port,
-            int timeout,
-            X509Certificate certificate,
-            RemoteCertificateValidationCallback certValidator = null,
-            LocalCertificateSelectionCallback localCertificateSelectionCallback = null,
-            SslProtocols sslProtocols = SslProtocols.Tls)
-        {
-            this.host = host;
-            this.port = port;
-            this.timeout = timeout;
-            this.certificate = certificate;
-            this.certValidator = certValidator;
-            this.localCertificateSelectionCallback = localCertificateSelectionCallback;
-            this.sslProtocols = sslProtocols;
-
-            InitSocket();
-        }
-
-        /// <summary>
-        /// Creates the TcpClient and sets the timeouts
-        /// </summary>
-        private void InitSocket()
-        {
-            client = TSocketVersionizer.CreateTcpClient();
-            client.ReceiveTimeout = client.SendTimeout = timeout;
-            client.Client.NoDelay = true;
-        }
-
-        /// <summary>
-        /// Sets Send / Recv Timeout for IO
-        /// </summary>
-        public int Timeout
-        {
-            set
-            {
-                this.client.ReceiveTimeout = this.client.SendTimeout = this.timeout = value;
-            }
-        }
-
-        /// <summary>
-        /// Gets the TCP client.
-        /// </summary>
-        public TcpClient TcpClient
-        {
-            get
-            {
-                return client;
-            }
-        }
-
-        /// <summary>
-        /// Gets the host.
-        /// </summary>
-        public string Host
-        {
-            get
-            {
-                return host;
-            }
-        }
-
-        /// <summary>
-        /// Gets the port.
-        /// </summary>
-        public int Port
-        {
-            get
-            {
-                return port;
-            }
-        }
-
-        /// <summary>
-        /// Gets a value indicating whether TCP Client is Cpen
-        /// </summary>
-        public override bool IsOpen
-        {
-            get
-            {
-                if (this.client == null)
-                {
-                    return false;
-                }
-
-                return this.client.Connected;
-            }
-        }
-
-        /// <summary>
-        /// Validates the certificates!<br/>
-        /// </summary>
-        /// <param name="sender">The sender-object.</param>
-        /// <param name="certificate">The used certificate.</param>
-        /// <param name="chain">The certificate chain.</param>
-        /// <param name="sslValidationErrors">An enum, which lists all the errors from the .NET certificate check.</param>
-        /// <returns></returns>
-        private bool DefaultCertificateValidator(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslValidationErrors)
-        {
-            return (sslValidationErrors == SslPolicyErrors.None);
-        }
-
-        /// <summary>
-        /// Connects to the host and starts the routine, which sets up the TLS
-        /// </summary>
-        public override void Open()
-        {
-            if (IsOpen)
-            {
-                throw new TTransportException(TTransportException.ExceptionType.AlreadyOpen, "Socket already connected");
-            }
-
-            if (string.IsNullOrEmpty(host))
-            {
-                throw new TTransportException(TTransportException.ExceptionType.NotOpen, "Cannot open null host");
-            }
-
-            if (port <= 0)
-            {
-                throw new TTransportException(TTransportException.ExceptionType.NotOpen, "Cannot open without port");
-            }
-
-            if (client == null)
-            {
-                InitSocket();
-            }
-
-            if (timeout == 0)            // no timeout -> infinite
-            {
-                client.Connect(host, port);
-            }
-            else                        // we have a timeout -> use it
-            {
-                ConnectHelper hlp = new ConnectHelper(client);
-                IAsyncResult asyncres = client.BeginConnect(host, port, new AsyncCallback(ConnectCallback), hlp);
-                bool bConnected = asyncres.AsyncWaitHandle.WaitOne(timeout) && client.Connected;
-                if (!bConnected)
-                {
-                    lock (hlp.Mutex)
-                    {
-                        if (hlp.CallbackDone)
-                        {
-                            asyncres.AsyncWaitHandle.Close();
-                            client.Close();
-                        }
-                        else
-                        {
-                            hlp.DoCleanup = true;
-                            client = null;
-                        }
-                    }
-                    throw new TTransportException(TTransportException.ExceptionType.TimedOut, "Connect timed out");
-                }
-            }
-
-            setupTLS();
-        }
-
-        /// <summary>
-        /// Creates a TLS-stream and lays it over the existing socket
-        /// </summary>
-        public void setupTLS()
-        {
-            RemoteCertificateValidationCallback validator = this.certValidator ?? DefaultCertificateValidator;
-
-            if (this.localCertificateSelectionCallback != null)
-            {
-                this.secureStream = new SslStream(
-                    this.client.GetStream(),
-                    false,
-                    validator,
-                    this.localCertificateSelectionCallback
-                );
-            }
-            else
-            {
-                this.secureStream = new SslStream(
-                    this.client.GetStream(),
-                    false,
-                    validator
-                );
-            }
-
-            try
-            {
-                if (isServer)
-                {
-                    // Server authentication
-                    this.secureStream.AuthenticateAsServer(this.certificate, this.certValidator != null, sslProtocols, true);
-                }
-                else
-                {
-                    // Client authentication
-                    X509CertificateCollection certs = certificate != null ? new X509CertificateCollection { certificate } : new X509CertificateCollection();
-                    this.secureStream.AuthenticateAsClient(host, certs, sslProtocols, true);
-                }
-            }
-            catch (Exception)
-            {
-                this.Close();
-                throw;
-            }
-
-            inputStream = this.secureStream;
-            outputStream = this.secureStream;
-        }
-        
-        static void ConnectCallback(IAsyncResult asyncres)
-        {
-            ConnectHelper hlp = asyncres.AsyncState as ConnectHelper;
-            lock (hlp.Mutex)
-            {
-                hlp.CallbackDone = true;
-
-                try
-                {
-                    if (hlp.Client.Client != null)
-                        hlp.Client.EndConnect(asyncres);
-                }
-                catch (Exception)
-                {
-                    // catch that away
-                }
-
-                if (hlp.DoCleanup)
-                {
-                    try
-                    {
-                        asyncres.AsyncWaitHandle.Close();
-                    }
-                    catch (Exception) { }
-
-                    try
-                    {
-                        if (hlp.Client is IDisposable)
-                            ((IDisposable)hlp.Client).Dispose();
-                    }
-                    catch (Exception) { }
-                    hlp.Client = null;
-                }
-            }
-        }
-
-        private class ConnectHelper
-        {
-            public object Mutex = new object();
-            public bool DoCleanup = false;
-            public bool CallbackDone = false;
-            public TcpClient Client;
-            public ConnectHelper(TcpClient client)
-            {
-                Client = client;
-            }
-        }
-
-        /// <summary>
-        /// Closes the SSL Socket
-        /// </summary>
-        public override void Close()
-        {
-            base.Close();
-            if (this.client != null)
-            {
-                this.client.Close();
-                this.client = null;
-            }
-
-            if (this.secureStream != null)
-            {
-                this.secureStream.Close();
-                this.secureStream = null;
-            }
-        }
-    }
-}
diff --git a/lib/csharp/src/Transport/TTransport.cs b/lib/csharp/src/Transport/TTransport.cs
deleted file mode 100644
index 5e4ac22..0000000
--- a/lib/csharp/src/Transport/TTransport.cs
+++ /dev/null
@@ -1,146 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- * Contains some contributions under the Thrift Software License.
- * Please see doc/old-thrift-license.txt in the Thrift distribution for
- * details.
- */
-
-using System;
-using System.IO;
-
-namespace Thrift.Transport
-{
-    public abstract class TTransport : IDisposable
-    {
-        public abstract bool IsOpen
-        {
-            get;
-        }
-
-        private byte[] _peekBuffer = new byte[1];
-        private bool _hasPeekByte;
-
-        public bool Peek()
-        {
-            //If we already have a byte read but not consumed, do nothing.
-            if (_hasPeekByte)
-                return true;
-
-            //If transport closed we can't peek.
-            if (!IsOpen)
-                return false;
-
-            //Try to read one byte. If succeeds we will need to store it for the next read.
-            try
-            {
-                int bytes = Read(_peekBuffer, 0, 1);
-                if (bytes == 0)
-                    return false;
-            }
-            catch (IOException)
-            {
-                return false;
-            }
-
-            _hasPeekByte = true;
-            return true;
-        }
-
-        public abstract void Open();
-
-        public abstract void Close();
-
-        protected static void ValidateBufferArgs(byte[] buf, int off, int len)
-        {
-            if (buf == null)
-                throw new ArgumentNullException("buf");
-            if (off < 0)
-                throw new ArgumentOutOfRangeException("Buffer offset is smaller than zero.");
-            if (len < 0)
-                throw new ArgumentOutOfRangeException("Buffer length is smaller than zero.");
-            if (off + len > buf.Length)
-                throw new ArgumentOutOfRangeException("Not enough data.");
-        }
-
-        public abstract int Read(byte[] buf, int off, int len);
-
-        public int ReadAll(byte[] buf, int off, int len)
-        {
-            ValidateBufferArgs(buf, off, len);
-            int got = 0;
-
-            //If we previously peeked a byte, we need to use that first.
-            if (_hasPeekByte)
-            {
-                buf[off + got++] = _peekBuffer[0];
-                _hasPeekByte = false;
-            }
-
-            while (got < len)
-            {
-                int ret = Read(buf, off + got, len - got);
-                if (ret <= 0)
-                {
-                    throw new TTransportException(
-                        TTransportException.ExceptionType.EndOfFile,
-                        "Cannot read, Remote side has closed");
-                }
-                got += ret;
-            }
-            return got;
-        }
-
-        public virtual void Write(byte[] buf)
-        {
-            Write(buf, 0, buf.Length);
-        }
-
-        public abstract void Write(byte[] buf, int off, int len);
-
-        public virtual void Flush()
-        {
-        }
-
-        public virtual IAsyncResult BeginFlush(AsyncCallback callback, object state)
-        {
-            throw new TTransportException(
-                TTransportException.ExceptionType.Unknown,
-                "Asynchronous operations are not supported by this transport.");
-        }
-
-        public virtual void EndFlush(IAsyncResult asyncResult)
-        {
-            throw new TTransportException(
-                TTransportException.ExceptionType.Unknown,
-                "Asynchronous operations are not supported by this transport.");
-        }
-
-        #region " IDisposable Support "
-        // IDisposable
-        protected abstract void Dispose(bool disposing);
-
-        public void Dispose()
-        {
-            // Do not change this code.  Put cleanup code in Dispose(ByVal disposing As Boolean) above.
-            Dispose(true);
-            GC.SuppressFinalize(this);
-        }
-        #endregion
-    }
-}
diff --git a/lib/csharp/src/Transport/TTransportException.cs b/lib/csharp/src/Transport/TTransportException.cs
deleted file mode 100644
index 7f6cc18..0000000
--- a/lib/csharp/src/Transport/TTransportException.cs
+++ /dev/null
@@ -1,69 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- * Contains some contributions under the Thrift Software License.
- * Please see doc/old-thrift-license.txt in the Thrift distribution for
- * details.
- */
-
-using System;
-
-namespace Thrift.Transport
-{
-    public class TTransportException : TException
-    {
-        protected ExceptionType type;
-
-        public TTransportException()
-            : base()
-        {
-        }
-
-        public TTransportException(ExceptionType type)
-            : this()
-        {
-            this.type = type;
-        }
-
-        public TTransportException(ExceptionType type, string message, Exception inner = null)
-            : base(message, inner)
-        {
-            this.type = type;
-        }
-
-        public TTransportException(string message, Exception inner = null)
-            : base(message, inner)
-        {
-        }
-
-        public ExceptionType Type
-        {
-            get { return type; }
-        }
-
-        public enum ExceptionType
-        {
-            Unknown,
-            NotOpen,
-            AlreadyOpen,
-            TimedOut,
-            EndOfFile,
-            Interrupted
-        }
-    }
-}
diff --git a/lib/csharp/src/Transport/TTransportFactory.cs b/lib/csharp/src/Transport/TTransportFactory.cs
deleted file mode 100644
index 47a0c62..0000000
--- a/lib/csharp/src/Transport/TTransportFactory.cs
+++ /dev/null
@@ -1,42 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- * Contains some contributions under the Thrift Software License.
- * Please see doc/old-thrift-license.txt in the Thrift distribution for
- * details.
- */
-
-using System;
-
-namespace Thrift.Transport
-{
-    /// <summary>
-    /// From Mark Slee &amp; Aditya Agarwal of Facebook:
-    /// Factory class used to create wrapped instance of Transports.
-    /// This is used primarily in servers, which get Transports from
-    /// a ServerTransport and then may want to mutate them (i.e. create
-    /// a BufferedTransport from the underlying base transport)
-    /// </summary>
-    public class TTransportFactory
-    {
-        public virtual TTransport GetTransport(TTransport trans)
-        {
-            return trans;
-        }
-    }
-}
diff --git a/lib/csharp/src/thrift.snk b/lib/csharp/src/thrift.snk
deleted file mode 100644
index 97bc581..0000000
--- a/lib/csharp/src/thrift.snk
+++ /dev/null
Binary files differ
diff --git a/lib/csharp/test/JSON/JSONTest.csproj b/lib/csharp/test/JSON/JSONTest.csproj
deleted file mode 100644
index f07d43e..0000000
--- a/lib/csharp/test/JSON/JSONTest.csproj
+++ /dev/null
@@ -1,85 +0,0 @@
-﻿<?xml version="1.0" encoding="utf-8"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements. See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership. The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License. You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied. See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <PropertyGroup>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">x86</Platform>
-    <ProductVersion>8.0.30703</ProductVersion>
-    <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{E37A0034-DCBF-4886-A0DA-25A03D12D975}</ProjectGuid>
-    <OutputType>Exe</OutputType>
-    <AppDesignerFolder>Properties</AppDesignerFolder>
-    <RootNamespace>JSONTest</RootNamespace>
-    <AssemblyName>JSONTest</AssemblyName>
-    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
-    <TargetFrameworkProfile>
-    </TargetFrameworkProfile>
-    <FileAlignment>512</FileAlignment>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
-    <PlatformTarget>x86</PlatformTarget>
-    <DebugSymbols>true</DebugSymbols>
-    <DebugType>full</DebugType>
-    <Optimize>false</Optimize>
-    <OutputPath>bin\Debug\</OutputPath>
-    <DefineConstants>DEBUG;TRACE</DefineConstants>
-    <ErrorReport>prompt</ErrorReport>
-    <WarningLevel>4</WarningLevel>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
-    <PlatformTarget>x86</PlatformTarget>
-    <DebugType>pdbonly</DebugType>
-    <Optimize>true</Optimize>
-    <OutputPath>bin\Release\</OutputPath>
-    <DefineConstants>TRACE</DefineConstants>
-    <ErrorReport>prompt</ErrorReport>
-    <WarningLevel>4</WarningLevel>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="System" />
-    <Reference Include="System.Core" />
-    <Reference Include="System.Xml.Linq" />
-    <Reference Include="System.Data.DataSetExtensions" />
-    <Reference Include="Microsoft.CSharp" />
-    <Reference Include="System.Data" />
-    <Reference Include="System.Xml" />
-  </ItemGroup>
-  <ItemGroup>
-    <Compile Include="Program.cs" />
-    <Compile Include="Properties\AssemblyInfo.cs" />
-  </ItemGroup>
-  <ItemGroup>
-    <None Include="app.config" />
-  </ItemGroup>
-  <ItemGroup>
-    <ProjectReference Include="..\..\src\Thrift.csproj">
-      <Project>{499EB63C-D74C-47E8-AE48-A2FC94538E9D}</Project>
-      <Name>Thrift</Name>
-    </ProjectReference>
-  </ItemGroup>
-  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
-  <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
-       Other similar extension points exist, see Microsoft.Common.targets.
-  <Target Name="BeforeBuild">
-  </Target>
-  <Target Name="AfterBuild">
-  </Target>
-  -->
-</Project>
\ No newline at end of file
diff --git a/lib/csharp/test/JSON/Program.cs b/lib/csharp/test/JSON/Program.cs
deleted file mode 100644
index f61388a..0000000
--- a/lib/csharp/test/JSON/Program.cs
+++ /dev/null
@@ -1,95 +0,0 @@
-﻿/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-using System;
-using System.Collections.Generic;
-using System.Diagnostics;
-using System.IO;
-using System.Linq;
-using System.Text;
-using Thrift.Protocol;
-using Thrift.Transport;
-
-namespace JSONTest
-{
-    class Program
-    {
-        static void Main(string[] args)
-        {
-            TestThrift2365();  // JSON binary decodes too much data
-            TestThrift2336();  // hex encoding using \uXXXX where 0xXXXX > 0xFF
-            TestThrift3403(); // JSON escaped unicode surrogate pair support.
-        }
-
-
-        public static void TestThrift2365()
-        {
-            var rnd = new Random();
-            for (var len = 0; len < 10; ++len)
-            {
-                byte[] dataWritten = new byte[len];
-                rnd.NextBytes(dataWritten);
-
-                Stream stm = new MemoryStream();
-                TTransport trans = new TStreamTransport(null, stm);
-                TProtocol prot = new TJSONProtocol(trans);
-                prot.WriteBinary(dataWritten);
-
-                stm.Position = 0;
-                trans = new TStreamTransport(stm, null);
-                prot = new TJSONProtocol(trans);
-                byte[] dataRead = prot.ReadBinary();
-
-                Debug.Assert(dataRead.Length == dataWritten.Length);
-                for (var i = 0; i < dataRead.Length; ++i)
-                    Debug.Assert(dataRead[i] == dataWritten[i]);
-            }
-        }
-
-
-        public static void TestThrift2336()
-        {
-            const string RUSSIAN_TEXT = "\u0420\u0443\u0441\u0441\u043a\u043e\u0435 \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435";
-            const string RUSSIAN_JSON = "\"\\u0420\\u0443\\u0441\\u0441\\u043a\\u043e\\u0435 \\u041d\\u0430\\u0437\\u0432\\u0430\\u043d\\u0438\\u0435\"";
-
-            // prepare buffer with JSON data
-            byte[] rawBytes = new byte[RUSSIAN_JSON.Length];
-            for (var i = 0; i < RUSSIAN_JSON.Length; ++i)
-                rawBytes[i] = (byte)(RUSSIAN_JSON[i] & (char)0xFF);  // only low bytes
-
-            // parse and check
-            var stm = new MemoryStream(rawBytes);
-            var trans = new TStreamTransport(stm, null);
-            var prot = new TJSONProtocol(trans);
-            Debug.Assert(prot.ReadString() == RUSSIAN_TEXT, "reading JSON with hex-encoded chars > 8 bit");
-        }
-
-        public static void TestThrift3403()
-        {
-            string GCLEF_TEXT = "\ud834\udd1e";
-            const string GCLEF_JSON = "\"\\ud834\\udd1e\"";
-
-            // parse and check
-            var stm = new MemoryStream(Encoding.UTF8.GetBytes(GCLEF_JSON));
-            var trans = new TStreamTransport(stm, null);
-            var prot = new TJSONProtocol(trans);
-            Debug.Assert(prot.ReadString() == GCLEF_TEXT, "reading JSON with surrogate pair hex-encoded chars");
-        }
-    }
-}
diff --git a/lib/csharp/test/JSON/Properties/AssemblyInfo.cs b/lib/csharp/test/JSON/Properties/AssemblyInfo.cs
deleted file mode 100644
index fdff4a1..0000000
--- a/lib/csharp/test/JSON/Properties/AssemblyInfo.cs
+++ /dev/null
@@ -1,55 +0,0 @@
-﻿/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-using System.Reflection;
-using System.Runtime.CompilerServices;
-using System.Runtime.InteropServices;
-
-// Allgemeine Informationen über eine Assembly werden über die folgenden
-// Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern,
-// die mit einer Assembly verknüpft sind.
-[assembly: AssemblyTitle("JSONTest")]
-[assembly: AssemblyDescription("")]
-[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("The Apache Software Foundation")]
-[assembly: AssemblyProduct("Thrift")]
-[assembly: AssemblyCopyright("The Apache Software Foundation")]
-[assembly: AssemblyTrademark("")]
-[assembly: AssemblyCulture("")]
-
-// Durch Festlegen von ComVisible auf "false" werden die Typen in dieser Assembly unsichtbar
-// für COM-Komponenten. Wenn Sie auf einen Typ in dieser Assembly von
-// COM zugreifen müssen, legen Sie das ComVisible-Attribut für diesen Typ auf "true" fest.
-[assembly: ComVisible(false)]
-
-// Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird
-[assembly: Guid("2b2e7d56-3e65-4368-92d7-e34d56b7105e")]
-
-// Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten:
-//
-//      Hauptversion
-//      Nebenversion
-//      Buildnummer
-//      Revision
-//
-// Sie können alle Werte angeben oder die standardmäßigen Build- und Revisionsnummern
-// übernehmen, indem Sie "*" eingeben:
-// [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("1.0.0.0")]
-[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/lib/csharp/test/JSON/app.config b/lib/csharp/test/JSON/app.config
deleted file mode 100644
index 9c1919d..0000000
--- a/lib/csharp/test/JSON/app.config
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements. See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership. The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License. You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied. See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<configuration>
-<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup></configuration>
diff --git a/lib/csharp/test/Multiplex/Client/Multiplex.Test.Client.cs b/lib/csharp/test/Multiplex/Client/Multiplex.Test.Client.cs
deleted file mode 100644
index c810a08..0000000
--- a/lib/csharp/test/Multiplex/Client/Multiplex.Test.Client.cs
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-using System;
-using System.Collections.Generic;
-using Thrift.Collections;
-using Thrift.Transport;
-using Thrift.Protocol;
-using Thrift.Server;
-using Thrift;
-using Test.Multiplex;
-
-namespace Test.Multiplex.Client
-{
-    public class TestClient
-    {
-        static void Execute(int port)
-        {
-            try
-            {
-                TTransport trans;
-                trans = new TSocket("localhost", port);
-                trans = new TFramedTransport(trans);
-                trans.Open();
-
-                TProtocol Protocol = new TBinaryProtocol(trans, true, true);
-
-                TMultiplexedProtocol multiplex;
-
-                multiplex = new TMultiplexedProtocol(Protocol, Constants.NAME_BENCHMARKSERVICE);
-                BenchmarkService.Iface bench = new BenchmarkService.Client(multiplex);
-
-                multiplex = new TMultiplexedProtocol(Protocol, Constants.NAME_AGGR);
-                Aggr.Iface aggr = new Aggr.Client(multiplex);
-
-                for (sbyte i = 1; 10 >= i; ++i)
-                {
-                    aggr.addValue(bench.fibonacci(i));
-                }
-
-                foreach (int k in aggr.getValues())
-                {
-                    Console.Write(k.ToString() + " ");
-                    Console.WriteLine("");
-                }
-                trans.Close();
-            }
-            catch (Exception e)
-            {
-                Console.WriteLine(e.Message);
-            }
-        }
-
-        static void Main(string[] args)
-        {
-            int port = 9090;
-            if (args.Length > 0)
-            {
-                port = ushort.Parse(args[0]);
-            }
-            Execute(port);
-            Console.WriteLine("done.");
-        }
-    }
-}
-
diff --git a/lib/csharp/test/Multiplex/Client/MultiplexClient.csproj b/lib/csharp/test/Multiplex/Client/MultiplexClient.csproj
deleted file mode 100644
index 551640b..0000000
--- a/lib/csharp/test/Multiplex/Client/MultiplexClient.csproj
+++ /dev/null
@@ -1,148 +0,0 @@
-﻿<?xml version="1.0" encoding="utf-8"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements. See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership. The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License. You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied. See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <PropertyGroup>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <ProductVersion>9.0.21022</ProductVersion>
-    <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{5E91DA17-E548-415F-8C9F-9E84EDF8EE06}</ProjectGuid>
-    <OutputType>Exe</OutputType>
-    <AppDesignerFolder>Properties</AppDesignerFolder>
-    <RootNamespace>MultiplexClient</RootNamespace>
-    <AssemblyName>MultiplexClient</AssemblyName>
-    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
-    <FileAlignment>512</FileAlignment>
-    <IsWebBootstrapper>false</IsWebBootstrapper>
-    <FileUpgradeFlags>
-    </FileUpgradeFlags>
-    <OldToolsVersion>3.5</OldToolsVersion>
-    <UpgradeBackupLocation />
-    <PublishUrl>publish\</PublishUrl>
-    <Install>true</Install>
-    <InstallFrom>Disk</InstallFrom>
-    <UpdateEnabled>false</UpdateEnabled>
-    <UpdateMode>Foreground</UpdateMode>
-    <UpdateInterval>7</UpdateInterval>
-    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
-    <UpdatePeriodically>false</UpdatePeriodically>
-    <UpdateRequired>false</UpdateRequired>
-    <MapFileExtensions>true</MapFileExtensions>
-    <ApplicationRevision>0</ApplicationRevision>
-    <ApplicationVersion>0.14.0.0</ApplicationVersion>
-    <UseApplicationTrust>false</UseApplicationTrust>
-    <BootstrapperEnabled>true</BootstrapperEnabled>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
-    <DebugSymbols>true</DebugSymbols>
-    <DebugType>full</DebugType>
-    <Optimize>false</Optimize>
-    <OutputPath>..\bin\Debug\</OutputPath>
-    <DefineConstants>DEBUG;TRACE</DefineConstants>
-    <ErrorReport>prompt</ErrorReport>
-    <WarningLevel>4</WarningLevel>
-    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
-    <DebugType>pdbonly</DebugType>
-    <Optimize>true</Optimize>
-    <OutputPath>..\bin\Release\</OutputPath>
-    <DefineConstants>TRACE</DefineConstants>
-    <ErrorReport>prompt</ErrorReport>
-    <WarningLevel>4</WarningLevel>
-    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="System" />
-  </ItemGroup>
-  <ItemGroup>
-    <Compile Include="..\Multiplex.Test.Common.cs">
-      <Link>Multiplex.Test.Common.cs</Link>
-    </Compile>
-    <Compile Include="..\gen-csharp\Aggr.cs" />
-    <Compile Include="..\gen-csharp\BenchmarkService.cs" />
-    <Compile Include="..\gen-csharp\Error.cs" />
-    <Compile Include="Multiplex.Test.Client.cs" />
-    <Compile Include="Properties\AssemblyInfo.cs" />
-  </ItemGroup>
-  <ItemGroup>
-    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
-      <Visible>False</Visible>
-      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
-      <Install>false</Install>
-    </BootstrapperPackage>
-    <BootstrapperPackage Include="Microsoft.Net.Framework.2.0">
-      <Visible>False</Visible>
-      <ProductName>.NET Framework 2.0 %28x86%29</ProductName>
-      <Install>false</Install>
-    </BootstrapperPackage>
-    <BootstrapperPackage Include="Microsoft.Net.Framework.3.0">
-      <Visible>False</Visible>
-      <ProductName>.NET Framework 3.0 %28x86%29</ProductName>
-      <Install>false</Install>
-    </BootstrapperPackage>
-    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5">
-      <Visible>False</Visible>
-      <ProductName>.NET Framework 3.5</ProductName>
-      <Install>true</Install>
-    </BootstrapperPackage>
-    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
-      <Visible>False</Visible>
-      <ProductName>.NET Framework 3.5 SP1</ProductName>
-      <Install>false</Install>
-    </BootstrapperPackage>
-    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
-      <Visible>False</Visible>
-      <ProductName>Windows Installer 3.1</ProductName>
-      <Install>true</Install>
-    </BootstrapperPackage>
-  </ItemGroup>
-  <ItemGroup>
-    <ProjectReference Include="..\..\..\src\Thrift.csproj">
-      <Project>{499EB63C-D74C-47E8-AE48-A2FC94538E9D}</Project>
-      <Name>Thrift</Name>
-    </ProjectReference>
-  </ItemGroup>
-  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
-  <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
-       Other similar extension points exist, see Microsoft.Common.targets.
-  <Target Name="BeforeBuild">
-  </Target>
-  <Target Name="AfterBuild">
-  </Target>
-  -->
-  <PropertyGroup>
-    <PreBuildEvent>rmdir /s /q "$(ProjectDir)gen-csharp"
-del /f /q "$(ProjectDir)ThriftImpl.dll"
-SET OUTPUT_DIR=$(ProjectDir)
-
-SET THRIFT_FILE=$(ProjectDir)\..\..\..\..\..\contrib\async-test\aggr.thrift
-for %25%25I in ("%25OUTPUT_DIR%25") do set SHORT_DIR=%25%25~fsI
-for %25%25I in ("%25THRIFT_FILE%25") do set THRIFT_SHORT=%25%25~fsI
-"$(ProjectDir)\..\..\..\..\..\compiler\cpp\thrift.exe" --gen csharp -o %25SHORT_DIR%25 %25THRIFT_SHORT%25
-
-SET THRIFT_FILE=$(ProjectDir)\..\..\..\..\..\lib\rb\benchmark\Benchmark.thrift
-for %25%25I in ("%25OUTPUT_DIR%25") do set SHORT_DIR=%25%25~fsI
-for %25%25I in ("%25THRIFT_FILE%25") do set THRIFT_SHORT=%25%25~fsI
-"$(ProjectDir)\..\..\..\..\..\compiler\cpp\thrift.exe" --gen csharp -o %25SHORT_DIR%25 %25THRIFT_SHORT%25
-
-</PreBuildEvent>
-  </PropertyGroup>
-</Project>
diff --git a/lib/csharp/test/Multiplex/Client/Properties/AssemblyInfo.cs b/lib/csharp/test/Multiplex/Client/Properties/AssemblyInfo.cs
deleted file mode 100644
index ce6692f..0000000
--- a/lib/csharp/test/Multiplex/Client/Properties/AssemblyInfo.cs
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-using System.Reflection;
-using System.Runtime.CompilerServices;
-using System.Runtime.InteropServices;
-
-// General Information about an assembly is controlled through the following
-// set of attributes. Change these attribute values to modify the information
-// associated with an assembly.
-[assembly: AssemblyTitle("MultiplexClient")]
-[assembly: AssemblyDescription("")]
-[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("The Apache Software Foundation")]
-[assembly: AssemblyProduct("Thrift")]
-[assembly: AssemblyCopyright("The Apache Software Foundation")]
-[assembly: AssemblyTrademark("")]
-[assembly: AssemblyCulture("")]
-
-// Setting ComVisible to false makes the types in this assembly not visible
-// to COM components.  If you need to access a type in this assembly from
-// COM, set the ComVisible attribute to true on that type.
-[assembly: ComVisible(false)]
-
-// The following GUID is for the ID of the typelib if this project is exposed to COM
-[assembly: Guid("66FC61E5-420B-4b56-8012-D6D6CE22537F")]
-
-// Version information for an assembly consists of the following four values:
-//
-//      Major Version
-//      Minor Version
-//      Build Number
-//      Revision
-//
-// You can specify all the values or you can default the Build and Revision Numbers
-// by using the '*' as shown below:
-// [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("0.14.0.0")]
-[assembly: AssemblyFileVersion("0.14.0.0")]
diff --git a/lib/csharp/test/Multiplex/Makefile.am b/lib/csharp/test/Multiplex/Makefile.am
deleted file mode 100644
index 9c1f1b8..0000000
--- a/lib/csharp/test/Multiplex/Makefile.am
+++ /dev/null
@@ -1,63 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-
-GENERATED = \
-	gen-csharp/Aggr.cs \
-	gen-csharp/BenchmarkService.cs \
-	gen-csharp/Error.cs
-
-BUILT_SOURCES = $(GENERATED)
-
-THRIFT = $(top_builddir)/compiler/cpp/thrift
-
-gen-csharp/Aggr.cs: $(top_srcdir)/contrib/async-test/aggr.thrift
-	$(THRIFT) --gen csharp $<
-
-gen-csharp/BenchmarkService.cs gen-csharp/Error.cs: $(top_srcdir)/lib/rb/benchmark/Benchmark.thrift
-	$(THRIFT) --gen csharp $<
-
-ThriftImpl.dll: Multiplex.Test.Common.cs $(GENERATED) ../../Thrift.dll
-	$(CSC) $(CSC_DEFINES) -t:library -out:./ThriftImpl.dll -reference:../../Thrift.dll $(GENERATED) $<
-
-MultiplexClient.exe: Client/Multiplex.Test.Client.cs ThriftImpl.dll
-	$(CSC) $(CSC_DEFINES) -out:$@ -reference:../../Thrift.dll -reference:ThriftImpl.dll $<
-
-MultiplexServer.exe: Server/Multiplex.Test.Server.cs ThriftImpl.dll
-	$(CSC) $(CSC_DEFINES) -out:$@ -reference:../../Thrift.dll -reference:ThriftImpl.dll $<
-
-CLEANFILES = \
-	MultiplexClient.exe \
-	MultiplexServer.exe \
-	ThriftImpl.dll
-
-DISTCLEANFILES = \
-	Makefile.in
-
-clean-local:
-	$(RM) -rf gen-csharp
-
-dist-hook:
-	$(RM) -r $(distdir)/gen-csharp/
-
-TESTPORT = 9501
-check-local: MultiplexServer.exe MultiplexClient.exe
-	echo $(TESTPORT)
-	MONO_PATH=../../ timeout 10 mono MultiplexServer.exe $(TESTPORT) &
-	sleep 1
-	MONO_PATH=../../ mono MultiplexClient.exe $(TESTPORT)
diff --git a/lib/csharp/test/Multiplex/Multiplex.Test.Common.cs b/lib/csharp/test/Multiplex/Multiplex.Test.Common.cs
deleted file mode 100644
index a687852..0000000
--- a/lib/csharp/test/Multiplex/Multiplex.Test.Common.cs
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-// Distributed under the Thrift Software License
-//
-// See accompanying file LICENSE or visit the Thrift site at:
-// http://developers.facebook.com/thrift/
-using System;
-using System.Collections.Generic;
-using Thrift.Collections;
-using Thrift.Transport;
-using Thrift.Protocol;
-using Thrift.Server;
-
-namespace Test.Multiplex
-{
-    public class Constants
-    {
-        public const string NAME_BENCHMARKSERVICE = "BenchmarkService";
-        public const string NAME_AGGR             = "Aggr";
-    }
-}
-
-
diff --git a/lib/csharp/test/Multiplex/Server/Multiplex.Test.Server.cs b/lib/csharp/test/Multiplex/Server/Multiplex.Test.Server.cs
deleted file mode 100644
index 9786189..0000000
--- a/lib/csharp/test/Multiplex/Server/Multiplex.Test.Server.cs
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-using System;
-using System.Collections.Generic;
-using Thrift.Collections;
-using Thrift.Transport;
-using Thrift.Protocol;
-using Thrift.Server;
-using Thrift;
-using Test.Multiplex;
-
-namespace Test.Multiplex.Server
-{
-    public class TestServer
-    {
-        class BenchmarkServiceImpl : BenchmarkService.Iface
-        {
-            public int fibonacci(sbyte n)
-            {
-                int prev, next, result;
-                prev   = 0;
-                result = 1;
-                while (n > 0)
-                {
-                    next   = result + prev;
-                    prev   = result;
-                    result = next;
-                    --n;
-                }
-                return result;
-            }
-        }
-
-        class AggrServiceImpl : Aggr.Iface
-        {
-            List<int> values = new List<int>();
-
-            public void addValue(int value)
-            {
-                values.Add(value);
-            }
-
-            public List<int> getValues()
-            {
-                return values;
-            }
-        }
-
-        static void Execute(int port)
-        {
-            try
-            {
-                // create protocol factory, default to BinaryProtocol
-                TProtocolFactory ProtocolFactory = new TBinaryProtocol.Factory(true,true);
-                TServerTransport servertrans = new TServerSocket(port, 0, false);
-                TTransportFactory TransportFactory = new TFramedTransport.Factory();
-
-                BenchmarkService.Iface benchHandler = new BenchmarkServiceImpl();
-                TProcessor benchProcessor = new BenchmarkService.Processor(benchHandler);
-
-                Aggr.Iface aggrHandler = new AggrServiceImpl();
-                TProcessor aggrProcessor = new Aggr.Processor(aggrHandler);
-
-                TMultiplexedProcessor multiplex = new TMultiplexedProcessor();
-                multiplex.RegisterProcessor(Constants.NAME_BENCHMARKSERVICE, benchProcessor);
-                multiplex.RegisterProcessor(Constants.NAME_AGGR, aggrProcessor);
-
-                TServer ServerEngine = new TSimpleServer(multiplex, servertrans, TransportFactory, ProtocolFactory);
-
-                Console.WriteLine("Starting the server ...");
-                ServerEngine.Serve();
-            }
-            catch (Exception e)
-            {
-                Console.WriteLine(e.Message);
-            }
-        }
-
-        static void Main(string[] args)
-        {
-            int port = 9090;
-            if (args.Length > 0)
-            {
-                port = ushort.Parse(args[0]);
-            }
-            Execute(port);
-        }
-    }
-}
-
diff --git a/lib/csharp/test/Multiplex/Server/MultiplexServer.csproj b/lib/csharp/test/Multiplex/Server/MultiplexServer.csproj
deleted file mode 100644
index 771ee12..0000000
--- a/lib/csharp/test/Multiplex/Server/MultiplexServer.csproj
+++ /dev/null
@@ -1,148 +0,0 @@
-﻿<?xml version="1.0" encoding="utf-8"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements. See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership. The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License. You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied. See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <PropertyGroup>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <ProductVersion>9.0.21022</ProductVersion>
-    <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{D592BDF3-0DCE-48FB-890F-E4AE1D9CE7CD}</ProjectGuid>
-    <OutputType>Exe</OutputType>
-    <AppDesignerFolder>Properties</AppDesignerFolder>
-    <RootNamespace>MultiplexServer</RootNamespace>
-    <AssemblyName>MultiplexServer</AssemblyName>
-    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
-    <FileAlignment>512</FileAlignment>
-    <IsWebBootstrapper>false</IsWebBootstrapper>
-    <FileUpgradeFlags>
-    </FileUpgradeFlags>
-    <OldToolsVersion>3.5</OldToolsVersion>
-    <UpgradeBackupLocation />
-    <PublishUrl>publish\</PublishUrl>
-    <Install>true</Install>
-    <InstallFrom>Disk</InstallFrom>
-    <UpdateEnabled>false</UpdateEnabled>
-    <UpdateMode>Foreground</UpdateMode>
-    <UpdateInterval>7</UpdateInterval>
-    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
-    <UpdatePeriodically>false</UpdatePeriodically>
-    <UpdateRequired>false</UpdateRequired>
-    <MapFileExtensions>true</MapFileExtensions>
-    <ApplicationRevision>0</ApplicationRevision>
-    <ApplicationVersion>0.14.0.0</ApplicationVersion>
-    <UseApplicationTrust>false</UseApplicationTrust>
-    <BootstrapperEnabled>true</BootstrapperEnabled>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
-    <DebugSymbols>true</DebugSymbols>
-    <DebugType>full</DebugType>
-    <Optimize>false</Optimize>
-    <OutputPath>..\bin\Debug\</OutputPath>
-    <DefineConstants>DEBUG;TRACE</DefineConstants>
-    <ErrorReport>prompt</ErrorReport>
-    <WarningLevel>4</WarningLevel>
-    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
-    <DebugType>pdbonly</DebugType>
-    <Optimize>true</Optimize>
-    <OutputPath>..\bin\Release\</OutputPath>
-    <DefineConstants>TRACE</DefineConstants>
-    <ErrorReport>prompt</ErrorReport>
-    <WarningLevel>4</WarningLevel>
-    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="System" />
-  </ItemGroup>
-  <ItemGroup>
-    <Compile Include="..\Multiplex.Test.Common.cs">
-      <Link>Multiplex.Test.Common.cs</Link>
-    </Compile>
-    <Compile Include="..\gen-csharp\Aggr.cs" />
-    <Compile Include="..\gen-csharp\BenchmarkService.cs" />
-    <Compile Include="..\gen-csharp\Error.cs" />
-    <Compile Include="Multiplex.Test.Server.cs" />
-    <Compile Include="Properties\AssemblyInfo.cs" />
-  </ItemGroup>
-  <ItemGroup>
-    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
-      <Visible>False</Visible>
-      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
-      <Install>false</Install>
-    </BootstrapperPackage>
-    <BootstrapperPackage Include="Microsoft.Net.Framework.2.0">
-      <Visible>False</Visible>
-      <ProductName>.NET Framework 2.0 %28x86%29</ProductName>
-      <Install>false</Install>
-    </BootstrapperPackage>
-    <BootstrapperPackage Include="Microsoft.Net.Framework.3.0">
-      <Visible>False</Visible>
-      <ProductName>.NET Framework 3.0 %28x86%29</ProductName>
-      <Install>false</Install>
-    </BootstrapperPackage>
-    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5">
-      <Visible>False</Visible>
-      <ProductName>.NET Framework 3.5</ProductName>
-      <Install>true</Install>
-    </BootstrapperPackage>
-    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
-      <Visible>False</Visible>
-      <ProductName>.NET Framework 3.5 SP1</ProductName>
-      <Install>false</Install>
-    </BootstrapperPackage>
-    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
-      <Visible>False</Visible>
-      <ProductName>Windows Installer 3.1</ProductName>
-      <Install>true</Install>
-    </BootstrapperPackage>
-  </ItemGroup>
-  <ItemGroup>
-    <ProjectReference Include="..\..\..\src\Thrift.csproj">
-      <Project>{499EB63C-D74C-47E8-AE48-A2FC94538E9D}</Project>
-      <Name>Thrift</Name>
-    </ProjectReference>
-  </ItemGroup>
-  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
-  <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
-       Other similar extension points exist, see Microsoft.Common.targets.
-  <Target Name="BeforeBuild">
-  </Target>
-  <Target Name="AfterBuild">
-  </Target>
-  -->
-  <PropertyGroup>
-    <PreBuildEvent>rmdir /s /q "$(ProjectDir)gen-csharp"
-del /f /q "$(ProjectDir)ThriftImpl.dll"
-SET OUTPUT_DIR=$(ProjectDir)
-
-SET THRIFT_FILE=$(ProjectDir)\..\..\..\..\..\contrib\async-test\aggr.thrift
-for %25%25I in ("%25OUTPUT_DIR%25") do set SHORT_DIR=%25%25~fsI
-for %25%25I in ("%25THRIFT_FILE%25") do set THRIFT_SHORT=%25%25~fsI
-"$(ProjectDir)\..\..\..\..\..\compiler\cpp\thrift.exe" --gen csharp -o %25SHORT_DIR%25 %25THRIFT_SHORT%25
-
-SET THRIFT_FILE=$(ProjectDir)\..\..\..\..\..\lib\rb\benchmark\Benchmark.thrift
-for %25%25I in ("%25OUTPUT_DIR%25") do set SHORT_DIR=%25%25~fsI
-for %25%25I in ("%25THRIFT_FILE%25") do set THRIFT_SHORT=%25%25~fsI
-"$(ProjectDir)\..\..\..\..\..\compiler\cpp\thrift.exe" --gen csharp -o %25SHORT_DIR%25 %25THRIFT_SHORT%25
-
-</PreBuildEvent>
-  </PropertyGroup>
-</Project>
diff --git a/lib/csharp/test/Multiplex/Server/Properties/AssemblyInfo.cs b/lib/csharp/test/Multiplex/Server/Properties/AssemblyInfo.cs
deleted file mode 100644
index 50b11af..0000000
--- a/lib/csharp/test/Multiplex/Server/Properties/AssemblyInfo.cs
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-using System.Reflection;
-using System.Runtime.CompilerServices;
-using System.Runtime.InteropServices;
-
-// General Information about an assembly is controlled through the following
-// set of attributes. Change these attribute values to modify the information
-// associated with an assembly.
-[assembly: AssemblyTitle("MultiplexServer")]
-[assembly: AssemblyDescription("")]
-[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("The Apache Software Foundation")]
-[assembly: AssemblyProduct("Thrift")]
-[assembly: AssemblyCopyright("The Apache Software Foundation")]
-[assembly: AssemblyTrademark("")]
-[assembly: AssemblyCulture("")]
-
-// Setting ComVisible to false makes the types in this assembly not visible
-// to COM components.  If you need to access a type in this assembly from
-// COM, set the ComVisible attribute to true on that type.
-[assembly: ComVisible(false)]
-
-// The following GUID is for the ID of the typelib if this project is exposed to COM
-[assembly: Guid("F2F436C1-3D4F-411a-ADC3-B98848476A8E")]
-
-// Version information for an assembly consists of the following four values:
-//
-//      Major Version
-//      Minor Version
-//      Build Number
-//      Revision
-//
-// You can specify all the values or you can default the Build and Revision Numbers
-// by using the '*' as shown below:
-// [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("0.14.0.0")]
-[assembly: AssemblyFileVersion("0.14.0.0")]
diff --git a/lib/csharp/test/ThriftMVCTest/App_Start/FilterConfig.cs b/lib/csharp/test/ThriftMVCTest/App_Start/FilterConfig.cs
deleted file mode 100644
index 855184f..0000000
--- a/lib/csharp/test/ThriftMVCTest/App_Start/FilterConfig.cs
+++ /dev/null
@@ -1,31 +0,0 @@
-﻿/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-using System.Web.Mvc;
-
-namespace ThriftMVCTest
-{
-    public static class FilterConfig
-    {
-        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
-        {
-            filters.Add(new HandleErrorAttribute());
-        }
-    }
-}
diff --git a/lib/csharp/test/ThriftMVCTest/App_Start/RouteConfig.cs b/lib/csharp/test/ThriftMVCTest/App_Start/RouteConfig.cs
deleted file mode 100644
index b4b6023..0000000
--- a/lib/csharp/test/ThriftMVCTest/App_Start/RouteConfig.cs
+++ /dev/null
@@ -1,39 +0,0 @@
-﻿/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-using System.Web.Mvc;
-using System.Web.Routing;
-
-namespace ThriftMVCTest
-{
-    public static class RouteConfig
-    {
-        public static void RegisterRoutes(RouteCollection routes)
-        {
-            routes.IgnoreRoute("{resource}.thrift");
-            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
-
-            routes.MapRoute(
-                name: "Default",
-                url: "{controller}/{action}/{id}",
-                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
-            );
-        }
-    }
-}
diff --git a/lib/csharp/test/ThriftMVCTest/AsyncHttpHandler.cs b/lib/csharp/test/ThriftMVCTest/AsyncHttpHandler.cs
deleted file mode 100644
index 7f26184..0000000
--- a/lib/csharp/test/ThriftMVCTest/AsyncHttpHandler.cs
+++ /dev/null
@@ -1,32 +0,0 @@
-﻿/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-using Thrift.Transport;
-
-namespace ThriftMVCTest
-{
-    public class AsyncHttpHandler : THttpTaskAsyncHandler
-    {
-        public AsyncHttpHandler()
-            : base(
-                new Thrift.Test.SecondService.AsyncProcessor(new SecondServiceImpl()))
-        {
-        }
-    }
-}
\ No newline at end of file
diff --git a/lib/csharp/test/ThriftMVCTest/Controllers/HomeController.cs b/lib/csharp/test/ThriftMVCTest/Controllers/HomeController.cs
deleted file mode 100644
index c9a1ec4..0000000
--- a/lib/csharp/test/ThriftMVCTest/Controllers/HomeController.cs
+++ /dev/null
@@ -1,70 +0,0 @@
-﻿/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-using System;
-using System.Threading.Tasks;
-using System.Web.Mvc;
-using Thrift.Protocol;
-using Thrift.Test;
-using Thrift.Transport;
-
-namespace ThriftMVCTest.Controllers
-{
-    public class HomeController : Controller
-    {
-        public ActionResult Index()
-        {
-            return View();
-        }
-
-        public async Task<ActionResult> TestThriftAsync()
-        {
-            var baseUri = new Uri(string.Format("{0}://{1}{2}", Request.Url.Scheme, Request.Url.Authority,
-                Url.Content("~")));
-
-            SecondService.IAsync asyncService =
-                new SecondService.Client(new TBinaryProtocol(new THttpClient(new Uri(baseUri, "Async.thrift"))));
-
-            var result = await asyncService.secondtestStringAsync("TestString");
-            if (result != "testString(\"TestString\")")
-            {
-                throw new Exception("The wrong result was returned");
-            }
-
-            return RedirectToAction("Index");
-        }
-
-        public ActionResult TestThriftSync()
-        {
-            var baseUri = new Uri(string.Format("{0}://{1}{2}", Request.Url.Scheme, Request.Url.Authority,
-                Url.Content("~")));
-
-            SecondService.ISync service =
-                new SecondService.Client(new TBinaryProtocol(new THttpClient(new Uri(baseUri, "Sync.thrift"))));
-
-            var result = service.secondtestString("TestString");
-            if (result != "testString(\"TestString\")")
-            {
-                throw new Exception("The wrong result was returned");
-            }
-
-            return RedirectToAction("Index");
-        }
-    }
-}
diff --git a/lib/csharp/test/ThriftMVCTest/Global.asax b/lib/csharp/test/ThriftMVCTest/Global.asax
deleted file mode 100644
index 7bb688c..0000000
--- a/lib/csharp/test/ThriftMVCTest/Global.asax
+++ /dev/null
@@ -1,19 +0,0 @@
-﻿<%@ Application Codebehind="Global.asax.cs" Inherits="ThriftMVCTest.MvcApplication" Language="C#" %>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements. See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership. The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License. You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied. See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
diff --git a/lib/csharp/test/ThriftMVCTest/Global.asax.cs b/lib/csharp/test/ThriftMVCTest/Global.asax.cs
deleted file mode 100644
index 59731ef..0000000
--- a/lib/csharp/test/ThriftMVCTest/Global.asax.cs
+++ /dev/null
@@ -1,34 +0,0 @@
-﻿/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-using System.Web.Mvc;
-using System.Web.Routing;
-
-namespace ThriftMVCTest
-{
-    public class MvcApplication : System.Web.HttpApplication
-    {
-        protected void Application_Start()
-        {
-            AreaRegistration.RegisterAllAreas();
-            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
-            RouteConfig.RegisterRoutes(RouteTable.Routes);
-        }
-    }
-}
diff --git a/lib/csharp/test/ThriftMVCTest/Properties/AssemblyInfo.cs b/lib/csharp/test/ThriftMVCTest/Properties/AssemblyInfo.cs
deleted file mode 100644
index a87107c..0000000
--- a/lib/csharp/test/ThriftMVCTest/Properties/AssemblyInfo.cs
+++ /dev/null
@@ -1,53 +0,0 @@
-﻿/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-using System.Reflection;
-using System.Runtime.InteropServices;
-
-// General Information about an assembly is controlled through the following
-// set of attributes. Change these attribute values to modify the information
-// associated with an assembly.
-[assembly: AssemblyTitle("ThriftMVCTest")]
-[assembly: AssemblyDescription("A web project for testing the thrift ASP.NET features.")]
-[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("The Apache Software Foundation")]
-[assembly: AssemblyProduct("Thrift")]
-[assembly: AssemblyCopyright("The Apache Software Foundation")]
-[assembly: AssemblyTrademark("")]
-[assembly: AssemblyCulture("")]
-
-// Setting ComVisible to false makes the types in this assembly not visible
-// to COM components.  If you need to access a type in this assembly from
-// COM, set the ComVisible attribute to true on that type.
-[assembly: ComVisible(false)]
-
-// The following GUID is for the ID of the typelib if this project is exposed to COM
-[assembly: Guid("366f9bd0-3c0e-48aa-b2ca-61fd4a93e427")]
-
-// Version information for an assembly consists of the following four values:
-//
-//      Major Version
-//      Minor Version
-//      Build Number
-//      Revision
-//
-// You can specify all the values or you can default the Build and Revision Numbers
-// by using the '*' as shown below:
-[assembly: AssemblyVersion("0.14.0.0")]
-[assembly: AssemblyFileVersion("0.14.0.0")]
diff --git a/lib/csharp/test/ThriftMVCTest/SecondServiceImpl.cs b/lib/csharp/test/ThriftMVCTest/SecondServiceImpl.cs
deleted file mode 100644
index fad301a..0000000
--- a/lib/csharp/test/ThriftMVCTest/SecondServiceImpl.cs
+++ /dev/null
@@ -1,37 +0,0 @@
-﻿/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-using System.Threading.Tasks;
-using Thrift.Test;
-
-namespace ThriftMVCTest
-{
-    public class SecondServiceImpl : SecondService.IAsync, SecondService.ISync
-    {
-        public Task<string> secondtestStringAsync(string thing)
-        {
-            return Task.FromResult(thing);
-        }
-
-        public string secondtestString(string thing)
-        {
-            return "testString(\"" + thing + "\")";
-        }
-    }
-}
diff --git a/lib/csharp/test/ThriftMVCTest/SyncHttpHandler.cs b/lib/csharp/test/ThriftMVCTest/SyncHttpHandler.cs
deleted file mode 100644
index 4fe2662..0000000
--- a/lib/csharp/test/ThriftMVCTest/SyncHttpHandler.cs
+++ /dev/null
@@ -1,32 +0,0 @@
-﻿/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-using Thrift.Transport;
-
-namespace ThriftMVCTest
-{
-    public class SyncHttpHandler : THttpHandler
-    {
-        public SyncHttpHandler()
-            : base(
-                new Thrift.Test.SecondService.Processor(new SecondServiceImpl()))
-        {
-        }
-    }
-}
\ No newline at end of file
diff --git a/lib/csharp/test/ThriftMVCTest/ThriftMVCTest.csproj b/lib/csharp/test/ThriftMVCTest/ThriftMVCTest.csproj
deleted file mode 100644
index 0eb969a..0000000
--- a/lib/csharp/test/ThriftMVCTest/ThriftMVCTest.csproj
+++ /dev/null
@@ -1,200 +0,0 @@
-﻿<?xml version="1.0" encoding="utf-8"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements. See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership. The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License. You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied. See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
-  <PropertyGroup>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <ProductVersion>
-    </ProductVersion>
-    <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{891B4487-C7BA-427E-BBC8-4C596C229A10}</ProjectGuid>
-    <ProjectTypeGuids>{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>
-    <OutputType>Library</OutputType>
-    <AppDesignerFolder>Properties</AppDesignerFolder>
-    <RootNamespace>ThriftMVCTest</RootNamespace>
-    <AssemblyName>ThriftMVCTest</AssemblyName>
-    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
-    <MvcBuildViews>false</MvcBuildViews>
-    <UseIISExpress>true</UseIISExpress>
-    <IISExpressSSLPort />
-    <IISExpressAnonymousAuthentication />
-    <IISExpressWindowsAuthentication />
-    <IISExpressUseClassicPipelineMode />
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
-    <DebugSymbols>true</DebugSymbols>
-    <DebugType>full</DebugType>
-    <Optimize>false</Optimize>
-    <OutputPath>bin\</OutputPath>
-    <DefineConstants>DEBUG;TRACE</DefineConstants>
-    <ErrorReport>prompt</ErrorReport>
-    <WarningLevel>4</WarningLevel>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
-    <DebugType>pdbonly</DebugType>
-    <Optimize>true</Optimize>
-    <OutputPath>bin\</OutputPath>
-    <DefineConstants>TRACE</DefineConstants>
-    <ErrorReport>prompt</ErrorReport>
-    <WarningLevel>4</WarningLevel>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="Microsoft.CSharp" />
-    <Reference Include="System" />
-    <Reference Include="System.Data" />
-    <Reference Include="System.Drawing" />
-    <Reference Include="System.Web.DynamicData" />
-    <Reference Include="System.Web.Entity" />
-    <Reference Include="System.Web.ApplicationServices" />
-    <Reference Include="System.ComponentModel.DataAnnotations" />
-    <Reference Include="System.Core" />
-    <Reference Include="System.Data.DataSetExtensions" />
-    <Reference Include="System.Xml.Linq" />
-    <Reference Include="System.Web" />
-    <Reference Include="System.Web.Extensions" />
-    <Reference Include="System.Web.Abstractions" />
-    <Reference Include="System.Web.Routing" />
-    <Reference Include="System.Xml" />
-    <Reference Include="System.Configuration" />
-    <Reference Include="System.Web.Services" />
-    <Reference Include="System.EnterpriseServices" />
-    <Reference Include="Microsoft.Web.Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
-      <Private>True</Private>
-      <HintPath>..\packages\Microsoft.Web.Infrastructure.1.0.0.0\lib\net40\Microsoft.Web.Infrastructure.dll</HintPath>
-    </Reference>
-    <Reference Include="System.Net.Http">
-    </Reference>
-    <Reference Include="System.Net.Http.WebRequest">
-    </Reference>
-    <Reference Include="System.Web.Helpers, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
-      <Private>True</Private>
-      <HintPath>..\packages\Microsoft.AspNet.WebPages.3.2.3\lib\net45\System.Web.Helpers.dll</HintPath>
-    </Reference>
-    <Reference Include="System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
-      <Private>True</Private>
-      <HintPath>..\packages\Microsoft.AspNet.Mvc.5.2.3\lib\net45\System.Web.Mvc.dll</HintPath>
-    </Reference>
-    <Reference Include="System.Web.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
-      <Private>True</Private>
-      <HintPath>..\packages\Microsoft.AspNet.Razor.3.2.3\lib\net45\System.Web.Razor.dll</HintPath>
-    </Reference>
-    <Reference Include="System.Web.WebPages, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
-      <Private>True</Private>
-      <HintPath>..\packages\Microsoft.AspNet.WebPages.3.2.3\lib\net45\System.Web.WebPages.dll</HintPath>
-    </Reference>
-    <Reference Include="System.Web.WebPages.Deployment, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
-      <Private>True</Private>
-      <HintPath>..\packages\Microsoft.AspNet.WebPages.3.2.3\lib\net45\System.Web.WebPages.Deployment.dll</HintPath>
-    </Reference>
-    <Reference Include="System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
-      <Private>True</Private>
-      <HintPath>..\packages\Microsoft.AspNet.WebPages.3.2.3\lib\net45\System.Web.WebPages.Razor.dll</HintPath>
-    </Reference>
-    <Reference Include="ThriftImpl">
-      <HintPath>.\ThriftImpl.dll</HintPath>
-    </Reference>
-  </ItemGroup>
-  <ItemGroup>
-    <Compile Include="App_Start\FilterConfig.cs" />
-    <Compile Include="App_Start\RouteConfig.cs" />
-    <Compile Include="SyncHttpHandler.cs" />
-    <Compile Include="AsyncHttpHandler.cs" />
-    <Compile Include="Controllers\HomeController.cs" />
-    <Compile Include="Global.asax.cs">
-      <DependentUpon>Global.asax</DependentUpon>
-    </Compile>
-    <Compile Include="Properties\AssemblyInfo.cs" />
-    <Compile Include="SecondServiceImpl.cs" />
-  </ItemGroup>
-  <ItemGroup>
-    <Content Include="favicon.ico" />
-    <Content Include="Global.asax" />
-    <Content Include="Web.config" />
-    <Content Include="Web.Debug.config">
-      <DependentUpon>Web.config</DependentUpon>
-    </Content>
-    <Content Include="Web.Release.config">
-      <DependentUpon>Web.config</DependentUpon>
-    </Content>
-    <Content Include="Views\Web.config" />
-    <Content Include="Views\_ViewStart.cshtml" />
-    <Content Include="Views\Shared\_Layout.cshtml" />
-    <Content Include="Views\Home\Index.cshtml" />
-  </ItemGroup>
-  <ItemGroup>
-    <Folder Include="App_Data\" />
-  </ItemGroup>
-  <ItemGroup>
-    <Content Include="packages.config">
-      <SubType>Designer</SubType>
-    </Content>
-  </ItemGroup>
-  <ItemGroup>
-    <ProjectReference Include="..\..\src\Thrift.45.csproj">
-      <Project>{ebce35da-cf6a-42bc-a357-a9c09b534299}</Project>
-      <Name>Thrift.45</Name>
-    </ProjectReference>
-  </ItemGroup>
-  <PropertyGroup>
-    <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
-    <VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
-  </PropertyGroup>
-  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
-  <Import Project="$(VSToolsPath)\WebApplications\Microsoft.WebApplication.targets" Condition="'$(VSToolsPath)' != ''" />
-  <Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" Condition="false" />
-  <Target Name="MvcBuildViews" AfterTargets="AfterBuild" Condition="'$(MvcBuildViews)'=='true'">
-    <AspNetCompiler VirtualPath="temp" PhysicalPath="$(WebProjectOutputDir)" />
-  </Target>
-  <ProjectExtensions>
-    <VisualStudio>
-      <FlavorProperties GUID="{349c5851-65df-11da-9384-00065b846f21}">
-        <WebProjectProperties>
-          <UseIIS>True</UseIIS>
-          <AutoAssignPort>True</AutoAssignPort>
-          <DevelopmentServerPort>57482</DevelopmentServerPort>
-          <DevelopmentServerVPath>/</DevelopmentServerVPath>
-          <IISUrl>http://localhost:57482/</IISUrl>
-          <NTLMAuthentication>False</NTLMAuthentication>
-          <UseCustomServer>False</UseCustomServer>
-          <CustomServerUrl>
-          </CustomServerUrl>
-          <SaveServerSettingsInUserFile>False</SaveServerSettingsInUserFile>
-        </WebProjectProperties>
-      </FlavorProperties>
-    </VisualStudio>
-  </ProjectExtensions>
-  <PropertyGroup>
-    <PreBuildEvent>rmdir /s /q "$(ProjectDir)gen-csharp"
-del /f /q "$(ProjectDir)ThriftImpl.dll"
-SET OUTPUT_DIR=$(ProjectDir)
-SET THRIFT_FILE=$(ProjectDir)\..\..\..\..\test\ThriftTest.thrift
-for %25%25I in ("%25OUTPUT_DIR%25") do set SHORT_DIR=%25%25~fsI
-for %25%25I in ("%25THRIFT_FILE%25") do set THRIFT_SHORT=%25%25~fsI
-"$(ProjectDir)\..\..\..\..\compiler\cpp\Debug\thrift.exe" --gen csharp:async=true -o %25SHORT_DIR%25 %25THRIFT_SHORT%25
-"$(MSBuildToolsPath)\Csc.exe" /t:library /out:"$(ProjectDir)ThriftImpl.dll" /recurse:"$(ProjectDir)gen-csharp"\* /reference:"$(ProjectDir)..\..\src\bin\Debug\Thrift45.dll"</PreBuildEvent>
-  </PropertyGroup>
-  <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
-       Other similar extension points exist, see Microsoft.Common.targets.
-  <Target Name="BeforeBuild">
-  </Target>
-  <Target Name="AfterBuild">
-  </Target> -->
-</Project>
\ No newline at end of file
diff --git a/lib/csharp/test/ThriftMVCTest/Views/Home/Index.cshtml b/lib/csharp/test/ThriftMVCTest/Views/Home/Index.cshtml
deleted file mode 100644
index f0ca7da..0000000
--- a/lib/csharp/test/ThriftMVCTest/Views/Home/Index.cshtml
+++ /dev/null
@@ -1,25 +0,0 @@
-﻿@*
-    Licensed to the Apache Software Foundation (ASF) under one
-    or more contributor license agreements. See the NOTICE file
-    distributed with this work for additional information
-    regarding copyright ownership. The ASF licenses this file
-    to you under the Apache License, Version 2.0 (the
-    "License"); you may not use this file except in compliance
-    with the License. You may obtain a copy of the License at
-
-        http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing,
-    software distributed under the License is distributed on an
-    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-    KIND, either express or implied. See the License for the
-    specific language governing permissions and limitations
-    under the License.
-*@
-
-@{
-    ViewBag.Title = "Home Page";
-}
-
-<p>@Html.ActionLink("Test Thrift Async Service", "TestThriftAsync")</p>
-<p>@Html.ActionLink("Test Thrift Sync Service", "TestThriftSync")</p>
diff --git a/lib/csharp/test/ThriftMVCTest/Views/Shared/_Layout.cshtml b/lib/csharp/test/ThriftMVCTest/Views/Shared/_Layout.cshtml
deleted file mode 100644
index b41c99a..0000000
--- a/lib/csharp/test/ThriftMVCTest/Views/Shared/_Layout.cshtml
+++ /dev/null
@@ -1,30 +0,0 @@
-﻿@*
-    Licensed to the Apache Software Foundation (ASF) under one
-    or more contributor license agreements. See the NOTICE file
-    distributed with this work for additional information
-    regarding copyright ownership. The ASF licenses this file
-    to you under the Apache License, Version 2.0 (the
-    "License"); you may not use this file except in compliance
-    with the License. You may obtain a copy of the License at
-
-        http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing,
-    software distributed under the License is distributed on an
-    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-    KIND, either express or implied. See the License for the
-    specific language governing permissions and limitations
-    under the License.
-*@
-
-<!DOCTYPE html>
-<html>
-<head>
-    <meta charset="utf-8" />
-    <meta name="viewport" content="width=device-width, initial-scale=1.0">
-    <title>Thrift ASP.NET Test</title>
-</head>
-<body>
-    @RenderBody()
-</body>
-</html>
diff --git a/lib/csharp/test/ThriftMVCTest/Views/Web.config b/lib/csharp/test/ThriftMVCTest/Views/Web.config
deleted file mode 100644
index 3c21138..0000000
--- a/lib/csharp/test/ThriftMVCTest/Views/Web.config
+++ /dev/null
@@ -1,60 +0,0 @@
-﻿<?xml version="1.0"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements. See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership. The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License. You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied. See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<configuration>
-  <configSections>
-    <sectionGroup name="system.web.webPages.razor" type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
-      <section name="host" type="System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
-      <section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
-    </sectionGroup>
-  </configSections>
-
-  <system.web.webPages.razor>
-    <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
-    <pages pageBaseType="System.Web.Mvc.WebViewPage">
-      <namespaces>
-        <add namespace="System.Web.Mvc" />
-        <add namespace="System.Web.Mvc.Ajax" />
-        <add namespace="System.Web.Mvc.Html" />
-        <add namespace="System.Web.Optimization"/>
-        <add namespace="System.Web.Routing" />
-        <add namespace="ThriftMVCTest" />
-      </namespaces>
-    </pages>
-  </system.web.webPages.razor>
-
-  <appSettings>
-    <add key="webpages:Enabled" value="false" />
-  </appSettings>
-
-  <system.webServer>
-    <handlers>
-      <remove name="BlockViewHandler"/>
-      <add name="BlockViewHandler" path="*" verb="*" preCondition="integratedMode" type="System.Web.HttpNotFoundHandler" />
-    </handlers>
-  </system.webServer>
-
-  <system.web>
-    <compilation>
-      <assemblies>
-        <add assembly="System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
-      </assemblies>
-    </compilation>
-  </system.web>
-</configuration>
diff --git a/lib/csharp/test/ThriftMVCTest/Views/_ViewStart.cshtml b/lib/csharp/test/ThriftMVCTest/Views/_ViewStart.cshtml
deleted file mode 100644
index 8cde2ee..0000000
--- a/lib/csharp/test/ThriftMVCTest/Views/_ViewStart.cshtml
+++ /dev/null
@@ -1,22 +0,0 @@
-﻿@*
-    Licensed to the Apache Software Foundation (ASF) under one
-    or more contributor license agreements. See the NOTICE file
-    distributed with this work for additional information
-    regarding copyright ownership. The ASF licenses this file
-    to you under the Apache License, Version 2.0 (the
-    "License"); you may not use this file except in compliance
-    with the License. You may obtain a copy of the License at
-
-        http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing,
-    software distributed under the License is distributed on an
-    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-    KIND, either express or implied. See the License for the
-    specific language governing permissions and limitations
-    under the License.
-*@
-
-@{
-    Layout = "~/Views/Shared/_Layout.cshtml";
-}
diff --git a/lib/csharp/test/ThriftMVCTest/Web.Debug.config b/lib/csharp/test/ThriftMVCTest/Web.Debug.config
deleted file mode 100644
index 45d56d8..0000000
--- a/lib/csharp/test/ThriftMVCTest/Web.Debug.config
+++ /dev/null
@@ -1,45 +0,0 @@
-﻿<?xml version="1.0"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements. See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership. The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License. You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied. See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
-  <!--
-    In the example below, the "SetAttributes" transform will change the value of
-    "connectionString" to use "ReleaseSQLServer" only when the "Match" locator
-    finds an attribute "name" that has a value of "MyDB".
-
-    <connectionStrings>
-      <add name="MyDB"
-        connectionString="Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True"
-        xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
-    </connectionStrings>
-  -->
-  <system.web>
-    <!--
-      In the example below, the "Replace" transform will replace the entire
-      <customErrors> section of your Web.config file.
-      Note that because there is only one customErrors section under the
-      <system.web> node, there is no need to use the "xdt:Locator" attribute.
-
-      <customErrors defaultRedirect="GenericError.htm"
-        mode="RemoteOnly" xdt:Transform="Replace">
-        <error statusCode="500" redirect="InternalError.htm"/>
-      </customErrors>
-    -->
-  </system.web>
-</configuration>
diff --git a/lib/csharp/test/ThriftMVCTest/Web.Release.config b/lib/csharp/test/ThriftMVCTest/Web.Release.config
deleted file mode 100644
index 157c340..0000000
--- a/lib/csharp/test/ThriftMVCTest/Web.Release.config
+++ /dev/null
@@ -1,46 +0,0 @@
-﻿<?xml version="1.0"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements. See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership. The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License. You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied. See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
-  <!--
-    In the example below, the "SetAttributes" transform will change the value of
-    "connectionString" to use "ReleaseSQLServer" only when the "Match" locator
-    finds an attribute "name" that has a value of "MyDB".
-
-    <connectionStrings>
-      <add name="MyDB"
-        connectionString="Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True"
-        xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
-    </connectionStrings>
-  -->
-  <system.web>
-    <compilation xdt:Transform="RemoveAttributes(debug)" />
-    <!--
-      In the example below, the "Replace" transform will replace the entire
-      <customErrors> section of your Web.config file.
-      Note that because there is only one customErrors section under the
-      <system.web> node, there is no need to use the "xdt:Locator" attribute.
-
-      <customErrors defaultRedirect="GenericError.htm"
-        mode="RemoteOnly" xdt:Transform="Replace">
-        <error statusCode="500" redirect="InternalError.htm"/>
-      </customErrors>
-    -->
-  </system.web>
-</configuration>
diff --git a/lib/csharp/test/ThriftMVCTest/Web.config b/lib/csharp/test/ThriftMVCTest/Web.config
deleted file mode 100644
index 9c57d11..0000000
--- a/lib/csharp/test/ThriftMVCTest/Web.config
+++ /dev/null
@@ -1,92 +0,0 @@
-﻿<?xml version="1.0" encoding="utf-8"?>
-
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements. See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership. The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License. You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied. See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-
-<!--
-  For more information on how to configure your ASP.NET application, please visit
-  http://go.microsoft.com/fwlink/?LinkId=301880
-  -->
-<configuration>
-  <appSettings>
-    <add key="webpages:Version" value="3.0.0.0" />
-    <add key="webpages:Enabled" value="false" />
-    <add key="ClientValidationEnabled" value="true" />
-    <add key="UnobtrusiveJavaScriptEnabled" value="true" />
-    <add key="owin:AutomaticAppStartup" value="false" />
-  </appSettings>
-  <system.web>
-    <authentication mode="None" />
-    <compilation debug="true" targetFramework="4.5" />
-    <httpRuntime targetFramework="4.5" />
-  </system.web>
-  <system.webServer>
-    <modules>
-      <remove name="FormsAuthentication" />
-    </modules>
-    <handlers>
-      <add name="AsyncHttpHandler" verb="*" path="Async.thrift" type="ThriftMVCTest.AsyncHttpHandler, ThriftMVCTest" />
-      <add name="SyncHttpHandler" verb="*" path="Sync.thrift" type="ThriftMVCTest.SyncHttpHandler, ThriftMVCTest" />
-    </handlers>
-  </system.webServer>
-  <runtime>
-    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
-      <dependentAssembly>
-        <assemblyIdentity name="Microsoft.Owin.Security" publicKeyToken="31bf3856ad364e35" />
-        <bindingRedirect oldVersion="0.0.0.0-3.0.1.0" newVersion="3.0.1.0" />
-      </dependentAssembly>
-      <dependentAssembly>
-        <assemblyIdentity name="Microsoft.Owin.Security.OAuth" publicKeyToken="31bf3856ad364e35" />
-        <bindingRedirect oldVersion="0.0.0.0-3.0.1.0" newVersion="3.0.1.0" />
-      </dependentAssembly>
-      <dependentAssembly>
-        <assemblyIdentity name="Microsoft.Owin.Security.Cookies" publicKeyToken="31bf3856ad364e35" />
-        <bindingRedirect oldVersion="0.0.0.0-3.0.1.0" newVersion="3.0.1.0" />
-      </dependentAssembly>
-      <dependentAssembly>
-        <assemblyIdentity name="Microsoft.Owin" publicKeyToken="31bf3856ad364e35" />
-        <bindingRedirect oldVersion="0.0.0.0-3.0.1.0" newVersion="3.0.1.0" />
-      </dependentAssembly>
-      <dependentAssembly>
-        <assemblyIdentity name="Newtonsoft.Json" culture="neutral" publicKeyToken="30ad4fe6b2a6aeed" />
-        <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
-      </dependentAssembly>
-      <dependentAssembly>
-        <assemblyIdentity name="System.Web.Optimization" publicKeyToken="31bf3856ad364e35" />
-        <bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="1.1.0.0" />
-      </dependentAssembly>
-      <dependentAssembly>
-        <assemblyIdentity name="WebGrease" publicKeyToken="31bf3856ad364e35" />
-        <bindingRedirect oldVersion="0.0.0.0-1.5.2.14234" newVersion="1.5.2.14234" />
-      </dependentAssembly>
-      <dependentAssembly>
-        <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" />
-        <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
-      </dependentAssembly>
-      <dependentAssembly>
-        <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
-        <bindingRedirect oldVersion="1.0.0.0-5.2.3.0" newVersion="5.2.3.0" />
-      </dependentAssembly>
-      <dependentAssembly>
-        <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" />
-        <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
-      </dependentAssembly>
-    </assemblyBinding>
-  </runtime>
-</configuration>
\ No newline at end of file
diff --git a/lib/csharp/test/ThriftMVCTest/favicon.ico b/lib/csharp/test/ThriftMVCTest/favicon.ico
deleted file mode 100644
index a3a7999..0000000
--- a/lib/csharp/test/ThriftMVCTest/favicon.ico
+++ /dev/null
Binary files differ
diff --git a/lib/csharp/test/ThriftMVCTest/packages.config b/lib/csharp/test/ThriftMVCTest/packages.config
deleted file mode 100644
index 98c8416..0000000
--- a/lib/csharp/test/ThriftMVCTest/packages.config
+++ /dev/null
@@ -1,25 +0,0 @@
-﻿<?xml version="1.0" encoding="utf-8"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements. See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership. The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License. You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied. See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<packages>
-  <package id="Microsoft.AspNet.Mvc" version="5.2.3" targetFramework="net45" />
-  <package id="Microsoft.AspNet.Razor" version="3.2.3" targetFramework="net45" />
-  <package id="Microsoft.AspNet.WebPages" version="3.2.3" targetFramework="net45" />
-  <package id="Microsoft.Web.Infrastructure" version="1.0.0.0" targetFramework="net45" />
-</packages>
\ No newline at end of file
diff --git a/lib/delphi/Thrift.groupproj b/lib/delphi/Thrift.groupproj
deleted file mode 100644
index f41f293..0000000
--- a/lib/delphi/Thrift.groupproj
+++ /dev/null
@@ -1,120 +0,0 @@
-﻿	<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-		<PropertyGroup>
-			<ProjectGuid>{86AE16E4-18D4-4C07-B06C-491E22A26C74}</ProjectGuid>
-		</PropertyGroup>
-		<ItemGroup>
-			<Projects Include="test\client.dproj">
-				<Dependencies/>
-			</Projects>
-			<Projects Include="test\server.dproj">
-				<Dependencies/>
-			</Projects>
-			<Projects Include="test\multiplexed\Multiplex.Test.Client.dproj">
-				<Dependencies/>
-			</Projects>
-			<Projects Include="test\multiplexed\Multiplex.Test.Server.dproj">
-				<Dependencies/>
-			</Projects>
-			<Projects Include="test\serializer\TestSerializer.dproj">
-				<Dependencies/>
-			</Projects>
-			<Projects Include="test\skip\skiptest_version2.dproj">
-				<Dependencies/>
-			</Projects>
-			<Projects Include="test\skip\skiptest_version1.dproj">
-				<Dependencies/>
-			</Projects>
-			<Projects Include="test\typeregistry\TestTypeRegistry.dproj">
-				<Dependencies/>
-			</Projects>
-		</ItemGroup>
-		<ProjectExtensions>
-			<Borland.Personality>Default.Personality.12</Borland.Personality>
-			<Borland.ProjectType/>
-			<BorlandProject>
-				<Default.Personality/>
-			</BorlandProject>
-		</ProjectExtensions>
-		<Target Name="client">
-			<MSBuild Projects="test\client.dproj"/>
-		</Target>
-		<Target Name="client:Clean">
-			<MSBuild Projects="test\client.dproj" Targets="Clean"/>
-		</Target>
-		<Target Name="client:Make">
-			<MSBuild Projects="test\client.dproj" Targets="Make"/>
-		</Target>
-		<Target Name="server">
-			<MSBuild Projects="test\server.dproj"/>
-		</Target>
-		<Target Name="server:Clean">
-			<MSBuild Projects="test\server.dproj" Targets="Clean"/>
-		</Target>
-		<Target Name="server:Make">
-			<MSBuild Projects="test\server.dproj" Targets="Make"/>
-		</Target>
-		<Target Name="Multiplex_Test_Client">
-			<MSBuild Projects="test\multiplexed\Multiplex.Test.Client.dproj"/>
-		</Target>
-		<Target Name="Multiplex_Test_Client:Clean">
-			<MSBuild Projects="test\multiplexed\Multiplex.Test.Client.dproj" Targets="Clean"/>
-		</Target>
-		<Target Name="Multiplex_Test_Client:Make">
-			<MSBuild Projects="test\multiplexed\Multiplex.Test.Client.dproj" Targets="Make"/>
-		</Target>
-		<Target Name="Multiplex_Test_Server">
-			<MSBuild Projects="test\multiplexed\Multiplex.Test.Server.dproj"/>
-		</Target>
-		<Target Name="Multiplex_Test_Server:Clean">
-			<MSBuild Projects="test\multiplexed\Multiplex.Test.Server.dproj" Targets="Clean"/>
-		</Target>
-		<Target Name="Multiplex_Test_Server:Make">
-			<MSBuild Projects="test\multiplexed\Multiplex.Test.Server.dproj" Targets="Make"/>
-		</Target>
-		<Target Name="TestSerializer">
-			<MSBuild Projects="test\serializer\TestSerializer.dproj"/>
-		</Target>
-		<Target Name="TestSerializer:Clean">
-			<MSBuild Projects="test\serializer\TestSerializer.dproj" Targets="Clean"/>
-		</Target>
-		<Target Name="TestSerializer:Make">
-			<MSBuild Projects="test\serializer\TestSerializer.dproj" Targets="Make"/>
-		</Target>
-		<Target Name="skiptest_version2">
-			<MSBuild Projects="test\skip\skiptest_version2.dproj"/>
-		</Target>
-		<Target Name="skiptest_version2:Clean">
-			<MSBuild Projects="test\skip\skiptest_version2.dproj" Targets="Clean"/>
-		</Target>
-		<Target Name="skiptest_version2:Make">
-			<MSBuild Projects="test\skip\skiptest_version2.dproj" Targets="Make"/>
-		</Target>
-		<Target Name="skiptest_version1">
-			<MSBuild Projects="test\skip\skiptest_version1.dproj"/>
-		</Target>
-		<Target Name="skiptest_version1:Clean">
-			<MSBuild Projects="test\skip\skiptest_version1.dproj" Targets="Clean"/>
-		</Target>
-		<Target Name="skiptest_version1:Make">
-			<MSBuild Projects="test\skip\skiptest_version1.dproj" Targets="Make"/>
-		</Target>
-		<Target Name="TestTypeRegistry">
-			<MSBuild Projects="test\typeregistry\TestTypeRegistry.dproj"/>
-		</Target>
-		<Target Name="TestTypeRegistry:Clean">
-			<MSBuild Projects="test\typeregistry\TestTypeRegistry.dproj" Targets="Clean"/>
-		</Target>
-		<Target Name="TestTypeRegistry:Make">
-			<MSBuild Projects="test\typeregistry\TestTypeRegistry.dproj" Targets="Make"/>
-		</Target>
-		<Target Name="Build">
-			<CallTarget Targets="client;server;Multiplex_Test_Client;Multiplex_Test_Server;TestSerializer;skiptest_version2;skiptest_version1;TestTypeRegistry"/>
-		</Target>
-		<Target Name="Clean">
-			<CallTarget Targets="client:Clean;server:Clean;Multiplex_Test_Client:Clean;Multiplex_Test_Server:Clean;TestSerializer:Clean;skiptest_version2:Clean;skiptest_version1:Clean;TestTypeRegistry:Clean"/>
-		</Target>
-		<Target Name="Make">
-			<CallTarget Targets="client:Make;server:Make;Multiplex_Test_Client:Make;Multiplex_Test_Server:Make;TestSerializer:Make;skiptest_version2:Make;skiptest_version1:Make;TestTypeRegistry:Make"/>
-		</Target>
-		<Import Condition="Exists('$(BDS)\Bin\CodeGear.Group.Targets')" Project="$(BDS)\Bin\CodeGear.Group.Targets"/>
-	</Project>
diff --git a/lib/delphi/Thrift.groupproj.local b/lib/delphi/Thrift.groupproj.local
deleted file mode 100644
index 9e6e18d..0000000
--- a/lib/delphi/Thrift.groupproj.local
+++ /dev/null
@@ -1,9 +0,0 @@
-﻿<?xml version="1.0" encoding="utf-8"?>
-<BorlandProject>
-	<Transactions>
-    <Transaction>1899.12.30 00:00:00.000.873,E:\D\TPCPP\Thrift\wc-XE-all\wc-JensG-haxe\lib\delphi\Thrift.groupproj=C:\Users\Jens\Documents\RAD Studio\Projekte\ProjectGroup1.groupproj</Transaction>
-  </Transactions>
-	<Default.Personality>
-		<Projects ActiveProject="E:\D\TPCPP\Thrift\wc-XE-all\wc-JensG-haxe\lib\delphi\test\client.dproj"/>
-	</Default.Personality>
-</BorlandProject>
diff --git a/lib/delphi/test/Performance/Referenz.txt b/lib/delphi/test/Performance/Referenz.txt
deleted file mode 100644
index 53cb154..0000000
--- a/lib/delphi/test/Performance/Referenz.txt
+++ /dev/null
@@ -1,21 +0,0 @@
-Delphi TestClient 0.14.0
-Setting up for ProtocolPeformanceTest ...
-RunTest(binary): write = 2650 msec
-RunTest(binary): read = 3135 msec
-RunTest(compact): write = 2807 msec
-RunTest(compact): read = 3053 msec
-RunTest(JSON): write = 13251 msec
-RunTest(JSON): read = 18759 msec
-RunTest(binary + buffered): write = 2635 msec
-RunTest(binary + buffered): read = 3109 msec
-RunTest(compact + buffered): write = 2788 msec
-RunTest(compact + buffered): read = 3069 msec
-RunTest(JSON + buffered): write = 13604 msec
-RunTest(JSON + buffered): read = 21537 msec
-RunTest(binary + framed): write = 3019 msec
-RunTest(binary + framed): read = 3573 msec
-RunTest(compact + framed): write = 3201 msec
-RunTest(compact + framed): read = 3504 msec
-RunTest(JSON + framed): write = 15093 msec
-RunTest(JSON + framed): read = 21548 msec
-Hit ENTER ...
\ No newline at end of file
diff --git a/lib/netstd/Benchmarks/Thrift.Benchmarks/Thrift.Benchmarks.csproj b/lib/netstd/Benchmarks/Thrift.Benchmarks/Thrift.Benchmarks.csproj
index 740d223..35138d8 100644
--- a/lib/netstd/Benchmarks/Thrift.Benchmarks/Thrift.Benchmarks.csproj
+++ b/lib/netstd/Benchmarks/Thrift.Benchmarks/Thrift.Benchmarks.csproj
@@ -25,7 +25,7 @@
   </PropertyGroup>
 
   <ItemGroup>
-    <PackageReference Include="BenchmarkDotNet" Version="0.12.1" />
+    <PackageReference Include="BenchmarkDotNet" Version="0.12.0" />
   </ItemGroup>
 
   <ItemGroup>
diff --git a/lib/netstd/Tests/Thrift.IntegrationTests/Thrift.IntegrationTests.csproj b/lib/netstd/Tests/Thrift.IntegrationTests/Thrift.IntegrationTests.csproj
index 318757a..7c5639b 100644
--- a/lib/netstd/Tests/Thrift.IntegrationTests/Thrift.IntegrationTests.csproj
+++ b/lib/netstd/Tests/Thrift.IntegrationTests/Thrift.IntegrationTests.csproj
@@ -32,10 +32,10 @@
   </PropertyGroup>
 
   <ItemGroup>
-    <PackageReference Include="CompareNETObjects" Version="4.66.0" />
-    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.6.1" />
-    <PackageReference Include="MSTest.TestAdapter" Version="2.1.2" />
-    <PackageReference Include="MSTest.TestFramework" Version="2.1.2" />
+    <PackageReference Include="CompareNETObjects" Version="4.64.0" />
+    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.4.0" />
+    <PackageReference Include="MSTest.TestAdapter" Version="2.0.0" />
+    <PackageReference Include="MSTest.TestFramework" Version="2.0.0" />
     <PackageReference Include="System.ServiceModel.Primitives" Version="4.7.0" />
   </ItemGroup>
   <ItemGroup>
diff --git a/lib/netstd/Tests/Thrift.Tests/Thrift.Tests.csproj b/lib/netstd/Tests/Thrift.Tests/Thrift.Tests.csproj
index 9b54a57..4b39e7d 100644
--- a/lib/netstd/Tests/Thrift.Tests/Thrift.Tests.csproj
+++ b/lib/netstd/Tests/Thrift.Tests/Thrift.Tests.csproj
@@ -21,11 +21,11 @@
     <TargetFramework>netcoreapp3.1</TargetFramework>
   </PropertyGroup>
   <ItemGroup>
-    <PackageReference Include="CompareNETObjects" Version="4.66.0" />
-    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.6.1" />
-    <PackageReference Include="MSTest.TestAdapter" Version="2.1.2" />
-    <PackageReference Include="MSTest.TestFramework" Version="2.1.2" />
-    <PackageReference Include="NSubstitute" Version="4.2.2" />
+    <PackageReference Include="CompareNETObjects" Version="4.64.0" />
+    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.4.0" />
+    <PackageReference Include="MSTest.TestAdapter" Version="2.0.0" />
+    <PackageReference Include="MSTest.TestFramework" Version="2.0.0" />
+    <PackageReference Include="NSubstitute" Version="4.2.1" />
   </ItemGroup>
   <ItemGroup>
     <ProjectReference Include="..\..\Thrift\Thrift.csproj" />
diff --git a/lib/netstd/Thrift/Thrift.csproj b/lib/netstd/Thrift/Thrift.csproj
index 991e64e..3278d98 100644
--- a/lib/netstd/Thrift/Thrift.csproj
+++ b/lib/netstd/Thrift/Thrift.csproj
@@ -44,16 +44,16 @@
 
   <ItemGroup>
     <PackageReference Include="Microsoft.AspNetCore.Http.Abstractions" Version="2.2.0" />
-    <PackageReference Include="Microsoft.Extensions.Logging" Version="3.1.5" />
-    <PackageReference Include="Microsoft.Extensions.Logging.Console" Version="3.1.5" />
-    <PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="3.1.5" />
-    <PackageReference Include="System.IO.Pipes" Version="4.3.0" />
+    <PackageReference Include="Microsoft.Extensions.Logging" Version="3.1.0" />
+    <PackageReference Include="Microsoft.Extensions.Logging.Console" Version="3.1.0" />
+    <PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="3.1.0" />
+    <PackageReference Include="System.IO.Pipes" Version="[4.3,)" />
     <PackageReference Include="System.IO.Pipes.AccessControl" Version="4.5.1" />
-    <PackageReference Include="System.Net.Http.WinHttpHandler" Version="4.7.2" />
-    <PackageReference Include="System.Net.NameResolution" Version="4.3.0" />
-    <PackageReference Include="System.Net.Requests" Version="4.3.0" />
+    <PackageReference Include="System.Net.Http.WinHttpHandler" Version="4.7.0" />
+    <PackageReference Include="System.Net.NameResolution" Version="[4.3,)" />
+    <PackageReference Include="System.Net.Requests" Version="[4.3,)" />
     <PackageReference Include="System.Net.Security" Version="4.3.2" />
-    <PackageReference Include="System.Threading.Tasks.Extensions" Version="4.5.4" />
+    <PackageReference Include="System.Threading.Tasks.Extensions" Version="4.5.3" />
   </ItemGroup>
 
   <Target Name="SetTFMAssemblyAttributesPath" BeforeTargets="GenerateTargetFrameworkMonikerAttribute">
diff --git a/test/ThriftTest.thrift b/test/ThriftTest.thrift
index bdc6d87..ac49aee 100644
--- a/test/ThriftTest.thrift
+++ b/test/ThriftTest.thrift
@@ -23,7 +23,6 @@
 
 namespace c_glib TTest
 namespace cpp thrift.test
-namespace csharp Thrift.Test
 namespace delphi Thrift.Test
 namespace go thrifttest
 namespace java thrift.test
diff --git a/test/csharp/Makefile.am b/test/csharp/Makefile.am
deleted file mode 100644
index ad166e3..0000000
--- a/test/csharp/Makefile.am
+++ /dev/null
@@ -1,95 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-
-GENERATED = \
-	gen-csharp/Thrift/Test/Bonk.cs \
-	gen-csharp/Thrift/Test/Bools.cs \
-	gen-csharp/Thrift/Test/BoolTest.cs \
-	gen-csharp/Thrift/Test/CrazyNesting.cs \
-	gen-csharp/Thrift/Test/EmptyStruct.cs \
-	gen-csharp/Thrift/Test/GuessProtocolStruct.cs \
-	gen-csharp/Thrift/Test/Insanity.cs \
-	gen-csharp/Thrift/Test/LargeDeltas.cs \
-	gen-csharp/Thrift/Test/ListBonks.cs \
-	gen-csharp/Thrift/Test/ListTypeVersioningV1.cs \
-	gen-csharp/Thrift/Test/ListTypeVersioningV2.cs \
-	gen-csharp/Thrift/Test/NestedListsBonk.cs \
-	gen-csharp/Thrift/Test/NestedListsI32x2.cs \
-	gen-csharp/Thrift/Test/NestedListsI32x3.cs \
-	gen-csharp/Thrift/Test/NestedMixedx2.cs \
-	gen-csharp/Thrift/Test/Numberz.cs \
-	gen-csharp/Thrift/Test/OneField.cs \
-	gen-csharp/Thrift/Test/SecondService.cs \
-	gen-csharp/Thrift/Test/StructA.cs \
-	gen-csharp/Thrift/Test/StructB.cs \
-	gen-csharp/Thrift/Test/ThriftTest.Constants.cs \
-	gen-csharp/Thrift/Test/ThriftTest.cs \
-	gen-csharp/Thrift/Test/VersioningTestV1.cs \
-	gen-csharp/Thrift/Test/VersioningTestV2.cs \
-	gen-csharp/Thrift/Test/Xception.cs \
-	gen-csharp/Thrift/Test/Xception2.cs \
-	gen-csharp/Thrift/Test/Xtruct.cs \
-	gen-csharp/Thrift/Test/Xtruct2.cs \
-	gen-csharp/Thrift/Test/Xtruct3.cs
-
-BUILT_SOURCES = $(GENERATED)
-
-if MONO_MCS
-CSC = mcs
-else
-CSC = gmcs
-endif
-
-if NET_2_0
-CSC_DEFINES = -d:NET_2_0
-endif
-
-LIBDIR = $(top_builddir)/lib/csharp
-
-THRIFT = $(top_builddir)/compiler/cpp/thrift
-
-$(GENERATED): $(top_srcdir)/test/ThriftTest.thrift $(THRIFT)
-	$(THRIFT) --gen csharp -o . $<
-
-precross: TestClientServer.exe
-
-ThriftImpl.dll: $(GENERATED) $(LIBDIR)/Thrift.dll
-	$(CSC) $(CSC_DEFINES) -t:library -out:$@ -reference:$(LIBDIR)/Thrift.dll $(GENERATED)
-
-SRCS = TestClient.cs TestServer.cs Program.cs
-
-TestClientServer.exe: $(SRCS) ThriftImpl.dll
-	$(CSC) $(CSC_DEFINES) -out:$@ -reference:$(LIBDIR)/Thrift.dll -reference:ThriftImpl.dll $(SRCS)
-
-clean-local:
-	$(RM) -rf gen-csharp *.exe *.dll
-
-TESTPORT = 9500
-check-local: TestClientServer.exe
-	MONO_PATH=$(LIBDIR) timeout 10 mono TestClientServer.exe server --port=$(TESTPORT) &
-	sleep 1
-	MONO_PATH=$(LIBDIR) mono TestClientServer.exe client --port=$(TESTPORT)
-
-EXTRA_DIST = \
-	Properties/AssemblyInfo.cs \
-	ThriftTest.csproj \
-	ThriftTest.sln \
-	Program.cs \
-	TestServer.cs \
-	TestClient.cs
diff --git a/test/csharp/Program.cs b/test/csharp/Program.cs
deleted file mode 100644
index 8ec00e3..0000000
--- a/test/csharp/Program.cs
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-// Distributed under the Thrift Software License
-//
-// See accompanying file LICENSE or visit the Thrift site at:
-// http://developers.facebook.com/thrift/
-
-using System;
-using Thrift.Transport;
-using Thrift.Protocol;
-using Thrift.Test; //generated code
-
-namespace Test
-{
-    class Program
-    {
-        static int Main(string[] args)
-        {
-            if (args.Length == 0)
-            {
-                Console.WriteLine("must provide 'server' or 'client' arg");
-                return -1;
-            }
-
-            try
-            {
-                Console.SetBufferSize(Console.BufferWidth, 4096);
-            }
-            catch (Exception)
-            {
-                Console.WriteLine("Failed to grow scroll-back buffer");
-            }
-
-            string[] subArgs = new string[args.Length - 1];
-            for(int i = 1; i < args.Length; i++)
-            {
-                subArgs[i-1] = args[i];
-            }
-            if (args[0] == "client")
-            {
-                return TestClient.Execute(subArgs);
-            }
-            else if (args[0] == "server")
-            {
-                return TestServer.Execute(subArgs) ? 0 : 1;
-            }
-            else
-            {
-                Console.WriteLine("first argument must be 'server' or 'client'");
-            }
-            return 0;
-        }
-    }
-}
diff --git a/test/csharp/Properties/AssemblyInfo.cs b/test/csharp/Properties/AssemblyInfo.cs
deleted file mode 100644
index 376ff25..0000000
--- a/test/csharp/Properties/AssemblyInfo.cs
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-using System.Reflection;
-using System.Runtime.CompilerServices;
-using System.Runtime.InteropServices;
-
-// General Information about an assembly is controlled through the following
-// set of attributes. Change these attribute values to modify the information
-// associated with an assembly.
-[assembly: AssemblyTitle("ThriftTest")]
-[assembly: AssemblyDescription("")]
-[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("The Apache Software Foundation")]
-[assembly: AssemblyProduct("Thrift")]
-[assembly: AssemblyCopyright("The Apache Software Foundation")]
-[assembly: AssemblyTrademark("")]
-[assembly: AssemblyCulture("")]
-
-// Setting ComVisible to false makes the types in this assembly not visible
-// to COM components.  If you need to access a type in this assembly from
-// COM, set the ComVisible attribute to true on that type.
-[assembly: ComVisible(false)]
-
-// The following GUID is for the ID of the typelib if this project is exposed to COM
-[assembly: Guid("f41b193b-f1ab-48ee-8843-f88e43084e26")]
-
-// Version information for an assembly consists of the following four values:
-//
-//      Major Version
-//      Minor Version
-//      Build Number
-//      Revision
-//
-// You can specify all the values or you can default the Build and Revision Numbers
-// by using the '*' as shown below:
-// [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("0.14.0.0")]
-[assembly: AssemblyFileVersion("0.14.0.0")]
diff --git a/test/csharp/TestClient.cs b/test/csharp/TestClient.cs
deleted file mode 100644
index 949c06e..0000000
--- a/test/csharp/TestClient.cs
+++ /dev/null
@@ -1,870 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-using System;
-using System.Linq;
-using System.Diagnostics;
-using System.Collections.Generic;
-using System.Threading;
-using System.Security.Cryptography.X509Certificates;
-using Thrift.Collections;
-using Thrift.Protocol;
-using Thrift.Transport;
-using Thrift.Test;
-using System.Security.Authentication;
-
-namespace Test
-{
-    public class TestClient
-    {
-        public class TestParams
-        {
-            public int numIterations = 1;
-            public string host = "localhost";
-            public int port = 9090;
-            public string url;
-            public string pipe;
-            public bool buffered;
-            public bool framed;
-            public string protocol;
-            public bool encrypted = false;
-            public bool multiplexed = false;
-            protected bool _isFirstTransport = true;
-
-
-            public TTransport CreateTransport()
-            {
-                if (url == null)
-                {
-                    // endpoint transport
-                    TTransport trans = null;
-                    if (pipe != null)
-                        trans = new TNamedPipeClientTransport(pipe);
-                    else
-                    {
-                        if (encrypted)
-                        {
-                            string certPath = "../keys/client.p12";
-                            X509Certificate cert = new X509Certificate2(certPath, "thrift");
-                            trans = new TTLSSocket(host, port, 0, cert, 
-                                (o, c, chain, errors) => true, 
-                                null, SslProtocols.Tls);
-                        }
-                        else
-                        {
-                            trans = new TSocket(host, port);
-                        }
-                    }
-
-                    // layered transport
-                    if (buffered)
-                        trans = new TBufferedTransport(trans);
-                    if (framed)
-                        trans = new TFramedTransport(trans);
-
-                    if (_isFirstTransport)
-                    {
-                        //ensure proper open/close of transport
-                        trans.Open();
-                        trans.Close();
-                        _isFirstTransport = false;
-                    }
-                    return trans;
-                }
-                else
-                {
-                    return new THttpClient(new Uri(url));
-                }
-            }
-
-            public TProtocol CreateProtocol(TTransport transport)
-            {
-                if (protocol == "compact")
-                    return new TCompactProtocol(transport);
-                else if (protocol == "json")
-                    return new TJSONProtocol(transport);
-                else
-                    return new TBinaryProtocol(transport);
-            }
-        };
-
-        private const int ErrorBaseTypes = 1;
-        private const int ErrorStructs = 2;
-        private const int ErrorContainers = 4;
-        private const int ErrorExceptions = 8;
-        private const int ErrorProtocol = 16;
-        private const int ErrorUnknown = 64;
-
-        private class ClientTest
-        {
-            private readonly TestParams param;
-            private readonly TTransport transport;
-            private readonly SecondService.Client second;
-            private readonly ThriftTest.Client client;
-            private readonly int numIterations;
-            private bool done;
-
-            public int ReturnCode { get; set; }
-
-            public ClientTest(TestParams paramin)
-            {
-                param = paramin;
-                transport = param.CreateTransport();
-                TProtocol protocol = param.CreateProtocol(transport);
-                if (param.multiplexed)
-                {
-                    second = new SecondService.Client(new TMultiplexedProtocol(protocol, "SecondService"));
-                }
-                client = new ThriftTest.Client(protocol);
-                numIterations = param.numIterations;
-            }
-            public void Execute()
-            {
-                if (done)
-                {
-                    Console.WriteLine("Execute called more than once");
-                    throw new InvalidOperationException();
-                }
-
-                for (int i = 0; i < numIterations; i++)
-                {
-                    try
-                    {
-                        if (!transport.IsOpen)
-                            transport.Open();
-                    }
-                    catch (TTransportException ex)
-                    {
-                        Console.WriteLine("*** FAILED ***");
-                        Console.WriteLine("Connect failed: " + ex.Message);
-                        ReturnCode |= ErrorUnknown;
-                        Console.WriteLine(ex.Message + " ST: " + ex.StackTrace);
-                        continue;
-                    }
-
-                    try
-                    {
-                        ReturnCode |= ExecuteClientTest(client, second, param);
-                    }
-                    catch (Exception ex)
-                    {
-                        Console.WriteLine("*** FAILED ***");
-                        Console.WriteLine(ex.Message + " ST: " + ex.StackTrace);
-                        ReturnCode |= ErrorUnknown;
-                    }
-                }
-                try
-                {
-                    transport.Close();
-                }
-                catch(Exception ex)
-                {
-                    Console.WriteLine("Error while closing transport");
-                    Console.WriteLine(ex.Message + " ST: " + ex.StackTrace);
-                }
-                done = true;
-            }
-        }
-
-        public static int Execute(string[] args)
-        {
-            try
-            {
-                TestParams param = new TestParams();
-                int numThreads = 1;
-                try
-                {
-                    for (int i = 0; i < args.Length; i++)
-                    {
-                        if (args[i] == "-u")
-                        {
-                            param.url = args[++i];
-                        }
-                        else if (args[i] == "-n")
-                        {
-                            param.numIterations = Convert.ToInt32(args[++i]);
-                        }
-                        else if (args[i] == "-pipe")  // -pipe <name>
-                        {
-                            param.pipe = args[++i];
-                            Console.WriteLine("Using named pipes transport");
-                        }
-                        else if (args[i].Contains("--host="))
-                        {
-                            param.host = args[i].Substring(args[i].IndexOf("=") + 1);
-                        }
-                        else if (args[i].Contains("--port="))
-                        {
-                            param.port = int.Parse(args[i].Substring(args[i].IndexOf("=")+1));
-                        }
-                        else if (args[i] == "-b" || args[i] == "--buffered" || args[i] == "--transport=buffered")
-                        {
-                            param.buffered = true;
-                            Console.WriteLine("Using buffered sockets");
-                        }
-                        else if (args[i] == "-f" || args[i] == "--framed"  || args[i] == "--transport=framed")
-                        {
-                            param.framed = true;
-                            Console.WriteLine("Using framed transport");
-                        }
-                        else if (args[i] == "-t")
-                        {
-                            numThreads = Convert.ToInt32(args[++i]);
-                        }
-                        else if (args[i] == "--compact" || args[i] == "--protocol=compact" || args[i] == "--protocol=multic")
-                        {
-                            param.protocol = "compact";
-                            Console.WriteLine("Using compact protocol");
-                        }
-                        else if (args[i] == "--json" || args[i] == "--protocol=json" || args[i] == "--protocol=multij")
-                        {
-                            param.protocol = "json";
-                            Console.WriteLine("Using JSON protocol");
-                        }
-                        else if (args[i] == "--ssl")
-                        {
-                            param.encrypted = true;
-                            Console.WriteLine("Using encrypted transport");
-                        }
-
-                        if (args[i].StartsWith("--protocol=multi"))
-                        {
-                            param.multiplexed = true;
-                        }
-                    }
-                }
-                catch (Exception ex)
-                {
-                    Console.WriteLine("*** FAILED ***");
-                    Console.WriteLine("Error while  parsing arguments");
-                    Console.WriteLine(ex.Message + " ST: " + ex.StackTrace);
-                    return ErrorUnknown;
-                }
-
-                var tests = Enumerable.Range(0, numThreads).Select(_ => new ClientTest(param)).ToArray();
-                //issue tests on separate threads simultaneously
-                var threads = tests.Select(test => new Thread(test.Execute)).ToArray();
-                DateTime start = DateTime.Now;
-                foreach (var t in threads)
-                    t.Start();
-                foreach (var t in threads)
-                    t.Join();
-                Console.WriteLine("Total time: " + (DateTime.Now - start));
-                Console.WriteLine();
-                return tests.Select(t => t.ReturnCode).Aggregate((r1, r2) => r1 | r2);
-            }
-            catch (Exception outerEx)
-            {
-                Console.WriteLine("*** FAILED ***");
-                Console.WriteLine("Unexpected error");
-                Console.WriteLine(outerEx.Message + " ST: " + outerEx.StackTrace);
-                return ErrorUnknown;
-            }
-        }
-
-        public static string BytesToHex(byte[] data) {
-            return BitConverter.ToString(data).Replace("-", string.Empty);
-        }
-
-        public static byte[] PrepareTestData(bool randomDist, bool huge)
-        {
-            // huge = true tests for THRIFT-4372
-            byte[] retval = new byte[huge ? 0x12345 : 0x100];
-            int initLen = retval.Length;
-
-            // linear distribution, unless random is requested
-            if (!randomDist) {
-                for (var i = 0; i < initLen; ++i) {
-                    retval[i] = (byte)i;
-                }
-                return retval;
-            }
-
-            // random distribution
-            for (var i = 0; i < initLen; ++i) {
-                retval[i] = (byte)0;
-            }
-            var rnd = new Random();
-            for (var i = 1; i < initLen; ++i) {
-                while( true) {
-                    int nextPos = rnd.Next() % initLen;
-                    if (retval[nextPos] == 0) {
-                        retval[nextPos] = (byte)i;
-                        break;
-                    }
-                }
-            }
-            return retval;
-        }
-
-        public static int ExecuteClientTest(ThriftTest.Client client, SecondService.Client second, TestParams param)
-        {
-            int returnCode = 0;
-
-            Console.Write("testVoid()");
-            client.testVoid();
-            Console.WriteLine(" = void");
-
-            Console.Write("testString(\"Test\")");
-            string s = client.testString("Test");
-            Console.WriteLine(" = \"" + s + "\"");
-            if ("Test" != s)
-            {
-                Console.WriteLine("*** FAILED ***");
-                returnCode |= ErrorBaseTypes;
-            }
-
-            if (param.multiplexed)
-            {
-                Console.WriteLine("secondTestString(\"Test2\")");
-                s = second.secondtestString("Test2");
-              Console.WriteLine(" = \"" + s + "\"");
-              if ("testString(\"Test2\")" != s)
-              {
-                  Console.WriteLine("*** FAILED ***");
-                  returnCode |= ErrorProtocol;
-              }
-            }
-
-            Console.Write("testBool(true)");
-            bool t = client.testBool((bool)true);
-            Console.WriteLine(" = " + t);
-            if (!t)
-            {
-                Console.WriteLine("*** FAILED ***");
-                returnCode |= ErrorBaseTypes;
-            }
-            Console.Write("testBool(false)");
-            bool f = client.testBool((bool)false);
-            Console.WriteLine(" = " + f);
-            if (f)
-            {
-                Console.WriteLine("*** FAILED ***");
-                returnCode |= ErrorBaseTypes;
-            }
-
-            Console.Write("testByte(1)");
-            sbyte i8 = client.testByte((sbyte)1);
-            Console.WriteLine(" = " + i8);
-            if (1 != i8)
-            {
-                Console.WriteLine("*** FAILED ***");
-                returnCode |= ErrorBaseTypes;
-            }
-
-            Console.Write("testI32(-1)");
-            int i32 = client.testI32(-1);
-            Console.WriteLine(" = " + i32);
-            if (-1 != i32)
-            {
-                Console.WriteLine("*** FAILED ***");
-                returnCode |= ErrorBaseTypes;
-            }
-
-            Console.Write("testI64(-34359738368)");
-            long i64 = client.testI64(-34359738368);
-            Console.WriteLine(" = " + i64);
-            if (-34359738368 != i64)
-            {
-                Console.WriteLine("*** FAILED ***");
-                returnCode |= ErrorBaseTypes;
-            }
-
-            // TODO: Validate received message
-            Console.Write("testDouble(5.325098235)");
-            double dub = client.testDouble(5.325098235);
-            Console.WriteLine(" = " + dub);
-            if (5.325098235 != dub)
-            {
-                Console.WriteLine("*** FAILED ***");
-                returnCode |= ErrorBaseTypes;
-            }
-            Console.Write("testDouble(-0.000341012439638598279)");
-            dub = client.testDouble(-0.000341012439638598279);
-            Console.WriteLine(" = " + dub);
-            if (-0.000341012439638598279 != dub)
-            {
-                Console.WriteLine("*** FAILED ***");
-                returnCode |= ErrorBaseTypes;
-            }
-
-            for (i32 = 0; i32 < 2; ++i32)
-            {
-                var huge = (i32 > 0);
-                byte[] binOut = PrepareTestData(false,huge);
-                Console.Write("testBinary(" + BytesToHex(binOut) + ")");
-                try
-                {
-                    byte[] binIn = client.testBinary(binOut);
-                    Console.WriteLine(" = " + BytesToHex(binIn));
-                    if (binIn.Length != binOut.Length)
-                    {
-                        Console.WriteLine("*** FAILED ***");
-                        returnCode |= ErrorBaseTypes;
-                    }
-                    for (int ofs = 0; ofs < Math.Min(binIn.Length, binOut.Length); ++ofs)
-                        if (binIn[ofs] != binOut[ofs])
-                        {
-                            Console.WriteLine("*** FAILED ***");
-                            returnCode |= ErrorBaseTypes;
-                        }
-                }
-                catch (Thrift.TApplicationException ex)
-                {
-                    Console.WriteLine("*** FAILED ***");
-                    returnCode |= ErrorBaseTypes;
-                    Console.WriteLine(ex.Message + " ST: " + ex.StackTrace);
-                }
-            }
-
-            // binary equals? only with hashcode option enabled ...
-            Console.WriteLine("Test CrazyNesting");
-            if( typeof(CrazyNesting).GetMethod("Equals").DeclaringType == typeof(CrazyNesting))
-            {
-                CrazyNesting one = new CrazyNesting();
-                CrazyNesting two = new CrazyNesting();
-                one.String_field = "crazy";
-                two.String_field = "crazy";
-                one.Binary_field = new byte[10] { 0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0xFF };
-                two.Binary_field = new byte[10] { 0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0xFF };
-                if (!one.Equals(two))
-                {
-                    Console.WriteLine("*** FAILED ***");
-                    returnCode |= ErrorContainers;
-                    throw new Exception("CrazyNesting.Equals failed");
-                }
-            }
-
-            // TODO: Validate received message
-            Console.Write("testStruct({\"Zero\", 1, -3, -5})");
-            Xtruct o = new Xtruct();
-            o.String_thing = "Zero";
-            o.Byte_thing = (sbyte)1;
-            o.I32_thing = -3;
-            o.I64_thing = -5;
-            Xtruct i = client.testStruct(o);
-            Console.WriteLine(" = {\"" + i.String_thing + "\", " + i.Byte_thing + ", " + i.I32_thing + ", " + i.I64_thing + "}");
-
-            // TODO: Validate received message
-            Console.Write("testNest({1, {\"Zero\", 1, -3, -5}, 5})");
-            Xtruct2 o2 = new Xtruct2();
-            o2.Byte_thing = (sbyte)1;
-            o2.Struct_thing = o;
-            o2.I32_thing = 5;
-            Xtruct2 i2 = client.testNest(o2);
-            i = i2.Struct_thing;
-            Console.WriteLine(" = {" + i2.Byte_thing + ", {\"" + i.String_thing + "\", " + i.Byte_thing + ", " + i.I32_thing + ", " + i.I64_thing + "}, " + i2.I32_thing + "}");
-
-            Dictionary<int, int> mapout = new Dictionary<int, int>();
-            for (int j = 0; j < 5; j++)
-            {
-                mapout[j] = j - 10;
-            }
-            Console.Write("testMap({");
-            bool first = true;
-            foreach (int key in mapout.Keys)
-            {
-                if (first)
-                {
-                    first = false;
-                }
-                else
-                {
-                    Console.Write(", ");
-                }
-                Console.Write(key + " => " + mapout[key]);
-            }
-            Console.Write("})");
-
-            Dictionary<int, int> mapin = client.testMap(mapout);
-
-            Console.Write(" = {");
-            first = true;
-            foreach (int key in mapin.Keys)
-            {
-                if (first)
-                {
-                    first = false;
-                }
-                else
-                {
-                    Console.Write(", ");
-                }
-                Console.Write(key + " => " + mapin[key]);
-            }
-            Console.WriteLine("}");
-
-            // TODO: Validate received message
-            List<int> listout = new List<int>();
-            for (int j = -2; j < 3; j++)
-            {
-                listout.Add(j);
-            }
-            Console.Write("testList({");
-            first = true;
-            foreach (int j in listout)
-            {
-                if (first)
-                {
-                    first = false;
-                }
-                else
-                {
-                    Console.Write(", ");
-                }
-                Console.Write(j);
-            }
-            Console.Write("})");
-
-            List<int> listin = client.testList(listout);
-
-            Console.Write(" = {");
-            first = true;
-            foreach (int j in listin)
-            {
-                if (first)
-                {
-                    first = false;
-                }
-                else
-                {
-                    Console.Write(", ");
-                }
-                Console.Write(j);
-            }
-            Console.WriteLine("}");
-
-            //set
-            // TODO: Validate received message
-            THashSet<int> setout = new THashSet<int>();
-            for (int j = -2; j < 3; j++)
-            {
-                setout.Add(j);
-            }
-            Console.Write("testSet({");
-            first = true;
-            foreach (int j in setout)
-            {
-                if (first)
-                {
-                    first = false;
-                }
-                else
-                {
-                    Console.Write(", ");
-                }
-                Console.Write(j);
-            }
-            Console.Write("})");
-
-            THashSet<int> setin = client.testSet(setout);
-
-            Console.Write(" = {");
-            first = true;
-            foreach (int j in setin)
-            {
-                if (first)
-                {
-                    first = false;
-                }
-                else
-                {
-                    Console.Write(", ");
-                }
-                Console.Write(j);
-            }
-            Console.WriteLine("}");
-
-
-            Console.Write("testEnum(ONE)");
-            Numberz ret = client.testEnum(Numberz.ONE);
-            Console.WriteLine(" = " + ret);
-            if (Numberz.ONE != ret)
-            {
-                Console.WriteLine("*** FAILED ***");
-                returnCode |= ErrorStructs;
-            }
-
-            Console.Write("testEnum(TWO)");
-            ret = client.testEnum(Numberz.TWO);
-            Console.WriteLine(" = " + ret);
-            if (Numberz.TWO != ret)
-            {
-                Console.WriteLine("*** FAILED ***");
-                returnCode |= ErrorStructs;
-            }
-
-            Console.Write("testEnum(THREE)");
-            ret = client.testEnum(Numberz.THREE);
-            Console.WriteLine(" = " + ret);
-            if (Numberz.THREE != ret)
-            {
-                Console.WriteLine("*** FAILED ***");
-                returnCode |= ErrorStructs;
-            }
-
-            Console.Write("testEnum(FIVE)");
-            ret = client.testEnum(Numberz.FIVE);
-            Console.WriteLine(" = " + ret);
-            if (Numberz.FIVE != ret)
-            {
-                Console.WriteLine("*** FAILED ***");
-                returnCode |= ErrorStructs;
-            }
-
-            Console.Write("testEnum(EIGHT)");
-            ret = client.testEnum(Numberz.EIGHT);
-            Console.WriteLine(" = " + ret);
-            if (Numberz.EIGHT != ret)
-            {
-                Console.WriteLine("*** FAILED ***");
-                returnCode |= ErrorStructs;
-            }
-
-            Console.Write("testTypedef(309858235082523)");
-            long uid = client.testTypedef(309858235082523L);
-            Console.WriteLine(" = " + uid);
-            if (309858235082523L != uid)
-            {
-                Console.WriteLine("*** FAILED ***");
-                returnCode |= ErrorStructs;
-            }
-
-            // TODO: Validate received message
-            Console.Write("testMapMap(1)");
-            Dictionary<int, Dictionary<int, int>> mm = client.testMapMap(1);
-            Console.Write(" = {");
-            foreach (int key in mm.Keys)
-            {
-                Console.Write(key + " => {");
-                Dictionary<int, int> m2 = mm[key];
-                foreach (int k2 in m2.Keys)
-                {
-                    Console.Write(k2 + " => " + m2[k2] + ", ");
-                }
-                Console.Write("}, ");
-            }
-            Console.WriteLine("}");
-
-            // TODO: Validate received message
-            Insanity insane = new Insanity();
-            insane.UserMap = new Dictionary<Numberz, long>();
-            insane.UserMap[Numberz.FIVE] = 5000L;
-            Xtruct truck = new Xtruct();
-            truck.String_thing = "Truck";
-            truck.Byte_thing = (sbyte)8;
-            truck.I32_thing = 8;
-            truck.I64_thing = 8;
-            insane.Xtructs = new List<Xtruct>();
-            insane.Xtructs.Add(truck);
-            Console.Write("testInsanity()");
-            Dictionary<long, Dictionary<Numberz, Insanity>> whoa = client.testInsanity(insane);
-            Console.Write(" = {");
-            foreach (long key in whoa.Keys)
-            {
-                Dictionary<Numberz, Insanity> val = whoa[key];
-                Console.Write(key + " => {");
-
-                foreach (Numberz k2 in val.Keys)
-                {
-                    Insanity v2 = val[k2];
-
-                    Console.Write(k2 + " => {");
-                    Dictionary<Numberz, long> userMap = v2.UserMap;
-
-                    Console.Write("{");
-                    if (userMap != null)
-                    {
-                        foreach (Numberz k3 in userMap.Keys)
-                        {
-                            Console.Write(k3 + " => " + userMap[k3] + ", ");
-                        }
-                    }
-                    else
-                    {
-                        Console.Write("null");
-                    }
-                    Console.Write("}, ");
-
-                    List<Xtruct> xtructs = v2.Xtructs;
-
-                    Console.Write("{");
-                    if (xtructs != null)
-                    {
-                        foreach (Xtruct x in xtructs)
-                        {
-                            Console.Write("{\"" + x.String_thing + "\", " + x.Byte_thing + ", " + x.I32_thing + ", " + x.I32_thing + "}, ");
-                        }
-                    }
-                    else
-                    {
-                        Console.Write("null");
-                    }
-                    Console.Write("}");
-
-                    Console.Write("}, ");
-                }
-                Console.Write("}, ");
-            }
-            Console.WriteLine("}");
-
-            sbyte arg0 = 1;
-            int arg1 = 2;
-            long arg2 = long.MaxValue;
-            Dictionary<short, string> multiDict = new Dictionary<short, string>();
-            multiDict[1] = "one";
-            Numberz arg4 = Numberz.FIVE;
-            long arg5 = 5000000;
-            Console.Write("Test Multi(" + arg0 + "," + arg1 + "," + arg2 + "," + multiDict + "," + arg4 + "," + arg5 + ")");
-            Xtruct multiResponse = client.testMulti(arg0, arg1, arg2, multiDict, arg4, arg5);
-            Console.Write(" = Xtruct(byte_thing:" + multiResponse.Byte_thing + ",String_thing:" + multiResponse.String_thing
-                        + ",i32_thing:" + multiResponse.I32_thing + ",i64_thing:" + multiResponse.I64_thing + ")\n");
-
-            try
-            {
-                Console.WriteLine("testException(\"Xception\")");
-                client.testException("Xception");
-                Console.WriteLine("*** FAILED ***");
-                returnCode |= ErrorExceptions;
-            }
-            catch (Xception ex)
-            {
-                if (ex.ErrorCode != 1001 || ex.Message != "Xception")
-                {
-                    Console.WriteLine("*** FAILED ***");
-                    returnCode |= ErrorExceptions;
-                }
-            }
-            catch (Exception ex)
-            {
-                Console.WriteLine("*** FAILED ***");
-                returnCode |= ErrorExceptions;
-                Console.WriteLine(ex.Message + " ST: " + ex.StackTrace);
-            }
-            try
-            {
-                Console.WriteLine("testException(\"TException\")");
-                client.testException("TException");
-                Console.WriteLine("*** FAILED ***");
-                returnCode |= ErrorExceptions;
-            }
-            catch (Thrift.TException)
-            {
-                // OK
-            }
-            catch (Exception ex)
-            {
-                Console.WriteLine("*** FAILED ***");
-                returnCode |= ErrorExceptions;
-                Console.WriteLine(ex.Message + " ST: " + ex.StackTrace);
-            }
-            try
-            {
-                Console.WriteLine("testException(\"ok\")");
-                client.testException("ok");
-                // OK
-            }
-            catch (Exception ex)
-            {
-                Console.WriteLine("*** FAILED ***");
-                returnCode |= ErrorExceptions;
-                Console.WriteLine(ex.Message + " ST: " + ex.StackTrace);
-            }
-
-            try
-            {
-                Console.WriteLine("testMultiException(\"Xception\", ...)");
-                client.testMultiException("Xception", "ignore");
-                Console.WriteLine("*** FAILED ***");
-                returnCode |= ErrorExceptions;
-            }
-            catch (Xception ex)
-            {
-                if (ex.ErrorCode != 1001 || ex.Message != "This is an Xception")
-                {
-                    Console.WriteLine("*** FAILED ***");
-                    returnCode |= ErrorExceptions;
-                }
-            }
-            catch (Exception ex)
-            {
-                Console.WriteLine("*** FAILED ***");
-                returnCode |= ErrorExceptions;
-                Console.WriteLine(ex.Message + " ST: " + ex.StackTrace);
-            }
-            try
-            {
-                Console.WriteLine("testMultiException(\"Xception2\", ...)");
-                client.testMultiException("Xception2", "ignore");
-                Console.WriteLine("*** FAILED ***");
-                returnCode |= ErrorExceptions;
-            }
-            catch (Xception2 ex)
-            {
-                if (ex.ErrorCode != 2002 || ex.Struct_thing.String_thing != "This is an Xception2")
-                {
-                    Console.WriteLine("*** FAILED ***");
-                    returnCode |= ErrorExceptions;
-                }
-            }
-            catch (Exception ex)
-            {
-                Console.WriteLine("*** FAILED ***");
-                returnCode |= ErrorExceptions;
-                Console.WriteLine(ex.Message + " ST: " + ex.StackTrace);
-            }
-            try
-            {
-                Console.WriteLine("testMultiException(\"success\", \"OK\")");
-                if ("OK" != client.testMultiException("success", "OK").String_thing)
-                {
-                    Console.WriteLine("*** FAILED ***");
-                    returnCode |= ErrorExceptions;
-                }
-            }
-            catch (Exception ex)
-            {
-                Console.WriteLine("*** FAILED ***");
-                returnCode |= ErrorExceptions;
-                Console.WriteLine(ex.Message + " ST: " + ex.StackTrace);
-            }
-
-            Stopwatch sw = new Stopwatch();
-            sw.Start();
-            Console.WriteLine("Test Oneway(1)");
-            client.testOneway(1);
-            sw.Stop();
-            if (sw.ElapsedMilliseconds > 1000)
-            {
-                Console.WriteLine("*** FAILED ***");
-                returnCode |= ErrorBaseTypes;
-            }
-
-            Console.Write("Test Calltime()");
-            var times = 50;
-            sw.Reset();
-            sw.Start();
-            for (int k = 0; k < times; ++k)
-                client.testVoid();
-            sw.Stop();
-            Console.WriteLine(" = {0} ms a testVoid() call", sw.ElapsedMilliseconds / times);
-            return returnCode;
-        }
-    }
-}
diff --git a/test/csharp/TestServer.cs b/test/csharp/TestServer.cs
deleted file mode 100644
index bf645c2..0000000
--- a/test/csharp/TestServer.cs
+++ /dev/null
@@ -1,535 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-// Distributed under the Thrift Software License
-//
-// See accompanying file LICENSE or visit the Thrift site at:
-// http://developers.facebook.com/thrift/
-using System;
-using System.Collections.Generic;
-using System.Security.Cryptography.X509Certificates;
-using Thrift.Collections;
-using Thrift.Test; //generated code
-using Thrift.Transport;
-using Thrift.Protocol;
-using Thrift.Server;
-using Thrift;
-using System.Threading;
-using System.Text;
-using System.Security.Authentication;
-
-namespace Test
-{
-    public class TestServer
-    {
-        public static int _clientID = -1;
-        public delegate void TestLogDelegate(string msg, params object[] values);
-
-        public class TradeServerEventHandler : TServerEventHandler
-        {
-            public int callCount = 0;
-            public void preServe()
-            {
-                callCount++;
-            }
-            public Object createContext(Thrift.Protocol.TProtocol input, Thrift.Protocol.TProtocol output)
-            {
-                callCount++;
-                return null;
-            }
-            public void deleteContext(Object serverContext, Thrift.Protocol.TProtocol input, Thrift.Protocol.TProtocol output)
-            {
-                callCount++;
-            }
-            public void processContext(Object serverContext, Thrift.Transport.TTransport transport)
-            {
-                callCount++;
-            }
-        };
-
-
-        public class TestHandler : ThriftTest.Iface, Thrift.TControllingHandler
-        {
-            public TServer server { get; set; }
-            private int handlerID;
-            private StringBuilder reusableStringBuilder = new StringBuilder();
-            private TestLogDelegate testLogDelegate;
-
-            public TestHandler()
-            {
-                handlerID = Interlocked.Increment(ref _clientID);
-                testLogDelegate += testConsoleLogger;
-                testLogDelegate.Invoke("New TestHandler instance created");
-            }
-
-            public void testConsoleLogger(string msg, params object[] values)
-            {
-                reusableStringBuilder.Clear();
-                reusableStringBuilder.AppendFormat("handler{0:D3}:",handlerID);
-                reusableStringBuilder.AppendFormat(msg, values);
-                reusableStringBuilder.AppendLine();
-                Console.Write( reusableStringBuilder.ToString() );
-            }
-
-            public void testVoid()
-            {
-                testLogDelegate.Invoke("testVoid()");
-            }
-
-            public string testString(string thing)
-            {
-                testLogDelegate.Invoke("testString({0})", thing);
-                return thing;
-            }
-
-            public bool testBool(bool thing)
-            {
-                testLogDelegate.Invoke("testBool({0})", thing);
-                return thing;
-            }
-
-            public sbyte testByte(sbyte thing)
-            {
-                testLogDelegate.Invoke("testByte({0})", thing);
-                return thing;
-            }
-
-            public int testI32(int thing)
-            {
-                testLogDelegate.Invoke("testI32({0})", thing);
-                return thing;
-            }
-
-            public long testI64(long thing)
-            {
-                testLogDelegate.Invoke("testI64({0})", thing);
-                return thing;
-            }
-
-            public double testDouble(double thing)
-            {
-                testLogDelegate.Invoke("testDouble({0})", thing);
-                return thing;
-            }
-
-            public byte[] testBinary(byte[] thing)
-            {
-                string hex = BitConverter.ToString(thing).Replace("-", string.Empty);
-                testLogDelegate.Invoke("testBinary({0:X})", hex);
-                return thing;
-            }
-
-            public Xtruct testStruct(Xtruct thing)
-            {
-                testLogDelegate.Invoke("testStruct({{\"{0}\", {1}, {2}, {3}}})", thing.String_thing, thing.Byte_thing, thing.I32_thing, thing.I64_thing);
-                return thing;
-            }
-
-            public Xtruct2 testNest(Xtruct2 nest)
-            {
-                Xtruct thing = nest.Struct_thing;
-                testLogDelegate.Invoke("testNest({{{0}, {{\"{1}\", {2}, {3}, {4}, {5}}}}})",
-                                 nest.Byte_thing,
-                                 thing.String_thing,
-                                 thing.Byte_thing,
-                                 thing.I32_thing,
-                                 thing.I64_thing,
-                                 nest.I32_thing);
-                return nest;
-            }
-
-            public Dictionary<int, int> testMap(Dictionary<int, int> thing)
-            {
-                reusableStringBuilder.Clear();
-                reusableStringBuilder.Append("testMap({{");
-                bool first = true;
-                foreach (int key in thing.Keys)
-                {
-                    if (first)
-                    {
-                        first = false;
-                    }
-                    else
-                    {
-                        reusableStringBuilder.Append(", ");
-                    }
-                    reusableStringBuilder.AppendFormat("{0} => {1}", key, thing[key]);
-                }
-                reusableStringBuilder.Append("}})");
-                testLogDelegate.Invoke(reusableStringBuilder.ToString());
-                return thing;
-            }
-
-            public Dictionary<string, string> testStringMap(Dictionary<string, string> thing)
-            {
-                reusableStringBuilder.Clear();
-                reusableStringBuilder.Append("testStringMap({{");
-                bool first = true;
-                foreach (string key in thing.Keys)
-                {
-                    if (first)
-                    {
-                        first = false;
-                    }
-                    else
-                    {
-                        reusableStringBuilder.Append(", ");
-                    }
-                    reusableStringBuilder.AppendFormat("{0} => {1}", key, thing[key]);
-                }
-                reusableStringBuilder.Append("}})");
-                testLogDelegate.Invoke(reusableStringBuilder.ToString());
-                return thing;
-            }
-
-            public THashSet<int> testSet(THashSet<int> thing)
-            {
-                reusableStringBuilder.Clear();
-                reusableStringBuilder.Append("testSet({{");
-                bool first = true;
-                foreach (int elem in thing)
-                {
-                    if (first)
-                    {
-                        first = false;
-                    }
-                    else
-                    {
-                        reusableStringBuilder.Append(", ");
-                    }
-                    reusableStringBuilder.AppendFormat("{0}", elem);
-                }
-                reusableStringBuilder.Append("}})");
-                testLogDelegate.Invoke(reusableStringBuilder.ToString());
-                return thing;
-            }
-
-            public List<int> testList(List<int> thing)
-            {
-                reusableStringBuilder.Clear();
-                reusableStringBuilder.Append("testList({{");
-                bool first = true;
-                foreach (int elem in thing)
-                {
-                    if (first)
-                    {
-                        first = false;
-                    }
-                    else
-                    {
-                        reusableStringBuilder.Append(", ");
-                    }
-                    reusableStringBuilder.AppendFormat("{0}", elem);
-                }
-                reusableStringBuilder.Append("}})");
-                testLogDelegate.Invoke(reusableStringBuilder.ToString());
-                return thing;
-            }
-
-            public Numberz testEnum(Numberz thing)
-            {
-                testLogDelegate.Invoke("testEnum({0})", thing);
-                return thing;
-            }
-
-            public long testTypedef(long thing)
-            {
-                testLogDelegate.Invoke("testTypedef({0})", thing);
-                return thing;
-            }
-
-            public Dictionary<int, Dictionary<int, int>> testMapMap(int hello)
-            {
-                testLogDelegate.Invoke("testMapMap({0})", hello);
-                Dictionary<int, Dictionary<int, int>> mapmap =
-                  new Dictionary<int, Dictionary<int, int>>();
-
-                Dictionary<int, int> pos = new Dictionary<int, int>();
-                Dictionary<int, int> neg = new Dictionary<int, int>();
-                for (int i = 1; i < 5; i++)
-                {
-                    pos[i] = i;
-                    neg[-i] = -i;
-                }
-
-                mapmap[4] = pos;
-                mapmap[-4] = neg;
-
-                return mapmap;
-            }
-
-            // Insanity
-            // returns:
-            // { 1 => { 2 => argument,
-            //          3 => argument,
-            //        },
-            //   2 => { 6 => <empty Insanity struct>, },
-            // }
-            public Dictionary<long, Dictionary<Numberz, Insanity>> testInsanity(Insanity argument)
-            {
-                testLogDelegate.Invoke("testInsanity()");
-
-                Dictionary<Numberz, Insanity> first_map = new Dictionary<Numberz, Insanity>();
-                Dictionary<Numberz, Insanity> second_map = new Dictionary<Numberz, Insanity>(); ;
-
-                first_map[Numberz.TWO] = argument;
-                first_map[Numberz.THREE] = argument;
-
-                second_map[Numberz.SIX] = new Insanity();
-
-                Dictionary<long, Dictionary<Numberz, Insanity>> insane =
-                  new Dictionary<long, Dictionary<Numberz, Insanity>>();
-                insane[(long)1] = first_map;
-                insane[(long)2] = second_map;
-
-                return insane;
-            }
-
-            public Xtruct testMulti(sbyte arg0, int arg1, long arg2, Dictionary<short, string> arg3, Numberz arg4, long arg5)
-            {
-                testLogDelegate.Invoke("testMulti()");
-
-                Xtruct hello = new Xtruct(); ;
-                hello.String_thing = "Hello2";
-                hello.Byte_thing = arg0;
-                hello.I32_thing = arg1;
-                hello.I64_thing = arg2;
-                return hello;
-            }
-
-            /**
-             * Print 'testException(%s)' with arg as '%s'
-             * @param string arg - a string indication what type of exception to throw
-             * if arg == "Xception" throw Xception with errorCode = 1001 and message = arg
-             * elsen if arg == "TException" throw TException
-             * else do not throw anything
-             */
-            public void testException(string arg)
-            {
-                testLogDelegate.Invoke("testException({0})", arg);
-                if (arg == "Xception")
-                {
-                    Xception x = new Xception();
-                    x.ErrorCode = 1001;
-                    x.Message = arg;
-                    throw x;
-                }
-                if (arg == "TException")
-                {
-                    throw new Thrift.TException();
-                }
-                return;
-            }
-
-            public Xtruct testMultiException(string arg0, string arg1)
-            {
-                testLogDelegate.Invoke("testMultiException({0}, {1})", arg0,arg1);
-                if (arg0 == "Xception")
-                {
-                    Xception x = new Xception();
-                    x.ErrorCode = 1001;
-                    x.Message = "This is an Xception";
-                    throw x;
-                }
-                else if (arg0 == "Xception2")
-                {
-                    Xception2 x = new Xception2();
-                    x.ErrorCode = 2002;
-                    x.Struct_thing = new Xtruct();
-                    x.Struct_thing.String_thing = "This is an Xception2";
-                    throw x;
-                }
-
-                Xtruct result = new Xtruct();
-                result.String_thing = arg1;
-                return result;
-            }
-
-            public void testStop()
-            {
-                if (server != null)
-                {
-                    server.Stop();
-                }
-            }
-
-            public void testOneway(int arg)
-            {
-                testLogDelegate.Invoke("testOneway({0}), sleeping...", arg);
-                System.Threading.Thread.Sleep(arg * 1000);
-                testLogDelegate.Invoke("testOneway finished");
-            }
-
-        } // class TestHandler
-
-        private enum ServerType
-        {
-            TSimpleServer,
-            TThreadedServer,
-            TThreadPoolServer,
-        }
-
-        private enum ProcessorFactoryType
-        {
-            TSingletonProcessorFactory,
-            TPrototypeProcessorFactory,
-        }
-
-        public static bool Execute(string[] args)
-        {
-            try
-            {
-                bool useBufferedSockets = false, useFramed = false, useEncryption = false, compact = false, json = false;
-                ServerType serverType = ServerType.TSimpleServer;
-                ProcessorFactoryType processorFactoryType = ProcessorFactoryType.TSingletonProcessorFactory;
-                int port = 9090;
-                string pipe = null;
-                for (int i = 0; i < args.Length; i++)
-                {
-                    if (args[i] == "-pipe")  // -pipe name
-                    {
-                        pipe = args[++i];
-                    }
-                    else if (args[i].Contains("--port="))
-                    {
-                        port = int.Parse(args[i].Substring(args[i].IndexOf("=") + 1));
-                    }
-                    else if (args[i] == "-b" || args[i] == "--buffered" || args[i] == "--transport=buffered")
-                    {
-                        useBufferedSockets = true;
-                    }
-                    else if (args[i] == "-f" || args[i] == "--framed" || args[i] == "--transport=framed")
-                    {
-                        useFramed = true;
-                    }
-                    else if (args[i] == "--compact" || args[i] == "--protocol=compact")
-                    {
-                        compact = true;
-                    }
-                    else if (args[i] == "--json" || args[i] == "--protocol=json")
-                    {
-                        json = true;
-                    }
-                    else if (args[i] == "--threaded" || args[i] == "--server-type=threaded")
-                    {
-                        serverType = ServerType.TThreadedServer;
-                    }
-                    else if (args[i] == "--threadpool" || args[i] == "--server-type=threadpool")
-                    {
-                        serverType = ServerType.TThreadPoolServer;
-                    }
-                    else if (args[i] == "--prototype" || args[i] == "--processor=prototype")
-                    {
-                        processorFactoryType = ProcessorFactoryType.TPrototypeProcessorFactory;
-                    }
-                    else if (args[i] == "--ssl")
-                    {
-                        useEncryption = true;
-                    }
-                }
-
-                // Transport
-                TServerTransport trans;
-                if (pipe != null)
-                {
-                    trans = new TNamedPipeServerTransport(pipe);
-                }
-                else
-                {
-                    if (useEncryption)
-                    {
-                        string certPath = "../keys/server.p12";
-                        trans = new TTLSServerSocket(port, 0, useBufferedSockets, new X509Certificate2(certPath, "thrift"), 
-                            null,
-                            null, SslProtocols.Tls);
-                    }
-                    else
-                    {
-                        trans = new TServerSocket(port, 0, useBufferedSockets);
-                    }
-                }
-
-                TProtocolFactory proto;
-                if (compact)
-                    proto = new TCompactProtocol.Factory();
-                else if (json)
-                    proto = new TJSONProtocol.Factory();
-                else
-                    proto = new TBinaryProtocol.Factory();
-
-                TProcessorFactory processorFactory;
-                if (processorFactoryType == ProcessorFactoryType.TPrototypeProcessorFactory)
-                {
-                    processorFactory = new TPrototypeProcessorFactory<ThriftTest.Processor, TestHandler>();
-                }
-                else
-                {
-                    // Processor
-                    TestHandler testHandler = new TestHandler();
-                    ThriftTest.Processor testProcessor = new ThriftTest.Processor(testHandler);
-                    processorFactory = new TSingletonProcessorFactory(testProcessor);
-                }
-
-                TTransportFactory transFactory;
-                if (useFramed)
-                    transFactory = new TFramedTransport.Factory();
-                else
-                    transFactory = new TTransportFactory();
-
-                TServer serverEngine;
-                switch (serverType)
-                {
-                    case ServerType.TThreadPoolServer:
-                        serverEngine = new TThreadPoolServer(processorFactory, trans, transFactory, proto);
-                        break;
-                    case ServerType.TThreadedServer:
-                        serverEngine = new TThreadedServer(processorFactory, trans, transFactory, proto);
-                        break;
-                    default:
-                        serverEngine = new TSimpleServer(processorFactory, trans, transFactory, proto);
-                        break;
-                }
-
-                //Server event handler
-                TradeServerEventHandler serverEvents = new TradeServerEventHandler();
-                serverEngine.setEventHandler(serverEvents);
-
-                // Run it
-                string where = (pipe != null ? "on pipe " + pipe : "on port " + port);
-                Console.WriteLine("Starting the " + serverType.ToString() + " " + where +
-                    (processorFactoryType == ProcessorFactoryType.TPrototypeProcessorFactory ? " with processor prototype factory " : "") +
-                    (useBufferedSockets ? " with buffered socket" : "") +
-                    (useFramed ? " with framed transport" : "") +
-                    (useEncryption ? " with encryption" : "") +
-                    (compact ? " with compact protocol" : "") +
-                    (json ? " with json protocol" : "") +
-                    "...");
-                serverEngine.Serve();
-
-            }
-            catch (Exception x)
-            {
-                Console.Error.Write(x);
-                return false;
-            }
-            Console.WriteLine("done.");
-            return true;
-        }
-    }
-}
diff --git a/test/csharp/ThriftTest.csproj b/test/csharp/ThriftTest.csproj
deleted file mode 100644
index 2ff0926..0000000
--- a/test/csharp/ThriftTest.csproj
+++ /dev/null
@@ -1,141 +0,0 @@
-﻿<?xml version="1.0" encoding="utf-8"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements. See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership. The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License. You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied. See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <PropertyGroup>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <ProductVersion>9.0.21022</ProductVersion>
-    <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{48DD757F-CA95-4DD7-BDA4-58DB6F108C2C}</ProjectGuid>
-    <OutputType>Exe</OutputType>
-    <AppDesignerFolder>Properties</AppDesignerFolder>
-    <RootNamespace>ThriftTest</RootNamespace>
-    <AssemblyName>ThriftTest</AssemblyName>
-    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
-    <FileAlignment>512</FileAlignment>
-    <IsWebBootstrapper>false</IsWebBootstrapper>
-    <FileUpgradeFlags>
-    </FileUpgradeFlags>
-    <OldToolsVersion>3.5</OldToolsVersion>
-    <UpgradeBackupLocation />
-    <PublishUrl>publish\</PublishUrl>
-    <Install>true</Install>
-    <InstallFrom>Disk</InstallFrom>
-    <UpdateEnabled>false</UpdateEnabled>
-    <UpdateMode>Foreground</UpdateMode>
-    <UpdateInterval>7</UpdateInterval>
-    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
-    <UpdatePeriodically>false</UpdatePeriodically>
-    <UpdateRequired>false</UpdateRequired>
-    <MapFileExtensions>true</MapFileExtensions>
-    <ApplicationRevision>0</ApplicationRevision>
-    <ApplicationVersion>0.14.0.0</ApplicationVersion>
-    <UseApplicationTrust>false</UseApplicationTrust>
-    <BootstrapperEnabled>true</BootstrapperEnabled>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
-    <DebugSymbols>true</DebugSymbols>
-    <DebugType>full</DebugType>
-    <Optimize>false</Optimize>
-    <OutputPath>bin\Debug\</OutputPath>
-    <DefineConstants>DEBUG;TRACE</DefineConstants>
-    <ErrorReport>prompt</ErrorReport>
-    <WarningLevel>4</WarningLevel>
-    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
-    <DebugType>pdbonly</DebugType>
-    <Optimize>true</Optimize>
-    <OutputPath>bin\Release\</OutputPath>
-    <DefineConstants>TRACE</DefineConstants>
-    <ErrorReport>prompt</ErrorReport>
-    <WarningLevel>4</WarningLevel>
-    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="System" />
-    <Reference Include="ThriftImpl, Version=0.0.0.0, Culture=neutral, processorArchitecture=MSIL">
-      <SpecificVersion>False</SpecificVersion>
-      <HintPath>.\ThriftImpl.dll</HintPath>
-    </Reference>
-  </ItemGroup>
-  <ItemGroup>
-    <Compile Include="Program.cs" />
-    <Compile Include="Properties\AssemblyInfo.cs" />
-    <Compile Include="TestClient.cs" />
-    <Compile Include="TestServer.cs" />
-  </ItemGroup>
-  <ItemGroup>
-    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
-      <Visible>False</Visible>
-      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
-      <Install>false</Install>
-    </BootstrapperPackage>
-    <BootstrapperPackage Include="Microsoft.Net.Framework.2.0">
-      <Visible>False</Visible>
-      <ProductName>.NET Framework 2.0 %28x86%29</ProductName>
-      <Install>false</Install>
-    </BootstrapperPackage>
-    <BootstrapperPackage Include="Microsoft.Net.Framework.3.0">
-      <Visible>False</Visible>
-      <ProductName>.NET Framework 3.0 %28x86%29</ProductName>
-      <Install>false</Install>
-    </BootstrapperPackage>
-    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5">
-      <Visible>False</Visible>
-      <ProductName>.NET Framework 3.5</ProductName>
-      <Install>true</Install>
-    </BootstrapperPackage>
-    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
-      <Visible>False</Visible>
-      <ProductName>.NET Framework 3.5 SP1</ProductName>
-      <Install>false</Install>
-    </BootstrapperPackage>
-    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
-      <Visible>False</Visible>
-      <ProductName>Windows Installer 3.1</ProductName>
-      <Install>true</Install>
-    </BootstrapperPackage>
-  </ItemGroup>
-  <ItemGroup>
-    <ProjectReference Include="..\..\lib\csharp\Thrift.csproj">
-      <Project>{499EB63C-D74C-47E8-AE48-A2FC94538E9D}</Project>
-      <Name>Thrift</Name>
-    </ProjectReference>
-  </ItemGroup>
-  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
-  <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
-       Other similar extension points exist, see Microsoft.Common.targets.
-  <Target Name="BeforeBuild">
-  </Target>
-  <Target Name="AfterBuild">
-  </Target>
-  -->
-  <PropertyGroup>
-    <PreBuildEvent>rmdir /s /q "$(ProjectDir)gen-csharp"
-del /f /q "$(ProjectDir)ThriftImpl.dll"
-SET OUTPUT_DIR=$(ProjectDir)
-SET THRIFT_FILE=$(ProjectDir)\..\ThriftTest.thrift
-for %25%25I in ("%25OUTPUT_DIR%25") do set SHORT_DIR=%25%25~fsI
-for %25%25I in ("%25THRIFT_FILE%25") do set THRIFT_SHORT=%25%25~fsI
-"$(ProjectDir)\..\..\compiler\cpp\thrift.exe" --gen csharp -o %25SHORT_DIR%25 %25THRIFT_SHORT%25
-$(MSBuildToolsPath)\Csc.exe /t:library /out:"$(ProjectDir)ThriftImpl.dll" /recurse:"$(ProjectDir)gen-csharp"\* /reference:"$(ProjectDir)..\..\lib\csharp\bin\Debug\Thrift.dll"</PreBuildEvent>
-  </PropertyGroup>
-</Project>
diff --git a/test/csharp/ThriftTest.sln b/test/csharp/ThriftTest.sln
deleted file mode 100644
index 1765a03..0000000
--- a/test/csharp/ThriftTest.sln
+++ /dev/null
@@ -1,17 +0,0 @@
-﻿
-Microsoft Visual Studio Solution File, Format Version 11.00
-# Visual Studio 2010
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ThriftTest", "ThriftTest.csproj", "{48DD757F-CA95-4DD7-BDA4-58DB6F108C2C}"
-EndProject
-Global
-	GlobalSection(SolutionConfigurationPlatforms) = preSolution
-		Debug|Any CPU = Debug|Any CPU
-		Release|Any CPU = Release|Any CPU
-	EndGlobalSection
-	GlobalSection(ProjectConfigurationPlatforms) = postSolution
-		{48DD757F-CA95-4DD7-BDA4-58DB6F108C2C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{48DD757F-CA95-4DD7-BDA4-58DB6F108C2C}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{48DD757F-CA95-4DD7-BDA4-58DB6F108C2C}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{48DD757F-CA95-4DD7-BDA4-58DB6F108C2C}.Release|Any CPU.Build.0 = Release|Any CPU
-	EndGlobalSection
-EndGlobal
diff --git a/test/haxe/src/Arguments.hx b/test/haxe/src/Arguments.hx
index 023f250..56e5253 100644
--- a/test/haxe/src/Arguments.hx
+++ b/test/haxe/src/Arguments.hx
@@ -92,7 +92,7 @@
     #if sys
 
     private static function GetHelp() : String {
-        var sProg = Path.withoutDirectory( Sys.programPath());
+        var sProg = Path.withoutDirectory( Sys.executablePath());
         return "\n"
             +sProg+"  [client|server]  [options]\n"
             +"\n"
diff --git a/test/netstd/Client/Client.csproj b/test/netstd/Client/Client.csproj
index ce71809..4ed57cb 100644
--- a/test/netstd/Client/Client.csproj
+++ b/test/netstd/Client/Client.csproj
@@ -31,7 +31,7 @@
     <GenerateAssemblyCopyrightAttribute>false</GenerateAssemblyCopyrightAttribute>
   </PropertyGroup>
   <ItemGroup>
-    <PackageReference Include="System.Net.Http.WinHttpHandler" Version="4.7.2" />
+    <PackageReference Include="System.Net.Http.WinHttpHandler" Version="4.7.0" />
     <PackageReference Include="System.Runtime.Serialization.Primitives" Version="[4.3,)" />
     <PackageReference Include="System.ServiceModel.Primitives" Version="4.7.0" />
     <PackageReference Include="System.Threading" Version="[4.3,)" />
diff --git a/test/netstd/Referenz.txt b/test/netstd/Referenz.txt
deleted file mode 100644
index 58088e4..0000000
--- a/test/netstd/Referenz.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-E:\D\TPCPP\Thrift\wc-XE-all\wc-JensG-haxe\test\netstd\Client\bin\Release\netcoreapp3.1>Client.exe --performance
-Setting up for ProtocolPeformanceTestAsync ...
-RunTestAsync(TBinaryProtocol): write = 1982 msec
-RunTestAsync(TBinaryProtocol): read = 4995 msec
-RunTestAsync(TCompactProtocol): write = 1240 msec
-RunTestAsync(TCompactProtocol): read = 3964 msec
-RunTestAsync(TJsonProtocol): write = 5206 msec
-RunTestAsync(TJsonProtocol): read = 23249 msec
-RunTestAsync(TBinaryProtocol + TBufferedTransport): write = 1990 msec
-RunTestAsync(TBinaryProtocol + TBufferedTransport): read = 5777 msec
-RunTestAsync(TCompactProtocol + TBufferedTransport): write = 1453 msec
-RunTestAsync(TCompactProtocol + TBufferedTransport): read = 4761 msec
-RunTestAsync(TJsonProtocol + TBufferedTransport): write = 8859 msec
-RunTestAsync(TJsonProtocol + TBufferedTransport): read = 30925 msec
-RunTestAsync(TBinaryProtocol + TFramedTransport): write = 2042 msec
-RunTestAsync(TBinaryProtocol + TFramedTransport): read = 5726 msec
-RunTestAsync(TCompactProtocol + TFramedTransport): write = 1480 msec
-RunTestAsync(TCompactProtocol + TFramedTransport): read = 4818 msec
-RunTestAsync(TJsonProtocol + TFramedTransport): write = 8612 msec
-RunTestAsync(TJsonProtocol + TFramedTransport): read = 30810 msec
diff --git a/test/netstd/Server/Server.csproj b/test/netstd/Server/Server.csproj
index cbd0fb1..fa5ce46 100644
--- a/test/netstd/Server/Server.csproj
+++ b/test/netstd/Server/Server.csproj
@@ -33,7 +33,7 @@
   <ItemGroup>
     <PackageReference Include="System.IO.Pipes" Version="4.3.0" />
     <PackageReference Include="System.IO.Pipes.AccessControl" Version="4.5.1" />
-    <PackageReference Include="System.Net.Http.WinHttpHandler" Version="4.7.2" />
+    <PackageReference Include="System.Net.Http.WinHttpHandler" Version="4.7.0" />
     <PackageReference Include="System.Runtime.Serialization.Primitives" Version="[4.3,)" />
     <PackageReference Include="System.ServiceModel.Primitives" Version="4.7.0" />
     <PackageReference Include="System.Threading" Version="[4.3,)" />
diff --git a/test/netstd/ThriftTest.sln b/test/netstd/ThriftTest.sln
index 7e101d9..352576e 100644
--- a/test/netstd/ThriftTest.sln
+++ b/test/netstd/ThriftTest.sln
@@ -1,7 +1,6 @@
-﻿
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio Version 16
-VisualStudioVersion = 16.0.30104.148
+﻿Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 15
+VisualStudioVersion = 15.0.26730.12
 MinimumVisualStudioVersion = 10.0.40219.1
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Thrift", "..\..\lib\netstd\Thrift\Thrift.csproj", "{C20EA2A9-7660-47DE-9A49-D1EF12FB2895}"
 EndProject
@@ -9,14 +8,6 @@
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Server", "Server\Server.csproj", "{0C6E8685-F191-4479-9842-882A38961127}"
 EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Thrift.IntegrationTests", "..\..\lib\netstd\Tests\Thrift.IntegrationTests\Thrift.IntegrationTests.csproj", "{C8148BFF-B943-4474-8D33-A641C6FD3DAB}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Thrift.PublicInterfaces.Compile.Tests", "..\..\lib\netstd\Tests\Thrift.PublicInterfaces.Compile.Tests\Thrift.PublicInterfaces.Compile.Tests.csproj", "{5D86C1B6-0CDA-4D1D-80A5-240583B21148}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Thrift.Tests", "..\..\lib\netstd\Tests\Thrift.Tests\Thrift.Tests.csproj", "{37FDED71-F8FB-434B-B2A8-1C53CCD9FD38}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Thrift.Benchmarks", "..\..\lib\netstd\Benchmarks\Thrift.Benchmarks\Thrift.Benchmarks.csproj", "{66946544-8DE7-45E9-8D0E-93EADA028D44}"
-EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Any CPU = Debug|Any CPU
@@ -63,54 +54,6 @@
 		{0C6E8685-F191-4479-9842-882A38961127}.Release|x64.Build.0 = Release|Any CPU
 		{0C6E8685-F191-4479-9842-882A38961127}.Release|x86.ActiveCfg = Release|Any CPU
 		{0C6E8685-F191-4479-9842-882A38961127}.Release|x86.Build.0 = Release|Any CPU
-		{C8148BFF-B943-4474-8D33-A641C6FD3DAB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{C8148BFF-B943-4474-8D33-A641C6FD3DAB}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{C8148BFF-B943-4474-8D33-A641C6FD3DAB}.Debug|x64.ActiveCfg = Debug|Any CPU
-		{C8148BFF-B943-4474-8D33-A641C6FD3DAB}.Debug|x64.Build.0 = Debug|Any CPU
-		{C8148BFF-B943-4474-8D33-A641C6FD3DAB}.Debug|x86.ActiveCfg = Debug|Any CPU
-		{C8148BFF-B943-4474-8D33-A641C6FD3DAB}.Debug|x86.Build.0 = Debug|Any CPU
-		{C8148BFF-B943-4474-8D33-A641C6FD3DAB}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{C8148BFF-B943-4474-8D33-A641C6FD3DAB}.Release|Any CPU.Build.0 = Release|Any CPU
-		{C8148BFF-B943-4474-8D33-A641C6FD3DAB}.Release|x64.ActiveCfg = Release|Any CPU
-		{C8148BFF-B943-4474-8D33-A641C6FD3DAB}.Release|x64.Build.0 = Release|Any CPU
-		{C8148BFF-B943-4474-8D33-A641C6FD3DAB}.Release|x86.ActiveCfg = Release|Any CPU
-		{C8148BFF-B943-4474-8D33-A641C6FD3DAB}.Release|x86.Build.0 = Release|Any CPU
-		{5D86C1B6-0CDA-4D1D-80A5-240583B21148}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{5D86C1B6-0CDA-4D1D-80A5-240583B21148}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{5D86C1B6-0CDA-4D1D-80A5-240583B21148}.Debug|x64.ActiveCfg = Debug|Any CPU
-		{5D86C1B6-0CDA-4D1D-80A5-240583B21148}.Debug|x64.Build.0 = Debug|Any CPU
-		{5D86C1B6-0CDA-4D1D-80A5-240583B21148}.Debug|x86.ActiveCfg = Debug|Any CPU
-		{5D86C1B6-0CDA-4D1D-80A5-240583B21148}.Debug|x86.Build.0 = Debug|Any CPU
-		{5D86C1B6-0CDA-4D1D-80A5-240583B21148}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{5D86C1B6-0CDA-4D1D-80A5-240583B21148}.Release|Any CPU.Build.0 = Release|Any CPU
-		{5D86C1B6-0CDA-4D1D-80A5-240583B21148}.Release|x64.ActiveCfg = Release|Any CPU
-		{5D86C1B6-0CDA-4D1D-80A5-240583B21148}.Release|x64.Build.0 = Release|Any CPU
-		{5D86C1B6-0CDA-4D1D-80A5-240583B21148}.Release|x86.ActiveCfg = Release|Any CPU
-		{5D86C1B6-0CDA-4D1D-80A5-240583B21148}.Release|x86.Build.0 = Release|Any CPU
-		{37FDED71-F8FB-434B-B2A8-1C53CCD9FD38}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{37FDED71-F8FB-434B-B2A8-1C53CCD9FD38}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{37FDED71-F8FB-434B-B2A8-1C53CCD9FD38}.Debug|x64.ActiveCfg = Debug|Any CPU
-		{37FDED71-F8FB-434B-B2A8-1C53CCD9FD38}.Debug|x64.Build.0 = Debug|Any CPU
-		{37FDED71-F8FB-434B-B2A8-1C53CCD9FD38}.Debug|x86.ActiveCfg = Debug|Any CPU
-		{37FDED71-F8FB-434B-B2A8-1C53CCD9FD38}.Debug|x86.Build.0 = Debug|Any CPU
-		{37FDED71-F8FB-434B-B2A8-1C53CCD9FD38}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{37FDED71-F8FB-434B-B2A8-1C53CCD9FD38}.Release|Any CPU.Build.0 = Release|Any CPU
-		{37FDED71-F8FB-434B-B2A8-1C53CCD9FD38}.Release|x64.ActiveCfg = Release|Any CPU
-		{37FDED71-F8FB-434B-B2A8-1C53CCD9FD38}.Release|x64.Build.0 = Release|Any CPU
-		{37FDED71-F8FB-434B-B2A8-1C53CCD9FD38}.Release|x86.ActiveCfg = Release|Any CPU
-		{37FDED71-F8FB-434B-B2A8-1C53CCD9FD38}.Release|x86.Build.0 = Release|Any CPU
-		{66946544-8DE7-45E9-8D0E-93EADA028D44}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{66946544-8DE7-45E9-8D0E-93EADA028D44}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{66946544-8DE7-45E9-8D0E-93EADA028D44}.Debug|x64.ActiveCfg = Debug|Any CPU
-		{66946544-8DE7-45E9-8D0E-93EADA028D44}.Debug|x64.Build.0 = Debug|Any CPU
-		{66946544-8DE7-45E9-8D0E-93EADA028D44}.Debug|x86.ActiveCfg = Debug|Any CPU
-		{66946544-8DE7-45E9-8D0E-93EADA028D44}.Debug|x86.Build.0 = Debug|Any CPU
-		{66946544-8DE7-45E9-8D0E-93EADA028D44}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{66946544-8DE7-45E9-8D0E-93EADA028D44}.Release|Any CPU.Build.0 = Release|Any CPU
-		{66946544-8DE7-45E9-8D0E-93EADA028D44}.Release|x64.ActiveCfg = Release|Any CPU
-		{66946544-8DE7-45E9-8D0E-93EADA028D44}.Release|x64.Build.0 = Release|Any CPU
-		{66946544-8DE7-45E9-8D0E-93EADA028D44}.Release|x86.ActiveCfg = Release|Any CPU
-		{66946544-8DE7-45E9-8D0E-93EADA028D44}.Release|x86.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
diff --git a/tutorial/csharp/CsharpClient/CsharpClient.cs b/tutorial/csharp/CsharpClient/CsharpClient.cs
deleted file mode 100644
index 113a472..0000000
--- a/tutorial/csharp/CsharpClient/CsharpClient.cs
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-using System;
-using Thrift;
-using Thrift.Protocol;
-using Thrift.Server;
-using Thrift.Transport;
-
-
-namespace CSharpTutorial
-{
-    public class CSharpClient
-    {
-        public static void Main()
-        {
-            try
-            {
-                TTransport transport = new TSocket("localhost", 9090);
-                TProtocol protocol = new TBinaryProtocol(transport);
-                Calculator.Client client = new Calculator.Client(protocol);
-
-                transport.Open();
-                try
-                {
-                    client.ping();
-                    Console.WriteLine("ping()");
-
-                    int sum = client.add(1, 1);
-                    Console.WriteLine("1+1={0}", sum);
-
-                    Work work = new Work();
-
-                    work.Op = Operation.DIVIDE;
-                    work.Num1 = 1;
-                    work.Num2 = 0;
-                    try
-                    {
-                        int quotient = client.calculate(1, work);
-                        Console.WriteLine("Whoa we can divide by 0");
-                    }
-                    catch (InvalidOperation io)
-                    {
-                        Console.WriteLine("Invalid operation: " + io.Why);
-                    }
-
-                    work.Op = Operation.SUBTRACT;
-                    work.Num1 = 15;
-                    work.Num2 = 10;
-                    try
-                    {
-                        int diff = client.calculate(1, work);
-                        Console.WriteLine("15-10={0}", diff);
-                    }
-                    catch (InvalidOperation io)
-                    {
-                        Console.WriteLine("Invalid operation: " + io.Why);
-                    }
-
-                    SharedStruct log = client.getStruct(1);
-                    Console.WriteLine("Check log: {0}", log.Value);
-
-                }
-                finally
-                {
-                    transport.Close();
-                }
-            }
-            catch (TApplicationException x)
-            {
-                Console.WriteLine(x.StackTrace);
-            }
-
-        }
-    }
-}
diff --git a/tutorial/csharp/CsharpClient/CsharpClient.csproj b/tutorial/csharp/CsharpClient/CsharpClient.csproj
deleted file mode 100644
index 1ea7ff6..0000000
--- a/tutorial/csharp/CsharpClient/CsharpClient.csproj
+++ /dev/null
@@ -1,110 +0,0 @@
-﻿<?xml version="1.0" encoding="utf-8"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements. See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership. The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License. You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied. See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <PropertyGroup>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <ProductVersion>9.0.30729</ProductVersion>
-    <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{18F24087-4760-43DA-ACAB-7B9F0E096B11}</ProjectGuid>
-    <OutputType>Exe</OutputType>
-    <AppDesignerFolder>Properties</AppDesignerFolder>
-    <RootNamespace>CsharpClient</RootNamespace>
-    <AssemblyName>CsharpClient</AssemblyName>
-    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
-    <FileAlignment>512</FileAlignment>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
-    <DebugSymbols>true</DebugSymbols>
-    <DebugType>full</DebugType>
-    <Optimize>false</Optimize>
-    <OutputPath>bin\Debug\</OutputPath>
-    <DefineConstants>DEBUG;TRACE</DefineConstants>
-    <ErrorReport>prompt</ErrorReport>
-    <WarningLevel>4</WarningLevel>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
-    <DebugType>pdbonly</DebugType>
-    <Optimize>true</Optimize>
-    <OutputPath>bin\Release\</OutputPath>
-    <DefineConstants>TRACE</DefineConstants>
-    <ErrorReport>prompt</ErrorReport>
-    <WarningLevel>4</WarningLevel>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="System" />
-    <Reference Include="System.Core">
-      <RequiredTargetFramework>3.5</RequiredTargetFramework>
-    </Reference>
-    <Reference Include="System.Xml.Linq">
-      <RequiredTargetFramework>3.5</RequiredTargetFramework>
-    </Reference>
-    <Reference Include="System.Data.DataSetExtensions">
-      <RequiredTargetFramework>3.5</RequiredTargetFramework>
-    </Reference>
-    <Reference Include="System.Data" />
-    <Reference Include="System.Xml" />
-  </ItemGroup>
-  <ItemGroup>
-    <Compile Include="..\gen-csharp\Calculator.cs">
-      <Link>Calculator.cs</Link>
-    </Compile>
-    <Compile Include="..\gen-csharp\InvalidOperation.cs">
-      <Link>InvalidOperation.cs</Link>
-    </Compile>
-    <Compile Include="..\gen-csharp\Operation.cs">
-      <Link>Operation.cs</Link>
-    </Compile>
-    <Compile Include="..\gen-csharp\SharedService.cs">
-      <Link>SharedService.cs</Link>
-    </Compile>
-    <Compile Include="..\gen-csharp\SharedStruct.cs">
-      <Link>SharedStruct.cs</Link>
-    </Compile>
-    <Compile Include="..\gen-csharp\tutorial.Constants.cs">
-      <Link>tutorial.Constants.cs</Link>
-    </Compile>
-    <Compile Include="..\gen-csharp\Work.cs">
-      <Link>Work.cs</Link>
-    </Compile>
-    <Compile Include="CsharpClient.cs" />
-    <Compile Include="Properties\AssemblyInfo.cs" />
-  </ItemGroup>
-  <ItemGroup>
-    <ProjectReference Include="..\..\..\lib\csharp\src\Thrift.csproj">
-      <Project>{499eb63c-d74c-47e8-ae48-a2fc94538e9d}</Project>
-      <Name>Thrift</Name>
-    </ProjectReference>
-  </ItemGroup>
-  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
-  <PropertyGroup>
-    <PreBuildEvent>pushd "$(SolutionDir)"
-thrift  -gen csharp   -r  ../tutorial.thrift
-popd
-</PreBuildEvent>
-  </PropertyGroup>
-  <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
-       Other similar extension points exist, see Microsoft.Common.targets.
-  <Target Name="BeforeBuild">
-  </Target>
-  <Target Name="AfterBuild">
-  </Target>
-  -->
-</Project>
\ No newline at end of file
diff --git a/tutorial/csharp/CsharpClient/Properties/AssemblyInfo.cs b/tutorial/csharp/CsharpClient/Properties/AssemblyInfo.cs
deleted file mode 100644
index 8f5b32a..0000000
--- a/tutorial/csharp/CsharpClient/Properties/AssemblyInfo.cs
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-using System.Reflection;
-using System.Runtime.CompilerServices;
-using System.Runtime.InteropServices;
-
-// General Information about an assembly is controlled through the following
-// set of attributes. Change these attribute values to modify the information
-// associated with an assembly.
-[assembly: AssemblyTitle("CsharpClient")]
-[assembly: AssemblyDescription("")]
-[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("The Apache Software Foundation")]
-[assembly: AssemblyProduct("Thrift")]
-[assembly: AssemblyCopyright("The Apache Software Foundation")]
-[assembly: AssemblyTrademark("")]
-[assembly: AssemblyCulture("")]
-
-// Setting ComVisible to false makes the types in this assembly not visible
-// to COM components.  If you need to access a type in this assembly from
-// COM, set the ComVisible attribute to true on that type.
-[assembly: ComVisible(false)]
-
-// The following GUID is for the ID of the typelib if this project is exposed to COM
-[assembly: Guid("1a461214-fa28-452a-bd1d-d23ca8e947e3")]
-
-// Version information for an assembly consists of the following four values:
-//
-//      Major Version
-//      Minor Version
-//      Build Number
-//      Revision
-//
-// You can specify all the values or you can default the Build and Revision Numbers
-// by using the '*' as shown below:
-// [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("0.14.0.0")]
-[assembly: AssemblyFileVersion("0.14.0.0")]
diff --git a/tutorial/csharp/CsharpServer/CsharpServer.cs b/tutorial/csharp/CsharpServer/CsharpServer.cs
deleted file mode 100644
index 439790a..0000000
--- a/tutorial/csharp/CsharpServer/CsharpServer.cs
+++ /dev/null
@@ -1,129 +0,0 @@
-﻿/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-using System;
-using System.Collections.Generic;
-using Thrift.Server;
-using Thrift.Transport;
-
-namespace CSharpTutorial
-{
-    public class CalculatorHandler : Calculator.Iface
-    {
-        Dictionary<int, SharedStruct> log;
-
-        public CalculatorHandler()
-        {
-            log = new Dictionary<int, SharedStruct>();
-        }
-
-        public void ping()
-        {
-            Console.WriteLine("ping()");
-        }
-
-        public int add(int n1, int n2)
-        {
-            Console.WriteLine("add({0},{1})", n1, n2);
-            return n1 + n2;
-        }
-
-        public int calculate(int logid, Work work)
-        {
-            Console.WriteLine("calculate({0}, [{1},{2},{3}])", logid, work.Op, work.Num1, work.Num2);
-            int val = 0;
-            switch (work.Op)
-            {
-                case Operation.ADD:
-                    val = work.Num1 + work.Num2;
-                    break;
-
-                case Operation.SUBTRACT:
-                    val = work.Num1 - work.Num2;
-                    break;
-
-                case Operation.MULTIPLY:
-                    val = work.Num1 * work.Num2;
-                    break;
-
-                case Operation.DIVIDE:
-                    if (work.Num2 == 0)
-                    {
-                        InvalidOperation io = new InvalidOperation();
-                        io.WhatOp = (int)work.Op;
-                        io.Why = "Cannot divide by 0";
-                        throw io;
-                    }
-                    val = work.Num1 / work.Num2;
-                    break;
-
-                default:
-                    {
-                        InvalidOperation io = new InvalidOperation();
-                        io.WhatOp = (int)work.Op;
-                        io.Why = "Unknown operation";
-                        throw io;
-                    }
-            }
-
-            SharedStruct entry = new SharedStruct();
-            entry.Key = logid;
-            entry.Value = val.ToString();
-            log[logid] = entry;
-
-            return val;
-        }
-
-        public SharedStruct getStruct(int key)
-        {
-            Console.WriteLine("getStruct({0})", key);
-            return log[key];
-        }
-
-        public void zip()
-        {
-            Console.WriteLine("zip()");
-        }
-    }
-
-    public class CSharpServer
-    {
-        public static void Main()
-        {
-            try
-            {
-                CalculatorHandler handler = new CalculatorHandler();
-                Calculator.Processor processor = new Calculator.Processor(handler);
-                TServerTransport serverTransport = new TServerSocket(9090);
-                TServer server = new TSimpleServer(processor, serverTransport);
-
-                // Use this for a multithreaded server
-                // server = new TThreadPoolServer(processor, serverTransport);
-
-                Console.WriteLine("Starting the server...");
-                server.Serve();
-            }
-            catch (Exception x)
-            {
-                Console.WriteLine(x.StackTrace);
-            }
-            Console.WriteLine("done.");
-        }
-    }
-}
diff --git a/tutorial/csharp/CsharpServer/CsharpServer.csproj b/tutorial/csharp/CsharpServer/CsharpServer.csproj
deleted file mode 100644
index 0748180..0000000
--- a/tutorial/csharp/CsharpServer/CsharpServer.csproj
+++ /dev/null
@@ -1,111 +0,0 @@
-﻿<?xml version="1.0" encoding="utf-8"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements. See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership. The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License. You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied. See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <PropertyGroup>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <ProductVersion>9.0.30729</ProductVersion>
-    <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{66707BAE-BBF9-4F03-B53E-BE3AD58322F8}</ProjectGuid>
-    <OutputType>Exe</OutputType>
-    <AppDesignerFolder>Properties</AppDesignerFolder>
-    <RootNamespace>CsharpServer</RootNamespace>
-    <AssemblyName>CsharpServer</AssemblyName>
-    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
-    <FileAlignment>512</FileAlignment>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
-    <DebugSymbols>true</DebugSymbols>
-    <DebugType>full</DebugType>
-    <Optimize>false</Optimize>
-    <OutputPath>bin\Debug\</OutputPath>
-    <DefineConstants>DEBUG;TRACE</DefineConstants>
-    <ErrorReport>prompt</ErrorReport>
-    <WarningLevel>4</WarningLevel>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
-    <DebugType>pdbonly</DebugType>
-    <Optimize>true</Optimize>
-    <OutputPath>bin\Release\</OutputPath>
-    <DefineConstants>TRACE</DefineConstants>
-    <ErrorReport>prompt</ErrorReport>
-    <WarningLevel>4</WarningLevel>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="System" />
-    <Reference Include="System.Core">
-      <RequiredTargetFramework>3.5</RequiredTargetFramework>
-    </Reference>
-    <Reference Include="System.Xml.Linq">
-      <RequiredTargetFramework>3.5</RequiredTargetFramework>
-    </Reference>
-    <Reference Include="System.Data.DataSetExtensions">
-      <RequiredTargetFramework>3.5</RequiredTargetFramework>
-    </Reference>
-    <Reference Include="System.Data" />
-    <Reference Include="System.Xml" />
-  </ItemGroup>
-  <ItemGroup>
-    <Compile Include="..\gen-csharp\Calculator.cs">
-      <Link>Calculator.cs</Link>
-    </Compile>
-    <Compile Include="..\gen-csharp\InvalidOperation.cs">
-      <Link>InvalidOperation.cs</Link>
-    </Compile>
-    <Compile Include="..\gen-csharp\Operation.cs">
-      <Link>Operation.cs</Link>
-    </Compile>
-    <Compile Include="..\gen-csharp\SharedService.cs">
-      <Link>SharedService.cs</Link>
-    </Compile>
-    <Compile Include="..\gen-csharp\SharedStruct.cs">
-      <Link>SharedStruct.cs</Link>
-    </Compile>
-    <Compile Include="..\gen-csharp\tutorial.Constants.cs">
-      <Link>tutorial.Constants.cs</Link>
-    </Compile>
-    <Compile Include="..\gen-csharp\Work.cs">
-      <Link>Work.cs</Link>
-    </Compile>
-    <Compile Include="CsharpServer.cs" />
-    <Compile Include="Properties\AssemblyInfo.cs" />
-  </ItemGroup>
-  <ItemGroup>
-    <ProjectReference Include="..\..\..\lib\csharp\src\Thrift.csproj">
-      <Project>{499eb63c-d74c-47e8-ae48-a2fc94538e9d}</Project>
-      <Name>Thrift</Name>
-    </ProjectReference>
-  </ItemGroup>
-  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
-  <PropertyGroup>
-    <PreBuildEvent>pushd "$(SolutionDir)"
-thrift  -gen csharp   -r  ../tutorial.thrift
-popd
-
-</PreBuildEvent>
-  </PropertyGroup>
-  <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
-       Other similar extension points exist, see Microsoft.Common.targets.
-  <Target Name="BeforeBuild">
-  </Target>
-  <Target Name="AfterBuild">
-  </Target>
-  -->
-</Project>
\ No newline at end of file
diff --git a/tutorial/csharp/CsharpServer/Properties/AssemblyInfo.cs b/tutorial/csharp/CsharpServer/Properties/AssemblyInfo.cs
deleted file mode 100644
index 0d4f0fb..0000000
--- a/tutorial/csharp/CsharpServer/Properties/AssemblyInfo.cs
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-using System.Reflection;
-using System.Runtime.CompilerServices;
-using System.Runtime.InteropServices;
-
-// General Information about an assembly is controlled through the following
-// set of attributes. Change these attribute values to modify the information
-// associated with an assembly.
-[assembly: AssemblyTitle("CsharpServer")]
-[assembly: AssemblyDescription("")]
-[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("The Apache Software Foundation")]
-[assembly: AssemblyProduct("Thrift")]
-[assembly: AssemblyCopyright("The Apache Software Foundation")]
-[assembly: AssemblyTrademark("")]
-[assembly: AssemblyCulture("")]
-
-// Setting ComVisible to false makes the types in this assembly not visible
-// to COM components.  If you need to access a type in this assembly from
-// COM, set the ComVisible attribute to true on that type.
-[assembly: ComVisible(false)]
-
-// The following GUID is for the ID of the typelib if this project is exposed to COM
-[assembly: Guid("e3b428f4-b2e9-4fc1-8a34-84abc4339860")]
-
-// Version information for an assembly consists of the following four values:
-//
-//      Major Version
-//      Minor Version
-//      Build Number
-//      Revision
-//
-// You can specify all the values or you can default the Build and Revision Numbers
-// by using the '*' as shown below:
-// [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("0.14.0.0")]
-[assembly: AssemblyFileVersion("0.14.0.0")]
diff --git a/tutorial/csharp/tutorial.sln b/tutorial/csharp/tutorial.sln
deleted file mode 100644
index ec57a18..0000000
--- a/tutorial/csharp/tutorial.sln
+++ /dev/null
@@ -1,39 +0,0 @@
-﻿
-Microsoft Visual Studio Solution File, Format Version 11.00
-# Visual Studio 2010
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Thrift", "..\..\lib\csharp\src\Thrift.csproj", "{499EB63C-D74C-47E8-AE48-A2FC94538E9D}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CsharpClient", "CsharpClient\CsharpClient.csproj", "{18F24087-4760-43DA-ACAB-7B9F0E096B11}"
-    ProjectSection(ProjectDependencies) = postProject
-        {499EB63C-D74C-47E8-AE48-A2FC94538E9D} = {499EB63C-D74C-47E8-AE48-A2FC94538E9D}
-        {66707BAE-BBF9-4F03-B53E-BE3AD58322F8} = {66707BAE-BBF9-4F03-B53E-BE3AD58322F8}
-    EndProjectSection
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CsharpServer", "CsharpServer\CsharpServer.csproj", "{66707BAE-BBF9-4F03-B53E-BE3AD58322F8}"
-    ProjectSection(ProjectDependencies) = postProject
-        {499EB63C-D74C-47E8-AE48-A2FC94538E9D} = {499EB63C-D74C-47E8-AE48-A2FC94538E9D}
-    EndProjectSection
-EndProject
-Global
-    GlobalSection(SolutionConfigurationPlatforms) = preSolution
-        Debug|Any CPU = Debug|Any CPU
-        Release|Any CPU = Release|Any CPU
-    EndGlobalSection
-    GlobalSection(ProjectConfigurationPlatforms) = postSolution
-        {499EB63C-D74C-47E8-AE48-A2FC94538E9D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-        {499EB63C-D74C-47E8-AE48-A2FC94538E9D}.Debug|Any CPU.Build.0 = Debug|Any CPU
-        {499EB63C-D74C-47E8-AE48-A2FC94538E9D}.Release|Any CPU.ActiveCfg = Release|Any CPU
-        {499EB63C-D74C-47E8-AE48-A2FC94538E9D}.Release|Any CPU.Build.0 = Release|Any CPU
-        {18F24087-4760-43DA-ACAB-7B9F0E096B11}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-        {18F24087-4760-43DA-ACAB-7B9F0E096B11}.Debug|Any CPU.Build.0 = Debug|Any CPU
-        {18F24087-4760-43DA-ACAB-7B9F0E096B11}.Release|Any CPU.ActiveCfg = Release|Any CPU
-        {18F24087-4760-43DA-ACAB-7B9F0E096B11}.Release|Any CPU.Build.0 = Release|Any CPU
-        {66707BAE-BBF9-4F03-B53E-BE3AD58322F8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-        {66707BAE-BBF9-4F03-B53E-BE3AD58322F8}.Debug|Any CPU.Build.0 = Debug|Any CPU
-        {66707BAE-BBF9-4F03-B53E-BE3AD58322F8}.Release|Any CPU.ActiveCfg = Release|Any CPU
-        {66707BAE-BBF9-4F03-B53E-BE3AD58322F8}.Release|Any CPU.Build.0 = Release|Any CPU
-    EndGlobalSection
-    GlobalSection(SolutionProperties) = preSolution
-        HideSolutionNode = FALSE
-    EndGlobalSection
-EndGlobal
diff --git a/tutorial/netstd/Client/Client.csproj b/tutorial/netstd/Client/Client.csproj
index 81b503f..10d5040 100644
--- a/tutorial/netstd/Client/Client.csproj
+++ b/tutorial/netstd/Client/Client.csproj
@@ -30,7 +30,7 @@
   </PropertyGroup>
 
   <ItemGroup>
-    <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="3.1.4" />
+    <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="3.1.0" />
   </ItemGroup>
 
   <ItemGroup>
diff --git a/tutorial/netstd/Server/Server.csproj b/tutorial/netstd/Server/Server.csproj
index 95eabd3..b3ff516 100644
--- a/tutorial/netstd/Server/Server.csproj
+++ b/tutorial/netstd/Server/Server.csproj
@@ -38,7 +38,7 @@
     <PackageReference Include="Microsoft.AspNetCore" Version="2.2.0" />
     <PackageReference Include="Microsoft.AspNetCore.Server.IISIntegration" Version="2.2.1" />
     <PackageReference Include="Microsoft.AspNetCore.Server.Kestrel" Version="2.2.0" />
-    <PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" Version="3.1.4" />
+    <PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" Version="3.1.0" />
   </ItemGroup>
 
 </Project>
