diff --git a/compiler/cpp/test/CMakeLists.txt b/compiler/cpp/test/CMakeLists.txt
index 373cb78..2bc7e9e 100644
--- a/compiler/cpp/test/CMakeLists.txt
+++ b/compiler/cpp/test/CMakeLists.txt
@@ -23,50 +23,6 @@
 set(BOOST_COMPONENTS unit_test_framework)
 REQUIRE_BOOST_LIBRARIES(BOOST_COMPONENTS)
 
-if(${WITH_PLUGIN})
-    # Make sure gen-cpp files can be included
-    include_directories("${CMAKE_CURRENT_BINARY_DIR}")
-
-    set(plugintest_SOURCES
-        plugin/conversion_test.cc
-    )
-    add_executable(plugintest ${plugintest_SOURCES})
-    target_link_libraries(plugintest
-        thriftc
-        ${Boost_LIBRARIES}
-    )
-    add_test(NAME PluginUnitTest COMMAND plugintest)
-
-    set(thrift-gen-mycpp_SOURCES
-        ../src/thrift/generate/t_cpp_generator.cc
-        plugin/cpp_plugin.cc
-    )
-    add_executable(thrift-gen-mycpp ${thrift-gen-mycpp_SOURCES})
-    target_link_libraries(thrift-gen-mycpp thriftc)
-
-    if(CMAKE_BUILD_TYPE STREQUAL "Debug")
-        set(BUILDTYPE "Debug")
-    else()
-        # RelWithDebInfo generates binaries in "Release" directory too
-        set(BUILDTYPE "Release")
-    endif()
-
-    set_directory_properties(PROPERTIES
-        ADDITIONAL_MAKE_CLEAN_FILES gen-cpp
-        ADDITIONAL_MAKE_CLEAN_FILES gen-mycpp)
-
-    file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/gen-cpp)
-    file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/gen-mycpp)
-    add_test(NAME PluginIntegrationTest
-             COMMAND ${CMAKE_COMMAND}
-                 -DTHRIFT_COMPILER=${THRIFT_COMPILER}
-                 -DBINDIR=${CMAKE_RUNTIME_OUTPUT_DIRECTORY}
-                 -DBUILDTYPE=${BUILDTYPE}
-                 -DCURDIR=${CMAKE_CURRENT_BINARY_DIR}
-                 -DSRCDIR=${CMAKE_CURRENT_SOURCE_DIR}
-                 -P ${CMAKE_CURRENT_SOURCE_DIR}/cpp_plugin_test.cmake)
-endif()
-
 file(GLOB KEYWORD_SAMPLES "${CMAKE_CURRENT_SOURCE_DIR}/keyword-samples/*.thrift")
 foreach(LANG ${thrift_compiler_LANGS})
     foreach(SAMPLE ${KEYWORD_SAMPLES})
@@ -84,4 +40,4 @@
   add_test(NAME StalenessCheckTest COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/compiler/staleness_check.py ${THRIFT_COMPILER})
 else()
   message(WARNING "Skipping StalenessCheckTest as there is no python interpreter available.")
-endif()
\ No newline at end of file
+endif()
diff --git a/compiler/cpp/test/Makefile.am b/compiler/cpp/test/Makefile.am
index b7fc91d..9625834 100644
--- a/compiler/cpp/test/Makefile.am
+++ b/compiler/cpp/test/Makefile.am
@@ -26,35 +26,3 @@
 AM_CPPFLAGS = $(BOOST_CPPFLAGS) -I$(top_srcdir)/compiler/cpp/src
 AM_LDFLAGS = $(BOOST_LDFLAGS)
 AM_CXXFLAGS = -Wall -Wextra -pedantic
-
-if WITH_PLUGIN
-check_PROGRAMS = plugintest
-
-noinst_PROGRAMS = thrift-gen-mycpp
-
-all-local: thrift-gen-bincat
-
-AM_CPPFLAGS += -I$(top_srcdir)/lib/cpp/src -I$(top_builddir)/lib/cpp/src
-
-plugintest_SOURCES = plugin/conversion_test.cc
-plugintest_LDADD = $(top_builddir)/compiler/cpp/libthriftc.la
-
-thrift_gen_mycpp_SOURCES = plugin/cpp_plugin.cc \
-                           plugin/t_cpp_generator.cc
-thrift_gen_mycpp_CPPFLAGS = $(AM_CPPFLAGS) -I$(top_srcdir)/compiler/cpp -I$(top_srcdir)/compiler/cpp/src/generate
-thrift_gen_mycpp_LDADD = $(top_builddir)/compiler/cpp/libthriftc.la
-
-cpp_plugin_test.sh: thrift-gen-mycpp
-
-thrift-gen-bincat:
-	cp bincat.sh $@
-	chmod 755 $@
-
-plugin_stability_test.sh: thrift-gen-bincat
-
-TESTS = $(check_PROGRAMS) cpp_plugin_test.sh plugin_stability_test.sh
-
-clean-local:
-	$(RM) -rf gen-cpp gen-mycpp gen-bincat thrift-gen-bincat
-
-endif
diff --git a/compiler/cpp/test/cpp_plugin_test.cmake b/compiler/cpp/test/cpp_plugin_test.cmake
deleted file mode 100644
index fd18281..0000000
--- a/compiler/cpp/test/cpp_plugin_test.cmake
+++ /dev/null
@@ -1,45 +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.
-#
-
-file(MAKE_DIRECTORY ${CURDIR}/gen-cpp)
-execute_process(COMMAND ${THRIFT_COMPILER} -r -out ${CURDIR}/gen-cpp -gen cpp ${SRCDIR}/../../../test/Include.thrift)
-if(EXITCODE)
-  message(FATAL_ERROR "FAILED: \"${ARGV}\": \"${EXITCODE}\"")
-endif()
-if(WIN32)
-    set(ENV{PATH} "${BINDIR}/${BUILDTYPE};${BINDIR};$ENV{PATH}")
-else()
-    set(ENV{PATH} "${BINDIR}:$ENV{PATH}")
-endif()
-
-file(MAKE_DIRECTORY ${CURDIR}/gen-mycpp)
-execute_process(COMMAND ${THRIFT_COMPILER} -r -out ${CURDIR}/gen-mycpp -gen mycpp ${SRCDIR}/../../../test/Include.thrift RESULT_VARIABLE EXITCODE)
-if(EXITCODE)
-  message(FATAL_ERROR "FAILED: \"${EXITCODE}\"")
-endif()
-
-find_program(DIFF diff)
-if(DIFF)
-  execute_process(COMMAND ${DIFF} -urN gen-cpp gen-mycpp RESULT_VARIABLE EXITCODE)
-  if(EXITCODE)
-    message(FATAL_ERROR "FAILED: \"${EXITCODE}\"")
-  endif()
-else()
-    message(WARNING "diff executable is not available. Not validating plugin-generated code.")
-endif()
diff --git a/compiler/cpp/test/cpp_plugin_test.sh b/compiler/cpp/test/cpp_plugin_test.sh
deleted file mode 100755
index ddb2e0a..0000000
--- a/compiler/cpp/test/cpp_plugin_test.sh
+++ /dev/null
@@ -1,27 +0,0 @@
-#!/bin/sh
-
-#
-# 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.
-#
-
-# this file is intended to be invoked by make.
-set -e
-mkdir -p gen-cpp gen-mycpp
-PATH=.:"$PATH" ../thrift -r -out gen-cpp -gen cpp ../../../test/Include.thrift
-PATH=.:"$PATH" ../thrift -r -out gen-mycpp -gen mycpp ../../../test/Include.thrift
-diff -urN gen-cpp gen-mycpp
diff --git a/compiler/cpp/test/plugin/conversion_test.cc b/compiler/cpp/test/plugin/conversion_test.cc
deleted file mode 100644
index 3c8d812..0000000
--- a/compiler/cpp/test/plugin/conversion_test.cc
+++ /dev/null
@@ -1,498 +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.
- */
-
-#include "thrift/parse/t_program.h"
-#include "thrift/plugin/type_util.h"
-#include "thrift/plugin/plugin_types.h"
-
-#include <map>
-#include <vector>
-
-#include <boost/preprocessor.hpp>
-#include <boost/test/included/unit_test.hpp>
-#include <boost/test/parameterized_test.hpp>
-
-using namespace apache::thrift;
-using namespace boost::unit_test;
-
-namespace test_data {
-#define T_TEST_TYPES                                                                               \
-  BOOST_PP_TUPLE_TO_LIST(14,                                                                       \
-                         (program,                                                                 \
-                          base_type,                                                               \
-                          enum_value,                                                              \
-                          enum,                                                                    \
-                          const_value,                                                             \
-                          const,                                                                   \
-                          list,                                                                    \
-                          set,                                                                     \
-                          map,                                                                     \
-                          field,                                                                   \
-                          struct,                                                                  \
-                          typedef,                                                                 \
-                          function,                                                                \
-                          service))
-#define T_DELETE_TESTDATA(r, d, elem)                                                              \
-  for (std::vector<t_##elem*>::reverse_iterator it = elem##s.rbegin(); it != elem##s.rend(); it++) \
-    delete *it;
-#define T_DECL_TESTDATA(r, d, elem) static std::vector< ::t_##elem*> elem##s;
-BOOST_PP_LIST_FOR_EACH(T_DECL_TESTDATA, _, T_TEST_TYPES)
-#undef T_DECL_TESTDATA
-
-bool has_data = false;
-void cleanup() {
-  if (has_data) {
-    has_data = false;
-    BOOST_PP_LIST_FOR_EACH(T_DELETE_TESTDATA, _, T_TEST_TYPES)
-  }
-}
-
-void init_programs() {
-  programs.push_back(new t_program("prog path", "prog_name"));
-}
-
-void init_base_types() {
-  base_types.push_back(new ::t_base_type("name0", ::t_base_type::TYPE_VOID));
-  base_types.push_back(new ::t_base_type("name1", ::t_base_type::TYPE_STRING));
-  base_types.push_back(new ::t_base_type("name2", ::t_base_type::TYPE_BOOL));
-  base_types.push_back(new ::t_base_type("name3", ::t_base_type::TYPE_I8));
-  base_types.push_back(new ::t_base_type("name4", ::t_base_type::TYPE_I16));
-  base_types.push_back(new ::t_base_type("name5", ::t_base_type::TYPE_I32));
-  base_types.push_back(new ::t_base_type("name6", ::t_base_type::TYPE_I64));
-  base_types.push_back(new ::t_base_type("name7", ::t_base_type::TYPE_DOUBLE));
-}
-
-void init_const_values() {
-  const_values.push_back(new t_const_value(42));
-  const_values.push_back(new t_const_value("foo"));
-  {
-    t_const_value* x = new t_const_value;
-    x->set_double(3.1415);
-    const_values.push_back(x);
-  }
-  {
-    t_const_value* x = new t_const_value;
-    x->set_identifier("bar");
-    x->set_enum(enums[0]);
-    const_values.push_back(x);
-  }
-  {
-    t_const_value* x = new t_const_value;
-    x->set_map();
-    x->add_map(const_values[0], const_values[1]);
-    x->add_map(const_values[1], const_values[0]);
-    const_values.push_back(x);
-  }
-  {
-    t_const_value* x = new t_const_value;
-    x->set_list();
-    x->add_list(const_values[0]);
-    x->add_list(const_values[1]);
-    const_values.push_back(x);
-  }
-}
-
-void init_consts() {
-  // base_type/enum indexes for this and other tests are arbitrary
-  consts.push_back(new t_const(base_types[2], "aaa", const_values[0]));
-  consts.back()->set_doc("soem doc");
-  consts.push_back(new t_const(base_types[3], "bbb", const_values[1]));
-}
-
-void init_enum_values() {
-  enum_values.push_back(new t_enum_value("VAL1", 11));
-  enum_values.back()->set_doc("enum doc 1");
-  enum_values.back()->annotations_.insert(std::make_pair("anno1", "val1"));
-
-  enum_values.push_back(new t_enum_value("VAL2", 22));
-}
-
-void init_enums() {
-  enums.push_back(new t_enum(programs[0]));
-  enums.back()->set_doc("enum doc 1");
-  enums.back()->annotations_.insert(std::make_pair("anno1", "val1"));
-  enums.back()->set_name("fooo");
-  enums.back()->append(enum_values[0]);
-  enums.back()->append(enum_values[1]);
-}
-
-void init_lists() {
-  lists.push_back(new t_list(enums[0]));
-  lists.push_back(new t_list(base_types[5]));
-  lists.back()->set_cpp_name("list_cpp_name_1");
-}
-void init_sets() {
-  sets.push_back(new t_set(base_types[4]));
-  sets.push_back(new t_set(enums[0]));
-  sets.back()->set_cpp_name("set_cpp_name_1");
-}
-void init_maps() {
-  maps.push_back(new t_map(base_types[4], base_types[1]));
-  maps.push_back(new t_map(base_types[5], enums[0]));
-  maps.back()->set_cpp_name("map_cpp_name_1");
-}
-
-void init_typedefs() {
-  typedefs.push_back(new t_typedef(programs[0], base_types[3], "VAL1"));
-}
-void init_fields() {
-  fields.push_back(new t_field(base_types[1], "f1"));
-  fields.back()->set_reference(false);
-  fields.back()->set_req(t_field::T_OPTIONAL);
-  fields.push_back(new t_field(base_types[2], "f2", 9));
-  fields.back()->set_reference(true);
-  fields.push_back(new t_field(base_types[3], "f3", 11));
-  fields.back()->set_req(t_field::T_REQUIRED);
-  fields.back()->set_value(const_values[0]);
-}
-void init_structs() {
-  structs.push_back(new t_struct(programs[0], "struct1"));
-  structs.back()->append(fields[0]);
-  structs.back()->append(fields[1]);
-  structs.push_back(new t_struct(programs[0], "union1"));
-  structs.back()->append(fields[0]);
-  structs.back()->append(fields[1]);
-  structs.back()->set_union(true);
-  structs.push_back(new t_struct(programs[0], "xcept1"));
-  structs.back()->set_xception(true);
-}
-void init_functions() {
-  structs.push_back(new t_struct(programs[0], "errs1"));
-  t_struct* errors = structs.back();
-  structs.push_back(new t_struct(programs[0], "args1"));
-  t_struct* arglist = structs.back();
-  functions.push_back(new t_function(base_types[0], "func1", errors, arglist, false));
-  functions.push_back(new t_function(base_types[0], "func2", errors, arglist, true));
-}
-void init_services() {
-  services.push_back(new t_service(programs[0]));
-  services.back()->set_doc("srv1 doc");
-  services.back()->set_name("srv1");
-  services.back()->add_function(functions[0]);
-  services.back()->add_function(functions[1]);
-
-  services.push_back(new t_service(programs[0]));
-  services.back()->set_name("srv2");
-  services.back()->set_extends(services[0]);
-}
-
-std::vector<t_type*> types;
-void init_types() {
-#define T_COPY_TYPES(type) std::copy(type##s.begin(), type##s.end(), std::back_inserter(types))
-  T_COPY_TYPES(base_type);
-  T_COPY_TYPES(enum);
-  T_COPY_TYPES(typedef);
-  T_COPY_TYPES(struct);
-  T_COPY_TYPES(list);
-  T_COPY_TYPES(set);
-  T_COPY_TYPES(map);
-// T_COPY_TYPES(service);
-#undef T_COPY_TYPES
-}
-
-void init() {
-  if (!has_data) {
-    has_data = true;
-#define T_INIT_TESTDATA(r, d, elem) init_##elem##s();
-    BOOST_PP_LIST_FOR_EACH(T_INIT_TESTDATA, _, T_TEST_TYPES)
-    init_types();
-#undef T_INIT_TESTDATA
-  }
-}
-}
-struct GlobalFixture {
-  ~GlobalFixture() { test_data::cleanup(); }
-};
-#if (BOOST_VERSION >= 105900)
-BOOST_GLOBAL_FIXTURE(GlobalFixture);
-#else
-BOOST_GLOBAL_FIXTURE(GlobalFixture)
-#endif
-
-void migrate_global_cache() {
-  plugin::TypeRegistry reg;
-  plugin_output::get_global_cache(reg);
-  plugin::set_global_cache(reg);
-  plugin_output::clear_global_cache();
-}
-template <typename T>
-T* round_trip(T* t) {
-  typename plugin::ToType<T>::type p;
-  plugin::clear_global_cache();
-  plugin_output::clear_global_cache();
-  plugin_output::convert(t, p);
-  migrate_global_cache();
-  return plugin::convert(p);
-}
-
-void test_base_type(::t_base_type* sut) {
-  plugin::t_base_type p;
-  plugin_output::convert(sut, p);
-  boost::scoped_ptr< ::t_base_type> sut2(plugin::convert(p));
-
-#define THRIFT_CHECK(r, data, elem) BOOST_PP_EXPAND(BOOST_CHECK_EQUAL(data elem, sut2->elem));
-  BOOST_PP_LIST_FOR_EACH(THRIFT_CHECK,
-                         sut->,
-                         BOOST_PP_TUPLE_TO_LIST(7,
-                                                (is_void(),
-                                                 is_string(),
-                                                 is_bool(),
-                                                 is_string_list(),
-                                                 is_binary(),
-                                                 is_string_enum(),
-                                                 is_base_type())))
-}
-
-void test_const_value(t_const_value* sut) {
-  boost::scoped_ptr<t_const_value> sut2(round_trip(sut));
-
-  BOOST_CHECK_EQUAL(sut->get_type(), sut2->get_type());
-  switch (sut->get_type()) {
-#define T_CONST_VALUE_CASE(type, name)                                                             \
-  case t_const_value::type:                                                                        \
-    BOOST_CHECK_EQUAL(sut->get_##name(), sut2->get_##name());                                      \
-    break
-    T_CONST_VALUE_CASE(CV_INTEGER, integer);
-    T_CONST_VALUE_CASE(CV_DOUBLE, double);
-    T_CONST_VALUE_CASE(CV_STRING, string);
-    T_CONST_VALUE_CASE(CV_IDENTIFIER, identifier);
-#undef T_CONST_VALUE_CASE
-  case t_const_value::CV_MAP:
-    BOOST_CHECK_EQUAL(sut->get_map().size(), sut2->get_map().size());
-    {
-      std::map<t_const_value::t_const_value_type, t_const_value::t_const_value_type> sut_values;
-      for (std::map<t_const_value*, t_const_value*, t_const_value::value_compare>::const_iterator it = sut->get_map().begin();
-           it != sut->get_map().end(); it++) {
-        sut_values[it->first->get_type()] = it->second->get_type();
-      }
-      std::map<t_const_value::t_const_value_type, t_const_value::t_const_value_type> sut2_values;
-      for (std::map<t_const_value*, t_const_value*, t_const_value::value_compare>::const_iterator it = sut2->get_map().begin();
-           it != sut2->get_map().end(); it++) {
-        sut2_values[it->first->get_type()] = it->second->get_type();
-      }
-      BOOST_CHECK_EQUAL(sut_values.begin()->first, sut2_values.begin()->first);
-      BOOST_CHECK_EQUAL(sut_values.begin()->second, sut2_values.begin()->second);
-    }
-    break;
-  case t_const_value::CV_LIST:
-    BOOST_CHECK_EQUAL(sut->get_list().size(), sut2->get_list().size());
-    BOOST_CHECK_EQUAL(sut->get_list().front()->get_type(), sut2->get_list().front()->get_type());
-    break;
-  default:
-    BOOST_ASSERT(false);
-    break;
-  }
-}
-
-void test_const(t_const* sut) {
-  boost::scoped_ptr< ::t_const> sut2(round_trip(sut));
-
-  BOOST_PP_LIST_FOR_EACH(THRIFT_CHECK,
-                         sut->,
-                         BOOST_PP_TUPLE_TO_LIST(4,
-                                                (get_type()->get_name(),
-                                                 get_name(),
-                                                 get_value()->get_type(),
-                                                 get_doc())))
-}
-
-void test_enum_value(t_enum_value* sut) {
-  boost::scoped_ptr<t_enum_value> sut2(round_trip(sut));
-
-  BOOST_PP_LIST_FOR_EACH(THRIFT_CHECK,
-                         sut->,
-                         BOOST_PP_TUPLE_TO_LIST(3, (get_name(), get_value(), get_doc())))
-}
-
-void test_enum(t_enum* sut) {
-  boost::scoped_ptr< ::t_enum> sut2(round_trip(sut));
-
-  BOOST_PP_LIST_FOR_EACH(THRIFT_CHECK,
-                         sut->,
-                         BOOST_PP_TUPLE_TO_LIST(6,
-                                                (get_name(),
-                                                 get_min_value()->get_value(),
-                                                 get_max_value()->get_value(),
-                                                 get_constant_by_value(11)->get_value(),
-                                                 get_constant_by_name("VAL1")->get_value(),
-                                                 get_doc())))
-}
-
-void test_list(t_list* sut) {
-  boost::scoped_ptr<t_list> sut2(round_trip(sut));
-
-  BOOST_PP_LIST_FOR_EACH(THRIFT_CHECK,
-                         sut->,
-                         BOOST_PP_TUPLE_TO_LIST(4,
-                                                (get_elem_type()->get_name(),
-                                                 has_cpp_name(),
-                                                 get_doc(),
-                                                 get_name())))
-  if (sut->has_cpp_name())
-    BOOST_CHECK_EQUAL(sut->get_cpp_name(), sut2->get_cpp_name());
-}
-void test_set(t_set* sut) {
-  boost::scoped_ptr<t_set> sut2(round_trip(sut));
-
-  BOOST_PP_LIST_FOR_EACH(THRIFT_CHECK,
-                         sut->,
-                         BOOST_PP_TUPLE_TO_LIST(4,
-                                                (get_elem_type()->get_name(),
-                                                 has_cpp_name(),
-                                                 get_doc(),
-                                                 get_name())))
-  if (sut->has_cpp_name())
-    BOOST_CHECK_EQUAL(sut->get_cpp_name(), sut2->get_cpp_name());
-}
-void test_map(t_map* sut) {
-  boost::scoped_ptr<t_map> sut2(round_trip(sut));
-
-  BOOST_PP_LIST_FOR_EACH(THRIFT_CHECK,
-                         sut->,
-                         BOOST_PP_TUPLE_TO_LIST(5,
-                                                (get_key_type()->get_name(),
-                                                 get_val_type()->get_name(),
-                                                 has_cpp_name(),
-                                                 get_doc(),
-                                                 get_name())))
-  if (sut->has_cpp_name())
-    BOOST_CHECK_EQUAL(sut->get_cpp_name(), sut2->get_cpp_name());
-}
-
-void test_typedef(t_typedef* sut) {
-  boost::scoped_ptr<t_typedef> sut2(round_trip(sut));
-
-  BOOST_PP_LIST_FOR_EACH(THRIFT_CHECK,
-                         sut->,
-                         BOOST_PP_TUPLE_TO_LIST(4,
-                                                (get_doc(),
-                                                 get_name(),
-                                                 get_symbolic(),
-                                                 is_forward_typedef())))
-}
-
-void test_type(t_type* sut) {
-  boost::scoped_ptr<t_type> sut2(round_trip(sut));
-
-  BOOST_PP_LIST_FOR_EACH(THRIFT_CHECK,
-                         sut->,
-                         BOOST_PP_TUPLE_TO_LIST(15,
-                                                (is_void(),
-                                                 is_base_type(),
-                                                 is_string(),
-                                                 is_bool(),
-                                                 is_typedef(),
-                                                 is_enum(),
-                                                 is_struct(),
-                                                 is_xception(),
-                                                 is_container(),
-                                                 is_list(),
-                                                 is_set(),
-                                                 is_map(),
-                                                 is_service(),
-                                                 get_doc(),
-                                                 get_name())))
-}
-
-void test_field(t_field* sut) {
-  boost::scoped_ptr<t_field> sut2(round_trip(sut));
-
-  BOOST_PP_LIST_FOR_EACH(THRIFT_CHECK,
-                         sut->,
-                         BOOST_PP_TUPLE_TO_LIST(5,
-                                                (get_req(),
-                                                 get_reference(),
-                                                 get_key(),
-                                                 get_doc(),
-                                                 get_name())))
-  if (sut->get_value()) {
-    THRIFT_CHECK(, sut->, get_value()->get_type());
-  } else {
-    BOOST_CHECK(!sut2->get_value());
-  }
-  if (sut->get_type()) {
-    THRIFT_CHECK(, sut->, get_type()->get_name());
-  } else {
-    BOOST_CHECK(!sut2->get_type());
-  }
-}
-void test_struct(t_struct* sut) {
-  boost::scoped_ptr<t_struct> sut2(round_trip(sut));
-
-  BOOST_PP_LIST_FOR_EACH(THRIFT_CHECK,
-                         sut->,
-                         BOOST_PP_TUPLE_TO_LIST(5,
-                                                (is_union(),
-                                                 is_xception(),
-                                                 is_struct(),
-                                                 get_doc(),
-                                                 get_name())))
-}
-
-void test_function(t_function* sut) {
-  boost::scoped_ptr<t_function> sut2(round_trip(sut));
-
-  BOOST_PP_LIST_FOR_EACH(
-      THRIFT_CHECK,
-      sut->,
-      BOOST_PP_TUPLE_TO_LIST(4, (get_doc(), get_name(), get_returntype()->get_name(), is_oneway())))
-}
-void test_service(t_service* sut) {
-  boost::scoped_ptr<t_service> sut2(round_trip(sut));
-
-  BOOST_PP_LIST_FOR_EACH(THRIFT_CHECK,
-                         sut->,
-                         BOOST_PP_TUPLE_TO_LIST(3, (get_doc(), get_name(), get_functions().size())))
-  if (sut->get_extends()) {
-    THRIFT_CHECK(, sut->, get_extends()->get_name());
-  } else {
-    BOOST_CHECK(!sut2->get_extends());
-  }
-}
-
-void test_program(t_program* sut) {
-  boost::scoped_ptr<t_program> sut2(round_trip(sut));
-
-  BOOST_PP_LIST_FOR_EACH(THRIFT_CHECK, sut->, BOOST_PP_TUPLE_TO_LIST(2, (get_doc(), get_name())))
-}
-boost::unit_test::test_suite* do_init_unit_test_suite() {
-  test_data::init();
-  test_suite* ts = BOOST_TEST_SUITE("PluginConversionTest");
-
-#define T_TEST_CASE(r, d, type)                                                                    \
-  ts->add(BOOST_PARAM_TEST_CASE(test_##type, test_data::type##s.begin(), test_data::type##s.end()));
-  BOOST_PP_LIST_FOR_EACH(T_TEST_CASE, _, T_TEST_TYPES)
-  T_TEST_CASE(_, _, type)
-#undef T_TEST_CASE
-  return ts;
-}
-
-#ifdef BOOST_TEST_DYN_LINK
-bool init_unit_test_suite() {
-  framework::master_test_suite().add(do_init_unit_test_suite());
-  return true;
-}
-int main(int argc, char* argv[]) {
-  return ::boost::unit_test::unit_test_main(&init_unit_test_suite, argc, argv);
-}
-#else
-boost::unit_test::test_suite* init_unit_test_suite(int argc, char* argv[]) {
-  return do_init_unit_test_suite();
-}
-#endif
diff --git a/compiler/cpp/test/plugin/cpp_plugin.cc b/compiler/cpp/test/plugin/cpp_plugin.cc
deleted file mode 100644
index 6cc19f2..0000000
--- a/compiler/cpp/test/plugin/cpp_plugin.cc
+++ /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.
- */
-
-#include "thrift/plugin/plugin.h"
-#include "thrift/generate/t_generator.h"
-
-namespace apache {
-namespace thrift {
-namespace plugin {
-
-class MyCppGenerator : public GeneratorPlugin {
-  virtual int generate(::t_program* program,
-                       const std::map<std::string, std::string>& parsed_options) {
-    t_generator* gen = t_generator_registry::get_generator(program, "cpp", parsed_options, "");
-    gen->generate_program();
-    delete gen;
-    return 0;
-  }
-};
-}
-}
-}
-
-int main(int argc, char* argv[]) {
-  apache::thrift::plugin::MyCppGenerator p;
-  return p.exec(argc, argv);
-}
diff --git a/compiler/cpp/test/plugin_stability_test.sh b/compiler/cpp/test/plugin_stability_test.sh
deleted file mode 100755
index eb7c93d..0000000
--- a/compiler/cpp/test/plugin_stability_test.sh
+++ /dev/null
@@ -1,32 +0,0 @@
-#!/bin/sh
-
-#
-# 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.
-#
-
-# this file is intended to be invoked by make.
-#
-# This file runs the compiler twice, using a plugin that just invokes
-# /bin/cat, and compares the output.  If GeneratorInput is
-# nondeterminsitic, you'd expect the output to differ from run-to-run.
-# So this tests that in fact, the output is stable from run-to-run.
-set -e
-mkdir -p gen-bincat
-PATH=.:"$PATH" ../thrift -r -gen bincat ../../../test/Include.thrift > gen-bincat/1.ser
-PATH=.:"$PATH" ../thrift -r -gen bincat ../../../test/Include.thrift > gen-bincat/2.ser
-diff --binary gen-bincat/1.ser gen-bincat/2.ser
