Merge branch '0.13.0'
diff --git a/ApacheThrift.nuspec b/ApacheThrift.nuspec
index 7bbfb0d..6dc3225 100644
--- a/ApacheThrift.nuspec
+++ b/ApacheThrift.nuspec
@@ -21,14 +21,14 @@
      the "Thrift" project.
   3. nuget setApiKey <your-api-key>
   3. nuget pack ApacheThrift.nuspec -Symbols -SymbolPackageFormat snupkg
-  4. nuget push ApacheThrift.0.13.0.nupkg -Source https://api.nuget.org/v3/index.json
+  4. nuget push ApacheThrift.0.14.0.nupkg -Source https://api.nuget.org/v3/index.json
   -->
 
 <package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd">
   <metadata>
     <id>ApacheThrift</id>
-    <version>0.13.0</version>
-    <title>Apache Thrift 0.13.0</title>
+    <version>0.14.0</version>
+    <title>Apache Thrift 0.14.0</title>
     <authors>Apache Thrift Developers</authors>
     <owners>Apache Software Foundation</owners>
     <license type="expression">Apache-2.0</license>
@@ -39,7 +39,7 @@
       Contains runtime libraries from lib/csharp for net35 and net45 frameworks, 
       and from lib/netstd for netstandard2.0 framework development.
     </description>
-    <repository type="GitHub" url="https://github.com/apache/thrift" branch="release/0.13.0" />
+    <repository type="GitHub" url="https://github.com/apache/thrift" branch="release/0.14.0" />
     <tags>Apache Thrift RPC</tags>
   </metadata>
   <files>
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 1880b79..f2e682a 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -28,7 +28,7 @@
 
 # PACKAGE_VERSION is used by cpack scripts currently
 # Both thrift_VERSION and PACKAGE_VERSION should be the same for now
-set(thrift_VERSION "0.13.0")
+set(thrift_VERSION "0.14.0")
 set(PACKAGE_VERSION ${thrift_VERSION})
 
 project("thrift" VERSION ${PACKAGE_VERSION})
diff --git a/appveyor.yml b/appveyor.yml
index ef729eb..233a056 100755
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -19,7 +19,7 @@
 
 # build Apache Thrift on AppVeyor - https://ci.appveyor.com
 
-version: '0.13.0.{build}'
+version: '0.14.0.{build}'
 
 shallow_clone: true
 
diff --git a/bower.json b/bower.json
index c602af1..68f2c8d 100644
--- a/bower.json
+++ b/bower.json
@@ -1,6 +1,6 @@
 {
   "name": "thrift",
-  "version": "0.13.0",
+  "version": "0.14.0",
   "homepage": "https://github.com/apache/thrift.git",
   "authors": [
     "Apache Thrift <dev@thrift.apache.org>"
diff --git a/configure.ac b/configure.ac
index 58f9319..2784699 100755
--- a/configure.ac
+++ b/configure.ac
@@ -20,7 +20,7 @@
 AC_PREREQ(2.65)
 AC_CONFIG_MACRO_DIR([./aclocal])
 
-AC_INIT([thrift], [0.13.0])
+AC_INIT([thrift], [0.14.0])
 
 AC_CONFIG_AUX_DIR([.])
 
diff --git a/contrib/thrift.spec b/contrib/thrift.spec
index cbb08fb..225a969 100644
--- a/contrib/thrift.spec
+++ b/contrib/thrift.spec
@@ -28,7 +28,7 @@
 License:        Apache License v2.0
 Group:          Development
 Summary:        RPC and serialization framework
-Version:        0.13.0
+Version:        0.14.0
 Release:        0
 URL:            http://thrift.apache.org
 Packager:       Thrift Developers <dev@thrift.apache.org>
diff --git a/doc/ReleaseManagement.md b/doc/ReleaseManagement.md
index 362fd83..ee744ae 100644
--- a/doc/ReleaseManagement.md
+++ b/doc/ReleaseManagement.md
@@ -331,7 +331,7 @@
     ~/thrift$ git push --tags
     ```
 
-    **NOTE:** If you get the error "gpg failed to sign the data" when tagging, try this fix: "export GPG_TTY=$(tty)"
+    **NOTE:** If you get the error "gpg failed to sign the data" when tagging, try this fix: ```export GPG_TTY=$(tty)```. Alternatively, it may be necessary to specify the ```-u <keyid>``` as an additional argument.
 
 1. Create a new release from the [GitHub Tags Page](https://github.com/apache/thrift/tags).  Attach the statically built Windows thrift compiler as a binary here.
 
diff --git a/lib/cpp/src/thrift/transport/TSSLSocket.cpp b/lib/cpp/src/thrift/transport/TSSLSocket.cpp
index b413002..64f08dd 100644
--- a/lib/cpp/src/thrift/transport/TSSLSocket.cpp
+++ b/lib/cpp/src/thrift/transport/TSSLSocket.cpp
@@ -957,6 +957,28 @@
   }
 }
 
+void TSSLSocketFactory::loadCertificateFromBuffer(const char* aCertificate, const char* format) {
+  if (aCertificate == nullptr || format == nullptr) {
+    throw TTransportException(TTransportException::BAD_ARGS,
+                              "loadCertificate: either <path> or <format> is NULL");
+  }
+  if (strcmp(format, "PEM") == 0) {
+    BIO* mem = BIO_new(BIO_s_mem());
+    BIO_puts(mem, aCertificate);
+    X509* cert = PEM_read_bio_X509(mem, NULL, 0, NULL);
+    BIO_free(mem);
+
+    if (SSL_CTX_use_certificate(ctx_->get(), cert) == 0) {
+      int errno_copy = THRIFT_GET_SOCKET_ERROR;
+      string errors;
+      buildErrors(errors, errno_copy);
+      throw TSSLException("SSL_CTX_use_certificate: " + errors);
+    }
+  } else {
+    throw TSSLException("Unsupported certificate format: " + string(format));
+  }
+}
+
 void TSSLSocketFactory::loadPrivateKey(const char* path, const char* format) {
   if (path == nullptr || format == nullptr) {
     throw TTransportException(TTransportException::BAD_ARGS,
@@ -972,6 +994,28 @@
   }
 }
 
+void TSSLSocketFactory::loadPrivateKeyFromBuffer(const char* aPrivateKey, const char* format) {
+  if (aPrivateKey == nullptr || format == nullptr) {
+    throw TTransportException(TTransportException::BAD_ARGS,
+                              "loadPrivateKey: either <path> or <format> is NULL");
+  }
+  if (strcmp(format, "PEM") == 0) {
+    BIO* mem = BIO_new(BIO_s_mem());
+    BIO_puts(mem, aPrivateKey);
+    EVP_PKEY* cert = PEM_read_bio_PrivateKey(mem, nullptr, nullptr, nullptr);
+
+    BIO_free(mem);
+    if (SSL_CTX_use_PrivateKey(ctx_->get(), cert) == 0) {
+      int errno_copy = THRIFT_GET_SOCKET_ERROR;
+      string errors;
+      buildErrors(errors, errno_copy);
+      throw TSSLException("SSL_CTX_use_PrivateKey: " + errors);
+    }
+  } else {
+    throw TSSLException("Unsupported certificate format: " + string(format));
+  }
+}
+
 void TSSLSocketFactory::loadTrustedCertificates(const char* path, const char* capath) {
   if (path == nullptr) {
     throw TTransportException(TTransportException::BAD_ARGS,
@@ -985,6 +1029,39 @@
   }
 }
 
+void TSSLSocketFactory::loadTrustedCertificatesFromBuffer(const char* aCertificate, const char* aChain) {
+  if (aCertificate == nullptr) {
+    throw TTransportException(TTransportException::BAD_ARGS,
+                              "loadTrustedCertificates: aCertificate is empty");
+  }
+  X509_STORE* vX509Store = SSL_CTX_get_cert_store(ctx_->get());
+  BIO* mem = BIO_new(BIO_s_mem());
+  BIO_puts(mem, aCertificate);
+  X509* cert = PEM_read_bio_X509(mem, NULL, 0, NULL);
+  BIO_free(mem);
+
+  if (X509_STORE_add_cert(vX509Store, cert) == 0) {
+    int errno_copy = THRIFT_GET_SOCKET_ERROR;
+    string errors;
+    buildErrors(errors, errno_copy);
+    throw TSSLException("X509_STORE_add_cert: " + errors);
+  }
+
+  if (aChain) {
+    mem = BIO_new(BIO_s_mem());
+    BIO_puts(mem, aChain);
+    cert = PEM_read_bio_X509(mem, NULL, 0, NULL);
+    BIO_free(mem);
+
+    if (SSL_CTX_add_extra_chain_cert(ctx_->get(), cert) == 0) {
+      int errno_copy = THRIFT_GET_SOCKET_ERROR;
+      string errors;
+      buildErrors(errors, errno_copy);
+      throw TSSLException("X509_STORE_add_cert: " + errors);
+    }
+  }
+}
+
 void TSSLSocketFactory::randomize() {
   RAND_poll();
 }
diff --git a/lib/cpp/src/thrift/transport/TSSLSocket.h b/lib/cpp/src/thrift/transport/TSSLSocket.h
index 87a9601..a78112c 100644
--- a/lib/cpp/src/thrift/transport/TSSLSocket.h
+++ b/lib/cpp/src/thrift/transport/TSSLSocket.h
@@ -261,6 +261,7 @@
    * @param format Certificate file format
    */
   virtual void loadCertificate(const char* path, const char* format = "PEM");
+  virtual void loadCertificateFromBuffer(const char* aCertificate, const char* format = "PEM");
   /**
    * Load private key.
    *
@@ -268,12 +269,14 @@
    * @param format Private key file format
    */
   virtual void loadPrivateKey(const char* path, const char* format = "PEM");
+  virtual void loadPrivateKeyFromBuffer(const char* aPrivateKey, const char* format = "PEM");
   /**
    * Load trusted certificates from specified file.
    *
    * @param path Path to trusted certificate file
    */
   virtual void loadTrustedCertificates(const char* path, const char* capath = nullptr);
+  virtual void loadTrustedCertificatesFromBuffer(const char* aCertificate, const char* aChain = nullptr);
   /**
    * Default randomize method.
    */
diff --git a/lib/cpp/test/CMakeLists.txt b/lib/cpp/test/CMakeLists.txt
index ef08dbc..fba15f6 100644
--- a/lib/cpp/test/CMakeLists.txt
+++ b/lib/cpp/test/CMakeLists.txt
@@ -334,6 +334,17 @@
 endif ()
 add_test(NAME SecurityTest COMMAND SecurityTest -- "${CMAKE_CURRENT_SOURCE_DIR}/../../../test/keys")
 
+add_executable(SecurityFromBufferTest SecurityFromBufferTest.cpp)
+target_link_libraries(SecurityFromBufferTest
+    testgencpp
+    ${Boost_LIBRARIES}
+)
+LINK_AGAINST_THRIFT_LIBRARY(SecurityFromBufferTest thrift)
+if (NOT MSVC AND NOT ${CMAKE_SYSTEM_NAME} MATCHES "Darwin" AND NOT MINGW)
+target_link_libraries(SecurityFromBufferTest -lrt)
+endif ()
+add_test(NAME SecurityFromBufferTest COMMAND SecurityFromBufferTest -- "${CMAKE_CURRENT_SOURCE_DIR}/../../../test/keys")
+
 endif()
 
 if(WITH_QT5)
diff --git a/lib/cpp/test/Makefile.am b/lib/cpp/test/Makefile.am
index 2a0b9e6..8399d9e 100755
--- a/lib/cpp/test/Makefile.am
+++ b/lib/cpp/test/Makefile.am
@@ -99,6 +99,7 @@
 	TInterruptTest \
 	TServerIntegrationTest \
 	SecurityTest \
+	SecurityFromBufferTest \
 	ZlibTest \
 	TFileTransportTest \
 	link_test \
@@ -174,6 +175,17 @@
   $(BOOST_SYSTEM_LDADD) \
   $(BOOST_THREAD_LDADD)
 
+SecurityFromBufferTest_SOURCES = \
+	SecurityFromBufferTest.cpp
+
+SecurityFromBufferTest_LDADD = \
+  libtestgencpp.la \
+  libprocessortest.la \
+  $(BOOST_TEST_LDADD) \
+  $(BOOST_FILESYSTEM_LDADD) \
+  $(BOOST_SYSTEM_LDADD) \
+  $(BOOST_THREAD_LDADD)
+
 TransportTest_SOURCES = \
 	TransportTest.cpp
 
diff --git a/lib/cpp/test/SecurityFromBufferTest.cpp b/lib/cpp/test/SecurityFromBufferTest.cpp
new file mode 100644
index 0000000..72a4c2a
--- /dev/null
+++ b/lib/cpp/test/SecurityFromBufferTest.cpp
@@ -0,0 +1,253 @@
+/*
+ * 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.
+ */
+
+#define BOOST_TEST_MODULE SecurityFromBufferTest
+#include <boost/filesystem.hpp>
+#include <boost/foreach.hpp>
+#include <boost/format.hpp>
+#include <boost/test/unit_test.hpp>
+#include <boost/thread.hpp>
+#include <stdexcept>
+#include <fstream>
+#include <memory>
+#include <thrift/transport/TSSLServerSocket.h>
+#include <thrift/transport/TSSLSocket.h>
+#include <thrift/transport/TTransport.h>
+#include <vector>
+#ifdef __linux__
+#include <signal.h>
+#endif
+
+using apache::thrift::transport::TServerTransport;
+using apache::thrift::transport::TSSLServerSocket;
+using apache::thrift::transport::TSSLSocket;
+using apache::thrift::transport::TSSLSocketFactory;
+using apache::thrift::transport::TTransport;
+using apache::thrift::transport::TTransportException;
+using apache::thrift::transport::TTransportFactory;
+
+using std::bind;
+using std::shared_ptr;
+
+boost::filesystem::path keyDir;
+boost::filesystem::path certFile(const std::string& filename) {
+  return keyDir / filename;
+}
+std::string certString(const std::string& filename) {
+  std::ifstream ifs(certFile(filename).string());
+  if(!ifs.is_open() || !ifs.good()) {
+    throw(std::runtime_error("Failed to open key file " + filename + " for reading"));
+  }
+  std::stringstream buffer;
+  buffer << ifs.rdbuf();
+  return buffer.str();
+}
+boost::mutex gMutex;
+
+struct GlobalFixture {
+  GlobalFixture() {
+    using namespace boost::unit_test::framework;
+    for (int i = 0; i < master_test_suite().argc; ++i) {
+      BOOST_TEST_MESSAGE(boost::format("argv[%1%] = \"%2%\"") % i % master_test_suite().argv[i]);
+    }
+
+#ifdef __linux__
+    // OpenSSL calls send() without MSG_NOSIGPIPE so writing to a socket that has
+    // disconnected can cause a SIGPIPE signal...
+    signal(SIGPIPE, SIG_IGN);
+#endif
+
+    TSSLSocketFactory::setManualOpenSSLInitialization(true);
+    apache::thrift::transport::initializeOpenSSL();
+
+    keyDir = boost::filesystem::current_path().parent_path().parent_path().parent_path() / "test" / "keys";
+    if (!boost::filesystem::exists(certFile("server.crt"))) {
+      keyDir = boost::filesystem::path(master_test_suite().argv[master_test_suite().argc - 1]);
+      if (!boost::filesystem::exists(certFile("server.crt"))) {
+        throw std::invalid_argument("The last argument to this test must be the directory containing the test certificate(s).");
+      }
+    }
+  }
+
+  virtual ~GlobalFixture() {
+    apache::thrift::transport::cleanupOpenSSL();
+#ifdef __linux__
+    signal(SIGPIPE, SIG_DFL);
+#endif
+  }
+};
+
+#if (BOOST_VERSION >= 105900)
+BOOST_GLOBAL_FIXTURE(GlobalFixture);
+#else
+BOOST_GLOBAL_FIXTURE(GlobalFixture)
+#endif
+
+struct SecurityFromBufferFixture {
+  void server(apache::thrift::transport::SSLProtocol protocol) {
+    try {
+      boost::mutex::scoped_lock lock(mMutex);
+
+      shared_ptr<TSSLSocketFactory> pServerSocketFactory;
+      shared_ptr<TSSLServerSocket> pServerSocket;
+
+      pServerSocketFactory.reset(new TSSLSocketFactory(static_cast<apache::thrift::transport::SSLProtocol>(protocol)));
+      pServerSocketFactory->ciphers("ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH");
+      pServerSocketFactory->loadCertificateFromBuffer(certString("server.crt").c_str());
+      pServerSocketFactory->loadPrivateKeyFromBuffer(certString("server.key").c_str());
+      pServerSocketFactory->server(true);
+      pServerSocket.reset(new TSSLServerSocket("localhost", 0, pServerSocketFactory));
+      shared_ptr<TTransport> connectedClient;
+
+      try {
+        pServerSocket->listen();
+        mPort = pServerSocket->getPort();
+        mCVar.notify_one();
+        lock.unlock();
+
+        connectedClient = pServerSocket->accept();
+        uint8_t buf[2];
+        buf[0] = 'O';
+        buf[1] = 'K';
+        connectedClient->write(&buf[0], 2);
+        connectedClient->flush();
+      }
+
+      catch (apache::thrift::transport::TTransportException& ex) {
+        boost::mutex::scoped_lock lock(gMutex);
+        BOOST_TEST_MESSAGE(boost::format("SRV %1% Exception: %2%") % boost::this_thread::get_id() % ex.what());
+      }
+
+      if (connectedClient) {
+        connectedClient->close();
+        connectedClient.reset();
+      }
+
+      pServerSocket->close();
+      pServerSocket.reset();
+    } catch (std::exception& ex) {
+      BOOST_FAIL(boost::format("%1%: %2%") % typeid(ex).name() % ex.what());
+    }
+  }
+
+  void client(apache::thrift::transport::SSLProtocol protocol) {
+    try {
+      shared_ptr<TSSLSocketFactory> pClientSocketFactory;
+      shared_ptr<TSSLSocket> pClientSocket;
+
+      try {
+        pClientSocketFactory.reset(new TSSLSocketFactory(static_cast<apache::thrift::transport::SSLProtocol>(protocol)));
+        pClientSocketFactory->authenticate(true);
+        pClientSocketFactory->loadCertificateFromBuffer(certString("client.crt").c_str());
+        pClientSocketFactory->loadPrivateKeyFromBuffer(certString("client.key").c_str());
+        pClientSocketFactory->loadTrustedCertificatesFromBuffer(certString("CA.pem").c_str());
+        pClientSocket = pClientSocketFactory->createSocket("localhost", mPort);
+        pClientSocket->open();
+
+        uint8_t buf[3];
+        buf[0] = 0;
+        buf[1] = 0;
+        BOOST_CHECK_EQUAL(2, pClientSocket->read(&buf[0], 2));
+        BOOST_CHECK_EQUAL(0, memcmp(&buf[0], "OK", 2));
+        mConnected = true;
+      } catch (apache::thrift::transport::TTransportException& ex) {
+        boost::mutex::scoped_lock lock(gMutex);
+        BOOST_TEST_MESSAGE(boost::format("CLI %1% Exception: %2%") % boost::this_thread::get_id() % ex.what());
+      }
+
+      if (pClientSocket) {
+        pClientSocket->close();
+        pClientSocket.reset();
+      }
+    } catch (std::exception& ex) {
+      BOOST_FAIL(boost::format("%1%: %2%") % typeid(ex).name() % ex.what());
+    }
+  }
+
+  static const char* protocol2str(size_t protocol) {
+    static const char* strings[apache::thrift::transport::LATEST + 1]
+        = {"SSLTLS", "SSLv2", "SSLv3", "TLSv1_0", "TLSv1_1", "TLSv1_2"};
+    return strings[protocol];
+  }
+
+  boost::mutex mMutex;
+  boost::condition_variable mCVar;
+  int mPort;
+  bool mConnected;
+};
+
+BOOST_FIXTURE_TEST_SUITE(BOOST_TEST_MODULE, SecurityFromBufferFixture)
+
+BOOST_AUTO_TEST_CASE(ssl_security_matrix) {
+  try {
+    // matrix of connection success between client and server with different SSLProtocol selections
+        static_assert(apache::thrift::transport::LATEST == 5, "Mismatch in assumed number of ssl protocols");
+        bool matrix[apache::thrift::transport::LATEST + 1][apache::thrift::transport::LATEST + 1] =
+        {
+    //   server    = SSLTLS   SSLv2    SSLv3    TLSv1_0  TLSv1_1  TLSv1_2
+    // client
+    /* SSLTLS  */  { true,    false,   false,   true,    true,    true    },
+    /* SSLv2   */  { false,   false,   false,   false,   false,   false   },
+    /* SSLv3   */  { false,   false,   true,    false,   false,   false   },
+    /* TLSv1_0 */  { true,    false,   false,   true,    false,   false   },
+    /* TLSv1_1 */  { true,    false,   false,   false,   true,    false   },
+    /* TLSv1_2 */  { true,    false,   false,   false,   false,   true    }
+        };
+
+    for (size_t si = 0; si <= apache::thrift::transport::LATEST; ++si) {
+      for (size_t ci = 0; ci <= apache::thrift::transport::LATEST; ++ci) {
+        if (si == 1 || ci == 1) {
+          // Skip all SSLv2 cases - protocol not supported
+          continue;
+        }
+
+#ifdef OPENSSL_NO_SSL3
+        if (si == 2 || ci == 2) {
+          // Skip all SSLv3 cases - protocol not supported
+          continue;
+        }
+#endif
+
+        boost::mutex::scoped_lock lock(mMutex);
+
+        BOOST_TEST_MESSAGE(boost::format("TEST: Server = %1%, Client = %2%") % protocol2str(si)
+                           % protocol2str(ci));
+
+        mConnected = false;
+        // thread_group manages the thread lifetime - ignore the return value of create_thread
+        boost::thread_group threads;
+        (void)threads.create_thread(bind(&SecurityFromBufferFixture::server, this,
+                                         static_cast<apache::thrift::transport::SSLProtocol>(si)));
+        mCVar.wait(lock); // wait for listen() to succeed
+        lock.unlock();
+        (void)threads.create_thread(bind(&SecurityFromBufferFixture::client, this,
+                                         static_cast<apache::thrift::transport::SSLProtocol>(ci)));
+        threads.join_all();
+
+        BOOST_CHECK_MESSAGE(mConnected == matrix[ci][si],
+            boost::format("      Server = %1%, Client = %2% expected mConnected == %3% but was %4%")
+                % protocol2str(si) % protocol2str(ci) % matrix[ci][si] % mConnected);
+      }
+    }
+  } catch (std::exception& ex) {
+    BOOST_FAIL(boost::format("%1%: %2%") % typeid(ex).name() % ex.what());
+  }
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/lib/csharp/ThriftMSBuildTask/ThriftMSBuildTask.csproj b/lib/csharp/ThriftMSBuildTask/ThriftMSBuildTask.csproj
index f4a26de..2589970 100644
--- a/lib/csharp/ThriftMSBuildTask/ThriftMSBuildTask.csproj
+++ b/lib/csharp/ThriftMSBuildTask/ThriftMSBuildTask.csproj
@@ -45,7 +45,7 @@
     <UpdateRequired>false</UpdateRequired>
     <MapFileExtensions>true</MapFileExtensions>
     <ApplicationRevision>0</ApplicationRevision>
-    <ApplicationVersion>0.13.0.0</ApplicationVersion>
+    <ApplicationVersion>0.14.0.0</ApplicationVersion>
     <IsWebBootstrapper>false</IsWebBootstrapper>
     <UseApplicationTrust>false</UseApplicationTrust>
     <BootstrapperEnabled>true</BootstrapperEnabled>
diff --git a/lib/csharp/src/Thrift.csproj b/lib/csharp/src/Thrift.csproj
index da69554..1305482 100644
--- a/lib/csharp/src/Thrift.csproj
+++ b/lib/csharp/src/Thrift.csproj
@@ -45,7 +45,7 @@
     <UpdateRequired>false</UpdateRequired>
     <MapFileExtensions>true</MapFileExtensions>
     <ApplicationRevision>0</ApplicationRevision>
-    <ApplicationVersion>0.13.0.0</ApplicationVersion>
+    <ApplicationVersion>0.14.0.0</ApplicationVersion>
     <IsWebBootstrapper>false</IsWebBootstrapper>
     <UseApplicationTrust>false</UseApplicationTrust>
     <BootstrapperEnabled>true</BootstrapperEnabled>
diff --git a/lib/csharp/test/Multiplex/Client/MultiplexClient.csproj b/lib/csharp/test/Multiplex/Client/MultiplexClient.csproj
index 09d20f5..551640b 100644
--- a/lib/csharp/test/Multiplex/Client/MultiplexClient.csproj
+++ b/lib/csharp/test/Multiplex/Client/MultiplexClient.csproj
@@ -46,7 +46,7 @@
     <UpdateRequired>false</UpdateRequired>
     <MapFileExtensions>true</MapFileExtensions>
     <ApplicationRevision>0</ApplicationRevision>
-    <ApplicationVersion>0.13.0.0</ApplicationVersion>
+    <ApplicationVersion>0.14.0.0</ApplicationVersion>
     <UseApplicationTrust>false</UseApplicationTrust>
     <BootstrapperEnabled>true</BootstrapperEnabled>
   </PropertyGroup>
diff --git a/lib/csharp/test/Multiplex/Server/Properties/AssemblyInfo.cs b/lib/csharp/test/Multiplex/Server/Properties/AssemblyInfo.cs
index 2b8a6af..50b11af 100644
--- a/lib/csharp/test/Multiplex/Server/Properties/AssemblyInfo.cs
+++ b/lib/csharp/test/Multiplex/Server/Properties/AssemblyInfo.cs
@@ -51,5 +51,5 @@
 // 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.13.0.0")]
-[assembly: AssemblyFileVersion("0.13.0.0")]
+[assembly: AssemblyVersion("0.14.0.0")]
+[assembly: AssemblyFileVersion("0.14.0.0")]
diff --git a/lib/csharp/test/ThriftMVCTest/Properties/AssemblyInfo.cs b/lib/csharp/test/ThriftMVCTest/Properties/AssemblyInfo.cs
index b812aaf..a87107c 100644
--- a/lib/csharp/test/ThriftMVCTest/Properties/AssemblyInfo.cs
+++ b/lib/csharp/test/ThriftMVCTest/Properties/AssemblyInfo.cs
@@ -49,5 +49,5 @@
 //
 // You can specify all the values or you can default the Build and Revision Numbers
 // by using the '*' as shown below:
-[assembly: AssemblyVersion("0.13.0.0")]
-[assembly: AssemblyFileVersion("0.13.0.0")]
+[assembly: AssemblyVersion("0.14.0.0")]
+[assembly: AssemblyFileVersion("0.14.0.0")]
diff --git a/lib/d/src/thrift/base.d b/lib/d/src/thrift/base.d
index 150c3da..4a8fbd7 100644
--- a/lib/d/src/thrift/base.d
+++ b/lib/d/src/thrift/base.d
@@ -50,7 +50,7 @@
 /// The Thrift version string, used for informative purposes.
 // Note: This is currently hardcoded, but will likely be filled in by the build
 // system in future versions.
-enum VERSION = "0.13.0";
+enum VERSION = "0.14.0";
 
 /**
  * Functions used for logging inside Thrift.
diff --git a/lib/delphi/src/Thrift.pas b/lib/delphi/src/Thrift.pas
index 2ee8344..e127380 100644
--- a/lib/delphi/src/Thrift.pas
+++ b/lib/delphi/src/Thrift.pas
@@ -27,7 +27,7 @@
   Thrift.Protocol;
 
 const
-  Version = '0.13.0';
+  Version = '0.14.0';
 
 type
   TException = Thrift.Exception.TException; // compatibility alias
diff --git a/lib/haxe/haxelib.json b/lib/haxe/haxelib.json
index b3c1530..d0e437b 100644
--- a/lib/haxe/haxelib.json
+++ b/lib/haxe/haxelib.json
@@ -4,7 +4,7 @@
 	"license": "Apache",
 	"tags": ["thrift", "rpc", "serialization", "cross", "framework"],
 	"description": "Haxe bindings for the Apache Thrift RPC and serialization framework",
-	"version": "0.13.0",
+	"version": "0.14.0",
 	"releasenote": "Licensed under Apache License, Version 2.0. The Apache Thrift compiler needs to be installed separately.",
 	"contributors": ["Apache Software Foundation (ASF)"],
 	"dependencies": { },
diff --git a/lib/hs/thrift.cabal b/lib/hs/thrift.cabal
index dd30d89..c60effb 100644
--- a/lib/hs/thrift.cabal
+++ b/lib/hs/thrift.cabal
@@ -18,7 +18,7 @@
 --
 
 Name:           thrift
-Version:        0.13.0
+Version:        0.14.0
 Cabal-Version:  1.24
 License:        Apache
 Category:       Foreign
diff --git a/lib/java/gradle.properties b/lib/java/gradle.properties
index 0811659..c5d2a1b 100644
--- a/lib/java/gradle.properties
+++ b/lib/java/gradle.properties
@@ -1,7 +1,7 @@
 # This file is shared currently between this Gradle build and the
 # Ant builds for fd303 and JavaScript. Keep the dotted notation for
 # the properties to minimize the changes in the dependencies.
-thrift.version=0.13.0
+thrift.version=0.14.0
 thrift.groupid=org.apache.thrift
 release=false
 
diff --git a/lib/js/src/thrift.js b/lib/js/src/thrift.js
index 21a3d65..69bcccd 100644
--- a/lib/js/src/thrift.js
+++ b/lib/js/src/thrift.js
@@ -46,7 +46,7 @@
      * @const {string} Version
      * @memberof Thrift
      */
-    Version: '0.13.0',
+    Version: '0.14.0',
 
     /**
      * Thrift IDL type string to Id mapping.
diff --git a/lib/lua/Thrift.lua b/lib/lua/Thrift.lua
index a948b3d..4a290de 100644
--- a/lib/lua/Thrift.lua
+++ b/lib/lua/Thrift.lua
@@ -48,7 +48,7 @@
   return count
 end
 
-version = '0.13.0'
+version = '0.14.0'
 
 TType = {
   STOP   = 0,
diff --git a/lib/netcore/Thrift/Properties/AssemblyInfo.cs b/lib/netcore/Thrift/Properties/AssemblyInfo.cs
index 0f433b6..58aa844 100644
--- a/lib/netcore/Thrift/Properties/AssemblyInfo.cs
+++ b/lib/netcore/Thrift/Properties/AssemblyInfo.cs
@@ -52,5 +52,5 @@
 // You can specify all the values or you can default the Build and Revision Numbers
 // by using the '*' as shown below:
 
-[assembly: AssemblyVersion("0.13.0.0")]
-[assembly: AssemblyFileVersion("0.13.0.0")]
+[assembly: AssemblyVersion("0.14.0.0")]
+[assembly: AssemblyFileVersion("0.14.0.0")]
diff --git a/lib/netcore/Thrift/Transports/Client/THttpClientTransport.cs b/lib/netcore/Thrift/Transports/Client/THttpClientTransport.cs
index 8bce9e4..b2ff804 100644
--- a/lib/netcore/Thrift/Transports/Client/THttpClientTransport.cs
+++ b/lib/netcore/Thrift/Transports/Client/THttpClientTransport.cs
@@ -150,7 +150,7 @@
             }
 
             httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/x-thrift"));
-            httpClient.DefaultRequestHeaders.UserAgent.Add(new ProductInfoHeaderValue("THttpClientTransport", "0.13.0"));
+            httpClient.DefaultRequestHeaders.UserAgent.Add(new ProductInfoHeaderValue("THttpClientTransport", "0.14.0"));
 
             if (CustomHeaders != null)
             {
diff --git a/lib/netstd/Thrift/Properties/AssemblyInfo.cs b/lib/netstd/Thrift/Properties/AssemblyInfo.cs
index 597290d..58aa844 100644
--- a/lib/netstd/Thrift/Properties/AssemblyInfo.cs
+++ b/lib/netstd/Thrift/Properties/AssemblyInfo.cs
@@ -52,6 +52,5 @@
 // You can specify all the values or you can default the Build and Revision Numbers
 // by using the '*' as shown below:
 
-[assembly: AssemblyVersion("0.13.0.0")]
-[assembly: AssemblyFileVersion("0.13.0.0")]
-
+[assembly: AssemblyVersion("0.14.0.0")]
+[assembly: AssemblyFileVersion("0.14.0.0")]
diff --git a/lib/php/test/Fixtures.php b/lib/php/test/Fixtures.php
index fd57d83..996f4af 100644
--- a/lib/php/test/Fixtures.php
+++ b/lib/php/test/Fixtures.php
@@ -66,32 +66,32 @@
 
         self::$testArgs['testStruct'] =
             new Xtruct(
-                array(
+            array(
                     'string_thing' => 'worked',
                     'byte_thing' => 0x01,
                     'i32_thing' => pow(2, 30),
                     'i64_thing' => self::$testArgs['testI64']
                 )
-            );
+        );
 
         self::$testArgs['testNestNested'] =
             new Xtruct(
-                array(
+            array(
                     'string_thing' => 'worked',
                     'byte_thing' => 0x01,
                     'i32_thing' => pow(2, 30),
                     'i64_thing' => self::$testArgs['testI64']
                 )
-            );
+        );
 
         self::$testArgs['testNest'] =
             new Xtruct2(
-                array(
+            array(
                     'byte_thing' => 0x01,
                     'struct_thing' => self::$testArgs['testNestNested'],
                     'i32_thing' => pow(2, 15)
                 )
-            );
+        );
 
         self::$testArgs['testMap'] =
             array(
@@ -138,23 +138,23 @@
 
         $xtruct1 =
             new Xtruct(
-                array(
+            array(
                     'string_thing' => 'Goodbye4',
                     'byte_thing' => 4,
                     'i32_thing' => 4,
                     'i64_thing' => 4
                 )
-            );
+        );
 
         $xtruct2 =
             new Xtruct(
-                array(
+            array(
                     'string_thing' => 'Hello2',
                     'byte_thing' => 2,
                     'i32_thing' => 2,
                     'i64_thing' => 2
                 )
-            );
+        );
 
         $userMap =
             array(
@@ -164,21 +164,21 @@
 
         $insanity2 =
             new Insanity(
-                array(
+            array(
                     'userMap' => $userMap,
                     'xtructs' => array($xtruct1, $xtruct2)
                 )
-            );
+        );
 
         $insanity3 = $insanity2;
 
         $insanity6 =
             new Insanity(
-                array(
+            array(
                     'userMap' => null,
                     'xtructs' => null
                 )
-            );
+        );
 
         self::$testArgs['testInsanityExpectedResult'] =
             array(
diff --git a/lib/rb/thrift.gemspec b/lib/rb/thrift.gemspec
index 869e5d9..3ee7e7c 100644
--- a/lib/rb/thrift.gemspec
+++ b/lib/rb/thrift.gemspec
@@ -3,7 +3,7 @@
 
 Gem::Specification.new do |s|
   s.name        = 'thrift'
-  s.version     = '0.13.0'
+  s.version     = '0.14.0'
   s.authors     = ['Apache Thrift Developers']
   s.email       = ['dev@thrift.apache.org']
   s.homepage    = 'http://thrift.apache.org'
diff --git a/lib/rs/Cargo.toml b/lib/rs/Cargo.toml
index 69da0f3..0c71bab 100644
--- a/lib/rs/Cargo.toml
+++ b/lib/rs/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 name = "thrift"
 description = "Rust bindings for the Apache Thrift RPC system"
-version = "0.13.0"
+version = "0.14.0"
 license = "Apache-2.0"
 authors = ["Apache Thrift Developers <dev@thrift.apache.org>"]
 homepage = "http://thrift.apache.org"
diff --git a/lib/st/package.xml b/lib/st/package.xml
index 21b7adc..eab4052 100644
--- a/lib/st/package.xml
+++ b/lib/st/package.xml
@@ -17,7 +17,7 @@
  specific language governing permissions and limitations
  under the License.
  -->
-<!-- Apache Thrift Smalltalk library version 0.13.0 -->
+<!-- Apache Thrift Smalltalk library version 0.14.0 -->
 <package>
   <name>libthrift-st</name>
   <file>thrift.st</file>
diff --git a/lib/ts/package.json b/lib/ts/package.json
index eda1c0a..1cd6c71 100644
--- a/lib/ts/package.json
+++ b/lib/ts/package.json
@@ -1,6 +1,6 @@
 {
   "name": "thrift",
-  "version": "0.13.0",
+  "version": "0.14.0",
   "description": "Thrift is a software framework for scalable cross-language services development.",
   "author": {
     "name": "Apache Thrift Developers",
diff --git a/package.json b/package.json
index 6393ee7..c674fef 100644
--- a/package.json
+++ b/package.json
@@ -6,7 +6,7 @@
     "type": "git",
     "url": "https://github.com/apache/thrift.git"
   },
-  "version": "0.13.0",
+  "version": "0.14.0",
   "author": {
     "name": "Apache Thrift Developers",
     "email": "dev@thrift.apache.org",
diff --git a/test/csharp/Properties/AssemblyInfo.cs b/test/csharp/Properties/AssemblyInfo.cs
index 76c9a80..376ff25 100644
--- a/test/csharp/Properties/AssemblyInfo.cs
+++ b/test/csharp/Properties/AssemblyInfo.cs
@@ -51,5 +51,5 @@
 // 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.13.0.0")]
-[assembly: AssemblyFileVersion("0.13.0.0")]
+[assembly: AssemblyVersion("0.14.0.0")]
+[assembly: AssemblyFileVersion("0.14.0.0")]
diff --git a/tutorial/csharp/CsharpClient/Properties/AssemblyInfo.cs b/tutorial/csharp/CsharpClient/Properties/AssemblyInfo.cs
index bae5e70..8f5b32a 100644
--- a/tutorial/csharp/CsharpClient/Properties/AssemblyInfo.cs
+++ b/tutorial/csharp/CsharpClient/Properties/AssemblyInfo.cs
@@ -51,5 +51,5 @@
 // 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.13.0.0")]
-[assembly: AssemblyFileVersion("0.13.0.0")]
+[assembly: AssemblyVersion("0.14.0.0")]
+[assembly: AssemblyFileVersion("0.14.0.0")]
diff --git a/tutorial/dart/console_client/pubspec.yaml b/tutorial/dart/console_client/pubspec.yaml
index ca122d2..1068f90 100644
--- a/tutorial/dart/console_client/pubspec.yaml
+++ b/tutorial/dart/console_client/pubspec.yaml
@@ -16,7 +16,7 @@
 # under the License.
 
 name: tutorial_console_client
-version: 0.13.0
+version: 0.14.0
 description: >
   A Dart console client to implementation of the Apache Thrift tutorial
 author: Apache Thrift Developers <dev@thrift.apache.org>
diff --git a/tutorial/dart/server/pubspec.yaml b/tutorial/dart/server/pubspec.yaml
index e09465e..bdd74b8 100644
--- a/tutorial/dart/server/pubspec.yaml
+++ b/tutorial/dart/server/pubspec.yaml
@@ -16,7 +16,7 @@
 # under the License.
 
 name: tutorial_server
-version: 0.13.0
+version: 0.14.0
 description: A Dart server to support the Apache Thrift tutorial
 author: Apache Thrift Developers <dev@thrift.apache.org>
 homepage: http://thrift.apache.org
diff --git a/tutorial/delphi/DelphiServer/DelphiServer.dproj b/tutorial/delphi/DelphiServer/DelphiServer.dproj
index ec1da2e..132d1bf 100644
--- a/tutorial/delphi/DelphiServer/DelphiServer.dproj
+++ b/tutorial/delphi/DelphiServer/DelphiServer.dproj
@@ -97,13 +97,13 @@
 					<VersionInfoKeys>
 						<VersionInfoKeys Name="CompanyName"/>
 						<VersionInfoKeys Name="FileDescription">Thrift Tutorial</VersionInfoKeys>
-						<VersionInfoKeys Name="FileVersion">0.13.0.0</VersionInfoKeys>
+						<VersionInfoKeys Name="FileVersion">0.14.0.0</VersionInfoKeys>
 						<VersionInfoKeys Name="InternalName">DelphiServer</VersionInfoKeys>
 						<VersionInfoKeys Name="LegalCopyright">Copyright © 2012 The Apache Software Foundation</VersionInfoKeys>
 						<VersionInfoKeys Name="LegalTrademarks"/>
 						<VersionInfoKeys Name="OriginalFilename">DelphiServer.exe</VersionInfoKeys>
 						<VersionInfoKeys Name="ProductName">Thrift</VersionInfoKeys>
-						<VersionInfoKeys Name="ProductVersion">0.13.0.0</VersionInfoKeys>
+						<VersionInfoKeys Name="ProductVersion">0.14.0.0</VersionInfoKeys>
 						<VersionInfoKeys Name="Comments"/>
 					</VersionInfoKeys>
 					<Source>
diff --git a/tutorial/hs/ThriftTutorial.cabal b/tutorial/hs/ThriftTutorial.cabal
index b6a6122..acf2130 100755
--- a/tutorial/hs/ThriftTutorial.cabal
+++ b/tutorial/hs/ThriftTutorial.cabal
@@ -18,7 +18,7 @@
 --
 
 Name:           ThriftTutorial
-Version:        0.13.0
+Version:        0.14.0
 Cabal-Version:  >= 1.4
 License:        OtherLicense
 Category:       Foreign
diff --git a/tutorial/ocaml/_oasis b/tutorial/ocaml/_oasis
index 4a4f337..7491436 100644
--- a/tutorial/ocaml/_oasis
+++ b/tutorial/ocaml/_oasis
@@ -1,5 +1,5 @@
 Name: tutorial
-Version: 0.13.0
+Version: 0.14.0
 OASISFormat: 0.3
 Synopsis: OCaml Tutorial example
 Authors: Apache Thrift Developers <dev@thrift.apache.org>