diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index f003db2..8288849 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -41,7 +41,7 @@
   compiler:
     strategy:
       matrix:
-        os: [ubuntu-20.04, ubuntu-22.04]
+        os: [ubuntu-20.04, ubuntu-22.04, ubuntu-24.04]
       fail-fast: false
     runs-on: ${{ matrix.os }}
     steps:
@@ -67,10 +67,10 @@
       - name: Run thrift version
         run: /usr/local/bin/thrift -version
 
-      # only upload while building ubuntu-20.04
+      # only upload while building ubuntu-22.04
       - name: Archive built thrift compiler
-        if: matrix.os == 'ubuntu-20.04'
-        uses: actions/upload-artifact@v3
+        if: matrix.os == 'ubuntu-22.04'
+        uses: actions/upload-artifact@v4
         with:
           name: thrift-compiler
           path: compiler/cpp/thrift
@@ -78,7 +78,7 @@
 
   lib-php:
     needs: compiler
-    runs-on: ubuntu-20.04
+    runs-on: ubuntu-22.04
     strategy:
       matrix:
         php-version: [7.1, 7.2, 7.3, 7.4, 8.0, 8.1, 8.2, 8.3]
@@ -90,7 +90,7 @@
         uses: shivammathur/setup-php@v2
         with:
           php-version: ${{ matrix.php-version }}
-          extensions: mbstring, intl, xml
+          extensions: mbstring, intl, xml, curl
           ini-values: "error_reporting=E_ALL"
 
       - name: Install Dependencies
@@ -103,7 +103,7 @@
         run: |
           ./configure $(echo $CONFIG_ARGS_FOR_LIBS | sed 's/without-php/with-php/' | sed 's/without-php_extension/with-php_extension/' )
 
-      - uses: actions/download-artifact@v3
+      - uses: actions/download-artifact@v4
         with:
           name: thrift-compiler
           path: compiler/cpp
@@ -120,18 +120,18 @@
           mkdir -p ./lib/php/test/Resources/packages/phpvo
           mkdir -p ./lib/php/test/Resources/packages/phpjs
           mkdir -p ./lib/php/test/Resources/packages/phpcm
-          compiler/cpp/thrift --gen php -r --out ./lib/php/test/Resources/packages/php lib/php/test/Resources/ThriftTest.thrift
-          compiler/cpp/thrift --gen php:validate -r --out ./lib/php/test/Resources/packages/phpv lib/php/test/Resources/ThriftTest.thrift
-          compiler/cpp/thrift --gen php:validate,oop -r --out ./lib/php/test/Resources/packages/phpvo lib/php/test/Resources/ThriftTest.thrift
-          compiler/cpp/thrift --gen php:json -r --out ./lib/php/test/Resources/packages/phpjs lib/php/test/Resources/ThriftTest.thrift
-          compiler/cpp/thrift --gen php:classmap,server,rest -r --out ./lib/php/test/Resources/packages/phpcm lib/php/test/Resources/ThriftTest.thrift
+          compiler/cpp/thrift --gen php:nsglobal="Basic" -r --out ./lib/php/test/Resources/packages/php lib/php/test/Resources/ThriftTest.thrift
+          compiler/cpp/thrift --gen php:validate,nsglobal="Validate" -r --out ./lib/php/test/Resources/packages/phpv lib/php/test/Resources/ThriftTest.thrift
+          compiler/cpp/thrift --gen php:validate,oop,nsglobal="ValidateOop" -r --out ./lib/php/test/Resources/packages/phpvo lib/php/test/Resources/ThriftTest.thrift
+          compiler/cpp/thrift --gen php:json,nsglobal="Json" -r --out ./lib/php/test/Resources/packages/phpjs lib/php/test/Resources/ThriftTest.thrift
+          compiler/cpp/thrift --gen php:classmap,server,rest,nsglobal="Classmap" -r --out ./lib/php/test/Resources/packages/phpcm lib/php/test/Resources/ThriftTest.thrift
 
       - name: Run Tests
         run: vendor/bin/phpunit -c lib/php/phpunit.xml
 
   lib-go:
     needs: compiler
-    runs-on: ubuntu-20.04
+    runs-on: ubuntu-22.04
     strategy:
       matrix:
         go:
@@ -157,7 +157,7 @@
         run: |
           ./configure $(echo $CONFIG_ARGS_FOR_LIBS | sed 's/without-go/with-go/')
 
-      - uses: actions/download-artifact@v3
+      - uses: actions/download-artifact@v4
         with:
           name: thrift-compiler
           path: compiler/cpp
@@ -181,7 +181,7 @@
 
       - name: Upload go precross artifacts
         if: matrix.go == '1.22'
-        uses: actions/upload-artifact@v3
+        uses: actions/upload-artifact@v4
         with:
           name: go-precross
           if-no-files-found: error
@@ -191,7 +191,7 @@
 
   lib-java-kotlin:
     needs: compiler
-    runs-on: ubuntu-20.04
+    runs-on: ubuntu-22.04
     env:
       GRADLE_VERSION: "8.4"
     steps:
@@ -235,7 +235,7 @@
         run: |
           ./configure $(echo $CONFIG_ARGS_FOR_LIBS | sed 's/without-java/with-java/' | sed 's/without-kotlin/with-kotlin/')
 
-      - uses: actions/download-artifact@v3
+      - uses: actions/download-artifact@v4
         with:
           name: thrift-compiler
           path: compiler/cpp
@@ -253,7 +253,7 @@
         run: make -C lib/java install
 
       - name: Upload java libthrift artifacts
-        uses: actions/upload-artifact@v3
+        uses: actions/upload-artifact@v4
         with:
           name: libthrift
           if-no-files-found: error
@@ -266,7 +266,7 @@
         run: make -C lib/java precross
 
       - name: Upload java precross artifacts
-        uses: actions/upload-artifact@v3
+        uses: actions/upload-artifact@v4
         with:
           name: java-precross
           if-no-files-found: error
@@ -288,7 +288,7 @@
         run: make -C lib/kotlin precross
 
       - name: Upload kotlin precross artifacts
-        uses: actions/upload-artifact@v3
+        uses: actions/upload-artifact@v4
         with:
           name: kotlin-precross
           if-no-files-found: error
@@ -299,7 +299,7 @@
 
   lib-swift:
     needs: compiler
-    runs-on: ubuntu-20.04
+    runs-on: ubuntu-22.04
     steps:
       - uses: actions/checkout@v4
 
@@ -310,7 +310,7 @@
         run: |
           ./configure $(echo $CONFIG_ARGS_FOR_LIBS | sed 's/without-swift/with-swift/')
 
-      - uses: actions/download-artifact@v3
+      - uses: actions/download-artifact@v4
         with:
           name: thrift-compiler
           path: compiler/cpp
@@ -324,7 +324,7 @@
         run: make -C test/swift precross
 
       - name: Upload swift precross artifacts
-        uses: actions/upload-artifact@v3
+        uses: actions/upload-artifact@v4
         with:
           name: swift-precross
           if-no-files-found: error
@@ -335,7 +335,7 @@
 
   lib-rust:
     needs: compiler
-    runs-on: ubuntu-20.04
+    runs-on: ubuntu-22.04
     env:
       TOOLCHAIN_VERSION: 1.65.0
     steps:
@@ -363,7 +363,7 @@
         run: |
           ./configure $(echo $CONFIG_ARGS_FOR_LIBS | sed 's/without-rs/with-rs/')
 
-      - uses: actions/download-artifact@v3
+      - uses: actions/download-artifact@v4
         with:
           name: thrift-compiler
           path: compiler/cpp
@@ -386,7 +386,7 @@
         run: make -C test/rs precross
 
       - name: Upload rust precross artifacts
-        uses: actions/upload-artifact@v3
+        uses: actions/upload-artifact@v4
         with:
           name: rs-precross
           if-no-files-found: error
@@ -400,7 +400,7 @@
 
   lib-python:
     needs: compiler
-    runs-on: ubuntu-20.04
+    runs-on: ubuntu-22.04
     strategy:
       matrix:
         python-version:
@@ -434,7 +434,7 @@
         run: |
           ./configure $(echo $CONFIG_ARGS_FOR_LIBS | sed 's/without-py3/with-py3/')
 
-      - uses: actions/download-artifact@v3
+      - uses: actions/download-artifact@v4
         with:
           name: thrift-compiler
           path: compiler/cpp
@@ -463,7 +463,7 @@
       - lib-rust
       - lib-go
       - lib-python
-    runs-on: ubuntu-20.04
+    runs-on: ubuntu-22.04
     strategy:
       matrix:
         server_lang: ['java', 'kotlin', 'go', 'rs', 'swift']
@@ -490,31 +490,31 @@
           sudo apt-get install -y --no-install-recommends openssl ca-certificates
 
       - name: Download java precross artifacts
-        uses: actions/download-artifact@v3
+        uses: actions/download-artifact@v4
         with:
           name: java-precross
           path: lib/java/build
 
       - name: Download kotlin precross artifacts
-        uses: actions/download-artifact@v3
+        uses: actions/download-artifact@v4
         with:
           name: kotlin-precross
           path: lib/kotlin
 
       - name: Download swift precross artifacts
-        uses: actions/download-artifact@v3
+        uses: actions/download-artifact@v4
         with:
           name: swift-precross
           path: test/swift/CrossTests/.build/x86_64-unknown-linux-gnu/debug
 
       - name: Download rust precross artifacts
-        uses: actions/download-artifact@v3
+        uses: actions/download-artifact@v4
         with:
           name: rs-precross
           path: test/rs/bin
 
       - name: Download go precross artifacts
-        uses: actions/download-artifact@v3
+        uses: actions/download-artifact@v4
         with:
           name: go-precross
           path: test/go/bin
@@ -540,10 +540,10 @@
             --client ${{ matrix.client_lang }}
 
       - name: Upload log files from failed cross test runs
-        uses: actions/upload-artifact@v3
+        uses: actions/upload-artifact@v4
         if: failure()
         with:
-          name: cross-test-log
+          name: cross-test-log_${{ matrix.server_lang }}-${{ matrix.client_lang }}
           path: test/log/
           retention-days: 3
 
diff --git a/.github/workflows/cmake.yml b/.github/workflows/cmake.yml
index 71748e8..c4ff747 100644
--- a/.github/workflows/cmake.yml
+++ b/.github/workflows/cmake.yml
@@ -14,7 +14,7 @@
 
 jobs:
   compiler:
-    runs-on: ubuntu-20.04
+    runs-on: ubuntu-22.04
     steps:
       - uses: actions/checkout@v4
 
diff --git a/.gitignore b/.gitignore
index 0ed4729..e7f06a7 100644
--- a/.gitignore
+++ b/.gitignore
@@ -75,6 +75,8 @@
 /compiler/cpp/src/thrift/plugin/gen.stamp
 /compiler/cpp/Debug
 /compiler/cpp/Release
+/compiler/cpp/compiler/Debug
+/compiler/cpp/compiler/Release
 /compiler/cpp/src/thrift/libparse.a
 /compiler/cpp/src/thrift/thriftl.cc
 /compiler/cpp/src/thrift/thrifty.cc
diff --git a/.travis.yml b/.travis.yml
index b771d70..99dd2bc 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -47,7 +47,7 @@
     - SCRIPT="cmake.sh"
     - BUILD_ARG=""
     - BUILD_ENV="-e CC=gcc -e CXX=g++ -e THRIFT_CROSSTEST_CONCURRENCY=4"
-    - DISTRO=ubuntu-bionic
+    - DISTRO=ubuntu-focal
     - BUILD_LIBS="CPP C_GLIB JAVA PYTHON TESTING TUTORIALS"  # only meaningful for CMake builds
     - TRAVIS_BUILD_STAGE=test
     # DOCKER_REPO (this works for all builds as a source for docker images - you can override for fork builds in your Travis settings)
@@ -58,12 +58,6 @@
 jobs:
   include:
     # ========================= stage: docker =========================
-    - stage: docker
-      script: true
-      env:
-        - JOB="Docker Build ubuntu-bionic 18.04 LTS"
-        - DISTRO=ubuntu-bionic
-        - TRAVIS_BUILD_STAGE=docker
     - script: true
       env:
         - JOB="Docker Build ubuntu-focal 20.04 LTS"
@@ -131,12 +125,6 @@
         - DISTRO=ubuntu-focal
         - SCRIPT="autotools.sh"
 
-    - script: build/docker/run.sh
-      env:
-        - JOB="Autotools (Ubuntu Bionic)"
-        - DISTRO=ubuntu-bionic
-        - SCRIPT="autotools.sh"
-
     # ------------------------- phase: cmake ------------------------
     - script: build/docker/run.sh
       env:
diff --git a/CHANGES.md b/CHANGES.md
index a8de336..bc2fed4 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -1,5 +1,70 @@
+
 # Apache Thrift Changelog
 
+## 0.20.0
+
+### Known Open Issues (Blocker or Critical)
+
+- [THRIFT-3877](https://issues.apache.org/jira/browse/THRIFT-3877) - C++ library don't work with HTTP (csharp server, cpp client; need cross test enhancement)
+- [THRIFT-5468](https://issues.apache.org/jira/browse/THRIFT-5468) - Swift service generator doesn't support oneway
+- [THRIFT-5654](https://issues.apache.org/jira/browse/THRIFT-5654) - LNK4042 and LNK2019 in go_validator_generator.cc
+
+### Build Process
+
+- [THRIFT-5747]https://issues.apache.org/jira/browse/THRIFT-5747 - warning: The macro `AC_HELP_STRING' is obsolete. You should run autoupdate. and some more warnings
+
+### C++
+
+- [THRIFT-5670]https://issues.apache.org/jira/browse/THRIFT-5670 - recvTimeout is not printed correctly for THRIFT_EAGAIN
+
+### Compiler (General)
+
+- [THRIFT-5733]https://issues.apache.org/jira/browse/THRIFT-5733 - Building code with circular `include`s can result in tons of memory usage and eventual segfault
+
+### Delphi
+
+- [THRIFT-5749]https://issues.apache.org/jira/browse/THRIFT-5749 - Option to enable RTTI info
+- [THRIFT-5740]https://issues.apache.org/jira/browse/THRIFT-5740 - inherited interfaces should be explicitly listed in Delphi class decl
+
+### Documentation	
+
+- [THRIFT-4606]https://issues.apache.org/jira/browse/THRIFT-4606 - LGPL license file still present 
+
+### Erlang
+
+- [THRIFT-5635]https://issues.apache.org/jira/browse/THRIFT-5635 - Replace some removed functions with new counterparts
+
+### Go
+
+- [THRIFT-5744]https://issues.apache.org/jira/browse/THRIFT-5744 - Switch to slog for go library
+- [THRIFT-5745]https://issues.apache.org/jira/browse/THRIFT-5745 - Implement slog.LogValuer on go TStructs
+
+
+### Haxe
+
+- [THRIFT-5734]https://issues.apache.org/jira/browse/THRIFT-5734 - generated code may lack required capitalization at class names
+- [THRIFT-5742]https://issues.apache.org/jira/browse/THRIFT-5742 - Add addRange() function to Set helpers to support adding data from arbitrary enumerable containers
+
+### Java
+
+- [THRIFT-5738]https://issues.apache.org/jira/browse/THRIFT-5738 - Compiler build fails on Mac
+
+### netstd
+
+- [THRIFT-5746]https://issues.apache.org/jira/browse/THRIFT-5746 - Upgrade to net8
+- [THRIFT-5743]https://issues.apache.org/jira/browse/THRIFT-5743 - add TLS1.3 to default protocols where available
+- [THRIFT-5726]https://issues.apache.org/jira/browse/THRIFT-5726 - package upgrades and consolidation/improvement of build targets checks 
+
+### PHP
+
+- [THRIFT-5752]https://issues.apache.org/jira/browse/THRIFT-5752 - Add TTransportFactoryInterface
+- [THRIFT-5754]https://issues.apache.org/jira/browse/THRIFT-5754 - Fix PHP 8.1 deprecates passing null to non-nullable internal function parameters
+- [THRIFT-5753]https://issues.apache.org/jira/browse/THRIFT-5753 - PHP 8.1 deprecated warning about return type in jsonSerialize functions
+
+### Python
+
+- [THRIFT-5688]https://issues.apache.org/jira/browse/THRIFT-5688 - Add PyPI publishing github actions
+
 ## 0.19.0
 
 ### Known Open Issues (Blocker or Critical)
diff --git a/LANGUAGES.md b/LANGUAGES.md
index 4952ade..ccb4443 100644
--- a/LANGUAGES.md
+++ b/LANGUAGES.md
@@ -80,7 +80,7 @@
 <!-- Since -----------------><td>0.2.0</td>
 <!-- Build Systems ---------><td><img src="/doc/images/cgrn.png" alt="Yes"/></td><td><img src="/doc/images/cgrn.png" alt="Yes"/></td>
 <!-- Language Levels -------><td colspan=2>C++11</td>
-<!-- Field types -----------><td><img src="/doc/images/cred.png" alt=""/></td>
+<!-- Field types -----------><td><img src="/doc/images/cgrn.png" alt="Yes"/></td>
 <!-- Low-Level Transports --><td><img src="/doc/images/cgrn.png" alt="Yes"/></td><td><img src="/doc/images/cgrn.png" alt="Yes"/></td><td><img src="/doc/images/cgrn.png" alt="Yes"/></td><td><img src="/doc/images/cgrn.png" alt="Yes"/></td><td><img src="/doc/images/cgrn.png" alt="Yes"/></td><td><img src="/doc/images/cgrn.png" alt="Yes"/></td>
 <!-- Transport Wrappers ----><td><img src="/doc/images/cgrn.png" alt="Yes"/></td><td><img src="/doc/images/cgrn.png" alt="Yes"/></td><td><img src="/doc/images/cgrn.png" alt="Yes"/></td><td><img src="/doc/images/cgrn.png" alt="Yes"/></td>
 <!-- Protocols -------------><td><img src="/doc/images/cgrn.png" alt="Yes"/></td><td><img src="/doc/images/cgrn.png" alt="Yes"/></td><td><img src="/doc/images/cgrn.png" alt="Yes"/></td><td><img src="/doc/images/cgrn.png" alt="Yes"/></td>
@@ -164,7 +164,7 @@
 <!-- Since -----------------><td>0.7.0</td>
 <!-- Build Systems ---------><td><img src="/doc/images/cgrn.png" alt="Yes"/></td><td><img src="/doc/images/cred.png" alt=""/></td>
 <!-- Language Levels -------><td>1.21</td><td>1.22</td>
-<!-- Field types -----------><td><img src="/doc/images/cred.png" alt=""/></td>
+<!-- Field types -----------><td><img src="/doc/images/cgrn.png" alt="Yes"/></td>
 <!-- Low-Level Transports --><td><img src="/doc/images/cred.png" alt=""/></td><td><img src="/doc/images/cred.png" alt=""/></td><td><img src="/doc/images/cgrn.png" alt="Yes"/></td><td><img src="/doc/images/cred.png" alt=""/></td><td><img src="/doc/images/cgrn.png" alt="Yes"/></td><td><img src="/doc/images/cgrn.png" alt="Yes"/></td>
 <!-- Transport Wrappers ----><td><img src="/doc/images/cgrn.png" alt="Yes"/></td><td><img src="/doc/images/cgrn.png" alt="Yes"/></td><td><img src="/doc/images/cgrn.png" alt="Yes"/></td><td><img src="/doc/images/cgrn.png" alt="Yes"/></td>
 <!-- Protocols -------------><td><img src="/doc/images/cgrn.png" alt="Yes"/></td><td><img src="/doc/images/cgrn.png" alt="Yes"/></td><td><img src="/doc/images/cgrn.png" alt="Yes"/></td><td><img src="/doc/images/cgrn.png" alt="Yes"/></td>
@@ -176,7 +176,7 @@
 <!-- Since -----------------><td>0.9.3</td>
 <!-- Build Systems ---------><td><img src="/doc/images/cgrn.png" alt="Yes"/></td><td><img src="/doc/images/cred.png" alt=""/></td>
 <!-- Language Levels -------><td>4.1.5</td><td>4.2.5</td>
-<!-- Field types -----------><td><img src="/doc/images/cred.png" alt=""/></td>
+<!-- Field types -----------><td><img src="/doc/images/cgrn.png" alt="Yes"/></td>
 <!-- Low-Level Transports --><td><img src="/doc/images/cred.png" alt=""/></td><td><img src="/doc/images/cgrn.png" alt="Yes"/></td><td><img src="/doc/images/cred.png" alt=""/></td><td><img src="/doc/images/cred.png" alt=""/></td><td><img src="/doc/images/cgrn.png" alt="Yes"/></td><td><img src="/doc/images/cred.png" alt=""/></td>
 <!-- Transport Wrappers ----><td><img src="/doc/images/cgrn.png" alt="Yes"/></td><td><img src="/doc/images/cred.png" alt=""/></td><td><img src="/doc/images/cgrn.png" alt="Yes"/></td><td><img src="/doc/images/cred.png" alt=""/></td>
 <!-- Protocols -------------><td><img src="/doc/images/cgrn.png" alt="Yes"/></td><td><img src="/doc/images/cgrn.png" alt="Yes"/></td><td><img src="/doc/images/cgrn.png" alt="Yes"/></td><td><img src="/doc/images/cgrn.png" alt="Yes"/></td>
@@ -344,7 +344,7 @@
 <!-- Since -----------------><td>0.12.0</td>
 <!-- Build Systems ---------><td><img src="/doc/images/cgrn.png" alt="Yes"/></td><td><img src="/doc/images/cred.png" alt=""/></td>
 <!-- Language Levels -------><td colspan=2>5.7</td>
-<!-- Field types -----------><td><img src="/doc/images/cred.png" alt=""/></td>
+<!-- Field types -----------><td><img src="/doc/images/cgrn.png" alt="Yes"/></td>
 <!-- Low-Level Transports --><td><img src="/doc/images/cred.png" alt=""/></td><td><img src="/doc/images/cgrn.png" alt="Yes"/></td><td><img src="/doc/images/cgrn.png" alt="Yes"/></td><td><img src="/doc/images/cred.png" alt=""/></td><td><img src="/doc/images/cgrn.png" alt="Yes"/></td><td><img src="/doc/images/cgrn.png" alt="Yes"/></td>
 <!-- Transport Wrappers ----><td><img src="/doc/images/cgrn.png" alt="Yes"/></td><td><img src="/doc/images/cred.png" alt=""/></td><td><img src="/doc/images/cgrn.png" alt="Yes"/></td><td><img src="/doc/images/cred.png" alt=""/></td>
 <!-- Protocols -------------><td><img src="/doc/images/cgrn.png" alt="Yes"/></td><td><img src="/doc/images/cgrn.png" alt="Yes"/></td><td><img src="/doc/images/cred.png" alt=""/></td><td><img src="/doc/images/cgrn.png" alt="Yes"/></td>
diff --git a/Makefile.am b/Makefile.am
index b2e5b18..df74904 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -131,6 +131,9 @@
 style-local:
 	codespell --write-changes --skip=$(skipped_files) --disable-colors
 
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
 EXTRA_DIST = \
 	.asf.yaml \
 	.clang-format \
@@ -141,6 +144,12 @@
 	.flake8 \
 	.gitattributes \
 	.gitignore \
+	.github/dependabot.yml \
+	.github/pull_request_template.md \
+	.github/stale.yml \
+	.github/workflows/build.yml \
+	.github/workflows/cmake.yml \
+	.github/workflows/pypi.yml \
 	.travis.yml \
 	ApacheThrift.nuspec \
 	appveyor.yml \
diff --git a/build/appveyor/MSVC-appveyor-full.bat b/build/appveyor/MSVC-appveyor-full.bat
index 49a3f94..d0f0347 100644
--- a/build/appveyor/MSVC-appveyor-full.bat
+++ b/build/appveyor/MSVC-appveyor-full.bat
@@ -137,7 +137,7 @@
 
 :: Adobe Flex SDK 4.6 for ActionScript
 MKDIR "C:\Adobe\Flex\SDK\4.6" || EXIT /B
-appveyor DownloadFile http://download.macromedia.com/pub/flex/sdk/flex_sdk_4.6.zip -FileName C:\Adobe\Flex\SDK\4.6\SDK.zip || EXIT /B
+appveyor DownloadFile https://fpdownload.adobe.com/pub/flex/sdk/builds/flex4.6/flex_sdk_4.6.0.23201B.zip -FileName C:\Adobe\Flex\SDK\4.6\SDK.zip || EXIT /B
 CD "C:\Adobe\Flex\SDK\4.6" || EXIT /B
 7z x SDK.zip || EXIT /B
 SETX FLEX_HOME "C:\Adobe\Flex\SDK\4.6"
diff --git a/build/cmake/ThriftConfig.cmake.in b/build/cmake/ThriftConfig.cmake.in
index 2f2003b..f132fe1 100644
--- a/build/cmake/ThriftConfig.cmake.in
+++ b/build/cmake/ThriftConfig.cmake.in
@@ -40,6 +40,13 @@
     set(THRIFT_LIBRARIES thriftz::thriftz)
 endif()
 
+if(@Qt5_FOUND@ AND @WITH_QT5@)
+    if (NOT TARGET thriftqt5::thriftqt5)
+        include("${THRIFT_CMAKE_DIR}/thriftqt5Targets.cmake")
+    endif()
+    set(THRIFT_LIBRARIES thriftqt5::thriftqt5)
+endif()
+
 if ("${THRIFT_LIBRARIES}" STREQUAL "")
     message(FATAL_ERROR "thrift libraries were not found")
 endif()
diff --git a/build/docker/README.md b/build/docker/README.md
index 9c9175f..2a338b4 100644
--- a/build/docker/README.md
+++ b/build/docker/README.md
@@ -20,12 +20,12 @@
 
 | Variable | Default | Usage |
 | -------- | ----- | ------- |
-| `DISTRO` | `ubuntu-bionic` | Set by various build jobs in `.travis.yml` to run builds in different containers.  Not intended to be set externally.|
+| `DISTRO` | `ubuntu-focal` | Set by various build jobs in `.travis.yml` to run builds in different containers.  Not intended to be set externally.|
 | `DOCKER_REPO` | `thrift/thrift-build` | The name of the Docker Hub repository to obtain and store docker images. |
 | `DOCKER_USER` | `<none>` | The Docker Hub account name containing the repository. |
 | `DOCKER_PASS` | `<none>` | The Docker Hub account password to use when pushing new tags. |
 
-For example, the default docker image that is used in builds if no overrides are specified would be: `thrift/thrift-build:ubuntu-bionic`
+For example, the default docker image that is used in builds if no overrides are specified would be: `thrift/thrift-build:ubuntu-focal`
 
 ### Forks ###
 
@@ -46,14 +46,13 @@
 
 ## Supported Containers ##
 
-The Travis CI (continuous integration) builds use the Ubuntu Bionic
-(18.04 LTS) and Xenial (16.04 LTS) images to maximize language level
+The Travis CI (continuous integration) builds use the Ubuntu Jammy
+(22.04 LTS) and Focal (20.04 LTS) images to maximize language level
 coverage.
 
 ### Ubuntu ###
 
 * focal (stable, current)
-* bionic (previous stable)
 * jammy (next stable, WIP)
 
 ## Unsupported Containers ##
@@ -105,16 +104,16 @@
 Travis CI does it) - if it is out of date in any way it will build a
 new one for you:
 
-    thrift$ DOCKER_REPO=thrift/thrift-build DISTRO=ubuntu-bionic build/docker/refresh.sh
+    thrift$ DOCKER_REPO=thrift/thrift-build DISTRO=ubuntu-focal build/docker/refresh.sh
 
 To run all unit tests (just like Travis CI does):
 
-    thrift$ dockerrun thrift/thrift-build:ubuntu-bionic
+    thrift$ dockerrun thrift/thrift-build:ubuntu-focal
     root@8caf56b0ce7b:/thrift/src# build/docker/scripts/autotools.sh
 
 To run the cross tests (just like Travis CI does):
 
-    thrift$ dockerrun thrift/thrift-build:ubuntu-bionic
+    thrift$ dockerrun thrift/thrift-build:ubuntu-focal
     root@8caf56b0ce7b:/thrift/src# build/docker/scripts/cross-test.sh
 
 When you are done, you want to clean up occasionally so that docker isn't using lots of extra disk space:
@@ -136,7 +135,14 @@
 
 Build the image:
 
-    thrift$ docker build -t thrift build/docker/ubuntu-bionic
+Linux/Mac:
+
+    thrift$ docker build --build-arg uid=$(id -u) --build-arg gid=$(id -g) -t thrift build/docker/ubuntu-jammy
+
+Windows:
+
+    thrift$ docker build -t thrift build/docker/ubuntu-jammy
+
 
 Open a command prompt in the image:
 
@@ -144,53 +150,52 @@
 
 ## Core Tool Versions per Dockerfile ##
 
-Last updated: October 1, 2017
+Last updated: March 5, 2024
 
-| Tool      | ubuntu-xenial | ubuntu-bionic | Notes |
+| Tool      | ubuntu-focal  | ubuntu-jammy  | Notes |
 | :-------- | :------------ | :------------ | :---- |
-| ant       | 1.9.6         | 1.10.3        |       |
-| autoconf  | 2.69          | 2.69          |       |
-| automake  | 1.15          | 1.15.1        |       |
-| bison     | 3.0.4         | 3.0.4         |       |
-| boost     | 1.58.0        | 1.65.1        |       |
-| cmake     | 3.5.1         | 3.10.2        |       |
-| cppcheck  | 1.72          | 1.82          |       |
-| flex      | 2.6.0         | 2.6.4         |       |
-| libc6     | 2.23          | 2.27          | glibc |
-| libevent  | 2.0.21        | 2.1.8         |       |
-| libstdc++ | 5.4.0         | 7.3.0         |       |
-| make      | 4.1           | 4.1           |       |
-| openssl   | 1.0.2g        | 1.1.0g        |       |
-| qt5       | 5.5.1         | 5.9.5         |       |
+| ant       | 1.10.7        | 1.10.12       |       |
+| autoconf  | 2.69          | 2.71          |       |
+| automake  | 1.16.1        | 1.16.5        |       |
+| bison     | 3.5.1         | 3.8.2         |       |
+| boost     | 1.71.0        | 1.74.0        |       |
+| cmake     | 3.16.3        | 3.22.1        |       |
+| cppcheck  | 1.90          | 2.7           |       |
+| flex      | 2.6.4         | 2.6.4         |       |
+| libc6     | 2.31          | 2.35          | glibc |
+| libevent  | 2.0.16        | 2.0.16        |       |
+| libstdc++ | 10.5.0        | 10.5.0        |       |
+| make      | 4.2.1         | 4.3           |       |
+| openssl   | 1.1.1f        | 3.0.2         |       |
+| qt5       | 5.12.8        | 5.15.3        |       |
 
 ## Compiler/Language Versions per Dockerfile ##
 
-| Language  | ubuntu-xenial | ubuntu-bionic | Notes |
+| Language  | ubuntu-focal  | ubuntu-jammy  | Notes |
 | :-------- | :------------ | :------------ | :---- |
 | as of     | Mar 06, 2018  | Jul 1, 2019   |       |
-| as3       |               | 4.6.0         |       |
-| C++ gcc   | 5.4.0         | 7.4.0         |       |
-| C++ clang | 3.8           | 6.0           |       |
-| C# (mono) | 4.2.1.0       | 4.6.2.7       |       |
-| c\_glib    | 2.48.2        | 2.56.4        |       |
+| as3       | 4.6.0         | 4.6.0         |       |
+| C++ gcc   | 9.4.0         | 11.4.0        |       |
+| C++ clang | 13.0.0        | 13.0.0        |       |
+| c\_glib   | 3.2.12        | 3.2.12        |       |
 | cl (sbcl) |               | 1.5.3         |       |
 | d         | 2.087.0       | 2.087.0       |       |
-| dart      | 2.0.0         | 2.4.0         |       |
+| dart      | 2.7.2-1       | 2.7.2-1       |       |
 | delphi    |               |               | Not in CI |
-| erlang    | OTP-20        | OTP-25        |       |
-| go        | 1.15.10       | 1.16.2        |       |
-| haxe      | 3.2.1         | 3.4.4         | THRIFT-4352: avoid 3.4.2 |
-| java      | 1.8.0\_191     | 17           |       |
-| js        | Node.js 6.17.1, V8 5.1.281.111, npm 3.10.10 | Node.js 10.18.0, V8 6.8.275.32, npm 6.13.4 |     |
-| lua       |               | 5.2.4         | Lua 5.3: see THRIFT-4386 |
-| netstd    | 7.0           | 7.0           |       |
-| nodejs    | 6.16.0        | 10.16.0       |       |
-| ocaml     |               | 4.05.0        | THRIFT-4517: ocaml 4.02.3 on xenial appears broken |
-| perl      | 5.22.1        | 5.26.1        |       |
-| php       | 7.0.32        | 7.2.19        |       |
-| python    | 2.7.12        | 2.7.15        |       |
-| python3   | 3.5.2         | 3.6.8         |       |
-| ruby      | 2.3.1p112     | 2.5.1p57      |       |
+| erlang    | OTP-25.3.2.9  | OTP-25.3.2.9  |       |
+| go        | 1.21.7        | 1.21.7        |       |
+| haxe      | 4.2.1         | 4.2.1         |       |
+| java      | 17            | 17            |       |
+| js        | Node.js 16.20.2, npm 8.19.4 | Node.js 16.20.2, npm 8.19.4 |     |
+| lua       | 5.2.4         | 5.2.4         | Lua 5.3: see THRIFT-4386 |
+| netstd    | 8.0.200       | 8.0.200       |       |
+| nodejs    | 16.20.2       | 16.20.2       |       |
+| ocaml     | 4.08.1        | 4.13.1        |       |
+| perl      | 5.30.0        | 5.34.0        |       |
+| php       | 7.4.3         | 8.1.2         |       |
+| python2   | 2.7.18        |               |       |
+| python3   | 3.8.10        | 3.10.12       |       |
+| ruby      | 2.7.0p0       | 3.0.2p107     |       |
 | rust      | 1.65.0        | 1.65.0        |       |
 | smalltalk |               |               | Not in CI |
-| swift     |               | 5.1.4         |       |
+| swift     | 5.7           | 5.7           |       |
diff --git a/build/docker/msvc2017/Dockerfile b/build/docker/msvc2017/Dockerfile
index d59c195..a29753e 100644
--- a/build/docker/msvc2017/Dockerfile
+++ b/build/docker/msvc2017/Dockerfile
@@ -67,7 +67,7 @@
 
 # Install zlib
 COPY appveyor\build-zlib.bat C:\TEMP\build-zlib.bat
-ENV ZLIB_VERSION=1.2.11
+ENV ZLIB_VERSION=1.2.13
 ENV WIN3P=C:\TEMP\WIN3P
 RUN C:\BuildTools\Common7\Tools\VsDevCmd.bat -arch=amd64 && `
     MKDIR C:\TEMP\WIN3P && `
@@ -76,7 +76,7 @@
     RMDIR /S /Q C:\TEMP\WIN3P
 
 # Install OpenSSL 1.1.0
-ADD http://slproweb.com/download/Win64OpenSSL-1_1_0j.exe C:\TEMP\openssl.exe
+ADD http://slproweb.com/download/Win64OpenSSL-1_1_0l.exe C:\TEMP\openssl.exe
 RUN C:\TEMP\openssl.exe /silent && `
     DEL C:\TEMP\openssl.exe
 
diff --git a/build/docker/old/Vagrantfile b/build/docker/old/Vagrantfile
deleted file mode 100644
index 5eac6e6..0000000
--- a/build/docker/old/Vagrantfile
+++ /dev/null
@@ -1,59 +0,0 @@
-# -*- mode: ruby -*-
-# vi: set ft=ruby :
-#
-# Licensed 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.
-
-# Base system bootstrap script
-$bootstrap_script = <<__BOOTSTRAP__
-echo "Provisioning defaults"
-
-sudo apt-get update -y
-sudo apt-get upgrade -y
-
-# Install default packages
-sudo apt-get install -y build-essential curl git
-
-# Install latest Docker version
-sudo curl -sSL https://get.docker.io/gpg | sudo apt-key add -
-sudo echo "deb http://get.docker.io/ubuntu docker main" > /etc/apt/sources.list.d/docker.list
-sudo apt-get update -y
-sudo apt-get install -y linux-image-extra-`uname -r` aufs-tools
-sudo apt-get install -y lxc-docker
-
-echo "Finished provisioning defaults"
-__BOOTSTRAP__
-
-Vagrant.configure("2") do |config|
-  config.vm.box = "trusty64"
-  config.vm.box_url = "https://cloud-images.ubuntu.com/vagrant/trusty/current/trusty-server-cloudimg-amd64-vagrant-disk1.box"
-  config.ssh.forward_agent = true
-
-  config.vm.provider :virtualbox do |vbox|
-    vbox.customize ["modifyvm", :id, "--memory", "1024"]
-    vbox.customize ["modifyvm", :id, "--cpus", "2"]
-  end
-
-  # Setup the default bootstrap script for our ubuntu base box image
-  config.vm.provision "shell", inline: $bootstrap_script
-
-  # Setup the custom docker image from our Ubuntu Dockerfile
-  config.vm.provision "docker" do |d|
-    d.build_image "/vagrant/ubuntu", args: "-t thrift"
-  end
-
-  # Setup the custom docker image from our Centos Dockerfile
-  #config.vm.provision "docker" do |d|
-  #  d.build_image "/vagrant/centos", args: "-t thrift-centos"
-  #end
-
-end
diff --git a/build/docker/old/centos-7.3/Dockerfile b/build/docker/old/centos-7.3/Dockerfile
deleted file mode 100644
index ba4c549..0000000
--- a/build/docker/old/centos-7.3/Dockerfile
+++ /dev/null
@@ -1,196 +0,0 @@
-# Licensed 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.
-
-# Apache Thrift Docker build environment for CentOS
-#
-# Known missing client libraries:
-#  - dotnet (will update to 2.0.0 separately)
-#  - haxe (not in centos)
-
-FROM centos:7.3.1611
-MAINTAINER Apache Thrift <dev@thrift.apache.org>
-
-RUN yum install -y epel-release
-
-# General dependencies
-RUN yum install -y \
-      autoconf \
-      bison \
-      bison-devel \
-      clang \
-      clang-analyzer \
-      cmake3 \
-      curl \
-      flex \
-      gcc \
-      gcc-c++ \
-      gdb \
-      git \
-      libtool \
-      m4 \
-      make \
-      tar \
-      unzip \
-      valgrind \
-      wget && \
-      ln -s /usr/bin/cmake3 /usr/bin/cmake && \
-      ln -s /usr/bin/cpack3 /usr/bin/cpack && \
-      ln -s /usr/bin/ctest3 /usr/bin/ctest
-
-# C++ dependencies
-RUN yum install -y \
-      boost-devel-static \
-      zlib-devel \
-      openssl-devel \
-      libevent-devel && \
-    cd /usr/lib64 && \
-    ln -s libboost_thread-mt.a libboost_thread.a
-
-# C# Dependencies
-RUN yum install -y \
-      mono-core \
-      mono-devel \
-      mono-web-devel \
-      mono-extras
-
-# D Dependencies
-RUN yum install -y http://downloads.dlang.org/releases/2.x/2.076.0/dmd-2.076.0-0.fedora.x86_64.rpm xdg-utils
-RUN curl -sSL https://github.com/D-Programming-Deimos/openssl/archive/master.tar.gz| tar xz && \
-    curl -sSL https://github.com/D-Programming-Deimos/libevent/archive/master.tar.gz| tar xz && \
-    mkdir -p /usr/include/dmd/druntime/import/deimos /usr/include/dmd/druntime/import/C && \
-    mv libevent-master/deimos/* openssl-master/deimos/* /usr/include/dmd/druntime/import/deimos/ && \
-    mv libevent-master/C/* openssl-master/C/* /usr/include/dmd/druntime/import/C/ && \
-    rm -rf libevent-master openssl-master
-
-# Dart
-RUN cd /usr/local && \
-    wget -q https://storage.googleapis.com/dart-archive/channels/stable/release/1.24.2/sdk/dartsdk-linux-x64-release.zip && \
-    unzip -q dartsdk-linux-x64-release.zip && \
-    rm dartsdk-linux-x64-release.zip
-ENV PATH /usr/local/dart-sdk/bin:$PATH
-
-# Erlang Dependencies
-RUN curl -sSL http://packages.erlang-solutions.com/rpm/centos/erlang_solutions.repo -o /etc/yum.repos.d/erlang_solutions.repo && \
-    yum install -y \
-      erlang-kernel \
-      erlang-erts \
-      erlang-stdlib \
-      erlang-eunit \
-      erlang-rebar \
-      erlang-tools
-
-# GLibC Dependencies
-RUN yum install -y glib2-devel
-
-# Go Dependencies
-RUN curl -sSL https://storage.googleapis.com/golang/go1.9.linux-amd64.tar.gz | tar -C /usr/local/ -xz
-ENV PATH /usr/local/go/bin:$PATH
-
-# Haxe Dependencies
-# Not in debian/stretch
-
-# Java Dependencies
-RUN yum install -y \
-      ant \
-      junit \
-      ant-junit \
-      java-1.8.0-openjdk-devel
-
-# Lua Dependencies
-# Lua in epel is too old (5.1.4, need 5.2) so we get the latest
-RUN yum install -y readline-devel && \
-    wget -q http://www.lua.org/ftp/lua-5.3.4.tar.gz && \
-    tar xzf lua-5.3.4.tar.gz && \
-    cd lua-5.3.4 && \
-    sed -i 's/CFLAGS= /CFLAGS= -fPIC /g' src/Makefile && \
-    make linux && \
-    make install && \
-    cd .. && \
-    rm -rf lua-5*
-
-# MinGW Dependencies
-RUN yum install -y \
-      mingw32-binutils \
-      mingw32-crt \
-      mingw32-nsis
-
-# Node.js Dependencies
-# Work around epel issue where they removed http-parser that nodejs depends on!
-RUN yum -y install https://opensource.enda.eu/packages/http-parser-2.7.1-3.el7.x86_64.rpm
-RUN yum install -y \
-      nodejs \
-      npm
-
-# Ocaml Dependencies
-RUN yum install -y \
-      ocaml \
-      ocaml-ocamldoc && \
-    wget -q https://raw.github.com/ocaml/opam/master/shell/opam_installer.sh -O - | sh -s /usr/local/bin && \
-    opam init --yes && \
-    opam install --yes oasis && \
-    echo '. /root/.opam/opam-init/init.sh > /dev/null 2> /dev/null || true' >> ~/.bashrc
-
-# Perl Dependencies
-RUN yum install -y \
-      perl \
-      perl-version \
-      perl-Bit-Vector \
-      perl-Class-Accessor \
-      perl-ExtUtils-MakeMaker \
-      perl-Test-Simple \
-      perl-IO-Socket-SSL \
-      perl-Net-SSLeay \
-      perl-Crypt-SSLeay
-
-# PHP Dependencies
-RUN yum install -y \
-      php \
-      php-devel \
-      php-pear \
-      re2c \
-      php-phpunit-PHPUnit \
-      bzip2
-
-# Python Dependencies
-RUN yum install -y \
-      python \
-      python-devel \
-      python-pip \
-      python-setuptools \
-      python34 \
-      python34-devel \
-      python34-pip \
-      python34-setuptools
-RUN pip2 install --upgrade pip
-RUN pip2 install --upgrade backports.ssl_match_hostname ipaddress setuptools six tornado tornado-testing twisted virtualenv zope-interface
-RUN pip3 install --upgrade pip
-RUN pip3 install --upgrade backports.ssl_match_hostname ipaddress setuptools six tornado tornado-testing twisted virtualenv zope-interface
-
-# Ruby Dependencies
-RUN yum install -y \
-      ruby \
-      ruby-devel \
-      rubygems && \
-    gem install bundler rake
-
-# Rust
-RUN curl https://sh.rustup.rs -sSf | sh -s -- -y --default-toolchain 1.17.0
-ENV PATH /root/.cargo/bin:$PATH
-
-# Clean up
-RUN rm -rf /tmp/* && \
-    yum clean all
-
-ENV THRIFT_ROOT /thrift
-RUN mkdir -p $THRIFT_ROOT/src
-COPY Dockerfile $THRIFT_ROOT/
-WORKDIR $THRIFT_ROOT/src
diff --git a/build/docker/old/debian-jessie/Dockerfile b/build/docker/old/debian-jessie/Dockerfile
deleted file mode 100644
index 15e02e9..0000000
--- a/build/docker/old/debian-jessie/Dockerfile
+++ /dev/null
@@ -1,197 +0,0 @@
-# Licensed 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.
-
-# Apache Thrift Docker build environment for Debian
-#
-# Known missing client libraries:
-#  - dotnetcore
-#  - rust
-
-FROM buildpack-deps:jessie-scm
-MAINTAINER Apache Thrift <dev@thrift.apache.org>
-
-ENV DEBIAN_FRONTEND noninteractive
-
-# Add apt sources
-# jessie-backports for cmake and some ruby bits
-RUN echo "deb http://ftp.debian.org/debian jessie-backports main" > /etc/apt/sources.list.d/jessie-backports.list
-
-# Dart
-RUN curl https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - && \
-    curl https://storage.googleapis.com/download.dartlang.org/linux/debian/dart_stable.list > /etc/apt/sources.list.d/dart_stable.list && \
-    sed -i /etc/apt/sources.list.d/dart_stable.list -e 's/https:/http:/g'
-
-RUN apt-get update && apt-get install -y --no-install-recommends \
-`# General dependencies` \
-      bison \
-      build-essential \
-      clang \
-      debhelper \
-      flex \
-      pkg-config && \
-    apt-get -t jessie-backports install -y --no-install-recommends cmake
-
-RUN apt-get install -y --no-install-recommends \
-`# C++ dependencies` \
-      libboost-dev \
-      libboost-filesystem-dev \
-      libboost-program-options-dev \
-      libboost-system-dev \
-      libboost-test-dev \
-      libboost-thread-dev \
-      libevent-dev \
-      libssl-dev \
-      qt5-default \
-      qtbase5-dev \
-      qtbase5-dev-tools
-
-RUN apt-get install -y --no-install-recommends \
-`# Java dependencies` \
-      ant \
-      ant-optional \
-      openjdk-7-jdk \
-      maven
-
-RUN apt-get install -y --no-install-recommends \
-`# Python dependencies` \
-      python-all \
-      python-all-dbg \
-      python-all-dev \
-      python-pip \
-      python-setuptools \
-      python-twisted \
-      python-zope.interface \
-      python3-all \
-      python3-all-dbg \
-      python3-all-dev \
-      python3-setuptools \
-      python3-pip
-
-RUN apt-get install -y --no-install-recommends \
-`# Ruby dependencies` \
-      ruby \
-      ruby-bundler \
-      ruby-dev \
-`# Perl dependencies` \
-      libbit-vector-perl \
-      libclass-accessor-class-perl \
-      libcrypt-ssleay-perl \
-      libio-socket-ssl-perl \
-      libnet-ssleay-perl
-
-RUN apt-get -t jessie-backports install -y ruby-bundler
-RUN apt-get install -y --no-install-recommends \
-`# Php dependencies` \
-      php5 \
-      php5-dev \
-      php5-cli \
-      php-pear \
-      re2c \
-      phpunit \
-`# GlibC dependencies` \
-      libglib2.0-dev
-
-RUN apt-get update && apt-get install -y --no-install-recommends \
-`# Erlang dependencies` \
-      erlang-base \
-      erlang-eunit \
-      erlang-dev \
-      erlang-tools \
-      rebar
-
-RUN apt-get update && apt-get install -y --no-install-recommends \
-`# Haxe dependencies` \
-      neko \
-      neko-dev \
-      libneko0
-
-RUN apt-get update && apt-get install -y --no-install-recommends \
-`# Node.js dependencies` \
-      nodejs \
-      nodejs-dev \
-      nodejs-legacy \
-      npm
-
-RUN apt-get update && apt-get install -y --no-install-recommends \
-`# D dependencies` \
-      xdg-utils \
-`# Dart dependencies` \
-      dart \
-`# Lua dependencies` \
-      lua5.2 \
-      lua5.2-dev \
-`# MinGW dependencies` \
-      mingw32 \
-      mingw32-binutils \
-`#      mingw32-runtime` \
-      nsis \
-`# Clean up` \
-    && rm -rf /var/cache/apt/* && \
-    rm -rf /var/lib/apt/lists/* && \
-    rm -rf /tmp/* && \
-    rm -rf /var/tmp/*
-
-# Ruby
-RUN gem install bundler --no-ri --no-rdoc
-
-# Python optional dependencies
-RUN pip2 install -U ipaddress backports.ssl_match_hostname tornado
-RUN pip3 install -U backports.ssl_match_hostname tornado
-
-# Go
-RUN curl -sSL https://storage.googleapis.com/golang/go1.4.3.linux-amd64.tar.gz | tar -C /usr/local/ -xz
-ENV PATH /usr/local/go/bin:$PATH
-
-# Haxe
-RUN mkdir -p /usr/lib/haxe && \
-    wget -O - https://github.com/HaxeFoundation/haxe/releases/download/3.2.1/haxe-3.2.1-linux64.tar.gz | \
-    tar -C /usr/lib/haxe --strip-components=1 -xz && \
-    ln -s /usr/lib/haxe/haxe /usr/bin/haxe && \
-    ln -s /usr/lib/haxe/haxelib /usr/bin/haxelib && \
-    mkdir -p /usr/lib/haxe/lib  && \
-    chmod -R 777 /usr/lib/haxe/lib && \
-    haxelib setup /usr/lib/haxe/lib && \
-    haxelib install hxcpp
-
-# D
-RUN curl -sSL http://downloads.dlang.org/releases/2.x/2.070.0/dmd_2.070.0-0_amd64.deb -o /tmp/dmd_2.070.0-0_amd64.deb && \
-    dpkg -i /tmp/dmd_2.070.0-0_amd64.deb && \
-    rm /tmp/dmd_2.070.0-0_amd64.deb && \
-    curl -sSL https://github.com/D-Programming-Deimos/openssl/archive/master.tar.gz| tar xz && \
-    curl -sSL https://github.com/D-Programming-Deimos/libevent/archive/master.tar.gz| tar xz && \
-    mkdir -p /usr/include/dmd/druntime/import/deimos /usr/include/dmd/druntime/import/C && \
-    mv libevent-master/deimos/* openssl-master/deimos/* /usr/include/dmd/druntime/import/deimos/ && \
-    mv libevent-master/C/* openssl-master/C/* /usr/include/dmd/druntime/import/C/ && \
-    rm -rf libevent-master openssl-master && \
-    echo 'gcc -Wl,--no-as-needed $*' > /usr/local/bin/gcc-dmd && \
-    chmod 755 /usr/local/bin/gcc-dmd && \
-    echo 'CC=/usr/local/bin/gcc-dmd' >> /etc/dmd.conf
-
-# Dart
-ENV PATH /usr/lib/dart/bin:$PATH
-
-# OCaml
-RUN echo 'deb http://ppa.launchpad.net/avsm/ppa/ubuntu trusty main' > /etc/apt/sources.list.d/avsm-official-ocaml.list && \
-    gpg --keyserver keyserver.ubuntu.com --recv 61707B09 && \
-    gpg --export --armor 61707B09 | apt-key add - && \
-    apt-get update && \
-    apt-get install -y ocaml opam && \
-    opam init && \
-    opam install oasis
-
-# Force utf8 locale to successfully build Haskell tf-random
-ENV LC_ALL C.UTF-8
-
-ENV THRIFT_ROOT /thrift
-RUN mkdir -p $THRIFT_ROOT/src
-COPY Dockerfile $THRIFT_ROOT/
-WORKDIR $THRIFT_ROOT/src
diff --git a/build/docker/old/debian-stretch/Dockerfile b/build/docker/old/debian-stretch/Dockerfile
deleted file mode 100644
index f584bba..0000000
--- a/build/docker/old/debian-stretch/Dockerfile
+++ /dev/null
@@ -1,225 +0,0 @@
-# Licensed 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.
-
-# Apache Thrift Docker build environment for Debian Stretch
-#
-# Known issues:
-# - d: deimos for libevent and openssl disabled - build errors
-# - dotnetcore, because netcore is for 1.0.0-preview and 2.0.0 is out
-# - rust: cargo not in debian repo - perhaps not needed?
-
-FROM buildpack-deps:stretch-scm
-MAINTAINER Apache Thrift <dev@thrift.apache.org>
-
-ENV DEBIAN_FRONTEND noninteractive
-
-### Add apt repos
-
-RUN apt-get update && apt-get install -y --no-install-recommends apt apt-transport-https curl wget apt-utils
-
-# D
-RUN wget http://master.dl.sourceforge.net/project/d-apt/files/d-apt.list -O /etc/apt/sources.list.d/d-apt.list && \
-    apt-get update && apt-get -y --allow-unauthenticated install --reinstall d-apt-keyring
-
-# Dart
-RUN curl https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - && \
-    curl https://storage.googleapis.com/download.dartlang.org/linux/debian/dart_stable.list > /etc/apt/sources.list.d/dart_stable.list && \
-    sed -i /etc/apt/sources.list.d/dart_stable.list -e 's/https:/http:/g'
-
-# dotnet (core) 2.0.0 - project isn't ready for this yet:
-# RUN curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > /etc/apt/trusted.gpg.d/microsoft.gpg && \
-#     echo "deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-xenial-prod xenial main" > /etc/apt/sources.list.d/dotnetdev.list
-
-# node.js (this step runs apt-get update internally)
-RUN curl -sL https://deb.nodesource.com/setup_8.x | bash
-
-
-### install general dependencies
-RUN apt-get install -y --no-install-recommends \
-`# General dependencies` \
-      bash-completion \
-      bison \
-      build-essential \
-      clang \
-      cmake \
-      debhelper \
-      flex \
-      gdb \
-      ninja-build \
-      pkg-config \
-      valgrind \
-      vim
-
-
-### languages
-
-RUN apt-get install -y --no-install-recommends \
-`# C++ dependencies` \
-      libboost-dev \
-      libboost-filesystem-dev \
-      libboost-program-options-dev \
-      libboost-system-dev \
-      libboost-test-dev \
-      libboost-thread-dev \
-      libevent-dev \
-      libssl-dev \
-      qt5-default \
-      qtbase5-dev \
-      qtbase5-dev-tools
-
-RUN apt-get install -y --no-install-recommends \
-`# D dependencies` \
-      dmd-bin \
-      libevent-dev \
-      libssl-dev \
-      xdg-utils
-# libevent deimos disabled - build errors
-# RUN mkdir -p /usr/include/dmd/druntime/import/deimos /usr/include/dmd/druntime/import/C && \
-#     curl -sSL https://github.com/D-Programming-Deimos/libevent/archive/master.tar.gz| tar xz && \
-#     mv libevent-master/deimos/* /usr/include/dmd/druntime/import/deimos/ && \
-#     mv libevent-master/C/* /usr/include/dmd/druntime/import/C/ && \
-#     rm -rf libevent-master
-# openssl deimos doesn't work with openssl-1.1.0 - disabling it for now:
-# RUN curl -sSL https://github.com/D-Programming-Deimos/openssl/archive/master.tar.gz| tar xz && \
-#     mv openssl-master/deimos/* /usr/include/dmd/druntime/import/deimos/ && \
-#     mv openssl-master/C/* /usr/include/dmd/druntime/import/C/ && \
-#     rm -rf openssl-master
-
-RUN apt-get install -y --no-install-recommends \
-`# Dart dependencies` \
-      dart
-ENV PATH /usr/lib/dart/bin:$PATH
-
-# project isn't ready for this quite yet:
-# RUN apt-get install -y --no-install-recommends \
-# `# dotnet core dependencies` \
-#       dotnet-sdk-8.0 \
-#       dotnet-runtime-8.0 \
-#       aspnetcore-runtime-8.0 \
-#       dotnet-apphost-pack-8.0
-
-RUN apt-get install -y --no-install-recommends \
-`# Erlang dependencies` \
-      erlang-base \
-      erlang-eunit \
-      erlang-dev \
-      erlang-tools \
-      rebar
-
-RUN apt-get install -y --no-install-recommends \
-`# GlibC dependencies` \
-      libglib2.0-dev
-
-RUN apt-get install -y --no-install-recommends \
-`# golang (go) dependencies` \
-      golang-go
-
-RUN apt-get install -y --no-install-recommends \
-`# Haxe dependencies` \
-      haxe \
-      neko \
-      neko-dev
-RUN haxelib setup --always /usr/share/haxe/lib && \
-    haxelib install --always hxcpp
-
-RUN apt-get install -y --no-install-recommends \
-`# Java dependencies` \
-      ant \
-      ant-optional \
-      openjdk-8-jdk \
-      maven
-
-RUN apt-get install -y --no-install-recommends \
-`# Lua dependencies` \
-      lua5.2 \
-      lua5.2-dev
-# https://bugs.launchpad.net/ubuntu/+source/lua5.3/+bug/1707212
-# same for debian stretch
-# lua5.3 does not install alternatives so stick with 5.2 here
-
-RUN apt-get install -y --no-install-recommends \
-`# Node.js dependencies` \
-      nodejs
-
-RUN apt-get install -y --no-install-recommends \
-`# OCaml dependencies` \
-      ocaml \
-      opam && \
-    opam init --yes && \
-    opam install --yes oasis
-
-RUN apt-get install -y --no-install-recommends \
-`# Perl dependencies` \
-      libbit-vector-perl \
-      libclass-accessor-class-perl \
-      libcrypt-ssleay-perl \
-      libio-socket-ssl-perl \
-      libnet-ssleay-perl
-
-RUN apt-get install -y --no-install-recommends \
-`# Php dependencies` \
-      php7.0 \
-      php7.0-cli \
-      php7.0-dev \
-      php-pear \
-      re2c \
-      phpunit
-
-RUN apt-get install -y --no-install-recommends \
-`# Python dependencies` \
-      python-all \
-      python-all-dbg \
-      python-all-dev \
-      python-backports.ssl-match-hostname \
-      python-ipaddress \
-      python-pip \
-      python-setuptools \
-      python-six \
-      python-tornado \
-      python-twisted \
-      python-wheel \
-      python-zope.interface \
-      python3-all \
-      python3-all-dbg \
-      python3-all-dev \
-      python3-setuptools \
-      python3-six \
-      python3-tornado \
-      python3-twisted \
-      python3-wheel \
-      python3-zope.interface && \
-    pip install --upgrade backports.ssl_match_hostname
-
-RUN apt-get install -y --no-install-recommends \
-`# Ruby dependencies` \
-      ruby \
-      ruby-dev \
-      ruby-bundler
-RUN gem install bundler --no-ri --no-rdoc
-
-RUN apt-get install -y --no-install-recommends \
-`# Rust dependencies` \
-      rustc
-
-# Update anything else left hanging
-RUN apt-get dist-upgrade -y
-
-# Clean up
-RUN rm -rf /var/cache/apt/* && \
-    rm -rf /var/lib/apt/lists/* && \
-    rm -rf /tmp/* && \
-    rm -rf /var/tmp/*
-
-ENV THRIFT_ROOT /thrift
-RUN mkdir -p $THRIFT_ROOT/src
-COPY Dockerfile $THRIFT_ROOT/
-WORKDIR $THRIFT_ROOT/src
diff --git a/build/docker/old/ubuntu-artful/Dockerfile b/build/docker/old/ubuntu-artful/Dockerfile
deleted file mode 100644
index f94b700..0000000
--- a/build/docker/old/ubuntu-artful/Dockerfile
+++ /dev/null
@@ -1,260 +0,0 @@
-# Licensed 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.
-
-#
-# Apache Thrift Docker build environment for Ubuntu Artful
-# Using all stock Ubuntu Artful packaging except for:
-# - cpp: stock boost 1.62 in artful has a nasty bug so we use stock boost 1.63
-# - d: dmd does not come with Ubuntu
-# - dart: does not come with Ubuntu. Pinned to last 1.x release
-# - dotnet: does not come with Ubuntu
-# - haxe: version 3.4.2 that comes with Ubuntu cores in our CI build
-# - go: artful comes with 1.9, we want the latest (supported)
-# - nodejs: want v8, artful comes with v6
-#
-
-FROM buildpack-deps:artful-scm
-MAINTAINER Apache Thrift <dev@thrift.apache.org>
-ENV DEBIAN_FRONTEND noninteractive
-
-### Add apt repos
-
-RUN apt-get update && \
-    apt-get dist-upgrade -y && \
-    apt-get install -y --no-install-recommends \
-      apt \
-      apt-transport-https \
-      apt-utils \
-      curl \
-      dirmngr \
-      software-properties-common \
-      wget
-
-# Dart
-RUN curl https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - && \
-    curl https://storage.googleapis.com/download.dartlang.org/linux/debian/dart_stable.list > \
-      /etc/apt/sources.list.d/dart_stable.list
-ENV DART_VERSION 1.24.3-1
-
-# dotnet (netcore)
-RUN curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > /etc/apt/trusted.gpg.d/microsoft.gpg && \
-    echo "deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-artful-prod artful main" > \
-      /etc/apt/sources.list.d/dotnetdev.list
-
-# haxe (https://haxe.org/download/linux/)
-RUN add-apt-repository ppa:haxe/releases -y
-
-# node.js
-RUN curl -sL https://deb.nodesource.com/gpgkey/nodesource.gpg.key | apt-key add - && \
-    echo "deb https://deb.nodesource.com/node_8.x artful main" | tee /etc/apt/sources.list.d/nodesource.list
-
-### install general dependencies
-RUN apt-get update && apt-get install -y --no-install-recommends \
-`# General dependencies` \
-      bash-completion \
-      bison \
-      build-essential \
-      clang \
-      cmake \
-      debhelper \
-      flex \
-      gdb \
-      llvm \
-      ninja-build \
-      pkg-config \
-      valgrind \
-      vim
-ENV PATH /usr/lib/llvm-3.8/bin:$PATH
-
-# boost-1.62 has a terrible bug in boost::test, see https://svn.boost.org/trac10/ticket/12507
-RUN apt-get install -y --no-install-recommends \
-`# C++ dependencies` \
-      libboost1.63-all-dev \
-      libevent-dev \
-      libssl-dev \
-      qt5-default \
-      qtbase5-dev \
-      qtbase5-dev-tools
-
-ENV SBCL_VERSION 1.4.5
-RUN \
-`# Common Lisp (sbcl) dependencies` \
-    curl --version && \
-    curl -O -J -L https://kent.dl.sourceforge.net/project/sbcl/sbcl/${SBCL_VERSION}/sbcl-${SBCL_VERSION}-x86-64-linux-binary.tar.bz2 && \
-    tar xjf sbcl-${SBCL_VERSION}-x86-64-linux-binary.tar.bz2 && \
-    cd sbcl-${SBCL_VERSION}-x86-64-linux && \
-    ./install.sh && \
-    sbcl --version && \
-    rm -rf sbcl*
-
-ENV D_VERSION     2.080.0
-ENV DMD_DEB       dmd_2.080.0-0_amd64.deb
-RUN \
-`# D dependencies` \
-    wget -q http://downloads.dlang.org/releases/2.x/${D_VERSION}/${DMD_DEB} && \
-    dpkg --install ${DMD_DEB} && \
-    rm -f ${DMD_DEB} && \
-    mkdir -p /usr/include/dmd/druntime/import/deimos /usr/include/dmd/druntime/import/C && \
-    curl -sSL https://github.com/D-Programming-Deimos/libevent/archive/master.tar.gz| tar xz && \
-    mv libevent-master/deimos/* /usr/include/dmd/druntime/import/deimos/ && \
-    mv libevent-master/C/* /usr/include/dmd/druntime/import/C/ && \
-    rm -rf libevent-master && \
-    curl -sSL https://github.com/D-Programming-Deimos/openssl/archive/master.tar.gz| tar xz && \
-    mv openssl-master/deimos/* /usr/include/dmd/druntime/import/deimos/ && \
-    mv openssl-master/C/* /usr/include/dmd/druntime/import/C/ && \
-    rm -rf openssl-master
-
-RUN apt-get install -y --no-install-recommends \
-`# Dart dependencies` \
-      dart=$DART_VERSION
-ENV PATH /usr/lib/dart/bin:$PATH
-
-RUN apt-get install -y --no-install-recommends \
-`# dotnet core dependencies` \
-      dotnet-sdk-8.0 \
-      dotnet-runtime-8.0 \
-      aspnetcore-runtime-8.0 \
-      dotnet-apphost-pack-8.0
-
-RUN apt-get install -y --no-install-recommends \
-`# Erlang dependencies` \
-      erlang-base \
-      erlang-eunit \
-      erlang-dev \
-      erlang-tools \
-      rebar
-
-RUN apt-get install -y --no-install-recommends \
-`# GlibC dependencies` \
-      libglib2.0-dev
-
-# golang
-ENV GOLANG_VERSION 1.10
-ENV GOLANG_DOWNLOAD_URL https://golang.org/dl/go$GOLANG_VERSION.linux-amd64.tar.gz
-ENV GOLANG_DOWNLOAD_SHA256 b5a64335f1490277b585832d1f6c7f8c6c11206cba5cd3f771dcb87b98ad1a33
-RUN curl -fsSL "$GOLANG_DOWNLOAD_URL" -o golang.tar.gz && \
-      echo "$GOLANG_DOWNLOAD_SHA256  golang.tar.gz" | sha256sum -c - && \
-            tar -C /usr/local -xzf golang.tar.gz && \
-                  ln -s /usr/local/go/bin/go /usr/local/bin && \
-                        rm golang.tar.gz
-
-RUN apt-get install -y --no-install-recommends \
-`# Haxe dependencies` \
-      haxe \
-      neko \
-      neko-dev && \
-    haxelib setup --always /usr/share/haxe/lib && \
-    haxelib install --always hxcpp 2>&1 > /dev/null
-
-RUN apt-get install -y --no-install-recommends \
-`# Java dependencies` \
-      ant \
-      ant-optional \
-      openjdk-8-jdk \
-      maven
-
-RUN apt-get install -y --no-install-recommends \
-`# Lua dependencies` \
-      lua5.2 \
-      lua5.2-dev
-# https://bugs.launchpad.net/ubuntu/+source/lua5.3/+bug/1707212
-# lua5.3 does not install alternatives!
-# need to update our luasocket code, lua doesn't have luaL_openlib any more
-
-RUN apt-get install -y --no-install-recommends \
-`# Node.js dependencies` \
-      nodejs
-
-# Test dependencies for running puppeteer
-RUN apt-get install -y --no-install-recommends \
-`# JS dependencies` \
-      libxss1
-
-RUN apt-get install -y --no-install-recommends \
-`# OCaml dependencies` \
-      ocaml \
-      opam && \
-    opam init --yes && \
-    opam install --yes oasis
-
-RUN apt-get install -y --no-install-recommends \
-`# Perl dependencies` \
-      libbit-vector-perl \
-      libclass-accessor-class-perl \
-      libcrypt-ssleay-perl \
-      libio-socket-ssl-perl \
-      libnet-ssleay-perl
-
-RUN apt-get install -y --no-install-recommends \
-`# Php dependencies` \
-      php \
-      php-cli \
-      php-dev \
-      php-pear \
-      re2c \
-      composer
-
-RUN apt-get install -y --no-install-recommends \
-`# Python dependencies` \
-      python-all \
-      python-all-dbg \
-      python-all-dev \
-      python-ipaddress \
-      python-pip \
-      python-setuptools \
-      python-six \
-      python-tornado \
-      python-twisted \
-      python-wheel \
-      python-zope.interface && \
-   pip install --upgrade backports.ssl_match_hostname
-
-RUN apt-get install -y --no-install-recommends \
-`# Python3 dependencies` \
-      python3-all \
-      python3-all-dbg \
-      python3-all-dev \
-      python3-pip \
-      python3-setuptools \
-      python3-six \
-      python3-tornado \
-      python3-twisted \
-      python3-wheel \
-      python3-zope.interface
-
-RUN apt-get install -y --no-install-recommends \
-`# Ruby dependencies` \
-      ruby \
-      ruby-dev \
-      ruby-bundler
-
-RUN apt-get install -y --no-install-recommends \
-`# Rust dependencies` \
-      cargo \
-      rustc
-
-RUN apt-get install -y --no-install-recommends \
-`# Static Code Analysis dependencies` \
-      cppcheck \
-      sloccount && \
-    pip install flake8
-
-# Clean up
-RUN rm -rf /var/cache/apt/* && \
-    rm -rf /var/lib/apt/lists/* && \
-    rm -rf /tmp/* && \
-    rm -rf /var/tmp/*
-
-ENV THRIFT_ROOT /thrift
-RUN mkdir -p $THRIFT_ROOT/src
-COPY Dockerfile $THRIFT_ROOT/
-WORKDIR $THRIFT_ROOT/src
diff --git a/build/docker/old/ubuntu-disco/Dockerfile b/build/docker/old/ubuntu-disco/Dockerfile
deleted file mode 100644
index 39642cf..0000000
--- a/build/docker/old/ubuntu-disco/Dockerfile
+++ /dev/null
@@ -1,296 +0,0 @@
-# Licensed 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.
-
-#
-# Apache Thrift Docker build environment for Ubuntu Disco
-# with some updated packages.
-#
-
-FROM buildpack-deps:disco-scm
-MAINTAINER Apache Thrift <dev@thrift.apache.org>
-ENV DEBIAN_FRONTEND noninteractive
-
-### Add apt repos
-
-RUN apt-get update && \
-      apt-get dist-upgrade -y && \
-      apt-get install -y --no-install-recommends \
-      apt \
-      apt-transport-https \
-      apt-utils \
-      curl \
-      dirmngr \
-      software-properties-common \
-      wget
-
-# Dart
-RUN curl https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - && \
-      curl https://storage.googleapis.com/download.dartlang.org/linux/debian/dart_stable.list > \
-      /etc/apt/sources.list.d/dart_stable.list
-
-# dotnet (netcore)
-RUN curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > /etc/apt/trusted.gpg.d/microsoft.gpg && \
-      wget -q -O /etc/apt/sources.list.d/microsoft-prod.list https://packages.microsoft.com/config/ubuntu/18.04/prod.list && \
-      chown root:root /etc/apt/trusted.gpg.d/microsoft.gpg && \
-      chown root:root /etc/apt/sources.list.d/microsoft-prod.list
-
-# erlang
-RUN wget -O- https://packages.erlang-solutions.com/ubuntu/erlang_solutions.asc | apt-key add - && \
-      echo "deb https://packages.erlang-solutions.com/ubuntu disco contrib" | tee /etc/apt/sources.list.d/erlang.list
-
-# node.js
-RUN curl -sL https://deb.nodesource.com/gpgkey/nodesource.gpg.key | apt-key add - && \
-      echo "deb https://deb.nodesource.com/node_10.x disco main" | tee /etc/apt/sources.list.d/nodesource.list
-
-### install general dependencies
-RUN apt-get update && apt-get install -y --no-install-recommends \
-      `# General dependencies` \
-      bash-completion \
-      bison \
-      build-essential \
-      clang \
-      cmake \
-      debhelper \
-      flex \
-      gdb \
-      libasound2 \
-      libatk-bridge2.0-0 \
-      libgtk-3-0 \
-      llvm \
-      ninja-build \
-      pkg-config \
-      unzip \
-      valgrind \
-      vim
-ENV PATH /usr/lib/llvm-6.0/bin:$PATH
-
-# lib/as3 (ActionScript)
-RUN mkdir -p /usr/local/adobe/flex/4.6 && \
-      cd /usr/local/adobe/flex/4.6 && \
-      wget -q "http://download.macromedia.com/pub/flex/sdk/flex_sdk_4.6.zip" && \
-      unzip flex_sdk_4.6.zip
-ENV FLEX_HOME /usr/local/adobe/flex/4.6
-
-RUN apt-get install -y --no-install-recommends \
-      `# C++ dependencies` \
-      libboost-all-dev \
-      libevent-dev \
-      libssl-dev \
-      qt5-default \
-      qtbase5-dev \
-      qtbase5-dev-tools
-
-ENV SBCL_VERSION 1.5.3
-RUN \
-      `# Common Lisp (sbcl) dependencies` \
-      curl --version && \
-      curl -o sbcl-${SBCL_VERSION}-x86-64-linux-binary.tar.bz2 -J -L https://sourceforge.net/projects/sbcl/files/sbcl/${SBCL_VERSION}/sbcl-${SBCL_VERSION}-x86-64-linux-binary.tar.bz2/download?use_mirror=managedway# && \
-      tar xjf sbcl-${SBCL_VERSION}-x86-64-linux-binary.tar.bz2 && \
-      cd sbcl-${SBCL_VERSION}-x86-64-linux && \
-      ./install.sh && \
-      sbcl --version && \
-      cd .. && \
-      rm -rf sbcl*
-
-ENV D_VERSION     2.087.0
-ENV DMD_DEB       dmd_2.087.0-0_amd64.deb
-RUN \
-      `# D dependencies` \
-      wget -q http://downloads.dlang.org/releases/2.x/${D_VERSION}/${DMD_DEB} && \
-      dpkg --install ${DMD_DEB} && \
-      rm -f ${DMD_DEB} && \
-      mkdir -p /usr/include/dmd/druntime/import/deimos /usr/include/dmd/druntime/import/C && \
-      git clone -b 'v2.0.2+2.0.16' https://github.com/D-Programming-Deimos/libevent.git deimos-libevent-2.0 && \
-      mv deimos-libevent-2.0/deimos/* /usr/include/dmd/druntime/import/deimos/ && \
-      mv deimos-libevent-2.0/C/* /usr/include/dmd/druntime/import/C/ && \
-      rm -rf deimos-libevent-2.0 && \
-      git clone -b 'v2.0.0+1.1.0h' https://github.com/D-Programming-Deimos/openssl.git deimos-openssl-1.1.0h && \
-      mv deimos-openssl-1.1.0h/deimos/* /usr/include/dmd/druntime/import/deimos/ && \
-      mv deimos-openssl-1.1.0h/C/* /usr/include/dmd/druntime/import/C/ && \
-      rm -rf deimos-openssl-1.1.0h
-
-ENV DART_VERSION 2.7.2-1
-RUN apt-get install -y --no-install-recommends \
-      `# Dart dependencies` \
-      dart=$DART_VERSION
-ENV PATH /usr/lib/dart/bin:$PATH
-
-RUN apt-get install -y --no-install-recommends \
-      `# dotnet core dependencies` \
-      dotnet-sdk-8.0 \
-      dotnet-runtime-8.0 \
-      aspnetcore-runtime-8.0 \
-      dotnet-apphost-pack-8.0
-
-RUN apt-get install -y --no-install-recommends \
-      `# Erlang dependencies` \
-      erlang && \
-      wget https://s3.amazonaws.com/rebar3/rebar3 -O /usr/bin/rebar3 && \
-      chmod 755 /usr/bin/rebar3 && \
-      rebar3 --version
-
-RUN apt-get install -y --no-install-recommends \
-      `# GlibC dependencies` \
-      libglib2.0-dev
-
-# golang
-ENV GOLANG_VERSION 1.19
-ENV GOLANG_DOWNLOAD_URL https://go.dev/dl/go$GOLANG_VERSION.linux-amd64.tar.gz
-ENV GOLANG_DOWNLOAD_SHA256 464b6b66591f6cf055bc5df90a9750bf5fbc9d038722bb84a9d56a2bea974be6
-RUN curl -fsSL "$GOLANG_DOWNLOAD_URL" -o golang.tar.gz && \
-      echo "$GOLANG_DOWNLOAD_SHA256  golang.tar.gz" | sha256sum -c - && \
-      tar -C /usr/local -xzf golang.tar.gz && \
-      ln -s /usr/local/go/bin/go /usr/local/bin && \
-      rm golang.tar.gz
-
-RUN apt-get install -y --no-install-recommends \
-      `# Haxe dependencies` \
-      haxe \
-      neko \
-      neko-dev && \
-      haxelib setup --always /usr/share/haxe/lib && \
-      haxelib install --always hxcpp 2>&1 > /dev/null
-
-ENV GRADLE_VERSION="8.4"
-RUN apt-get install -y --no-install-recommends \
-      `# Java dependencies` \
-      ant \
-      ant-optional \
-      maven \
-      openjdk-11-jdk-headless && \
-      `# Gradle` \
-      wget https://services.gradle.org/distributions/gradle-$GRADLE_VERSION-bin.zip -q -O /tmp/gradle-$GRADLE_VERSION-bin.zip && \
-      (echo "3e1af3ae886920c3ac87f7a91f816c0c7c436f276a6eefdb3da152100fef72ae  /tmp/gradle-$GRADLE_VERSION-bin.zip" | sha256sum -c -) && \
-      unzip -d /tmp /tmp/gradle-$GRADLE_VERSION-bin.zip && \
-      mv /tmp/gradle-$GRADLE_VERSION /usr/local/gradle && \
-      ln -s /usr/local/gradle/bin/gradle /usr/local/bin
-
-RUN apt-get install -y --no-install-recommends \
-      `# Lua dependencies` \
-      lua5.2 \
-      lua5.2-dev
-# https://bugs.launchpad.net/ubuntu/+source/lua5.3/+bug/1707212
-# lua5.3 does not install alternatives!
-# need to update our luasocket code, lua doesn't have luaL_openlib any more
-
-RUN apt-get install -y --no-install-recommends \
-      `# Node.js dependencies` \
-      nodejs
-
-# Test dependencies for running puppeteer
-RUN apt-get install -y --no-install-recommends \
-      `# JS dependencies` \
-      libxss1 \
-      libxtst6
-
-# does not work on disco?
-# RUN apt-get install -y --no-install-recommends \
-# `# OCaml dependencies` \
-#       ocaml \
-#       opam && \
-#     opam init --yes && \
-#     opam install --yes oasis
-
-RUN apt-get install -y --no-install-recommends \
-      `# Perl dependencies` \
-      libbit-vector-perl \
-      libclass-accessor-class-perl \
-      libcrypt-ssleay-perl \
-      libio-socket-ssl-perl \
-      libnet-ssleay-perl \
-      libtest-exception-perl
-
-RUN apt-get install -y --no-install-recommends \
-      `# Php dependencies` \
-      php \
-      php-cli \
-      php-dev \
-      php-json \
-      php-pear \
-      re2c \
-      composer
-
-RUN apt-get install -y --no-install-recommends \
-      `# Python dependencies` \
-      python-all \
-      python-all-dbg \
-      python-all-dev \
-      python-ipaddress \
-      python-pip \
-      python-setuptools \
-      python-six \
-      python-tornado \
-      python-twisted \
-      python-wheel \
-      python-zope.interface && \
-      pip install --upgrade backports.ssl_match_hostname
-
-RUN apt-get install -y --no-install-recommends \
-      `# Python3 dependencies` \
-      python3-all \
-      python3-all-dbg \
-      python3-all-dev \
-      python3-pip \
-      python3-setuptools \
-      python3-six \
-      python3-tornado \
-      python3-twisted \
-      python3-wheel \
-      python3-zope.interface
-
-RUN apt-get install -y --no-install-recommends \
-      `# Ruby dependencies` \
-      ruby \
-      ruby-dev \
-      ruby-bundler
-
-# Rust dependencies
-RUN curl https://sh.rustup.rs -sSf | sh -s -- --default-toolchain 1.65.0 -y
-ENV PATH /root/.cargo/bin:$PATH
-
-# Swift on Linux for cross tests
-# does not work on disco
-# RUN cd / && \
-#     wget --quiet https://swift.org/builds/swift-4.2.1-release/ubuntu1804/swift-4.2.1-RELEASE/swift-4.2.1-RELEASE-ubuntu18.04.tar.gz && \
-#     tar xf swift-4.2.1-RELEASE-ubuntu18.04.tar.gz --strip-components=1 && \
-#     rm swift-4.2.1-RELEASE-ubuntu18.04.tar.gz && \
-#     swift --version
-
-# Locale(s) for cpp unit tests
-RUN apt-get install -y --no-install-recommends \
-      `# Locale dependencies` \
-      locales && \
-      locale-gen en_US.UTF-8 && \
-      locale-gen de_DE.UTF-8 && \
-      update-locale
-
-# cppcheck-1.82 has a nasty cpp parser bug, so we're using something newer
-# don't need this on disco, nobody uses it
-# RUN apt-get install -y --no-install-recommends \
-# `# Static Code Analysis dependencies` \
-#       cppcheck \
-#       sloccount && \
-#     pip install flake8 && \
-#     wget -q "https://launchpad.net/ubuntu/+source/cppcheck/1.83-2/+build/14874703/+files/cppcheck_1.83-2_amd64.deb" && \
-#     dpkg -i cppcheck_1.83-2_amd64.deb && \
-#     rm cppcheck_1.83-2_amd64.deb
-
-# Clean up
-RUN rm -rf /var/cache/apt/* && \
-      rm -rf /var/lib/apt/lists/* && \
-      rm -rf /tmp/* && \
-      rm -rf /var/tmp/*
-
-ENV THRIFT_ROOT /thrift
-RUN mkdir -p $THRIFT_ROOT/src
-COPY Dockerfile $THRIFT_ROOT/
-WORKDIR $THRIFT_ROOT/src
diff --git a/build/docker/old/ubuntu-trusty/Dockerfile b/build/docker/old/ubuntu-trusty/Dockerfile
deleted file mode 100644
index 89f683e..0000000
--- a/build/docker/old/ubuntu-trusty/Dockerfile
+++ /dev/null
@@ -1,235 +0,0 @@
-# Licensed 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.
-
-#
-# Apache Thrift Docker build environment for Ubuntu Trusty
-# Using all stock Ubuntu Trusty packaging except for:
-# - d: does not come with Ubuntu so we're installing 2.070.0
-# - dart: does not come with Ubuntu so we're installing 1.20.1
-# - dotnetcore, disabled because netcore is for 1.0.0-preview and 2.0.0 is out
-# - haxe, disabled because the distro comes with 3.0.0 and it cores while installing
-# - node.js, disabled because it is at 0.10.0 in the distro which is too old (need 4+)
-# - ocaml, disabled because it fails to install properly
-#
-
-FROM buildpack-deps:trusty-scm
-MAINTAINER Apache Thrift <dev@thrift.apache.org>
-ENV DEBIAN_FRONTEND noninteractive
-
-### Add apt repos
-
-RUN apt-get update && \
-    apt-get dist-upgrade -y && \
-    apt-get install -y --no-install-recommends \
-      apt \
-      apt-transport-https \
-      apt-utils \
-      curl \
-      dirmngr \
-      software-properties-common \
-      wget
-
-# D
-RUN apt-key adv --keyserver keyserver.ubuntu.com --recv-keys EBCF975E5BA24D5E && \
-        wget http://master.dl.sourceforge.net/project/d-apt/files/d-apt.list -O /etc/apt/sources.list.d/d-apt.list && \
-        wget -qO - https://dlang.org/d-keyring.gpg | apt-key add -
-
-# Dart
-RUN curl https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - && \
-        curl https://storage.googleapis.com/download.dartlang.org/linux/debian/dart_stable.list > \
-          /etc/apt/sources.list.d/dart_stable.list
-
-RUN apt-get update && apt-get install -y --no-install-recommends \
-`# General dependencies` \
-      bash-completion \
-      bison \
-      build-essential \
-      clang \
-      cmake \
-      debhelper \
-      flex \
-      gdb \
-      llvm \
-      ninja-build \
-      pkg-config \
-      valgrind \
-      vim
-ENV PATH /usr/lib/llvm-3.8/bin:$PATH
-
-RUN apt-get install -y --no-install-recommends \
-`# C++ dependencies` \
-      libboost-all-dev \
-      libevent-dev \
-      libssl-dev \
-      qt5-default \
-      qtbase5-dev \
-      qtbase5-dev-tools
-
-RUN apt-get install -y --no-install-recommends \
-`# D dependencies` \
-      dmd-bin=2.070.2-0 \
-      libphobos2-dev=2.070.2-0 \
-      dub \
-      dfmt \
-      dscanner \
-      xdg-utils
-RUN mkdir -p /usr/include/dmd/druntime/import/deimos /usr/include/dmd/druntime/import/C && \
-    curl -sSL https://github.com/D-Programming-Deimos/libevent/archive/master.tar.gz| tar xz && \
-    mv libevent-master/deimos/* /usr/include/dmd/druntime/import/deimos/ && \
-    mv libevent-master/C/* /usr/include/dmd/druntime/import/C/ && \
-    rm -rf libevent-master
-RUN curl -sSL https://github.com/D-Programming-Deimos/openssl/archive/master.tar.gz| tar xz && \
-    mv openssl-master/deimos/* /usr/include/dmd/druntime/import/deimos/ && \
-    mv openssl-master/C/* /usr/include/dmd/druntime/import/C/ && \
-    rm -rf openssl-master
-
-RUN apt-get install -y --no-install-recommends \
-`# Dart dependencies` \
-      dart=1.20.1-1
-ENV PATH /usr/lib/dart/bin:$PATH
-
-RUN apt-get install -y --no-install-recommends \
-`# Erlang dependencies` \
-      erlang-base \
-      erlang-eunit \
-      erlang-dev \
-      erlang-tools \
-      rebar
-
-RUN apt-get install -y --no-install-recommends \
-`# GlibC dependencies` \
-      libglib2.0-dev
-
-# golang
-ENV GOLANG_VERSION 1.7.6
-ENV GOLANG_DOWNLOAD_URL https://golang.org/dl/go$GOLANG_VERSION.linux-amd64.tar.gz
-ENV GOLANG_DOWNLOAD_SHA256 ad5808bf42b014c22dd7646458f631385003049ded0bb6af2efc7f1f79fa29ea
-RUN curl -fsSL "$GOLANG_DOWNLOAD_URL" -o golang.tar.gz && \
-      echo "$GOLANG_DOWNLOAD_SHA256  golang.tar.gz" | sha256sum -c - && \
-      tar -C /usr/local -xzf golang.tar.gz && \
-      ln -s /usr/local/go/bin/go /usr/local/bin && \
-      rm golang.tar.gz
-
-# disabled because it cores while installing
-# RUN apt-get install -y --no-install-recommends \
-# `# Haxe dependencies` \
-#       haxe \
-#       neko \
-#       neko-dev && \
-#     haxelib setup /usr/share/haxe/lib && \
-#     haxelib install hxcpp 3.2.102
-
-RUN apt-get install -y --no-install-recommends \
-`# Java dependencies` \
-      ant \
-      ant-optional \
-      openjdk-7-jdk \
-      maven
-
-RUN apt-get install -y --no-install-recommends \
-`# Lua dependencies` \
-      lua5.1 \
-      lua5.1-dev
-
-# disabled because it is too old
-# RUN apt-get install -y --no-install-recommends \
-# `# Node.js dependencies` \
-#       nodejs \
-#       npm
-
-# disabled because it fails to install properly
-# RUN apt-get install -y --no-install-recommends \
-# `# OCaml dependencies` \
-#       ocaml \
-#       opam && \
-#     opam init --yes && \
-#     opam install --yes oasis
-
-RUN apt-get install -y --no-install-recommends \
-`# Perl dependencies` \
-      libbit-vector-perl \
-      libclass-accessor-class-perl \
-      libcrypt-ssleay-perl \
-      libio-socket-ssl-perl \
-      libnet-ssleay-perl
-
-RUN apt-get install -y --no-install-recommends \
-`# Php dependencies` \
-      php5 \
-      php5-cli \
-      php5-dev \
-      php-pear \
-      re2c && \
-      wget https://getcomposer.org/installer -O - -q | php -- --quiet --install-dir=/usr/local/bin/ --filename=composer
-
-RUN apt-get install -y --no-install-recommends \
-`# Python dependencies` \
-      python-all \
-      python-all-dbg \
-      python-all-dev \
-      python-pip \
-      python-setuptools \
-      python-six \
-      python-twisted \
-      python-wheel \
-      python-zope.interface \
-      python3-all \
-      python3-all-dbg \
-      python3-all-dev \
-      python3-pip \
-      python3-setuptools \
-      python3-six \
-      python3-wheel \
-      python3-zope.interface && \
-    pip install -U ipaddress backports.ssl_match_hostname tornado && \
-    pip3 install -U backports.ssl_match_hostname tornado
-# installing tornado by pip/pip3 instead of debian package
-# if we install the debian package, the build fails in py2
-
-RUN apt-get install -y --no-install-recommends \
-`# Ruby dependencies` \
-      ruby \
-      ruby-dev \
-      ruby-bundler
-RUN gem install bundler --no-ri --no-rdoc
-
-RUN apt-get install -y --no-install-recommends \
-`# Rust dependencies` \
-      cargo \
-      rustc
-
-RUN apt-get install -y --no-install-recommends \
-`# Static Code Analysis dependencies` \
-      cppcheck \
-      sloccount && \
-    pip install flake8
-
-# Install BouncyCastle provider to fix Java builds issues with JDK 7
-# Builds accessing repote repositories fail as seen here: https://github.com/travis-ci/travis-ci/issues/8503
-RUN apt-get install -y --no-install-recommends \
-`# BouncyCastle JCE Provider dependencies` \
-      libbcprov-java && \
-    ln -s /usr/share/java/bcprov.jar /usr/lib/jvm/java-7-openjdk-amd64/jre/lib/ext/bcprov.jar && \
-    awk -F . -v OFS=. 'BEGIN{n=2}/^security\.provider/ {split($3, posAndEquals, "=");$3=n++"="posAndEquals[2];print;next} 1' /etc/java-7-openjdk/security/java.security > /tmp/java.security && \
-  echo "security.provider.1=org.bouncycastle.jce.provider.BouncyCastleProvider" >> /tmp/java.security && \
-  mv /tmp/java.security /etc/java-7-openjdk/security/java.security
-
-# Clean up
-RUN rm -rf /var/cache/apt/* && \
-    rm -rf /var/lib/apt/lists/* && \
-    rm -rf /tmp/* && \
-    rm -rf /var/tmp/*
-
-ENV THRIFT_ROOT /thrift
-RUN mkdir -p $THRIFT_ROOT/src
-COPY Dockerfile $THRIFT_ROOT/
-WORKDIR $THRIFT_ROOT/src
diff --git a/build/docker/old/ubuntu-xenial/Dockerfile b/build/docker/old/ubuntu-xenial/Dockerfile
deleted file mode 100644
index d9d87cc..0000000
--- a/build/docker/old/ubuntu-xenial/Dockerfile
+++ /dev/null
@@ -1,273 +0,0 @@
-# Licensed 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.
-
-#
-# Apache Thrift Docker build environment for Ubuntu Xenial
-# Using all stock Ubuntu Xenial packaging except for:
-# - d: does not come with Ubuntu so we're installing 2.087.0 for coverage
-# - dart: does not come with Ubuntu so we're installing 2.0.0-1 for coverage
-# - dotnet: does not come with Ubuntu
-# - go: Xenial comes with 1.6, but we need 1.10 or later
-# - nodejs: Xenial comes with 4.2.6 which exits LTS April 2018, so we're installing 10.x
-# - ocaml: causes stack overflow error, just started March 2018 not sure why
-#
-
-FROM buildpack-deps:xenial-scm
-MAINTAINER Apache Thrift <dev@thrift.apache.org>
-ENV DEBIAN_FRONTEND noninteractive
-
-### Add apt repos
-
-RUN apt-get update && \
-      apt-get dist-upgrade -y && \
-      apt-get install -y --no-install-recommends \
-      apt \
-      apt-transport-https \
-      apt-utils \
-      curl \
-      software-properties-common \
-      wget && \
-
-      # Dart
-      curl https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - && \
-      curl https://storage.googleapis.com/download.dartlang.org/linux/debian/dart_stable.list > \
-      /etc/apt/sources.list.d/dart_stable.list && \
-
-      # dotnet (core)
-      curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > /etc/apt/trusted.gpg.d/microsoft.gpg && \
-      echo "deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-xenial-prod xenial main" > \
-      /etc/apt/sources.list.d/dotnetdev.list && \
-
-      # node.js
-      curl -sL https://deb.nodesource.com/gpgkey/nodesource.gpg.key | apt-key add - && \
-      echo "deb https://deb.nodesource.com/node_10.x xenial main" | tee /etc/apt/sources.list.d/nodesource.list && \
-
-      # ruby 2.4
-      apt-add-repository ppa:brightbox/ruby-ng
-
-### install general dependencies
-RUN apt-get update && apt-get install -y --no-install-recommends \
-      `# General dependencies` \
-      bash-completion \
-      bison \
-      build-essential \
-      clang \
-      cmake \
-      debhelper \
-      flex \
-      gdb \
-      llvm \
-      ninja-build \
-      pkg-config \
-      valgrind \
-      vim
-ENV PATH /usr/lib/llvm-3.8/bin:$PATH
-
-### languages
-
-# TODO: "apt-get install" without "apt-get update" in the same "RUN" step can cause cache issues if modified later.
-# See https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#run
-RUN apt-get install -y --no-install-recommends \
-      `# C++ dependencies` \
-      libboost-dev \
-      libboost-filesystem-dev \
-      libboost-program-options-dev \
-      libboost-system-dev \
-      libboost-test-dev \
-      libboost-thread-dev \
-      libevent-dev \
-      libssl-dev \
-      qt5-default \
-      qtbase5-dev \
-      qtbase5-dev-tools
-
-ENV D_VERSION     2.087.0
-ENV DMD_DEB       dmd_2.087.0-0_amd64.deb
-RUN \
-      `# D dependencies` \
-      wget -q http://downloads.dlang.org/releases/2.x/${D_VERSION}/${DMD_DEB} && \
-      dpkg --install ${DMD_DEB} && \
-      rm -f ${DMD_DEB} && \
-      mkdir -p /usr/include/dmd/druntime/import/deimos /usr/include/dmd/druntime/import/C && \
-      git clone -b 'v2.0.2+2.0.16' https://github.com/D-Programming-Deimos/libevent.git deimos-libevent-2.0 && \
-      mv deimos-libevent-2.0/deimos/* /usr/include/dmd/druntime/import/deimos/ && \
-      mv deimos-libevent-2.0/C/* /usr/include/dmd/druntime/import/C/ && \
-      rm -rf deimos-libevent-2.0 && \
-      git clone -b 'v1.1.6+1.0.1g' https://github.com/D-Programming-Deimos/openssl.git deimos-openssl-1.0.1g && \
-      mv deimos-openssl-1.0.1g/deimos/* /usr/include/dmd/druntime/import/deimos/ && \
-      mv deimos-openssl-1.0.1g/C/* /usr/include/dmd/druntime/import/C/ && \
-      rm -rf deimos-openssl-1.0.1g
-
-ENV DART_VERSION 2.7.2-1
-RUN apt-get install -y --no-install-recommends \
-      `# Dart dependencies` \
-      dart=$DART_VERSION
-ENV PATH /usr/lib/dart/bin:$PATH
-
-RUN apt-get install -y --no-install-recommends \
-      `# dotnet core dependencies` \
-      dotnet-sdk-8.0 \
-      dotnet-runtime-8.0 \
-      aspnetcore-runtime-8.0 \
-      dotnet-apphost-pack-8.0
-
-# Erlang dependencies
-ARG ERLANG_OTP_VERSION=20.3.8.9
-ARG ERLANG_REBAR_VERSION=3.13.2
-RUN apt-get update && apt-get install -y --no-install-recommends automake libncurses5-dev && \
-      curl https://raw.githubusercontent.com/kerl/kerl/master/kerl -o /usr/local/bin/kerl && chmod +x /usr/local/bin/kerl && \
-      kerl build $ERLANG_OTP_VERSION && kerl install $ERLANG_OTP_VERSION /usr/local/lib/otp/ && . /usr/local/lib/otp/activate && \
-      curl https://s3.amazonaws.com/rebar3/rebar3 -o /usr/local/bin/rebar3 && chmod +x /usr/local/bin/rebar3 && \
-      curl -ssLo /usr/local/bin/rebar3 https://github.com/erlang/rebar3/releases/download/${ERLANG_REBAR_VERSION}/rebar3 && chmod +x /usr/local/bin/rebar3 && \
-      rebar3 --version
-ENV PATH /usr/local/lib/otp/bin:$PATH
-
-RUN apt-get install -y --no-install-recommends \
-      `# GlibC dependencies` \
-      libglib2.0-dev
-
-# golang
-ENV GOLANG_VERSION 1.18.5
-ENV GOLANG_DOWNLOAD_URL https://go.dev/dl/go$GOLANG_VERSION.linux-amd64.tar.gz
-ENV GOLANG_DOWNLOAD_SHA256 9e5de37f9c49942c601b191ac5fba404b868bfc21d446d6960acc12283d6e5f2
-RUN curl -fsSL "$GOLANG_DOWNLOAD_URL" -o golang.tar.gz && \
-      echo "$GOLANG_DOWNLOAD_SHA256  golang.tar.gz" | sha256sum -c - && \
-      tar -C /usr/local -xzf golang.tar.gz && \
-      ln -s /usr/local/go/bin/go /usr/local/bin && \
-      rm golang.tar.gz
-
-RUN apt-get install -y --no-install-recommends \
-      `# Haxe dependencies` \
-      haxe \
-      neko \
-      neko-dev \
-      libneko0 && \
-      haxelib setup --always /usr/share/haxe/lib && \
-      haxelib install --always hxcpp 3.4.64 2>&1 > /dev/null
-# note: hxcpp 3.4.185 (latest) no longer ships static libraries, and caused a build failure
-
-ENV GRADLE_VERSION="8.4"
-RUN apt-get install -y --no-install-recommends \
-      `# Java dependencies` \
-      ant \
-      ant-optional \
-      openjdk-8-jdk \
-      maven \
-      unzip && \
-      `# Gradle` \
-      wget https://services.gradle.org/distributions/gradle-$GRADLE_VERSION-bin.zip -q -O /tmp/gradle-$GRADLE_VERSION-bin.zip && \
-      (echo "3e1af3ae886920c3ac87f7a91f816c0c7c436f276a6eefdb3da152100fef72ae  /tmp/gradle-$GRADLE_VERSION-bin.zip" | sha256sum -c -) && \
-      unzip -d /tmp /tmp/gradle-$GRADLE_VERSION-bin.zip && \
-      mv /tmp/gradle-$GRADLE_VERSION /usr/local/gradle && \
-      ln -s /usr/local/gradle/bin/gradle /usr/local/bin
-
-# disabled: same as ubuntu-bionic jobs
-# RUN apt-get install -y --no-install-recommends \
-# `# Lua dependencies` \
-#       lua5.2 \
-#       lua5.2-dev
-# https://bugs.launchpad.net/ubuntu/+source/lua5.3/+bug/1707212
-# lua5.3 does not install alternatives so stick with 5.2 here
-
-RUN apt-get install -y --no-install-recommends \
-      `# Node.js dependencies` \
-      nodejs
-
-# Test dependencies for running puppeteer
-RUN apt-get install -y --no-install-recommends \
-      `# JS dependencies` \
-      libxss1 \
-      libxtst6 \
-      libatk-bridge2.0-0 \
-      libgtk-3-0
-
-# THRIFT-4517: causes stack overflows; version too old; skip ocaml in xenial
-# RUN apt-get install -y --no-install-recommends \
-# `# OCaml dependencies` \
-#       ocaml \
-#       opam && \
-#     opam init --yes && \
-#     opam install --yes oasis
-
-RUN apt-get install -y --no-install-recommends \
-      `# Perl dependencies` \
-      libbit-vector-perl \
-      libclass-accessor-class-perl \
-      libcrypt-ssleay-perl \
-      libio-socket-ssl-perl \
-      libnet-ssleay-perl \
-      libtest-exception-perl
-
-RUN apt-get install -y --no-install-recommends \
-      `# Php dependencies` \
-      php7.0 \
-      php7.0-cli \
-      php7.0-dev \
-      php-json \
-      php-pear \
-      re2c \
-      composer
-
-RUN apt-get install -y --no-install-recommends \
-      `# Python dependencies` \
-      python-all \
-      python-all-dbg \
-      python-all-dev \
-      python-backports.ssl-match-hostname \
-      python-ipaddress \
-      python-pip \
-      python-setuptools \
-      python-six \
-      python-tornado \
-      python-twisted \
-      python-wheel \
-      python-zope.interface \
-      python3-all \
-      python3-all-dbg \
-      python3-all-dev \
-      python3-setuptools \
-      python3-six \
-      python3-tornado \
-      python3-twisted \
-      python3-wheel \
-      python3-zope.interface && \
-      pip install --upgrade backports.ssl_match_hostname
-
-RUN apt-get install -y --no-install-recommends \
-      `# Ruby dependencies` \
-      ruby2.4 \
-      ruby2.4-dev \
-      ruby-bundler
-
-# Rust dependencies
-RUN curl https://sh.rustup.rs -sSf | sh -s -- --default-toolchain 1.65.0 -y
-
-# Locale(s) for cpp unit tests
-RUN apt-get install -y --no-install-recommends \
-      `# Locale dependencies` \
-      locales && \
-      locale-gen en_US.UTF-8 && \
-      locale-gen de_DE.UTF-8 && \
-      update-locale
-
-# NOTE: this does not reduce the image size but adds an additional layer.
-# # Clean up
-# RUN rm -rf /var/cache/apt/* && \
-#     rm -rf /var/lib/apt/lists/* && \
-#     rm -rf /tmp/* && \
-#     rm -rf /var/tmp/*
-
-ENV DOTNET_CLI_TELEMETRY_OPTOUT 1
-ENV THRIFT_ROOT /thrift
-RUN mkdir -p $THRIFT_ROOT/src
-COPY Dockerfile $THRIFT_ROOT/
-WORKDIR $THRIFT_ROOT/src
diff --git a/build/docker/ubuntu-bionic/Dockerfile b/build/docker/ubuntu-bionic/Dockerfile
deleted file mode 100644
index 5ece6e1..0000000
--- a/build/docker/ubuntu-bionic/Dockerfile
+++ /dev/null
@@ -1,304 +0,0 @@
-# Licensed 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.
-
-#
-# Apache Thrift Docker build environment for Ubuntu Bionic
-# with some updated packages.
-#
-
-FROM buildpack-deps:bionic-scm
-LABEL MAINTAINER='Apache Thrift <dev@thrift.apache.org>'
-ENV DEBIAN_FRONTEND noninteractive
-
-### Add apt repos
-
-RUN apt-get update -yq && \
-      apt-get dist-upgrade -y && \
-      apt-get install -y --no-install-recommends --fix-missing \
-      apt \
-      apt-transport-https \
-      apt-utils \
-      curl \
-      dirmngr \
-      software-properties-common \
-      wget
-
-# Dart
-RUN curl https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - && \
-      curl https://storage.googleapis.com/download.dartlang.org/linux/debian/dart_stable.list > \
-      /etc/apt/sources.list.d/dart_stable.list
-
-# dotnet (netcore)
-RUN curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > /etc/apt/trusted.gpg.d/microsoft.gpg && \
-      wget -q -O /etc/apt/sources.list.d/microsoft-prod.list https://packages.microsoft.com/config/ubuntu/18.04/prod.list && \
-      chown root:root /etc/apt/trusted.gpg.d/microsoft.gpg && \
-      chown root:root /etc/apt/sources.list.d/microsoft-prod.list
-
-# node.js
-RUN curl -sL https://deb.nodesource.com/gpgkey/nodesource.gpg.key | apt-key add - && \
-      echo "deb https://deb.nodesource.com/node_10.x bionic main" | tee /etc/apt/sources.list.d/nodesource.list
-
-### install general dependencies
-RUN apt-get update && apt-get install -y --no-install-recommends \
-      `# General dependencies` \
-      bash-completion \
-      bison \
-      build-essential \
-      clang \
-      cmake \
-      debhelper \
-      flex \
-      gdb \
-      libasound2 \
-      libatk-bridge2.0-0 \
-      libgtk-3-0 \
-      llvm \
-      ninja-build \
-      pkg-config \
-      unzip \
-      valgrind \
-      vim
-ENV PATH /usr/lib/llvm-6.0/bin:$PATH
-
-# lib/as3 (ActionScript)
-RUN mkdir -p /usr/local/adobe/flex/4.6 && \
-      cd /usr/local/adobe/flex/4.6 && \
-      wget -q "http://download.macromedia.com/pub/flex/sdk/flex_sdk_4.6.zip" && \
-      unzip flex_sdk_4.6.zip
-ENV FLEX_HOME /usr/local/adobe/flex/4.6
-
-# TODO: "apt-get install" without "apt-get update" in the same "RUN" step can cause cache issues if modified later.
-# See https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#run
-RUN apt-get install -y --no-install-recommends \
-      `# C++ dependencies` \
-      libboost-all-dev \
-      libevent-dev \
-      libssl-dev \
-      qt5-default \
-      qtbase5-dev \
-      qtbase5-dev-tools
-
-ENV SBCL_VERSION 1.5.3
-RUN \
-      `# Common Lisp (sbcl) dependencies` \
-      curl --version && \
-      curl -o sbcl-${SBCL_VERSION}-x86-64-linux-binary.tar.bz2 -J -L https://sourceforge.net/projects/sbcl/files/sbcl/${SBCL_VERSION}/sbcl-${SBCL_VERSION}-x86-64-linux-binary.tar.bz2/download?use_mirror=managedway# && \
-      tar xjf sbcl-${SBCL_VERSION}-x86-64-linux-binary.tar.bz2 && \
-      cd sbcl-${SBCL_VERSION}-x86-64-linux && \
-      ./install.sh && \
-      sbcl --version && \
-      cd .. && \
-      rm -rf sbcl*
-
-ENV D_VERSION     2.087.0
-ENV DMD_DEB       dmd_2.087.0-0_amd64.deb
-RUN \
-      `# D dependencies` \
-      wget -q http://downloads.dlang.org/releases/2.x/${D_VERSION}/${DMD_DEB} && \
-      dpkg --install ${DMD_DEB} && \
-      rm -f ${DMD_DEB} && \
-      mkdir -p /usr/include/dmd/druntime/import/deimos /usr/include/dmd/druntime/import/C && \
-      git clone -b 'v2.0.2+2.0.16' https://github.com/D-Programming-Deimos/libevent.git deimos-libevent-2.0 && \
-      mv deimos-libevent-2.0/deimos/* /usr/include/dmd/druntime/import/deimos/ && \
-      mv deimos-libevent-2.0/C/* /usr/include/dmd/druntime/import/C/ && \
-      rm -rf deimos-libevent-2.0 && \
-      git clone -b 'v2.0.0+1.1.0h' https://github.com/D-Programming-Deimos/openssl.git deimos-openssl-1.1.0h && \
-      mv deimos-openssl-1.1.0h/deimos/* /usr/include/dmd/druntime/import/deimos/ && \
-      mv deimos-openssl-1.1.0h/C/* /usr/include/dmd/druntime/import/C/ && \
-      rm -rf deimos-openssl-1.1.0h
-
-ENV DART_VERSION 2.7.2-1
-RUN apt-get install -y --no-install-recommends \
-      `# Dart dependencies` \
-      dart=$DART_VERSION
-ENV PATH /usr/lib/dart/bin:$PATH
-
-RUN apt-get install -y --no-install-recommends \
-      `# dotnet core dependencies` \
-      dotnet-sdk-8.0 \
-      dotnet-runtime-8.0 \
-      aspnetcore-runtime-8.0 \
-      dotnet-apphost-pack-8.0
-
-# Erlang dependencies
-ARG ERLANG_OTP_VERSION=23.3.4.11
-ARG ERLANG_REBAR_VERSION=3.18.0
-RUN apt-get update && apt-get install -y --no-install-recommends libncurses5-dev && \
-      curl -ssLo /usr/local/bin/kerl https://raw.githubusercontent.com/kerl/kerl/master/kerl && chmod +x /usr/local/bin/kerl && \
-      kerl build $ERLANG_OTP_VERSION && kerl install $ERLANG_OTP_VERSION /usr/local/lib/otp/ && . /usr/local/lib/otp/activate && \
-      curl -ssLo /usr/local/bin/rebar3 https://github.com/erlang/rebar3/releases/download/${ERLANG_REBAR_VERSION}/rebar3 && chmod +x /usr/local/bin/rebar3 && \
-      rebar3 --version
-ENV PATH /usr/local/lib/otp/bin:$PATH
-
-RUN apt-get install -y --no-install-recommends \
-      `# GlibC dependencies` \
-      libglib2.0-dev
-
-# golang
-ENV GOLANG_VERSION 1.19.5
-ENV GOLANG_DOWNLOAD_URL https://go.dev/dl/go$GOLANG_VERSION.linux-amd64.tar.gz
-ENV GOLANG_DOWNLOAD_SHA256 36519702ae2fd573c9869461990ae550c8c0d955cd28d2827a6b159fda81ff95
-RUN curl -fsSL "$GOLANG_DOWNLOAD_URL" -o golang.tar.gz && \
-      echo "$GOLANG_DOWNLOAD_SHA256  golang.tar.gz" | sha256sum -c - && \
-      tar -C /usr/local -xzf golang.tar.gz && \
-      ln -s /usr/local/go/bin/go /usr/local/bin && \
-      rm golang.tar.gz
-
-RUN apt-get install -y --no-install-recommends \
-      `# Haxe dependencies` \
-      haxe \
-      neko \
-      neko-dev && \
-      haxelib setup --always /usr/share/haxe/lib && \
-      haxelib install --always hxcpp 2>&1 > /dev/null
-
-ENV GRADLE_VERSION="8.4"
-RUN apt-get install -y --no-install-recommends \
-      `# Java dependencies` \
-      ant \
-      ant-optional \
-      maven \
-      openjdk-17-jdk-headless && \
-      `# Gradle` \
-      wget https://services.gradle.org/distributions/gradle-$GRADLE_VERSION-bin.zip -q -O /tmp/gradle-$GRADLE_VERSION-bin.zip && \
-      (echo "3e1af3ae886920c3ac87f7a91f816c0c7c436f276a6eefdb3da152100fef72ae  /tmp/gradle-$GRADLE_VERSION-bin.zip" | sha256sum -c -) && \
-      unzip -d /tmp /tmp/gradle-$GRADLE_VERSION-bin.zip && \
-      mv /tmp/gradle-$GRADLE_VERSION /usr/local/gradle && \
-      ln -s /usr/local/gradle/bin/gradle /usr/local/bin
-
-RUN apt-get install -y --no-install-recommends \
-      `# Lua dependencies` \
-      lua5.2 \
-      lua5.2-dev
-# https://bugs.launchpad.net/ubuntu/+source/lua5.3/+bug/1707212
-# lua5.3 does not install alternatives!
-# need to update our luasocket code, lua doesn't have luaL_openlib any more
-
-RUN apt-get install -y --no-install-recommends \
-      `# Node.js dependencies` \
-      nodejs
-
-# Test dependencies for running puppeteer
-RUN apt-get install -y --no-install-recommends \
-      `# JS dependencies` \
-      libxss1 \
-      libxtst6
-
-RUN apt-get install -y --no-install-recommends \
-      `# OCaml dependencies` \
-      ocaml \
-      opam && \
-      opam init --yes && \
-      opam install --yes oasis
-
-RUN apt-get install -y --no-install-recommends \
-      `# Perl dependencies` \
-      libbit-vector-perl \
-      libclass-accessor-class-perl \
-      libcrypt-ssleay-perl \
-      libio-socket-ssl-perl \
-      libnet-ssleay-perl \
-      libtest-exception-perl
-
-RUN apt-get install -y --no-install-recommends \
-      `# Php dependencies` \
-      php \
-      php-cli \
-      php-dev \
-      php-json \
-      php-pear \
-      php-mbstring \
-      php-xml \
-      re2c \
-      composer
-
-RUN pecl install xdebug-3.1.1 && \
-      echo "zend_extension=xdebug.so" > /etc/php/7.2/cli/conf.d/20-xdebug.ini
-
-RUN apt-get install -y --no-install-recommends \
-      `# Python dependencies` \
-      python-all \
-      python-all-dbg \
-      python-all-dev \
-      python-ipaddress \
-      python-pip \
-      python-setuptools \
-      python-six \
-      python-tornado \
-      python-twisted \
-      python-wheel \
-      python-zope.interface && \
-      pip install --upgrade backports.ssl_match_hostname
-
-RUN apt-get install -y --no-install-recommends \
-      `# Python3 dependencies` \
-      python3-all \
-      python3-all-dbg \
-      python3-all-dev \
-      python3-pip \
-      python3-setuptools \
-      python3-six \
-      python3-tornado \
-      python3-twisted \
-      python3-wheel \
-      python3-zope.interface
-
-RUN apt-get install -y --no-install-recommends \
-      `# Ruby dependencies` \
-      ruby \
-      ruby-dev \
-      ruby-bundler
-
-# Rust dependencies
-RUN curl https://sh.rustup.rs -sSf | sh -s -- --default-toolchain 1.65.0 -y
-ENV PATH /root/.cargo/bin:$PATH
-
-# Swift on Linux for cross tests
-RUN apt-get install -yq \
-      libedit-dev \
-      libz3-dev \
-      libpython-dev \
-      libxml2-dev && \
-      cd / && \
-      wget --quiet https://download.swift.org/swift-5.7-release/ubuntu1804/swift-5.7-RELEASE/swift-5.7-RELEASE-ubuntu18.04.tar.gz && \
-      tar xf swift-5.7-RELEASE-ubuntu18.04.tar.gz && \
-      mv swift-5.7-RELEASE-ubuntu18.04 /usr/share/swift && \
-      rm swift-5.7-RELEASE-ubuntu18.04.tar.gz
-
-ENV PATH /usr/share/swift/usr/bin:$PATH
-RUN swift --version
-
-# Locale(s) for cpp unit tests
-RUN apt-get install -y --no-install-recommends \
-      `# Locale dependencies` \
-      locales && \
-      locale-gen en_US.UTF-8 && \
-      locale-gen de_DE.UTF-8 && \
-      update-locale
-
-RUN apt-get install -y --no-install-recommends \
-      `# Static Code Analysis dependencies` \
-      cppcheck \
-      sloccount && \
-      pip install flake8
-
-# NOTE: this does not reduce the image size but adds an additional layer.
-# # Clean up
-# RUN rm -rf /var/cache/apt/* && \
-#     rm -rf /var/lib/apt/lists/* && \
-#     rm -rf /tmp/* && \
-#     rm -rf /var/tmp/*
-
-ENV THRIFT_ROOT /thrift
-RUN mkdir -p $THRIFT_ROOT/src
-COPY Dockerfile $THRIFT_ROOT/
-WORKDIR $THRIFT_ROOT/src
diff --git a/build/docker/ubuntu-focal/Dockerfile b/build/docker/ubuntu-focal/Dockerfile
index 416e806..a29ec69 100644
--- a/build/docker/ubuntu-focal/Dockerfile
+++ b/build/docker/ubuntu-focal/Dockerfile
@@ -32,6 +32,20 @@
       software-properties-common \
       wget
 
+# Create a user
+ARG user=build
+ARG group=build
+ARG uid=1000
+ARG gid=1000
+
+RUN apt-get install -y --no-install-recommends sudo && \
+    echo "Running with: UID: ${uid}, User: ${user}, GID: ${gid}, Group: ${group}" && \
+    if [ -z `cat /etc/group | grep "${group}:"` ] && [ -z `cat /etc/group | grep ":${gid}:"` ]; then addgroup --gid ${gid} ${group}; fi && \
+    if [ -z `cat /etc/passwd | grep "${user}:"` ] && [ -z `cat /etc/passwd | grep ":${uid}:"` ]; then adduser --uid ${uid} --gid ${gid} --shell /bin/bash ${user} --disabled-password -q --gecos ""; fi && \
+    echo "${user} ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers && \
+    mkdir -p /home/${user} && \
+    chown -R ${user}:${group} /home/${user}
+
 # Dart
 RUN curl https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - && \
       curl https://storage.googleapis.com/download.dartlang.org/linux/debian/dart_stable.list > \
@@ -39,7 +53,7 @@
 
 # dotnet (netcore)
 RUN curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > /etc/apt/trusted.gpg.d/microsoft.gpg && \
-      wget -q -O /etc/apt/sources.list.d/microsoft-prod.list https://packages.microsoft.com/config/ubuntu/18.04/prod.list && \
+      wget -q -O /etc/apt/sources.list.d/microsoft-prod.list https://packages.microsoft.com/config/ubuntu/20.04/prod.list && \
       chown root:root /etc/apt/trusted.gpg.d/microsoft.gpg && \
       chown root:root /etc/apt/sources.list.d/microsoft-prod.list
 
@@ -145,22 +159,37 @@
       libglib2.0-dev
 
 # golang
-ENV GOLANG_VERSION 1.20
+ENV GOLANG_VERSION 1.21.7
 ENV GOLANG_DOWNLOAD_URL https://go.dev/dl/go$GOLANG_VERSION.linux-amd64.tar.gz
-ENV GOLANG_DOWNLOAD_SHA256 5a9ebcc65c1cce56e0d2dc616aff4c4cedcfbda8cc6f0288cc08cda3b18dcbf1
+ENV GOLANG_DOWNLOAD_SHA256 13b76a9b2a26823e53062fa841b07087d48ae2ef2936445dc34c4ae03293702c
 RUN curl -fsSL "$GOLANG_DOWNLOAD_URL" -o golang.tar.gz && \
       echo "$GOLANG_DOWNLOAD_SHA256  golang.tar.gz" | sha256sum -c - && \
       tar -C /usr/local -xzf golang.tar.gz && \
       ln -s /usr/local/go/bin/go /usr/local/bin && \
       rm golang.tar.gz
 
-RUN apt-get install -y --no-install-recommends \
-      `# Haxe dependencies` \
-      haxe \
-      neko \
-      neko-dev && \
-      haxelib setup --always /usr/share/haxe/lib && \
-      haxelib install --always hxcpp 2>&1 > /dev/null
+# HAXE
+ARG HAXE_VERSION=4.2.1
+ARG NEKO_VERSION=2.3.0
+RUN cd $HOME && \
+    `# Haxe dependencies` && \
+    wget https://github.com/HaxeFoundation/haxe/releases/download/${HAXE_VERSION}/haxe-${HAXE_VERSION}-linux64.tar.gz && \
+    tar xvf haxe-${HAXE_VERSION}-linux64.tar.gz && \
+    rm haxe-${HAXE_VERSION}-linux64.tar.gz && \
+    mv haxe_* /opt/haxe && \
+    wget https://github.com/HaxeFoundation/neko/releases/download/v`echo ${NEKO_VERSION} | sed "s/\./-/g"`/neko-${NEKO_VERSION}-linux64.tar.gz && \
+    tar xvf neko-${NEKO_VERSION}-linux64.tar.gz && \
+    rm neko-${NEKO_VERSION}-linux64.tar.gz && \
+    mv neko-* /opt/neko
+ENV PATH /opt/haxe:/opt/neko:$PATH
+RUN echo "/opt/neko" > /etc/ld.so.conf.d/neko.conf && \
+    ldconfig
+USER ${user}
+RUN mkdir -p $HOME/haxe/lib && \
+    haxelib setup --always $HOME/haxe/lib && \
+    haxelib install --always hxcpp 2>&1 > /dev/null && \
+    haxelib install --always uuid 2>&1 > /dev/null
+USER root
 
 ENV GRADLE_VERSION="8.4"
 RUN apt-get install -y --no-install-recommends \
@@ -213,10 +242,13 @@
 
 RUN apt-get install -y --no-install-recommends \
       `# Php dependencies` \
-      php \
-      php-cli \
-      php-dev \
-      php-json \
+      php7.4 \
+      php7.4-cli \
+      php7.4-dev \
+      php7.4-mbstring \
+      php7.4-xml \
+      php7.4-curl \
+      php7.4-xdebug \
       php-pear \
       re2c \
       composer
@@ -240,9 +272,11 @@
       ruby-dev \
       ruby-bundler
 
-# Rust dependencies
-RUN curl https://sh.rustup.rs -sSf | sh -s -- --default-toolchain 1.65.0 -y
-ENV PATH /root/.cargo/bin:$PATH
+USER ${user}
+RUN `# Rust dependencies` \
+    curl https://sh.rustup.rs -sSf | sh -s -- --default-toolchain 1.65.0 -y
+ENV PATH /home/${user}/.cargo/bin:$PATH
+USER root
 
 # Swift on Linux for cross tests
 RUN apt-get install -yq \
@@ -281,6 +315,9 @@
 #     rm -rf /var/tmp/*
 
 ENV THRIFT_ROOT /thrift
-RUN mkdir -p $THRIFT_ROOT/src
+RUN mkdir -p $THRIFT_ROOT/src && \
+    chown -R ${uid}:${uid} $THRIFT_ROOT/
 COPY Dockerfile $THRIFT_ROOT/
 WORKDIR $THRIFT_ROOT/src
+
+USER ${user}
diff --git a/build/docker/ubuntu-jammy/Dockerfile b/build/docker/ubuntu-jammy/Dockerfile
index a10fea6..5fa6e6f 100644
--- a/build/docker/ubuntu-jammy/Dockerfile
+++ b/build/docker/ubuntu-jammy/Dockerfile
@@ -32,6 +32,20 @@
   software-properties-common \
   wget
 
+# Create a user
+ARG user=build
+ARG group=build
+ARG uid=1000
+ARG gid=1000
+
+RUN apt-get install -y --no-install-recommends sudo && \
+    echo "Running with: UID: ${uid}, User: ${user}, GID: ${gid}, Group: ${group}" && \
+    if [ -z `cat /etc/group | grep "${group}:"` ] && [ -z `cat /etc/group | grep ":${gid}:"` ]; then addgroup --gid ${gid} ${group}; fi && \
+    if [ -z `cat /etc/passwd | grep "${user}:"` ] && [ -z `cat /etc/passwd | grep ":${uid}:"` ]; then adduser --uid ${uid} --gid ${gid} --shell /bin/bash ${user} --disabled-password -q --gecos ""; fi && \
+    echo "${user} ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers && \
+    mkdir -p /home/${user} && \
+    chown -R ${user}:${group} /home/${user}
+
 # Dart
 RUN curl https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - && \
   curl https://storage.googleapis.com/download.dartlang.org/linux/debian/dart_stable.list > \
@@ -39,7 +53,7 @@
 
 # dotnet (netcore)
 RUN curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > /etc/apt/trusted.gpg.d/microsoft.gpg && \
-  wget -q -O /etc/apt/sources.list.d/microsoft-prod.list https://packages.microsoft.com/config/ubuntu/18.04/prod.list && \
+  wget -q -O /etc/apt/sources.list.d/microsoft-prod.list https://packages.microsoft.com/config/ubuntu/22.04/prod.list && \
   chown root:root /etc/apt/trusted.gpg.d/microsoft.gpg && \
   chown root:root /etc/apt/sources.list.d/microsoft-prod.list
 
@@ -84,7 +98,6 @@
   libboost-all-dev \
   libevent-dev \
   libssl-dev \
-  qt5-default \
   qtbase5-dev \
   qtbase5-dev-tools
 
@@ -131,7 +144,7 @@
   dotnet-apphost-pack-8.0
 
 # Erlang dependencies
-ARG ERLANG_OTP_VERSION=23.3.4.11
+ARG ERLANG_OTP_VERSION=25.3.2.9
 ARG ERLANG_REBAR_VERSION=3.18.0
 RUN apt-get update && apt-get install -y --no-install-recommends libncurses5-dev && \
   curl -ssLo /usr/local/bin/kerl https://raw.githubusercontent.com/kerl/kerl/master/kerl && chmod +x /usr/local/bin/kerl && \
@@ -145,22 +158,37 @@
   libglib2.0-dev
 
 # golang
-ENV GOLANG_VERSION 1.20
+ENV GOLANG_VERSION 1.21.7
 ENV GOLANG_DOWNLOAD_URL https://go.dev/dl/go$GOLANG_VERSION.linux-amd64.tar.gz
-ENV GOLANG_DOWNLOAD_SHA256 5a9ebcc65c1cce56e0d2dc616aff4c4cedcfbda8cc6f0288cc08cda3b18dcbf1
+ENV GOLANG_DOWNLOAD_SHA256 13b76a9b2a26823e53062fa841b07087d48ae2ef2936445dc34c4ae03293702c
 RUN curl -fsSL "$GOLANG_DOWNLOAD_URL" -o golang.tar.gz && \
   echo "$GOLANG_DOWNLOAD_SHA256  golang.tar.gz" | sha256sum -c - && \
   tar -C /usr/local -xzf golang.tar.gz && \
   ln -s /usr/local/go/bin/go /usr/local/bin && \
   rm golang.tar.gz
 
-RUN apt-get install -y --no-install-recommends \
-  `# Haxe dependencies` \
-  haxe \
-  neko \
-  neko-dev && \
-  haxelib setup --always /usr/share/haxe/lib && \
-  haxelib install --always hxcpp 2>&1 > /dev/null
+# HAXE
+ARG HAXE_VERSION=4.2.1
+ARG NEKO_VERSION=2.3.0
+RUN cd $HOME && \
+    `# Haxe dependencies` && \
+    wget https://github.com/HaxeFoundation/haxe/releases/download/${HAXE_VERSION}/haxe-${HAXE_VERSION}-linux64.tar.gz && \
+    tar xvf haxe-${HAXE_VERSION}-linux64.tar.gz && \
+    rm haxe-${HAXE_VERSION}-linux64.tar.gz && \
+    mv haxe_* /opt/haxe && \
+    wget https://github.com/HaxeFoundation/neko/releases/download/v`echo ${NEKO_VERSION} | sed "s/\./-/g"`/neko-${NEKO_VERSION}-linux64.tar.gz && \
+    tar xvf neko-${NEKO_VERSION}-linux64.tar.gz && \
+    rm neko-${NEKO_VERSION}-linux64.tar.gz && \
+    mv neko-* /opt/neko
+ENV PATH /opt/haxe:/opt/neko:$PATH
+RUN echo "/opt/neko" > /etc/ld.so.conf.d/neko.conf && \
+    ldconfig
+USER ${user}
+RUN mkdir -p $HOME/haxe/lib && \
+    haxelib setup --always $HOME/haxe/lib && \
+    haxelib install --always hxcpp 2>&1 > /dev/null && \
+    haxelib install --always uuid 2>&1 > /dev/null
+USER root
 
 ENV GRADLE_VERSION="8.4"
 RUN apt-get install -y --no-install-recommends \
@@ -168,7 +196,7 @@
   ant \
   ant-optional \
   maven \
-  openjdk-11-jdk-headless && \
+  openjdk-17-jdk-headless && \
   `# Gradle` \
   wget https://services.gradle.org/distributions/gradle-$GRADLE_VERSION-bin.zip -q -O /tmp/gradle-$GRADLE_VERSION-bin.zip && \
   (echo "3e1af3ae886920c3ac87f7a91f816c0c7c436f276a6eefdb3da152100fef72ae  /tmp/gradle-$GRADLE_VERSION-bin.zip" | sha256sum -c -) && \
@@ -213,10 +241,13 @@
 
 RUN apt-get install -y --no-install-recommends \
   `# Php dependencies` \
-  php \
-  php-cli \
-  php-dev \
-  php-json \
+  php8.1 \
+  php8.1-cli \
+  php8.1-dev \
+  php8.1-mbstring \
+  php8.1-xml \
+  php8.1-curl \
+  php8.1-xdebug \
   php-pear \
   re2c \
   composer
@@ -240,9 +271,11 @@
   ruby-dev \
   ruby-bundler
 
-# Rust dependencies
-RUN curl https://sh.rustup.rs -sSf | sh -s -- --default-toolchain 1.65.0 -y
-ENV PATH /root/.cargo/bin:$PATH
+USER ${user}
+RUN `# Rust dependencies` \
+    curl https://sh.rustup.rs -sSf | sh -s -- --default-toolchain 1.65.0 -y
+ENV PATH /home/${user}/.cargo/bin:$PATH
+USER root
 
 # Swift on Linux for cross tests
 RUN apt-get install -yq \
@@ -281,6 +314,9 @@
 #     rm -rf /var/tmp/*
 
 ENV THRIFT_ROOT /thrift
-RUN mkdir -p $THRIFT_ROOT/src
+RUN mkdir -p $THRIFT_ROOT/src && \
+    chown -R ${uid}:${uid} $THRIFT_ROOT/
 COPY Dockerfile $THRIFT_ROOT/
 WORKDIR $THRIFT_ROOT/src
+
+USER ${user}
diff --git a/build/veralign.sh b/build/veralign.sh
index 834bf7e..f59eaf4 100755
--- a/build/veralign.sh
+++ b/build/veralign.sh
@@ -70,8 +70,10 @@
 FILES[lib/js/src/thrift.js]=simpleReplace
 FILES[lib/lua/Thrift.lua]=simpleReplace
 FILES[lib/netstd/Tests/Thrift.Tests/Thrift.Tests.csproj]=simpleReplace
-FILES[lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift.PublicInterfaces.Compile.Tests.csproj]=simpleReplace
-FILES[lib/netstd/Tests/Thrift.IntegrationTests/Thrift.IntegrationTests.csproj]=simpleReplace
+FILES[lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net8/Thrift.Compile.net8.csproj]=simpleReplace
+FILES[lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net6/Thrift.Compile.net6.csproj]=simpleReplace
+FILES[lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.netstd2/Thrift.Compile.netstd2.csproj]=simpleReplace
+FILES[lib/netstd/Tests/Thrift.Compile.Tests/Thrift.IntegrationTests/Thrift.IntegrationTests.csproj]=simpleReplace
 FILES[lib/netstd/Thrift/Properties/AssemblyInfo.cs]=simpleReplace
 FILES[lib/netstd/Thrift/Thrift.csproj]=simpleReplace
 FILES[lib/ocaml/_oasis]=simpleReplace
diff --git a/compiler/cpp/Makefile.am b/compiler/cpp/Makefile.am
index bb29d8c..29ef1bd 100644
--- a/compiler/cpp/Makefile.am
+++ b/compiler/cpp/Makefile.am
@@ -114,6 +114,9 @@
              compiler.vcxproj \
              compiler.vcxproj.filters
 
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
 EXTRA_DIST = \
              coding_standards.md \
              README.md \
diff --git a/compiler/cpp/compiler.vcxproj b/compiler/cpp/compiler.vcxproj
index 9fbf903..9cc2ccb 100644
--- a/compiler/cpp/compiler.vcxproj
+++ b/compiler/cpp/compiler.vcxproj
@@ -83,6 +83,8 @@
     <ClCompile Include="src\thrift\generate\t_swift_generator.cc" />
     <ClCompile Include="src\thrift\generate\t_xml_generator.cc" />
     <ClCompile Include="src\thrift\generate\t_xsd_generator.cc" />
+    <ClCompile Include="src\thrift\generate\go_validator_generator.cc" />
+    <ClCompile Include="src\thrift\generate\validator_parser.cc" />
     <ClCompile Include="src\thrift\main.cc" />
     <ClCompile Include="src\thrift\parse\parse.cc" />
     <ClCompile Include="src\thrift\parse\t_typedef.cc" />
@@ -103,23 +105,27 @@
     <ConfigurationType>Application</ConfigurationType>
     <UseDebugLibraries>true</UseDebugLibraries>
     <CharacterSet>MultiByte</CharacterSet>
+    <PlatformToolset>v143</PlatformToolset>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
     <ConfigurationType>Application</ConfigurationType>
     <UseDebugLibraries>true</UseDebugLibraries>
     <CharacterSet>MultiByte</CharacterSet>
+    <PlatformToolset>v143</PlatformToolset>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
     <ConfigurationType>Application</ConfigurationType>
     <UseDebugLibraries>false</UseDebugLibraries>
     <WholeProgramOptimization>true</WholeProgramOptimization>
     <CharacterSet>MultiByte</CharacterSet>
+    <PlatformToolset>v143</PlatformToolset>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
     <ConfigurationType>Application</ConfigurationType>
     <UseDebugLibraries>false</UseDebugLibraries>
     <WholeProgramOptimization>true</WholeProgramOptimization>
     <CharacterSet>MultiByte</CharacterSet>
+    <PlatformToolset>v143</PlatformToolset>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
   <ImportGroup Label="ExtensionSettings">
@@ -248,4 +254,4 @@
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets">
   </ImportGroup>
-</Project>
+</Project>
\ No newline at end of file
diff --git a/compiler/cpp/src/Makefile.am b/compiler/cpp/src/Makefile.am
index 5111fd5..5b6802a 100644
--- a/compiler/cpp/src/Makefile.am
+++ b/compiler/cpp/src/Makefile.am
@@ -39,6 +39,9 @@
 	$(RM) thrift/thriftl.cc thrift/thrifty.cc thrift/thrifty.h thrift/thrifty.hh
 
 
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
 EXTRA_DIST = \
 	thrift/logging.cc \
 	thrift/windows/config.h
diff --git a/compiler/cpp/src/thrift/generate/go_validator_generator.cc b/compiler/cpp/src/thrift/generate/go_validator_generator.cc
index 1f5a3ad..0adff2e 100644
--- a/compiler/cpp/src/thrift/generate/go_validator_generator.cc
+++ b/compiler/cpp/src/thrift/generate/go_validator_generator.cc
@@ -82,19 +82,19 @@
   }
   if (type->is_enum()) {
     if (context.tgt[0] == '*') {
-      out << indent() << "if " << context.tgt.substr(1) << " != nil {" << endl;
+      out << indent() << "if " << context.tgt.substr(1) << " != nil {" << '\n';
       indent_up();
     }
     generate_enum_field_validator(out, context);
     if (context.tgt[0] == '*') {
       indent_down();
-      out << indent() << "}" << endl;
+      out << indent() << "}" << '\n';
     }
     return;
   } else if (type->is_base_type()) {
     t_base_type::t_base tbase = ((t_base_type*)type)->get_base();
     if (context.tgt[0] == '*') {
-      out << indent() << "if " << context.tgt.substr(1) << " != nil {" << endl;
+      out << indent() << "if " << context.tgt.substr(1) << " != nil {" << '\n';
       indent_up();
     }
     switch (tbase) {
@@ -119,7 +119,7 @@
     }
     if (context.tgt[0] == '*') {
       indent_down();
-      out << indent() << "}" << endl;
+      out << indent() << "}" << '\n';
     }
     return;
   } else if (type->is_list()) {
@@ -146,7 +146,7 @@
     if (key == "vt.in") {
       if (values.size() > 1) {
         std::string exist = GenID("_exist");
-        out << indent() << "var " << exist << " bool" << endl;
+        out << indent() << "var " << exist << " bool" << '\n';
 
         std::string src = GenID("_src");
         out << indent() << src << " := []int64{";
@@ -162,19 +162,19 @@
           }
           out << ")";
         }
-        out << "}" << endl;
+        out << "}" << '\n';
 
-        out << indent() << "for _, src := range " << src << " {" << endl;
+        out << indent() << "for _, src := range " << src << " {" << '\n';
         indent_up();
-        out << indent() << "if int64(" << context.tgt << ") == src {" << endl;
+        out << indent() << "if int64(" << context.tgt << ") == src {" << '\n';
         indent_up();
-        out << indent() << exist << " = true" << endl;
-        out << indent() << "break" << endl;
+        out << indent() << exist << " = true" << '\n';
+        out << indent() << "break" << '\n';
         indent_down();
-        out << indent() << "}" << endl;
+        out << indent() << "}" << '\n';
         indent_down();
-        out << indent() << "}" << endl;
-        out << indent() << "if " << exist << " == false {" << endl;
+        out << indent() << "}" << '\n';
+        out << indent() << "if " << exist << " == false {" << '\n';
       } else {
         out << indent() << "if int64(" << context.tgt << ") != int64(";
         if (values[0]->is_field_reference()) {
@@ -182,18 +182,18 @@
         } else {
           out << values[0]->get_enum()->get_value();
         }
-        out << ") {" << endl;
+        out << ") {" << '\n';
       }
       indent_up();
       out << indent()
           << "return thrift.NewValidationException(thrift.VALIDATION_FAILED, \"vt.in\", \""
           << context.field_symbol << "\", \"" << context.field_symbol
-          << " not valid, rule vt.in check failed\")" << endl;
+          << " not valid, rule vt.in check failed\")" << '\n';
       indent_down();
-      out << indent() << "}" << endl;
+      out << indent() << "}" << '\n';
       if (values.size() > 1) {
         indent_down();
-        out << indent() << "}" << endl;
+        out << indent() << "}" << '\n';
       }
     } else if (key == "vt.not_in") {
       if (values.size() > 1) {
@@ -211,11 +211,11 @@
           }
           out << ")";
         }
-        out << "}" << endl;
+        out << "}" << '\n';
 
-        out << indent() << "for _, src := range " << src << " {" << endl;
+        out << indent() << "for _, src := range " << src << " {" << '\n';
         indent_up();
-        out << indent() << "if int64(" << context.tgt << ") == src {" << endl;
+        out << indent() << "if int64(" << context.tgt << ") == src {" << '\n';
       } else {
         out << indent() << "if int64(" << context.tgt << ") == ";
         out << "int64(";
@@ -224,18 +224,18 @@
         } else {
           out << values[0]->get_enum()->get_value();
         }
-        out << ") {" << endl;
+        out << ") {" << '\n';
       }
       indent_up();
       out << indent()
           << "return thrift.NewValidationException(thrift.VALIDATION_FAILED, \"vt.not_in\", \""
           << context.field_symbol << "\", \"" << context.field_symbol
-          << " not valid, rule vt.not_in check failed\")" << endl;
+          << " not valid, rule vt.not_in check failed\")" << '\n';
       indent_down();
-      out << indent() << "}" << endl;
+      out << indent() << "}" << '\n';
       if (values.size() > 1) {
         indent_down();
-        out << indent() << "}" << endl;
+        out << indent() << "}" << '\n';
       }
     } else if (key == "vt.defined_only") {
       if (values[0]->get_bool()) {
@@ -243,14 +243,14 @@
       } else {
         continue;
       }
-      out << "{" << endl;
+      out << "{" << '\n';
       indent_up();
       out << indent()
           << "return thrift.NewValidationException(thrift.VALIDATION_FAILED, \"" + key + "\", \""
           << context.field_symbol << "\", \"" << context.field_symbol << " not valid, rule " << key
-          << " check failed\")" << endl;
+          << " check failed\")" << '\n';
       indent_down();
-      out << indent() << "}" << endl;
+      out << indent() << "}" << '\n';
     }
   }
 }
@@ -276,14 +276,14 @@
         }
       }
     }
-    out << "{" << endl;
+    out << "{" << '\n';
     indent_up();
     out << indent()
         << "return thrift.NewValidationException(thrift.VALIDATION_FAILED, \"" + key + "\", \""
         << context.field_symbol << "\", \"" << context.field_symbol << " not valid, rule " << key
-        << " check failed\")" << endl;
+        << " check failed\")" << '\n';
     indent_down();
-    out << indent() << "}" << endl;
+    out << indent() << "}" << '\n';
   }
 }
 
@@ -308,19 +308,19 @@
       } else {
         out << values[0]->get_double();
       }
-      out << "{" << endl;
+      out << "{" << '\n';
       indent_up();
       out << indent()
           << "return thrift.NewValidationException(thrift.VALIDATION_FAILED, \"" + key + "\", \""
           << context.field_symbol << "\", \"" << context.field_symbol << " not valid, rule " << key
-          << " check failed\")" << endl;
+          << " check failed\")" << '\n';
       indent_down();
-      out << indent() << "}" << endl;
+      out << indent() << "}" << '\n';
       continue;
     } else if (key == "vt.in") {
       if (values.size() > 1) {
         std::string exist = GenID("_exist");
-        out << indent() << "var " << exist << " bool" << endl;
+        out << indent() << "var " << exist << " bool" << '\n';
 
         std::string src = GenID("_src");
         out << indent() << src << " := []float64{";
@@ -334,19 +334,19 @@
             out << (*it)->get_double();
           }
         }
-        out << "}" << endl;
+        out << "}" << '\n';
 
-        out << indent() << "for _, src := range " << src << " {" << endl;
+        out << indent() << "for _, src := range " << src << " {" << '\n';
         indent_up();
-        out << indent() << "if " << context.tgt << " == src {" << endl;
+        out << indent() << "if " << context.tgt << " == src {" << '\n';
         indent_up();
-        out << indent() << exist << " = true" << endl;
-        out << indent() << "break" << endl;
+        out << indent() << exist << " = true" << '\n';
+        out << indent() << "break" << '\n';
         indent_down();
-        out << indent() << "}" << endl;
+        out << indent() << "}" << '\n';
         indent_down();
-        out << indent() << "}" << endl;
-        out << indent() << "if " << exist << " == false {" << endl;
+        out << indent() << "}" << '\n';
+        out << indent() << "if " << exist << " == false {" << '\n';
       } else {
         out << indent() << "if " << context.tgt << " != ";
         if (values[0]->is_field_reference()) {
@@ -354,16 +354,16 @@
         } else {
           out << values[0]->get_double();
         }
-        out << "{" << endl;
+        out << "{" << '\n';
       }
 
       indent_up();
       out << indent()
           << "return thrift.NewValidationException(thrift.VALIDATION_FAILED, \"vt.in\", \""
           << context.field_symbol << "\", \"" << context.field_symbol
-          << " not valid, rule vt.in check failed\")" << endl;
+          << " not valid, rule vt.in check failed\")" << '\n';
       indent_down();
-      out << indent() << "}" << endl;
+      out << indent() << "}" << '\n';
     } else if (key == "vt.not_in") {
       if (values.size() > 1) {
         std::string src = GenID("_src");
@@ -378,11 +378,11 @@
             out << (*it)->get_double();
           }
         }
-        out << "}" << endl;
+        out << "}" << '\n';
 
-        out << indent() << "for _, src := range " << src << " {" << endl;
+        out << indent() << "for _, src := range " << src << " {" << '\n';
         indent_up();
-        out << indent() << "if " << context.tgt << " == src {" << endl;
+        out << indent() << "if " << context.tgt << " == src {" << '\n';
       } else {
         out << indent() << "if " << context.tgt << " == ";
         if (values[0]->is_field_reference()) {
@@ -390,18 +390,18 @@
         } else {
           out << values[0]->get_double();
         }
-        out << "{" << endl;
+        out << "{" << '\n';
       }
       indent_up();
       out << indent()
           << "return thrift.NewValidationException(thrift.VALIDATION_FAILED, \"vt.not_in\", \""
           << context.field_symbol << "\", \"" << context.field_symbol
-          << " not valid, rule vt.not_in check failed\")" << endl;
+          << " not valid, rule vt.not_in check failed\")" << '\n';
       indent_down();
-      out << indent() << "}" << endl;
+      out << indent() << "}" << '\n';
       if (values.size() > 1) {
         indent_down();
-        out << indent() << "}" << endl;
+        out << indent() << "}" << '\n';
       }
     }
   }
@@ -460,18 +460,18 @@
       } else {
         out << values[0]->get_int();
       }
-      out << "{" << endl;
+      out << "{" << '\n';
       indent_up();
       out << indent()
           << "return thrift.NewValidationException(thrift.VALIDATION_FAILED, \"" + key + "\", \""
           << context.field_symbol << "\", \"" << context.field_symbol << " not valid, rule " << key
-          << " check failed\")" << endl;
+          << " check failed\")" << '\n';
       indent_down();
-      out << indent() << "}" << endl;
+      out << indent() << "}" << '\n';
     } else if (key == "vt.in") {
       if (values.size() > 1) {
         std::string exist = GenID("_exist");
-        out << indent() << "var " << exist << " bool" << endl;
+        out << indent() << "var " << exist << " bool" << '\n';
 
         std::string src = GenID("_src");
         out << indent() << src << " := []";
@@ -499,19 +499,19 @@
             out << (*it)->get_int();
           }
         }
-        out << "}" << endl;
+        out << "}" << '\n';
 
-        out << indent() << "for _, src := range " << src << " {" << endl;
+        out << indent() << "for _, src := range " << src << " {" << '\n';
         indent_up();
-        out << indent() << "if " << context.tgt << " == src {" << endl;
+        out << indent() << "if " << context.tgt << " == src {" << '\n';
         indent_up();
-        out << indent() << exist << " = true" << endl;
-        out << indent() << "break" << endl;
+        out << indent() << exist << " = true" << '\n';
+        out << indent() << "break" << '\n';
         indent_down();
-        out << indent() << "}" << endl;
+        out << indent() << "}" << '\n';
         indent_down();
-        out << indent() << "}" << endl;
-        out << indent() << "if " << exist << " == false {" << endl;
+        out << indent() << "}" << '\n';
+        out << indent() << "if " << exist << " == false {" << '\n';
       } else {
         out << indent() << "if " << context.tgt << " != ";
         if (values[0]->is_field_reference()) {
@@ -531,15 +531,15 @@
         } else {
           out << values[0]->get_int();
         }
-        out << "{" << endl;
+        out << "{" << '\n';
       }
       indent_up();
       out << indent()
           << "return thrift.NewValidationException(thrift.VALIDATION_FAILED, \"vt.in\", \""
           << context.field_symbol << "\", \"" << context.field_symbol
-          << " not valid, rule vt.in check failed\")" << endl;
+          << " not valid, rule vt.in check failed\")" << '\n';
       indent_down();
-      out << indent() << "}" << endl;
+      out << indent() << "}" << '\n';
     } else if (key == "vt.not_in") {
       if (values.size() > 1) {
         std::string src = GenID("_src");
@@ -584,11 +584,11 @@
             out << (*it)->get_int();
           }
         }
-        out << "}" << endl;
+        out << "}" << '\n';
 
-        out << indent() << "for _, src := range " << src << " {" << endl;
+        out << indent() << "for _, src := range " << src << " {" << '\n';
         indent_up();
-        out << indent() << "if " << context.tgt << " == src {" << endl;
+        out << indent() << "if " << context.tgt << " == src {" << '\n';
       } else {
         out << indent() << "if " << context.tgt << " == ";
         if (values[0]->is_field_reference()) {
@@ -608,18 +608,18 @@
         } else {
           out << values[0]->get_int();
         }
-        out << "{" << endl;
+        out << "{" << '\n';
       }
       indent_up();
       out << indent()
           << "return thrift.NewValidationException(thrift.VALIDATION_FAILED, \"vt.not_in\", \""
           << context.field_symbol << "\", \"" << context.field_symbol
-          << " not valid, rule vt.not_in check failed\")" << endl;
+          << " not valid, rule vt.not_in check failed\")" << '\n';
       indent_down();
-      out << indent() << "}" << endl;
+      out << indent() << "}" << '\n';
       if (values.size() > 1) {
         indent_down();
-        out << indent() << "}" << endl;
+        out << indent() << "}" << '\n';
       }
     }
   }
@@ -635,7 +635,7 @@
   if (type->is_binary()) {
     target = GenID("_tgt");
     out << indent() << target << " := "
-        << "string(" << context.tgt << ")" << endl;
+        << "string(" << context.tgt << ")" << '\n';
   }
   for (auto it = context.rules.begin(); it != context.rules.end(); it++) {
     const std::vector<validation_value*>& values = (*it)->get_values();
@@ -729,14 +729,14 @@
       }
       out << ")";
     }
-    out << "{" << endl;
+    out << "{" << '\n';
     indent_up();
     out << indent()
         << "return thrift.NewValidationException(thrift.VALIDATION_FAILED, \"" + key + "\", \""
         << context.field_symbol << "\", \"" << context.field_symbol << " not valid, rule " << key
-        << " check failed\")" << endl;
+        << " check failed\")" << '\n';
     indent_down();
-    out << indent() << "}" << endl;
+    out << indent() << "}" << '\n';
   }
 }
 
@@ -764,19 +764,19 @@
       } else {
         out << values[0]->get_int();
       }
-      out << "{" << endl;
+      out << "{" << '\n';
       indent_up();
       out << indent()
           << "return thrift.NewValidationException(thrift.VALIDATION_FAILED, \"" + key + "\", \""
           << context.field_symbol << "\", \"" << context.field_symbol << " not valid, rule " << key
-          << " check failed\")" << endl;
+          << " check failed\")" << '\n';
       indent_down();
-      out << indent() << "}" << endl;
+      out << indent() << "}" << '\n';
     } else if (key == "vt.elem") {
-      out << indent() << "for i := 0; i < len(" << context.tgt << ");i++ {" << endl;
+      out << indent() << "for i := 0; i < len(" << context.tgt << ");i++ {" << '\n';
       indent_up();
       std::string src = GenID("_elem");
-      out << indent() << src << " := " << context.tgt << "[i]" << endl;
+      out << indent() << src << " := " << context.tgt << "[i]" << '\n';
       t_type* elem_type;
       if (context.type->is_list()) {
         elem_type = ((t_list*)context.type)->get_elem_type();
@@ -791,7 +791,7 @@
                             std::vector<validation_rule*>{(*it)->get_inner()}};
       generate_field_validator(out, ctx);
       indent_down();
-      out << indent() << "}" << endl;
+      out << indent() << "}" << '\n';
     }
   }
 }
@@ -815,17 +815,17 @@
       } else {
         out << values[0]->get_int();
       }
-      out << "{" << endl;
+      out << "{" << '\n';
       indent_up();
       out << indent()
           << "return thrift.NewValidationException(thrift.VALIDATION_FAILED, \"" + key + "\", \""
           << context.field_symbol << "\", \"" << context.field_symbol << " not valid, rule " << key
-          << " check failed\")" << endl;
+          << " check failed\")" << '\n';
       indent_down();
-      out << indent() << "}" << endl;
+      out << indent() << "}" << '\n';
     } else if (key == "vt.key") {
       std::string src = GenID("_key");
-      out << indent() << "for " << src << " := range " << context.tgt << " {" << endl;
+      out << indent() << "for " << src << " := range " << context.tgt << " {" << '\n';
       indent_up();
       generator_context ctx{context.field_symbol + ".key",
                             "",
@@ -835,10 +835,10 @@
                             std::vector<validation_rule*>{(*it)->get_inner()}};
       generate_field_validator(out, ctx);
       indent_down();
-      out << indent() << "}" << endl;
+      out << indent() << "}" << '\n';
     } else if (key == "vt.value") {
       std::string src = GenID("_value");
-      out << indent() << "for _, " << src << " := range " << context.tgt << " {" << endl;
+      out << indent() << "for _, " << src << " := range " << context.tgt << " {" << '\n';
       indent_up();
       generator_context ctx{context.field_symbol + ".value",
                             "",
@@ -848,7 +848,7 @@
                             std::vector<validation_rule*>{(*it)->get_inner()}};
       generate_field_validator(out, ctx);
       indent_down();
-      out << indent() << "}" << endl;
+      out << indent() << "}" << '\n';
     }
   }
 }
@@ -875,31 +875,31 @@
   }
   if (generate_valid) {
     if (last_valid_rule == nullptr) {
-      out << indent() << "if err := " << context.tgt << ".Validate(); err != nil {" << endl;
+      out << indent() << "if err := " << context.tgt << ".Validate(); err != nil {" << '\n';
       indent_up();
-      out << indent() << "return err" << endl;
+      out << indent() << "return err" << '\n';
       indent_down();
-      out << indent() << "}" << endl;
+      out << indent() << "}" << '\n';
     } else {
       const std::vector<validation_value*>& values = last_valid_rule->get_values();
       if (!values[0]->get_bool()) {
-        out << indent() << "if err := " << context.tgt << ".Validate(); err != nil {" << endl;
+        out << indent() << "if err := " << context.tgt << ".Validate(); err != nil {" << '\n';
         indent_up();
-        out << indent() << "return err" << endl;
+        out << indent() << "return err" << '\n';
         indent_down();
-        out << indent() << "}" << endl;
+        out << indent() << "}" << '\n';
       } else if (values[0]->is_field_reference()) {
         out << indent() << "if !";
         out << get_field_reference_name(values[0]->get_field_reference());
-        out << "{" << endl;
+        out << "{" << '\n';
         indent_up();
-        out << indent() << "if err := " << context.tgt << ".Validate(); err != nil {" << endl;
+        out << indent() << "if err := " << context.tgt << ".Validate(); err != nil {" << '\n';
         indent_up();
-        out << indent() << "return err" << endl;
+        out << indent() << "return err" << '\n';
         indent_down();
-        out << indent() << "}" << endl;
+        out << indent() << "}" << '\n';
         indent_down();
-        out << indent() << "}" << endl;
+        out << indent() << "}" << '\n';
       }
     }
   }
diff --git a/compiler/cpp/src/thrift/generate/t_c_glib_generator.cc b/compiler/cpp/src/thrift/generate/t_c_glib_generator.cc
index da25338..b5eb603 100644
--- a/compiler/cpp/src/thrift/generate/t_c_glib_generator.cc
+++ b/compiler/cpp/src/thrift/generate/t_c_glib_generator.cc
@@ -39,8 +39,6 @@
 using std::stringstream;
 using std::vector;
 
-static const string endl = "\n"; // avoid ostream << std::endl flushes
-
 /* forward declarations */
 string initial_caps_to_underscores(string name);
 string underscores_to_initial_caps(string name);
@@ -241,18 +239,18 @@
   f_types_impl_ << autogen_comment();
 
   /* include inclusion guard */
-  f_types_ << "#ifndef " << this->nspace_uc << program_name_uc << "_TYPES_H" << endl << "#define "
-           << this->nspace_uc << program_name_uc << "_TYPES_H" << endl << endl;
+  f_types_ << "#ifndef " << this->nspace_uc << program_name_uc << "_TYPES_H" << '\n' << "#define "
+           << this->nspace_uc << program_name_uc << "_TYPES_H" << '\n' << '\n';
 
   /* include base types */
-  f_types_ << "/* base includes */" << endl << "#include <glib-object.h>" << endl
-           << "#include <thrift/c_glib/thrift_struct.h>" << endl
-           << "#include <thrift/c_glib/protocol/thrift_protocol.h>" << endl;
+  f_types_ << "/* base includes */" << '\n' << "#include <glib-object.h>" << '\n'
+           << "#include <thrift/c_glib/thrift_struct.h>" << '\n'
+           << "#include <thrift/c_glib/protocol/thrift_protocol.h>" << '\n';
 
   /* include other thrift includes */
   const vector<t_program*>& includes = program_->get_includes();
   if (!includes.empty()) {
-    f_types_ << "/* other thrift includes */" << endl;
+    f_types_ << "/* other thrift includes */" << '\n';
 
     for (auto include : includes) {
       const std::string& include_nspace = include->get_namespace("c_glib");
@@ -260,32 +258,32 @@
         include_nspace.empty() ? "" : initial_caps_to_underscores(include_nspace) + "_";
 
       f_types_ << "#include \"" << include_nspace_prefix
-               << initial_caps_to_underscores(include->get_name()) << "_types.h\"" << endl;
+               << initial_caps_to_underscores(include->get_name()) << "_types.h\"" << '\n';
     }
-    f_types_ << endl;
+    f_types_ << '\n';
   }
 
   /* include custom headers */
   const vector<string>& c_includes = program_->get_c_includes();
-  f_types_ << "/* custom thrift includes */" << endl;
+  f_types_ << "/* custom thrift includes */" << '\n';
   for (const auto & c_include : c_includes) {
     if (c_include[0] == '<') {
-      f_types_ << "#include " << c_include << endl;
+      f_types_ << "#include " << c_include << '\n';
     } else {
-      f_types_ << "#include \"" << c_include << "\"" << endl;
+      f_types_ << "#include \"" << c_include << "\"" << '\n';
     }
   }
-  f_types_ << endl;
+  f_types_ << '\n';
 
   /* include math.h (for "INFINITY") in the implementation file, in case we
      encounter a struct with a member of type double */
-  f_types_impl_ << endl << "#include <math.h>" << endl;
+  f_types_impl_ << '\n' << "#include <math.h>" << '\n';
 
   // include the types file
-  f_types_impl_ << endl << "#include \"" << this->nspace_lc << program_name_u << "_types.h\""
-                << endl << "#include <thrift/c_glib/thrift.h>" << endl << endl;
+  f_types_impl_ << '\n' << "#include \"" << this->nspace_lc << program_name_u << "_types.h\""
+                << '\n' << "#include <thrift/c_glib/thrift.h>" << '\n' << '\n';
 
-  f_types_ << "/* begin types */" << endl << endl;
+  f_types_ << "/* begin types */" << '\n' << '\n';
 }
 
 /**
@@ -295,7 +293,7 @@
   string program_name_uc = to_upper_case(initial_caps_to_underscores(program_name_));
 
   /* end the header inclusion guard */
-  f_types_ << "#endif /* " << this->nspace_uc << program_name_uc << "_TYPES_H */" << endl;
+  f_types_ << "#endif /* " << this->nspace_uc << program_name_uc << "_TYPES_H */" << '\n';
 
   /* close output file */
   f_types_.close();
@@ -313,7 +311,7 @@
  */
 void t_c_glib_generator::generate_typedef(t_typedef* ttypedef) {
   f_types_ << indent() << "typedef " << type_name(ttypedef->get_type(), true) << " " << this->nspace
-           << ttypedef->get_symbolic() << ";" << endl << endl;
+           << ttypedef->get_symbolic() << ";" << '\n' << '\n';
 }
 
 /**
@@ -336,7 +334,7 @@
   string name = tenum->get_name();
   string name_uc = to_upper_case(initial_caps_to_underscores(name));
 
-  f_types_ << indent() << "enum _" << this->nspace << name << " {" << endl;
+  f_types_ << indent() << "enum _" << this->nspace << name << " {" << '\n';
 
   indent_up();
 
@@ -349,7 +347,7 @@
     if (first) {
       first = false;
     } else {
-      f_types_ << "," << endl;
+      f_types_ << "," << '\n';
     }
 
     f_types_ << indent() << this->nspace_uc << name_uc << "_" << (*c_iter)->get_name();
@@ -357,19 +355,19 @@
   }
 
   indent_down();
-  f_types_ << endl << "};" << endl << "typedef enum _" << this->nspace << name << " "
-           << this->nspace << name << ";" << endl << endl;
+  f_types_ << '\n' << "};" << '\n' << "typedef enum _" << this->nspace << name << " "
+           << this->nspace << name << ";" << '\n' << '\n';
 
-  f_types_ << "/* return the name of the constant */" << endl;
-  f_types_ << "const char *" << endl;
-  f_types_ << "toString_" << name << "(int value); " << endl << endl;
+  f_types_ << "/* return the name of the constant */" << '\n';
+  f_types_ << "const char *" << '\n';
+  f_types_ << "toString_" << name << "(int value); " << '\n' << '\n';
   ;
-  f_types_impl_ << "/* return the name of the constant */" << endl;
-  f_types_impl_ << "const char *" << endl;
-  f_types_impl_ << "toString_" << name << "(int value) " << endl;
-  f_types_impl_ << "{" << endl;
-  f_types_impl_ << "  static __thread char buf[16] = {0};" << endl;
-  f_types_impl_ << "  switch(value) {" << endl;
+  f_types_impl_ << "/* return the name of the constant */" << '\n';
+  f_types_impl_ << "const char *" << '\n';
+  f_types_impl_ << "toString_" << name << "(int value) " << '\n';
+  f_types_impl_ << "{" << '\n';
+  f_types_impl_ << "  static __thread char buf[16] = {0};" << '\n';
+  f_types_impl_ << "  switch(value) {" << '\n';
   std::set<int> done;
   for (c_iter = constants.begin(); c_iter != constants.end(); ++c_iter) {
     int value = (*c_iter)->get_value();
@@ -379,20 +377,20 @@
       f_types_impl_ << "  case " << this->nspace_uc << name_uc << "_" << (*c_iter)->get_name()
                     << ":"
                     << "return \"" << this->nspace_uc << name_uc << "_" << (*c_iter)->get_name()
-                    << "\";" << endl;
+                    << "\";" << '\n';
     }
   }
-  f_types_impl_ << "  default: g_snprintf(buf, 16, \"%d\", value); return buf;" << endl;
-  f_types_impl_ << "  }" << endl;
-  f_types_impl_ << "}" << endl << endl;
+  f_types_impl_ << "  default: g_snprintf(buf, 16, \"%d\", value); return buf;" << '\n';
+  f_types_impl_ << "  }" << '\n';
+  f_types_impl_ << "}" << '\n' << '\n';
 }
 
 /**
  * Generates Thrift constants in C code.
  */
 void t_c_glib_generator::generate_consts(vector<t_const*> consts) {
-  f_types_ << "/* constants */" << endl;
-  f_types_impl_ << "/* constants */" << endl;
+  f_types_ << "/* constants */" << '\n';
+  f_types_impl_ << "/* constants */" << '\n';
 
   vector<t_const*>::iterator c_iter;
   for (c_iter = consts.begin(); c_iter != consts.end(); ++c_iter) {
@@ -404,17 +402,17 @@
 
     if (is_complex_type(type)) {
       f_types_ << type_name(type) << indent() << this->nspace_lc << name_lc
-               << "_constant();" << endl;
+               << "_constant();" << '\n';
     }
 
     f_types_ << indent() << "#define " << this->nspace_uc << name_uc << " "
-             << constant_value(name_lc, type, value) << endl;
+             << constant_value(name_lc, type, value) << '\n';
 
     generate_const_initializer(name_lc, type, value, true);
   }
 
-  f_types_ << endl;
-  f_types_impl_ << endl;
+  f_types_ << '\n';
+  f_types_impl_ << '\n';
 }
 
 /**
@@ -439,7 +437,7 @@
  * // ... additional GObject boilerplate ...
  */
 void t_c_glib_generator::generate_struct(t_struct* tstruct) {
-  f_types_ << "/* struct " << tstruct->get_name() << " */" << endl;
+  f_types_ << "/* struct " << tstruct->get_name() << " */" << '\n';
   generate_object(tstruct);
 }
 
@@ -463,21 +461,21 @@
   f_header_ << autogen_comment();
 
   // add an inclusion guard
-  f_header_ << "#ifndef " << svcname_uc << "_H" << endl << "#define " << svcname_uc << "_H" << endl
-            << endl;
+  f_header_ << "#ifndef " << svcname_uc << "_H" << '\n' << "#define " << svcname_uc << "_H" << '\n'
+            << '\n';
 
   // add standard includes
-  f_header_ << "#include <thrift/c_glib/processor/thrift_dispatch_processor.h>" << endl << endl;
-  f_header_ << "#include \"" << this->nspace_lc << program_name_lc << "_types.h\"" << endl;
+  f_header_ << "#include <thrift/c_glib/processor/thrift_dispatch_processor.h>" << '\n' << '\n';
+  f_header_ << "#include \"" << this->nspace_lc << program_name_lc << "_types.h\"" << '\n';
 
   // if we are inheriting from another service, include its header
   t_service* extends_service = tservice->get_extends();
   if (extends_service != nullptr) {
     f_header_ << "#include \"" << this->nspace_lc
               << to_lower_case(initial_caps_to_underscores(extends_service->get_name())) << ".h\""
-              << endl;
+              << '\n';
   }
-  f_header_ << endl;
+  f_header_ << '\n';
 
   // create the service implementation
   string f_service_name = get_out_dir() + filename + ".c";
@@ -487,9 +485,9 @@
   f_service_ << autogen_comment();
 
   // include the headers
-  f_service_ << "#include <string.h>" << endl << "#include <thrift/c_glib/thrift.h>" << endl
-             << "#include <thrift/c_glib/thrift_application_exception.h>" << endl << "#include \""
-             << filename << ".h\"" << endl << endl;
+  f_service_ << "#include <string.h>" << '\n' << "#include <thrift/c_glib/thrift.h>" << '\n'
+             << "#include <thrift/c_glib/thrift_application_exception.h>" << '\n' << "#include \""
+             << filename << ".h\"" << '\n' << '\n';
 
   // generate the service-helper classes
   generate_service_helpers(tservice);
@@ -501,7 +499,7 @@
   generate_service_server(tservice);
 
   // end the header inclusion guard
-  f_header_ << "#endif /* " << svcname_uc << "_H */" << endl;
+  f_header_ << "#endif /* " << svcname_uc << "_H */" << '\n';
 
   // close the files
   f_service_.close();
@@ -519,27 +517,27 @@
 
   generate_object(tstruct);
 
-  f_types_ << "/* exception */" << endl
-           << "typedef enum" << endl
-           << "{" << endl;
+  f_types_ << "/* exception */" << '\n'
+           << "typedef enum" << '\n'
+           << "{" << '\n';
   indent_up();
-  f_types_ << indent() << this->nspace_uc << name_uc << "_ERROR_CODE" << endl;
+  f_types_ << indent() << this->nspace_uc << name_uc << "_ERROR_CODE" << '\n';
   indent_down();
-  f_types_ << "} " << this->nspace << name << "Error;" << endl
-           << endl
+  f_types_ << "} " << this->nspace << name << "Error;" << '\n'
+           << '\n'
            << "GQuark " << this->nspace_lc << name_lc
-           << "_error_quark (void);" << endl
+           << "_error_quark (void);" << '\n'
            << "#define " << this->nspace_uc << name_uc << "_ERROR ("
-           << this->nspace_lc << name_lc << "_error_quark())" << endl
-           << endl
-           << endl;
+           << this->nspace_lc << name_lc << "_error_quark())" << '\n'
+           << '\n'
+           << '\n';
 
-  f_types_impl_ << "/* define the GError domain for exceptions */" << endl << "#define "
+  f_types_impl_ << "/* define the GError domain for exceptions */" << '\n' << "#define "
                 << this->nspace_uc << name_uc << "_ERROR_DOMAIN \"" << this->nspace_lc << name_lc
-                << "_error_quark\"" << endl << "GQuark" << endl << this->nspace_lc << name_lc
-                << "_error_quark (void)" << endl << "{" << endl
+                << "_error_quark\"" << '\n' << "GQuark" << '\n' << this->nspace_lc << name_lc
+                << "_error_quark (void)" << '\n' << "{" << '\n'
                 << "  return g_quark_from_static_string (" << this->nspace_uc << name_uc
-                << "_ERROR_DOMAIN);" << endl << "}" << endl << endl;
+                << "_ERROR_DOMAIN);" << '\n' << "}" << '\n' << '\n';
 }
 
 /********************
@@ -983,12 +981,12 @@
   ostringstream render;
   if (is_numeric(etype)) {
     render << "    " << type_name(etype) << " *" << fname << " = "
-           << "g_new (" << base_type_name(etype) << ", 1);" << endl
+           << "g_new (" << base_type_name(etype) << ", 1);" << '\n'
            << "    *" << fname << " = " << constant_value(fname, (t_type*)etype, value) << ";"
-           << endl;
+           << '\n';
   } else {
     render << "    " << type_name(etype) << " " << fname << " = "
-           << constant_value(fname, (t_type*)etype, value) << ";" << endl;
+           << constant_value(fname, (t_type*)etype, value) << ";" << '\n';
   }
   return render.str();
 }
@@ -1037,22 +1035,22 @@
       initializers << "    constant->" << v_iter->first->get_string() << " = "
                    << constant_value(name + "_constant_" + field_name,
                                      field_type,
-                                     v_iter->second) << ";" << endl
+                                     v_iter->second) << ";" << '\n'
                    << "    constant->__isset_" << v_iter->first->get_string()
-                   << " = TRUE;" << endl;
+                   << " = TRUE;" << '\n';
     }
 
     // implement the initializer
     f_types_impl_ << maybe_static << this->nspace << type->get_name() << " *"
-                  << endl
-                  << this->nspace_lc << name_lc << "_constant (void)" << endl;
+                  << '\n'
+                  << this->nspace_lc << name_lc << "_constant (void)" << '\n';
     scope_up(f_types_impl_);
     f_types_impl_ << indent() << "static " << this->nspace << type->get_name()
-                  << " *constant = NULL;" << endl
-                  << indent() << "if (constant == NULL)" << endl;
+                  << " *constant = NULL;" << '\n'
+                  << indent() << "if (constant == NULL)" << '\n';
     scope_up(f_types_impl_);
     f_types_impl_ << indent() << "constant = g_object_new (" << this->nspace_uc
-                  << "TYPE_" << type_uc << ", NULL);" << endl
+                  << "TYPE_" << type_uc << ", NULL);" << '\n'
                   << initializers.str();
     scope_down(f_types_impl_);
 
@@ -1074,9 +1072,9 @@
       field_name = tmp(field_name);
     }
 
-    f_types_impl_ << indent() << "return constant;" << endl;
+    f_types_impl_ << indent() << "return constant;" << '\n';
     scope_down(f_types_impl_);
-    f_types_impl_ << endl;
+    f_types_impl_ << '\n';
   } else if (type->is_list()) {
     string list_type = "GPtrArray *";
     string free_func
@@ -1125,33 +1123,33 @@
       if (list_variable) {
         initializers << "    " << type_name(etype) << " " << fname << " = "
                      << constant_value(fname, (t_type*)etype, (*v_iter)) << ";"
-                     << endl;
+                     << '\n';
         appenders << "    " << list_appender << "(constant, " << fname << ");"
-                  << endl;
+                  << '\n';
       } else {
         appenders << "    " << list_appender << "(constant, "
                   << constant_value(fname, (t_type*)etype, (*v_iter)) << ");"
-                  << endl;
+                  << '\n';
       }
     }
 
-    f_types_impl_ << maybe_static << list_type << endl
-                  << this->nspace_lc << name_lc << "_constant (void)" << endl;
+    f_types_impl_ << maybe_static << list_type << '\n'
+                  << this->nspace_lc << name_lc << "_constant (void)" << '\n';
     scope_up(f_types_impl_);
     f_types_impl_ << indent() << "static " << list_type << " constant = NULL;"
-                  << endl
-                  << indent() << "if (constant == NULL)" << endl;
+                  << '\n'
+                  << indent() << "if (constant == NULL)" << '\n';
     scope_up(f_types_impl_);
     if (!initializers.str().empty()) {
       f_types_impl_ << initializers.str()
-                    << endl;
+                    << '\n';
     }
-    f_types_impl_ << indent() << "constant = " << list_initializer << endl
+    f_types_impl_ << indent() << "constant = " << list_initializer << '\n'
                   << appenders.str();
     scope_down(f_types_impl_);
-    f_types_impl_ << indent() << "return constant;" << endl;
+    f_types_impl_ << indent() << "return constant;" << '\n';
     scope_down(f_types_impl_);
-    f_types_impl_ << endl;
+    f_types_impl_ << '\n';
   } else if (type->is_set()) {
     t_type* etype = ((t_set*)type)->get_elem_type();
     const vector<t_const_value*>& val = value->get_list();
@@ -1164,22 +1162,22 @@
       string ptr = is_numeric(etype) ? "*" : "";
       generate_const_initializer(fname, etype, (*v_iter));
       initializers << constant_value_with_storage(fname, (t_type*)etype, *v_iter);
-      appenders << "    g_hash_table_insert (constant, " << fname << ", 0);" << endl;
+      appenders << "    g_hash_table_insert (constant, " << fname << ", 0);" << '\n';
     }
 
-    f_types_impl_ << maybe_static << "GHashTable *" << endl
-                  << this->nspace_lc << name_lc << "_constant (void)" << endl;
+    f_types_impl_ << maybe_static << "GHashTable *" << '\n'
+                  << this->nspace_lc << name_lc << "_constant (void)" << '\n';
     scope_up(f_types_impl_);
-    f_types_impl_ << indent() << "static GHashTable *constant = NULL;" << endl
-                  << indent() << "if (constant == NULL)" << endl;
+    f_types_impl_ << indent() << "static GHashTable *constant = NULL;" << '\n'
+                  << indent() << "if (constant == NULL)" << '\n';
     scope_up(f_types_impl_);
-    f_types_impl_ << initializers.str() << endl
-                  << indent() << "constant = " << generate_new_hash_from_type(etype, nullptr) << endl
+    f_types_impl_ << initializers.str() << '\n'
+                  << indent() << "constant = " << generate_new_hash_from_type(etype, nullptr) << '\n'
                   << appenders.str();
     scope_down(f_types_impl_);
-    f_types_impl_ << indent() << "return constant;" << endl;
+    f_types_impl_ << indent() << "return constant;" << '\n';
     scope_down(f_types_impl_);
-    f_types_impl_ << endl;
+    f_types_impl_ << '\n';
   } else if (type->is_map()) {
     t_type* ktype = ((t_map*)type)->get_key_type();
     t_type* vtype = ((t_map*)type)->get_val_type();
@@ -1197,22 +1195,22 @@
 
       initializers << constant_value_with_storage(kname, (t_type*)ktype, v_iter->first);
       initializers << constant_value_with_storage(vname, (t_type*)vtype, v_iter->second);
-      appenders << "    g_hash_table_insert (constant, " << kname << ", " << vname << ");" << endl;
+      appenders << "    g_hash_table_insert (constant, " << kname << ", " << vname << ");" << '\n';
     }
 
-    f_types_impl_ << maybe_static << "GHashTable *" << endl
-                  << this->nspace_lc << name_lc << "_constant (void)" << endl;
+    f_types_impl_ << maybe_static << "GHashTable *" << '\n'
+                  << this->nspace_lc << name_lc << "_constant (void)" << '\n';
     scope_up(f_types_impl_);
-    f_types_impl_ << indent() << "static GHashTable *constant = NULL;" << endl
-                  << indent() << "if (constant == NULL)" << endl;
+    f_types_impl_ << indent() << "static GHashTable *constant = NULL;" << '\n'
+                  << indent() << "if (constant == NULL)" << '\n';
     scope_up(f_types_impl_);
-    f_types_impl_ << initializers.str() << endl
-                  << indent() << "constant = " << generate_new_hash_from_type(ktype, vtype) << endl
+    f_types_impl_ << initializers.str() << '\n'
+                  << indent() << "constant = " << generate_new_hash_from_type(ktype, vtype) << '\n'
                   << appenders.str();
     scope_down(f_types_impl_);
-    f_types_impl_ << indent() << "return constant;" << endl;
+    f_types_impl_ << indent() << "return constant;" << '\n';
     scope_down(f_types_impl_);
-    f_types_impl_ << endl;
+    f_types_impl_ << '\n';
   }
 }
 
@@ -1303,13 +1301,13 @@
   string base_service_name_uc = to_upper_case(base_service_name_lc);
 
   // Generate the client interface dummy object in the header.
-  f_header_ << "/* " << service_name_ << " service interface */" << endl << "typedef struct _"
+  f_header_ << "/* " << service_name_ << " service interface */" << '\n' << "typedef struct _"
             << this->nspace << service_name_ << "If " << this->nspace << service_name_ << "If; "
-            << " /* dummy object */" << endl << endl;
+            << " /* dummy object */" << '\n' << '\n';
 
   // Generate the client interface object in the header.
-  f_header_ << "struct _" << this->nspace << service_name_ << "IfInterface" << endl << "{" << endl
-            << "  GTypeInterface parent;" << endl << endl;
+  f_header_ << "struct _" << this->nspace << service_name_ << "IfInterface" << '\n' << "{" << '\n'
+            << "  GTypeInterface parent;" << '\n' << '\n';
 
   /* write out the functions for this interface */
   indent_up();
@@ -1330,26 +1328,26 @@
                     + (has_args ? "" : (", " + argument_list(arglist)))
                     + (has_xceptions ? "" : (", " + xception_list(xlist))) + ", GError **error)";
 
-    indent(f_header_) << "gboolean (*" << funname << ") " << params << ";" << endl;
+    indent(f_header_) << "gboolean (*" << funname << ") " << params << ";" << '\n';
   }
   indent_down();
 
-  f_header_ << "};" << endl << "typedef struct _" << this->nspace << service_name_ << "IfInterface "
-            << this->nspace << service_name_ << "IfInterface;" << endl << endl;
+  f_header_ << "};" << '\n' << "typedef struct _" << this->nspace << service_name_ << "IfInterface "
+            << this->nspace << service_name_ << "IfInterface;" << '\n' << '\n';
 
   // generate all the interface boilerplate
-  f_header_ << "GType " << this->nspace_lc << service_name_lc << "_if_get_type (void);" << endl
+  f_header_ << "GType " << this->nspace_lc << service_name_lc << "_if_get_type (void);" << '\n'
             << "#define " << this->nspace_uc << "TYPE_" << service_name_uc << "_IF "
-            << "(" << this->nspace_lc << service_name_lc << "_if_get_type())" << endl << "#define "
+            << "(" << this->nspace_lc << service_name_lc << "_if_get_type())" << '\n' << "#define "
             << this->nspace_uc << service_name_uc << "_IF(obj) "
             << "(G_TYPE_CHECK_INSTANCE_CAST ((obj), " << this->nspace_uc << "TYPE_"
-            << service_name_uc << "_IF, " << this->nspace << service_name_ << "If))" << endl
+            << service_name_uc << "_IF, " << this->nspace << service_name_ << "If))" << '\n'
             << "#define " << this->nspace_uc << "IS_" << service_name_uc << "_IF(obj) "
             << "(G_TYPE_CHECK_INSTANCE_TYPE ((obj), " << this->nspace_uc << "TYPE_"
-            << service_name_uc << "_IF))" << endl << "#define " << this->nspace_uc
+            << service_name_uc << "_IF))" << '\n' << "#define " << this->nspace_uc
             << service_name_uc << "_IF_GET_INTERFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE ((inst), "
             << this->nspace_uc << "TYPE_" << service_name_uc << "_IF, " << this->nspace
-            << service_name_ << "IfInterface))" << endl << endl;
+            << service_name_ << "IfInterface))" << '\n' << '\n';
 
   // write out all the interface function prototypes
   for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
@@ -1368,50 +1366,50 @@
                     + (has_xceptions ? "" : (", " + xception_list(xlist))) + ", GError **error)";
 
     f_header_ << "gboolean " << this->nspace_lc << service_name_lc << "_if_" << funname << " "
-              << params << ";" << endl;
+              << params << ";" << '\n';
   }
-  f_header_ << endl;
+  f_header_ << '\n';
 
   // Generate the client object instance definition in the header.
-  f_header_ << "/* " << service_name_ << " service client */" << endl << "struct _" << this->nspace
-            << service_name_ << "Client" << endl << "{" << endl << "  " << parent_class_name
-            << " parent;" << endl;
+  f_header_ << "/* " << service_name_ << " service client */" << '\n' << "struct _" << this->nspace
+            << service_name_ << "Client" << '\n' << "{" << '\n' << "  " << parent_class_name
+            << " parent;" << '\n';
   if (!extends_service) {
     // Define "input_protocol" and "output_protocol" properties only
     // for base services; child service-client classes will inherit
     // these
-    f_header_ << endl << "  ThriftProtocol *input_protocol;" << endl
-              << "  ThriftProtocol *output_protocol;" << endl;
+    f_header_ << '\n' << "  ThriftProtocol *input_protocol;" << '\n'
+              << "  ThriftProtocol *output_protocol;" << '\n';
   }
-  f_header_ << "};" << endl << "typedef struct _" << this->nspace << service_name_ << "Client "
-            << this->nspace << service_name_ << "Client;" << endl << endl;
+  f_header_ << "};" << '\n' << "typedef struct _" << this->nspace << service_name_ << "Client "
+            << this->nspace << service_name_ << "Client;" << '\n' << '\n';
 
   // Generate the class definition in the header.
-  f_header_ << "struct _" << this->nspace << service_name_ << "ClientClass" << endl << "{" << endl
-            << "  " << parent_class_name << "Class parent;" << endl << "};" << endl
+  f_header_ << "struct _" << this->nspace << service_name_ << "ClientClass" << '\n' << "{" << '\n'
+            << "  " << parent_class_name << "Class parent;" << '\n' << "};" << '\n'
             << "typedef struct _" << this->nspace << service_name_ << "ClientClass " << this->nspace
-            << service_name_ << "ClientClass;" << endl << endl;
+            << service_name_ << "ClientClass;" << '\n' << '\n';
 
   // Create all the GObject boilerplate
-  f_header_ << "GType " << this->nspace_lc << service_name_lc << "_client_get_type (void);" << endl
+  f_header_ << "GType " << this->nspace_lc << service_name_lc << "_client_get_type (void);" << '\n'
             << "#define " << this->nspace_uc << "TYPE_" << service_name_uc << "_CLIENT "
-            << "(" << this->nspace_lc << service_name_lc << "_client_get_type())" << endl
+            << "(" << this->nspace_lc << service_name_lc << "_client_get_type())" << '\n'
             << "#define " << this->nspace_uc << service_name_uc << "_CLIENT(obj) "
             << "(G_TYPE_CHECK_INSTANCE_CAST ((obj), " << this->nspace_uc << "TYPE_"
-            << service_name_uc << "_CLIENT, " << this->nspace << service_name_ << "Client))" << endl
+            << service_name_uc << "_CLIENT, " << this->nspace << service_name_ << "Client))" << '\n'
             << "#define " << this->nspace_uc << service_name_uc << "_CLIENT_CLASS(c) "
             << "(G_TYPE_CHECK_CLASS_CAST ((c), " << this->nspace_uc << "TYPE_" << service_name_uc
-            << "_CLIENT, " << this->nspace << service_name_ << "ClientClass))" << endl << "#define "
+            << "_CLIENT, " << this->nspace << service_name_ << "ClientClass))" << '\n' << "#define "
             << this->nspace_uc << service_name_uc << "_IS_CLIENT(obj) "
             << "(G_TYPE_CHECK_INSTANCE_TYPE ((obj), " << this->nspace_uc << "TYPE_"
-            << service_name_uc << "_CLIENT))" << endl << "#define " << this->nspace_uc
+            << service_name_uc << "_CLIENT))" << '\n' << "#define " << this->nspace_uc
             << service_name_uc << "_IS_CLIENT_CLASS(c) "
             << "(G_TYPE_CHECK_CLASS_TYPE ((c), " << this->nspace_uc << "TYPE_" << service_name_uc
-            << "_CLIENT))" << endl << "#define " << this->nspace_uc << service_name_uc
+            << "_CLIENT))" << '\n' << "#define " << this->nspace_uc << service_name_uc
             << "_CLIENT_GET_CLASS(obj) "
             << "(G_TYPE_INSTANCE_GET_CLASS ((obj), " << this->nspace_uc << "TYPE_"
             << service_name_uc << "_CLIENT, " << this->nspace << service_name_ << "ClientClass))"
-            << endl << endl;
+            << '\n' << '\n';
 
   /* write out the function prototypes */
   for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
@@ -1422,12 +1420,12 @@
                                 service_name_lc + string("_client_") + funname,
                                 (*f_iter)->get_arglist(),
                                 (*f_iter)->get_xceptions());
-    indent(f_header_) << function_signature(&service_function) << ";" << endl;
+    indent(f_header_) << function_signature(&service_function) << ";" << '\n';
 
     t_function send_function(g_type_void,
                              service_name_lc + string("_client_send_") + funname,
                              (*f_iter)->get_arglist());
-    indent(f_header_) << function_signature(&send_function) << ";" << endl;
+    indent(f_header_) << function_signature(&send_function) << ";" << '\n';
 
     // implement recv if not a oneway service
     if (!(*f_iter)->is_oneway()) {
@@ -1436,19 +1434,19 @@
                                service_name_lc + string("_client_recv_") + funname,
                                &noargs,
                                (*f_iter)->get_xceptions());
-      indent(f_header_) << function_signature(&recv_function) << ";" << endl;
+      indent(f_header_) << function_signature(&recv_function) << ";" << '\n';
     }
   }
 
   /* write out the get/set function prototypes */
   f_header_ << "void " + service_name_lc + "_client_set_property (GObject *object, guint "
                                            "property_id, const GValue *value, GParamSpec *pspec);"
-            << endl;
+            << '\n';
   f_header_ << "void " + service_name_lc + "_client_get_property (GObject *object, guint "
                                            "property_id, GValue *value, GParamSpec *pspec);"
-            << endl;
+            << '\n';
 
-  f_header_ << endl;
+  f_header_ << '\n';
   // end of header code
 
   // Generate interface method implementations
@@ -1483,76 +1481,76 @@
       params_without_type += ", ";
     }
 
-    f_service_ << "gboolean" << endl << this->nspace_lc << service_name_lc << "_if_" << funname
-               << " " << params << endl << "{" << endl << "  return " << this->nspace_uc
+    f_service_ << "gboolean" << '\n' << this->nspace_lc << service_name_lc << "_if_" << funname
+               << " " << params << '\n' << "{" << '\n' << "  return " << this->nspace_uc
                << service_name_uc << "_IF_GET_INTERFACE (iface)->" << funname << " ("
-               << params_without_type << "error);" << endl << "}" << endl << endl;
+               << params_without_type << "error);" << '\n' << "}" << '\n' << '\n';
   }
 
   // Generate interface boilerplate
-  f_service_ << "GType" << endl << this->nspace_lc << service_name_lc << "_if_get_type (void)"
-             << endl << "{" << endl << "  static GType type = 0;" << endl << "  if (type == 0)"
-             << endl << "  {" << endl << "    static const GTypeInfo type_info =" << endl << "    {"
-             << endl << "      sizeof (" << this->nspace << service_name_ << "IfInterface)," << endl
-             << "      NULL,  /* base_init */" << endl << "      NULL,  /* base_finalize */" << endl
-             << "      NULL,  /* class_init */" << endl << "      NULL,  /* class_finalize */"
-             << endl << "      NULL,  /* class_data */" << endl
-             << "      0,     /* instance_size */" << endl << "      0,     /* n_preallocs */"
-             << endl << "      NULL,  /* instance_init */" << endl
-             << "      NULL   /* value_table */" << endl << "    };" << endl
-             << "    type = g_type_register_static (G_TYPE_INTERFACE," << endl
+  f_service_ << "GType" << '\n' << this->nspace_lc << service_name_lc << "_if_get_type (void)"
+             << '\n' << "{" << '\n' << "  static GType type = 0;" << '\n' << "  if (type == 0)"
+             << '\n' << "  {" << '\n' << "    static const GTypeInfo type_info =" << '\n' << "    {"
+             << '\n' << "      sizeof (" << this->nspace << service_name_ << "IfInterface)," << '\n'
+             << "      NULL,  /* base_init */" << '\n' << "      NULL,  /* base_finalize */" << '\n'
+             << "      NULL,  /* class_init */" << '\n' << "      NULL,  /* class_finalize */"
+             << '\n' << "      NULL,  /* class_data */" << '\n'
+             << "      0,     /* instance_size */" << '\n' << "      0,     /* n_preallocs */"
+             << '\n' << "      NULL,  /* instance_init */" << '\n'
+             << "      NULL   /* value_table */" << '\n' << "    };" << '\n'
+             << "    type = g_type_register_static (G_TYPE_INTERFACE," << '\n'
              << "                                   \"" << this->nspace << service_name_ << "If\","
-             << endl << "                                   &type_info, 0);" << endl << "  }"
-             << endl << "  return type;" << endl << "}" << endl << endl;
+             << '\n' << "                                   &type_info, 0);" << '\n' << "  }"
+             << '\n' << "  return type;" << '\n' << "}" << '\n' << '\n';
 
   // Generate client boilerplate
-  f_service_ << "static void " << endl << this->nspace_lc << service_name_lc
+  f_service_ << "static void " << '\n' << this->nspace_lc << service_name_lc
              << "_if_interface_init (" << this->nspace << service_name_ << "IfInterface *iface);"
-             << endl << endl << "G_DEFINE_TYPE_WITH_CODE (" << this->nspace << service_name_
-             << "Client, " << this->nspace_lc << service_name_lc << "_client," << endl
-             << "                         " << parent_type_name << ", " << endl
+             << '\n' << '\n' << "G_DEFINE_TYPE_WITH_CODE (" << this->nspace << service_name_
+             << "Client, " << this->nspace_lc << service_name_lc << "_client," << '\n'
+             << "                         " << parent_type_name << ", " << '\n'
              << "                         G_IMPLEMENT_INTERFACE (" << this->nspace_uc << "TYPE_"
-             << service_name_uc << "_IF," << endl
+             << service_name_uc << "_IF," << '\n'
              << "                                                " << this->nspace_lc
-             << service_name_lc << "_if_interface_init))" << endl << endl;
+             << service_name_lc << "_if_interface_init))" << '\n' << '\n';
 
   // Generate property-related code only for base services---child
   // service-client classes have only properties inherited from their
   // parent class
   if (!extends_service) {
     // Generate client properties
-    f_service_ << "enum _" << this->nspace << service_name_ << "ClientProperties" << endl << "{"
-               << endl << "  PROP_0," << endl << "  PROP_" << this->nspace_uc << service_name_uc
-               << "_CLIENT_INPUT_PROTOCOL," << endl << "  PROP_" << this->nspace_uc
-               << service_name_uc << "_CLIENT_OUTPUT_PROTOCOL" << endl << "};" << endl << endl;
+    f_service_ << "enum _" << this->nspace << service_name_ << "ClientProperties" << '\n' << "{"
+               << '\n' << "  PROP_0," << '\n' << "  PROP_" << this->nspace_uc << service_name_uc
+               << "_CLIENT_INPUT_PROTOCOL," << '\n' << "  PROP_" << this->nspace_uc
+               << service_name_uc << "_CLIENT_OUTPUT_PROTOCOL" << '\n' << "};" << '\n' << '\n';
 
     // generate property setter
-    f_service_ << "void" << endl << this->nspace_lc << service_name_lc << "_client_set_property ("
+    f_service_ << "void" << '\n' << this->nspace_lc << service_name_lc << "_client_set_property ("
                << "GObject *object, guint property_id, const GValue *value, "
-               << "GParamSpec *pspec)" << endl << "{" << endl << "  " << this->nspace
+               << "GParamSpec *pspec)" << '\n' << "{" << '\n' << "  " << this->nspace
                << service_name_ << "Client *client = " << this->nspace_uc << service_name_uc
-               << "_CLIENT (object);" << endl << endl << "  THRIFT_UNUSED_VAR (pspec);" << endl
-               << endl << "  switch (property_id)" << endl << "  {" << endl << "    case PROP_"
-               << this->nspace_uc << service_name_uc << "_CLIENT_INPUT_PROTOCOL:" << endl
-               << "      client->input_protocol = g_value_get_object (value);" << endl
-               << "      break;" << endl << "    case PROP_" << this->nspace_uc << service_name_uc
-               << "_CLIENT_OUTPUT_PROTOCOL:" << endl
-               << "      client->output_protocol = g_value_get_object (value);" << endl
-               << "      break;" << endl << "  }" << endl << "}" << endl << endl;
+               << "_CLIENT (object);" << '\n' << '\n' << "  THRIFT_UNUSED_VAR (pspec);" << '\n'
+               << '\n' << "  switch (property_id)" << '\n' << "  {" << '\n' << "    case PROP_"
+               << this->nspace_uc << service_name_uc << "_CLIENT_INPUT_PROTOCOL:" << '\n'
+               << "      client->input_protocol = g_value_get_object (value);" << '\n'
+               << "      break;" << '\n' << "    case PROP_" << this->nspace_uc << service_name_uc
+               << "_CLIENT_OUTPUT_PROTOCOL:" << '\n'
+               << "      client->output_protocol = g_value_get_object (value);" << '\n'
+               << "      break;" << '\n' << "  }" << '\n' << "}" << '\n' << '\n';
 
     // generate property getter
-    f_service_ << "void" << endl << this->nspace_lc << service_name_lc << "_client_get_property ("
+    f_service_ << "void" << '\n' << this->nspace_lc << service_name_lc << "_client_get_property ("
                << "GObject *object, guint property_id, GValue *value, "
-               << "GParamSpec *pspec)" << endl << "{" << endl << "  " << this->nspace
+               << "GParamSpec *pspec)" << '\n' << "{" << '\n' << "  " << this->nspace
                << service_name_ << "Client *client = " << this->nspace_uc << service_name_uc
-               << "_CLIENT (object);" << endl << endl << "  THRIFT_UNUSED_VAR (pspec);" << endl
-               << endl << "  switch (property_id)" << endl << "  {" << endl << "    case PROP_"
-               << this->nspace_uc << service_name_uc << "_CLIENT_INPUT_PROTOCOL:" << endl
-               << "      g_value_set_object (value, client->input_protocol);" << endl
-               << "      break;" << endl << "    case PROP_" << this->nspace_uc << service_name_uc
-               << "_CLIENT_OUTPUT_PROTOCOL:" << endl
-               << "      g_value_set_object (value, client->output_protocol);" << endl
-               << "      break;" << endl << "  }" << endl << "}" << endl << endl;
+               << "_CLIENT (object);" << '\n' << '\n' << "  THRIFT_UNUSED_VAR (pspec);" << '\n'
+               << '\n' << "  switch (property_id)" << '\n' << "  {" << '\n' << "    case PROP_"
+               << this->nspace_uc << service_name_uc << "_CLIENT_INPUT_PROTOCOL:" << '\n'
+               << "      g_value_set_object (value, client->input_protocol);" << '\n'
+               << "      break;" << '\n' << "    case PROP_" << this->nspace_uc << service_name_uc
+               << "_CLIENT_OUTPUT_PROTOCOL:" << '\n'
+               << "      g_value_set_object (value, client->output_protocol);" << '\n'
+               << "      break;" << '\n' << "  }" << '\n' << "}" << '\n' << '\n';
   }
 
   // Generate client method implementations
@@ -1569,31 +1567,31 @@
                              (*f_iter)->get_arglist());
 
     // Open the send function
-    indent(f_service_) << function_signature(&send_function) << endl;
+    indent(f_service_) << function_signature(&send_function) << '\n';
     scope_up(f_service_);
 
     string reqType = (*f_iter)->is_oneway() ? "T_ONEWAY" : "T_CALL";
 
     // Serialize the request
-    f_service_ << indent() << "gint32 cseqid = 0;" << endl << indent()
+    f_service_ << indent() << "gint32 cseqid = 0;" << '\n' << indent()
                << "ThriftProtocol * protocol = " << this->nspace_uc << base_service_name_uc
-               << "_CLIENT (iface)->output_protocol;" << endl << endl << indent()
+               << "_CLIENT (iface)->output_protocol;" << '\n' << '\n' << indent()
                << "if (thrift_protocol_write_message_begin (protocol, \"" << name << "\", "
-               << reqType << ", cseqid, error) < 0)" << endl << indent() << "  return FALSE;"
-               << endl << endl;
+               << reqType << ", cseqid, error) < 0)" << '\n' << indent() << "  return FALSE;"
+               << '\n' << '\n';
 
     generate_struct_writer(f_service_, arg_struct, "", "", false);
 
-    f_service_ << indent() << "if (thrift_protocol_write_message_end (protocol, error) < 0)" << endl
-               << indent() << "  return FALSE;" << endl << indent()
-               << "if (!thrift_transport_flush (protocol->transport, error))" << endl << indent()
-               << "  return FALSE;" << endl << indent()
-               << "if (!thrift_transport_write_end (protocol->transport, error))" << endl
-               << indent() << "  return FALSE;" << endl << endl << indent() << "return TRUE;"
-               << endl;
+    f_service_ << indent() << "if (thrift_protocol_write_message_end (protocol, error) < 0)" << '\n'
+               << indent() << "  return FALSE;" << '\n' << indent()
+               << "if (!thrift_transport_flush (protocol->transport, error))" << '\n' << indent()
+               << "  return FALSE;" << '\n' << indent()
+               << "if (!thrift_transport_write_end (protocol->transport, error))" << '\n'
+               << indent() << "  return FALSE;" << '\n' << '\n' << indent() << "return TRUE;"
+               << '\n';
 
     scope_down(f_service_);
-    f_service_ << endl;
+    f_service_ << '\n';
 
     // Generate recv function only if not an async function
     if (!(*f_iter)->is_oneway()) {
@@ -1603,78 +1601,78 @@
                                &noargs,
                                (*f_iter)->get_xceptions());
       // Open function
-      indent(f_service_) << function_signature(&recv_function) << endl;
+      indent(f_service_) << function_signature(&recv_function) << '\n';
       scope_up(f_service_);
 
-      f_service_ << indent() << "gint32 rseqid;" << endl
-                 << indent() << "gchar * fname = NULL;" << endl
-                 << indent() << "ThriftMessageType mtype;" << endl
+      f_service_ << indent() << "gint32 rseqid;" << '\n'
+                 << indent() << "gchar * fname = NULL;" << '\n'
+                 << indent() << "ThriftMessageType mtype;" << '\n'
                  << indent() << "ThriftProtocol * protocol = "
                  << this->nspace_uc << base_service_name_uc
-                 << "_CLIENT (iface)->input_protocol;" << endl
-                 << indent() << "ThriftApplicationException *xception;" << endl
-                 << endl
+                 << "_CLIENT (iface)->input_protocol;" << '\n'
+                 << indent() << "ThriftApplicationException *xception;" << '\n'
+                 << '\n'
                  << indent() << "if (thrift_protocol_read_message_begin "
-                    "(protocol, &fname, &mtype, &rseqid, error) < 0) {" << endl;
+                    "(protocol, &fname, &mtype, &rseqid, error) < 0) {" << '\n';
       indent_up();
-      f_service_ << indent() << "if (fname) g_free (fname);" << endl
-                 << indent() << "return FALSE;" << endl;
+      f_service_ << indent() << "if (fname) g_free (fname);" << '\n'
+                 << indent() << "return FALSE;" << '\n';
       indent_down();
-      f_service_ << indent() << "}" << endl
-                 << endl
-                 << indent() << "if (mtype == T_EXCEPTION) {" << endl;
+      f_service_ << indent() << "}" << '\n'
+                 << '\n'
+                 << indent() << "if (mtype == T_EXCEPTION) {" << '\n';
       indent_up();
-      f_service_ << indent() << "if (fname) g_free (fname);" << endl
+      f_service_ << indent() << "if (fname) g_free (fname);" << '\n'
                  << indent() << "xception = g_object_new "
-                    "(THRIFT_TYPE_APPLICATION_EXCEPTION, NULL);" << endl
+                    "(THRIFT_TYPE_APPLICATION_EXCEPTION, NULL);" << '\n'
                  << indent() << "thrift_struct_read (THRIFT_STRUCT (xception), "
-                    "protocol, NULL);" << endl
+                    "protocol, NULL);" << '\n'
                  << indent() << "thrift_protocol_read_message_end "
-                    "(protocol, NULL);" << endl
+                    "(protocol, NULL);" << '\n'
                  << indent() << "thrift_transport_read_end "
-                    "(protocol->transport, NULL);" << endl
+                    "(protocol->transport, NULL);" << '\n'
                  << indent() << "g_set_error (error, "
                     "THRIFT_APPLICATION_EXCEPTION_ERROR,xception->type, "
-                    "\"application error: %s\", xception->message);" << endl
-                 << indent() << "g_object_unref (xception);" << endl
-                 << indent() << "return FALSE;" << endl;
+                    "\"application error: %s\", xception->message);" << '\n'
+                 << indent() << "g_object_unref (xception);" << '\n'
+                 << indent() << "return FALSE;" << '\n';
       indent_down();
-      f_service_ << indent() << "} else if (mtype != T_REPLY) {" << endl;
+      f_service_ << indent() << "} else if (mtype != T_REPLY) {" << '\n';
       indent_up();
-      f_service_ << indent() << "if (fname) g_free (fname);" << endl
+      f_service_ << indent() << "if (fname) g_free (fname);" << '\n'
                  << indent() << "thrift_protocol_skip (protocol, T_STRUCT, "
-                    "NULL);" << endl
+                    "NULL);" << '\n'
                  << indent() << "thrift_protocol_read_message_end (protocol, "
-                    "NULL);" << endl
+                    "NULL);" << '\n'
                  << indent() << "thrift_transport_read_end ("
-                    "protocol->transport, NULL);" << endl
+                    "protocol->transport, NULL);" << '\n'
                  << indent() << "g_set_error (error, "
                     "THRIFT_APPLICATION_EXCEPTION_ERROR, "
                     "THRIFT_APPLICATION_EXCEPTION_ERROR_INVALID_MESSAGE_TYPE, "
                     "\"invalid message type %d, expected T_REPLY\", mtype);"
-                 << endl
-                 << indent() << "return FALSE;" << endl;
+                 << '\n'
+                 << indent() << "return FALSE;" << '\n';
       indent_down();
       f_service_ << indent() << "} else if (strncmp (fname, \"" << name
-                 << "\", " << name.length() << ") != 0) {" << endl;
+                 << "\", " << name.length() << ") != 0) {" << '\n';
       indent_up();
       f_service_ << indent() << "thrift_protocol_skip (protocol, T_STRUCT, "
-                    "NULL);" << endl
+                    "NULL);" << '\n'
                  << indent() << "thrift_protocol_read_message_end (protocol,"
-                    "error);" << endl
+                    "error);" << '\n'
                  << indent() << "thrift_transport_read_end ("
-                    "protocol->transport, error);" << endl
+                    "protocol->transport, error);" << '\n'
                  << indent() << "g_set_error (error, "
                     "THRIFT_APPLICATION_EXCEPTION_ERROR, "
                     "THRIFT_APPLICATION_EXCEPTION_ERROR_WRONG_METHOD_NAME, "
                     "\"wrong method name %s, expected " << name
-                    << "\", fname);" << endl
-                 << indent() << "if (fname) g_free (fname);" << endl
-                 << indent() << "return FALSE;" << endl;
+                    << "\", fname);" << '\n'
+                 << indent() << "if (fname) g_free (fname);" << '\n'
+                 << indent() << "return FALSE;" << '\n';
       indent_down();
-      f_service_ << indent() << "}" << endl
-                 << indent() << "if (fname) g_free (fname);" << endl
-                 << endl;
+      f_service_ << indent() << "}" << '\n'
+                 << indent() << "if (fname) g_free (fname);" << '\n'
+                 << '\n';
 
       t_struct* xs = (*f_iter)->get_xceptions();
       const std::vector<t_field*>& xceptions = xs->get_members();
@@ -1699,25 +1697,25 @@
       }
 
       f_service_ << indent() << "if (thrift_protocol_read_message_end (protocol, error) < 0)"
-                 << endl << indent() << "  return FALSE;" << endl << endl << indent()
-                 << "if (!thrift_transport_read_end (protocol->transport, error))" << endl
-                 << indent() << "  return FALSE;" << endl << endl;
+                 << '\n' << indent() << "  return FALSE;" << '\n' << '\n' << indent()
+                 << "if (!thrift_transport_read_end (protocol->transport, error))" << '\n'
+                 << indent() << "  return FALSE;" << '\n' << '\n';
 
       // copy over any throw exceptions and return failure
       for (x_iter = xceptions.begin(); x_iter != xceptions.end(); x_iter++) {
-        f_service_ << indent() << "if (*" << (*x_iter)->get_name() << " != NULL)" << endl
-                   << indent() << "{" << endl << indent() << "    g_set_error (error, "
+        f_service_ << indent() << "if (*" << (*x_iter)->get_name() << " != NULL)" << '\n'
+                   << indent() << "{" << '\n' << indent() << "    g_set_error (error, "
                    << this->nspace_uc
                    << to_upper_case(initial_caps_to_underscores((*x_iter)->get_type()->get_name()))
                    << "_ERROR, " << this->nspace_uc
                    << to_upper_case(initial_caps_to_underscores((*x_iter)->get_type()->get_name()))
-                   << "_ERROR_CODE, \"" << (*x_iter)->get_type()->get_name() << "\");" << endl
-                   << indent() << "    return FALSE;" << endl << indent() << "}" << endl;
+                   << "_ERROR_CODE, \"" << (*x_iter)->get_type()->get_name() << "\");" << '\n'
+                   << indent() << "    return FALSE;" << '\n' << indent() << "}" << '\n';
       }
       // Close function
-      indent(f_service_) << "return TRUE;" << endl;
+      indent(f_service_) << "return TRUE;" << '\n';
       scope_down(f_service_);
-      f_service_ << endl;
+      f_service_ << '\n';
     }
 
     // Open function
@@ -1725,7 +1723,7 @@
                                 service_name_lc + string("_client_") + funname,
                                 (*f_iter)->get_arglist(),
                                 (*f_iter)->get_xceptions());
-    indent(f_service_) << function_signature(&service_function) << endl;
+    indent(f_service_) << function_signature(&service_function) << '\n';
     scope_up(f_service_);
 
     // wrap each function
@@ -1738,7 +1736,7 @@
     for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) {
       f_service_ << ", " << (*fld_iter)->get_name();
     }
-    f_service_ << ", error))" << endl << indent() << "  return FALSE;" << endl;
+    f_service_ << ", error))" << '\n' << indent() << "  return FALSE;" << '\n';
 
     // if not oneway, implement recv
     if (!(*f_iter)->is_oneway()) {
@@ -1752,20 +1750,20 @@
       }
 
       f_service_ << indent() << "if (!" << this->nspace_lc << service_name_lc << "_client_recv_"
-                 << funname << " (iface, " << ret << "error))" << endl << indent()
-                 << "  return FALSE;" << endl;
+                 << funname << " (iface, " << ret << "error))" << '\n' << indent()
+                 << "  return FALSE;" << '\n';
     }
 
     // return TRUE which means all functions were called OK
-    indent(f_service_) << "return TRUE;" << endl;
+    indent(f_service_) << "return TRUE;" << '\n';
     scope_down(f_service_);
-    f_service_ << endl;
+    f_service_ << '\n';
   }
 
   // create the interface initializer
-  f_service_ << "static void" << endl
+  f_service_ << "static void" << '\n'
              << this->nspace_lc << service_name_lc << "_if_interface_init ("
-             << this->nspace << service_name_ << "IfInterface *iface)" << endl;
+             << this->nspace << service_name_ << "IfInterface *iface)" << '\n';
   scope_up(f_service_);
   if (functions.size() > 0) {
     for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
@@ -1773,62 +1771,62 @@
       string funname = initial_caps_to_underscores((*f_iter)->get_name());
 
       f_service_ << indent() << "iface->" << funname << " = " << this->nspace_lc
-                 << service_name_lc << "_client_" << funname << ";" << endl;
+                 << service_name_lc << "_client_" << funname << ";" << '\n';
     }
   }
   else {
-    f_service_ << indent() << "THRIFT_UNUSED_VAR (iface);" << endl;
+    f_service_ << indent() << "THRIFT_UNUSED_VAR (iface);" << '\n';
   }
   scope_down(f_service_);
-  f_service_ << endl;
+  f_service_ << '\n';
 
   // create the client instance initializer
-  f_service_ << "static void" << endl
+  f_service_ << "static void" << '\n'
              << this->nspace_lc << service_name_lc << "_client_init ("
-             << this->nspace << service_name_ << "Client *client)" << endl;
+             << this->nspace << service_name_ << "Client *client)" << '\n';
   scope_up(f_service_);
   if (!extends_service) {
-    f_service_ << indent() << "client->input_protocol = NULL;" << endl
-               << indent() << "client->output_protocol = NULL;" << endl;
+    f_service_ << indent() << "client->input_protocol = NULL;" << '\n'
+               << indent() << "client->output_protocol = NULL;" << '\n';
   }
   else {
-    f_service_ << indent() << "THRIFT_UNUSED_VAR (client);" << endl;
+    f_service_ << indent() << "THRIFT_UNUSED_VAR (client);" << '\n';
   }
   scope_down(f_service_);
-  f_service_ << endl;
+  f_service_ << '\n';
 
   // create the client class initializer
-  f_service_ << "static void" << endl << this->nspace_lc << service_name_lc
+  f_service_ << "static void" << '\n' << this->nspace_lc << service_name_lc
              << "_client_class_init (" << this->nspace << service_name_ << "ClientClass *cls)"
-             << endl << "{" << endl;
+             << '\n' << "{" << '\n';
   if (!extends_service) {
-    f_service_ << "  GObjectClass *gobject_class = G_OBJECT_CLASS (cls);" << endl
-               << "  GParamSpec *param_spec;" << endl << endl
+    f_service_ << "  GObjectClass *gobject_class = G_OBJECT_CLASS (cls);" << '\n'
+               << "  GParamSpec *param_spec;" << '\n' << '\n'
                << "  gobject_class->set_property = " << this->nspace_lc << service_name_lc
-               << "_client_set_property;" << endl
+               << "_client_set_property;" << '\n'
                << "  gobject_class->get_property = " << this->nspace_lc << service_name_lc
-               << "_client_get_property;" << endl << endl
-               << "  param_spec = g_param_spec_object (\"input_protocol\"," << endl
-               << "                                    \"input protocol (construct)\"," << endl
-               << "                                    \"Set the client input protocol\"," << endl
-               << "                                    THRIFT_TYPE_PROTOCOL," << endl
-               << "                                    G_PARAM_READWRITE);" << endl
-               << "  g_object_class_install_property (gobject_class," << endl
+               << "_client_get_property;" << '\n' << '\n'
+               << "  param_spec = g_param_spec_object (\"input_protocol\"," << '\n'
+               << "                                    \"input protocol (construct)\"," << '\n'
+               << "                                    \"Set the client input protocol\"," << '\n'
+               << "                                    THRIFT_TYPE_PROTOCOL," << '\n'
+               << "                                    G_PARAM_READWRITE);" << '\n'
+               << "  g_object_class_install_property (gobject_class," << '\n'
                << "                                   PROP_" << this->nspace_uc << service_name_uc
-               << "_CLIENT_INPUT_PROTOCOL, param_spec);" << endl << endl
-               << "  param_spec = g_param_spec_object (\"output_protocol\"," << endl
-               << "                                    \"output protocol (construct)\"," << endl
-               << "                                    \"Set the client output protocol\"," << endl
-               << "                                    THRIFT_TYPE_PROTOCOL," << endl
-               << "                                    G_PARAM_READWRITE);" << endl
-               << "  g_object_class_install_property (gobject_class," << endl
+               << "_CLIENT_INPUT_PROTOCOL, param_spec);" << '\n' << '\n'
+               << "  param_spec = g_param_spec_object (\"output_protocol\"," << '\n'
+               << "                                    \"output protocol (construct)\"," << '\n'
+               << "                                    \"Set the client output protocol\"," << '\n'
+               << "                                    THRIFT_TYPE_PROTOCOL," << '\n'
+               << "                                    G_PARAM_READWRITE);" << '\n'
+               << "  g_object_class_install_property (gobject_class," << '\n'
                << "                                   PROP_" << this->nspace_uc << service_name_uc
-               << "_CLIENT_OUTPUT_PROTOCOL, param_spec);" << endl;
+               << "_CLIENT_OUTPUT_PROTOCOL, param_spec);" << '\n';
   }
   else {
-    f_service_ << "  THRIFT_UNUSED_VAR (cls);" << endl;
+    f_service_ << "  THRIFT_UNUSED_VAR (cls);" << '\n';
   }
-  f_service_ << "}" << endl << endl;
+  f_service_ << "}" << '\n' << '\n';
 }
 
 /**
@@ -1874,19 +1872,19 @@
   // Generate the handler class' definition in the header file
 
   // Generate the handler instance definition
-  f_header_ << "/* " << service_name_ << " handler (abstract base class) */" << endl << "struct _"
-            << class_name << endl << "{" << endl;
+  f_header_ << "/* " << service_name_ << " handler (abstract base class) */" << '\n' << "struct _"
+            << class_name << '\n' << "{" << '\n';
   indent_up();
-  f_header_ << indent() << parent_class_name << " parent;" << endl;
+  f_header_ << indent() << parent_class_name << " parent;" << '\n';
   indent_down();
-  f_header_ << "};" << endl << "typedef struct _" << class_name << " " << class_name << ";" << endl
-            << endl;
+  f_header_ << "};" << '\n' << "typedef struct _" << class_name << " " << class_name << ";" << '\n'
+            << '\n';
 
   // Generate the handler class definition, including its class members
   // (methods)
-  f_header_ << "struct _" << class_name << "Class" << endl << "{" << endl;
+  f_header_ << "struct _" << class_name << "Class" << '\n' << "{" << '\n';
   indent_up();
-  f_header_ << indent() << parent_class_name << "Class parent;" << endl << endl;
+  f_header_ << indent() << parent_class_name << "Class parent;" << '\n' << '\n';
 
   for (function_iter = functions.begin(); function_iter != functions.end(); ++function_iter) {
     string method_name = initial_caps_to_underscores((*function_iter)->get_name());
@@ -1902,31 +1900,31 @@
                     + (has_args ? "" : (", " + argument_list(arg_list)))
                     + (has_xceptions ? "" : (", " + xception_list(x_list))) + ", GError **error)";
 
-    indent(f_header_) << "gboolean (*" << method_name << ") " << params << ";" << endl;
+    indent(f_header_) << "gboolean (*" << method_name << ") " << params << ";" << '\n';
   }
   indent_down();
 
-  f_header_ << "};" << endl << "typedef struct _" << class_name << "Class " << class_name
-            << "Class;" << endl << endl;
+  f_header_ << "};" << '\n' << "typedef struct _" << class_name << "Class " << class_name
+            << "Class;" << '\n' << '\n';
 
   // Generate the remaining header boilerplate
-  f_header_ << "GType " << class_name_lc << "_get_type (void);" << endl << "#define "
+  f_header_ << "GType " << class_name_lc << "_get_type (void);" << '\n' << "#define "
             << this->nspace_uc << "TYPE_" << service_name_uc << "_HANDLER "
-            << "(" << class_name_lc << "_get_type())" << endl << "#define " << class_name_uc
+            << "(" << class_name_lc << "_get_type())" << '\n' << "#define " << class_name_uc
             << "(obj) "
             << "(G_TYPE_CHECK_INSTANCE_CAST ((obj), " << this->nspace_uc << "TYPE_"
-            << service_name_uc << "_HANDLER, " << class_name << "))" << endl << "#define "
+            << service_name_uc << "_HANDLER, " << class_name << "))" << '\n' << "#define "
             << this->nspace_uc << "IS_" << service_name_uc << "_HANDLER(obj) "
             << "(G_TYPE_CHECK_INSTANCE_TYPE ((obj), " << this->nspace_uc << "TYPE_"
-            << service_name_uc << "_HANDLER))" << endl << "#define " << class_name_uc
+            << service_name_uc << "_HANDLER))" << '\n' << "#define " << class_name_uc
             << "_CLASS(c) (G_TYPE_CHECK_CLASS_CAST ((c), " << this->nspace_uc << "TYPE_"
-            << service_name_uc << "_HANDLER, " << class_name << "Class))" << endl << "#define "
+            << service_name_uc << "_HANDLER, " << class_name << "Class))" << '\n' << "#define "
             << this->nspace_uc << "IS_" << service_name_uc << "_HANDLER_CLASS(c) "
             << "(G_TYPE_CHECK_CLASS_TYPE ((c), " << this->nspace_uc << "TYPE_" << service_name_uc
-            << "_HANDLER))" << endl << "#define " << this->nspace_uc << service_name_uc
+            << "_HANDLER))" << '\n' << "#define " << this->nspace_uc << service_name_uc
             << "_HANDLER_GET_CLASS(obj) "
             << "(G_TYPE_INSTANCE_GET_CLASS ((obj), " << this->nspace_uc << "TYPE_"
-            << service_name_uc << "_HANDLER, " << class_name << "Class))" << endl << endl;
+            << service_name_uc << "_HANDLER, " << class_name << "Class))" << '\n' << '\n';
 
   // Generate the handler class' method definitions
   for (function_iter = functions.begin(); function_iter != functions.end(); ++function_iter) {
@@ -1943,25 +1941,25 @@
                     + (has_args ? "" : (", " + argument_list(arg_list)))
                     + (has_xceptions ? "" : (", " + xception_list(x_list))) + ", GError **error)";
 
-    f_header_ << "gboolean " << class_name_lc << "_" << method_name << " " << params << ";" << endl;
+    f_header_ << "gboolean " << class_name_lc << "_" << method_name << " " << params << ";" << '\n';
   }
-  f_header_ << endl;
+  f_header_ << '\n';
 
   // Generate the handler's implementation in the implementation file
 
   // Generate the implementation boilerplate
-  f_service_ << "static void" << endl << class_name_lc << "_" << service_name_lc
+  f_service_ << "static void" << '\n' << class_name_lc << "_" << service_name_lc
              << "_if_interface_init (" << this->nspace << service_name_ << "IfInterface *iface);"
-             << endl << endl;
+             << '\n' << '\n';
 
   args_indent = string(25, ' ');
-  f_service_ << "G_DEFINE_TYPE_WITH_CODE (" << class_name << ", " << endl << args_indent
-             << class_name_lc << "," << endl << args_indent << parent_type_name << "," << endl
+  f_service_ << "G_DEFINE_TYPE_WITH_CODE (" << class_name << ", " << '\n' << args_indent
+             << class_name_lc << "," << '\n' << args_indent << parent_type_name << "," << '\n'
              << args_indent << "G_IMPLEMENT_INTERFACE (" << this->nspace_uc << "TYPE_"
-             << service_name_uc << "_IF," << endl;
+             << service_name_uc << "_IF," << '\n';
   args_indent += string(23, ' ');
   f_service_ << args_indent << class_name_lc << "_" << service_name_lc << "_if_interface_init))"
-             << endl << endl;
+             << '\n' << '\n';
 
   // Generate the handler method implementations
   for (function_iter = functions.begin(); function_iter != functions.end(); ++function_iter) {
@@ -1982,10 +1980,10 @@
                                      x_list,
                                      (*function_iter)->is_oneway());
 
-    indent(f_service_) << function_signature(&implementing_function) << endl;
+    indent(f_service_) << function_signature(&implementing_function) << '\n';
     scope_up(f_service_);
     f_service_ << indent() << "g_return_val_if_fail (" << this->nspace_uc << "IS_"
-               << service_name_uc << "_HANDLER (iface), FALSE);" << endl << endl << indent()
+               << service_name_uc << "_HANDLER (iface), FALSE);" << '\n' << '\n' << indent()
                << "return " << class_name_uc << "_GET_CLASS (iface)"
                << "->" << method_name << " (iface, ";
 
@@ -1998,42 +1996,42 @@
     for (field_iter = xceptions.begin(); field_iter != xceptions.end(); ++field_iter) {
       f_service_ << (*field_iter)->get_name() << ", ";
     }
-    f_service_ << "error);" << endl;
+    f_service_ << "error);" << '\n';
     scope_down(f_service_);
-    f_service_ << endl;
+    f_service_ << '\n';
   }
 
   // Generate the handler interface initializer
-  f_service_ << "static void" << endl << class_name_lc << "_" << service_name_lc
+  f_service_ << "static void" << '\n' << class_name_lc << "_" << service_name_lc
              << "_if_interface_init (" << this->nspace << service_name_ << "IfInterface *iface)"
-             << endl;
+             << '\n';
   scope_up(f_service_);
   if (functions.size() > 0) {
     for (function_iter = functions.begin(); function_iter != functions.end(); ++function_iter) {
       string method_name = initial_caps_to_underscores((*function_iter)->get_name());
 
       f_service_ << indent() << "iface->" << method_name << " = " << class_name_lc << "_"
-                 << method_name << ";" << endl;
+                 << method_name << ";" << '\n';
     }
   }
   else {
-    f_service_ << "THRIFT_UNUSED_VAR (iface);" << endl;
+    f_service_ << "THRIFT_UNUSED_VAR (iface);" << '\n';
   }
   scope_down(f_service_);
-  f_service_ << endl;
+  f_service_ << '\n';
 
   // Generate the handler instance initializer
-  f_service_ << "static void" << endl << class_name_lc << "_init (" << class_name << " *self)"
-             << endl;
+  f_service_ << "static void" << '\n' << class_name_lc << "_init (" << class_name << " *self)"
+             << '\n';
   scope_up(f_service_);
-  f_service_ << indent() << "THRIFT_UNUSED_VAR (self);" << endl;
+  f_service_ << indent() << "THRIFT_UNUSED_VAR (self);" << '\n';
   scope_down(f_service_);
-  f_service_ << endl;
+  f_service_ << '\n';
 
   // Generate the handler class initializer
-  f_service_ << "static void" << endl
+  f_service_ << "static void" << '\n'
              << class_name_lc << "_class_init (" << class_name << "Class *cls)"
-             << endl;
+             << '\n';
   scope_up(f_service_);
   if (functions.size() > 0) {
     for (function_iter = functions.begin();
@@ -2043,14 +2041,14 @@
       string method_name = initial_caps_to_underscores(function_name);
 
       // All methods are pure virtual and must be implemented by subclasses
-      f_service_ << indent() << "cls->" << method_name << " = NULL;" << endl;
+      f_service_ << indent() << "cls->" << method_name << " = NULL;" << '\n';
     }
   }
   else {
-    f_service_ << indent() << "THRIFT_UNUSED_VAR (cls);" << endl;
+    f_service_ << indent() << "THRIFT_UNUSED_VAR (cls);" << '\n';
   }
   scope_down(f_service_);
-  f_service_ << endl;
+  f_service_ << '\n';
 }
 
 /**
@@ -2104,84 +2102,84 @@
   // Generate the processor class' definition in the header file
 
   // Generate the processor instance definition
-  f_header_ << "/* " << service_name_ << " processor */" << endl << "struct _" << class_name << endl
-            << "{" << endl;
+  f_header_ << "/* " << service_name_ << " processor */" << '\n' << "struct _" << class_name << '\n'
+            << "{" << '\n';
   indent_up();
-  f_header_ << indent() << parent_class_name << " parent;" << endl << endl << indent()
-            << "/* protected */" << endl << indent()
-            << this->nspace + service_name_ + "Handler *handler;" << endl << indent()
-            << "GHashTable *process_map;" << endl;
+  f_header_ << indent() << parent_class_name << " parent;" << '\n' << '\n' << indent()
+            << "/* protected */" << '\n' << indent()
+            << this->nspace + service_name_ + "Handler *handler;" << '\n' << indent()
+            << "GHashTable *process_map;" << '\n';
   indent_down();
-  f_header_ << "};" << endl << "typedef struct _" << class_name << " " << class_name << ";" << endl
-            << endl;
+  f_header_ << "};" << '\n' << "typedef struct _" << class_name << " " << class_name << ";" << '\n'
+            << '\n';
 
   // Generate the processor class definition
-  f_header_ << "struct _" << class_name << "Class" << endl << "{" << endl;
+  f_header_ << "struct _" << class_name << "Class" << '\n' << "{" << '\n';
   indent_up();
-  f_header_ << indent() << parent_class_name << "Class parent;" << endl << endl << indent()
-            << "/* protected */" << endl << indent()
-            << "gboolean (*dispatch_call) (ThriftDispatchProcessor *processor," << endl;
+  f_header_ << indent() << parent_class_name << "Class parent;" << '\n' << '\n' << indent()
+            << "/* protected */" << '\n' << indent()
+            << "gboolean (*dispatch_call) (ThriftDispatchProcessor *processor," << '\n';
   args_indent = indent() + string(27, ' ');
-  f_header_ << args_indent << "ThriftProtocol *in," << endl << args_indent << "ThriftProtocol *out,"
-            << endl << args_indent << "gchar *fname," << endl << args_indent << "gint32 seqid,"
-            << endl << args_indent << "GError **error);" << endl;
+  f_header_ << args_indent << "ThriftProtocol *in," << '\n' << args_indent << "ThriftProtocol *out,"
+            << '\n' << args_indent << "gchar *fname," << '\n' << args_indent << "gint32 seqid,"
+            << '\n' << args_indent << "GError **error);" << '\n';
   indent_down();
-  f_header_ << "};" << endl << "typedef struct _" << class_name << "Class " << class_name
-            << "Class;" << endl << endl;
+  f_header_ << "};" << '\n' << "typedef struct _" << class_name << "Class " << class_name
+            << "Class;" << '\n' << '\n';
 
   // Generate the remaining header boilerplate
-  f_header_ << "GType " << class_name_lc << "_get_type (void);" << endl << "#define "
+  f_header_ << "GType " << class_name_lc << "_get_type (void);" << '\n' << "#define "
             << this->nspace_uc << "TYPE_" << service_name_uc << "_PROCESSOR "
-            << "(" << class_name_lc << "_get_type())" << endl << "#define " << class_name_uc
+            << "(" << class_name_lc << "_get_type())" << '\n' << "#define " << class_name_uc
             << "(obj) "
             << "(G_TYPE_CHECK_INSTANCE_CAST ((obj), " << this->nspace_uc << "TYPE_"
-            << service_name_uc << "_PROCESSOR, " << class_name << "))" << endl << "#define "
+            << service_name_uc << "_PROCESSOR, " << class_name << "))" << '\n' << "#define "
             << this->nspace_uc << "IS_" << service_name_uc << "_PROCESSOR(obj) "
             << "(G_TYPE_CHECK_INSTANCE_TYPE ((obj), " << this->nspace_uc << "TYPE_"
-            << service_name_uc << "_PROCESSOR))" << endl << "#define " << class_name_uc
+            << service_name_uc << "_PROCESSOR))" << '\n' << "#define " << class_name_uc
             << "_CLASS(c) (G_TYPE_CHECK_CLASS_CAST ((c), " << this->nspace_uc << "TYPE_"
-            << service_name_uc << "_PROCESSOR, " << class_name << "Class))" << endl << "#define "
+            << service_name_uc << "_PROCESSOR, " << class_name << "Class))" << '\n' << "#define "
             << this->nspace_uc << "IS_" << service_name_uc << "_PROCESSOR_CLASS(c) "
             << "(G_TYPE_CHECK_CLASS_TYPE ((c), " << this->nspace_uc << "TYPE_" << service_name_uc
-            << "_PROCESSOR))" << endl << "#define " << this->nspace_uc << service_name_uc
+            << "_PROCESSOR))" << '\n' << "#define " << this->nspace_uc << service_name_uc
             << "_PROCESSOR_GET_CLASS(obj) "
             << "(G_TYPE_INSTANCE_GET_CLASS ((obj), " << this->nspace_uc << "TYPE_"
-            << service_name_uc << "_PROCESSOR, " << class_name << "Class))" << endl << endl;
+            << service_name_uc << "_PROCESSOR, " << class_name << "Class))" << '\n' << '\n';
 
   // Generate the processor's implementation in the implementation file
 
   // Generate the processor's properties enum
-  f_service_ << "enum _" << class_name << "Properties" << endl << "{" << endl;
+  f_service_ << "enum _" << class_name << "Properties" << '\n' << "{" << '\n';
   indent_up();
-  f_service_ << indent() << "PROP_" << class_name_uc << "_0," << endl << indent() << "PROP_"
-             << class_name_uc << "_HANDLER" << endl;
+  f_service_ << indent() << "PROP_" << class_name_uc << "_0," << '\n' << indent() << "PROP_"
+             << class_name_uc << "_HANDLER" << '\n';
   indent_down();
-  f_service_ << "};" << endl << endl;
+  f_service_ << "};" << '\n' << '\n';
 
   // Generate the implementation boilerplate
   args_indent = string(15, ' ');
-  f_service_ << "G_DEFINE_TYPE (" << class_name << "," << endl << args_indent << class_name_lc
-             << "," << endl << args_indent << parent_type_name << ")" << endl << endl;
+  f_service_ << "G_DEFINE_TYPE (" << class_name << "," << '\n' << args_indent << class_name_lc
+             << "," << '\n' << args_indent << parent_type_name << ")" << '\n' << '\n';
 
   // Generate the processor's processing-function type
   args_indent = string(process_function_type_name.length() + 23, ' ');
   f_service_ << "typedef gboolean (* " << process_function_type_name << ") ("
-             << class_name << " *, " << endl
-             << args_indent << "gint32," << endl
-             << args_indent << "ThriftProtocol *," << endl
-             << args_indent << "ThriftProtocol *," << endl
-             << args_indent << "GError **);" << endl
-             << endl;
+             << class_name << " *, " << '\n'
+             << args_indent << "gint32," << '\n'
+             << args_indent << "ThriftProtocol *," << '\n'
+             << args_indent << "ThriftProtocol *," << '\n'
+             << args_indent << "GError **);" << '\n'
+             << '\n';
 
   // Generate the processor's processing-function-definition type
-  f_service_ << "typedef struct" << endl
-             << "{" << endl;
+  f_service_ << "typedef struct" << '\n'
+             << "{" << '\n';
   indent_up();
-  f_service_ << indent() << "gchar *name;" << endl
-             << indent() << process_function_type_name << " function;" << endl;
+  f_service_ << indent() << "gchar *name;" << '\n'
+             << indent() << process_function_type_name << " function;" << '\n';
   indent_down();
-  f_service_ << "} " << process_function_def_type_name << ";" << endl
-             << endl;
+  f_service_ << "} " << process_function_def_type_name << ";" << '\n'
+             << '\n';
 
   // Generate forward declarations of the processor's processing functions so we
   // can refer to them in the processing-function-definition struct below and
@@ -2193,23 +2191,23 @@
       + initial_caps_to_underscores((*function_iter)->get_name());
 
     args_indent = string(function_name.length() + 2, ' ');
-    f_service_ << "static gboolean" << endl
+    f_service_ << "static gboolean" << '\n'
                << function_name << " ("
-               << class_name << " *," << endl
-               << args_indent << "gint32," << endl
-               << args_indent << "ThriftProtocol *," << endl
-               << args_indent << "ThriftProtocol *," << endl
-               << args_indent << "GError **);" << endl;
+               << class_name << " *," << '\n'
+               << args_indent << "gint32," << '\n'
+               << args_indent << "ThriftProtocol *," << '\n'
+               << args_indent << "ThriftProtocol *," << '\n'
+               << args_indent << "GError **);" << '\n';
   }
-  f_service_ << endl;
+  f_service_ << '\n';
 
   // Generate the processor's processing-function definitions, if the service
   // defines any methods
   if (functions.size() > 0) {
     f_service_ << indent() << "static " << process_function_def_type_name
-               << endl
+               << '\n'
                << indent() << class_name_lc << "_process_function_defs["
-               << functions.size() << "] = {" << endl;
+               << functions.size() << "] = {" << '\n';
     indent_up();
     for (function_iter = functions.begin();
          function_iter != functions.end();
@@ -2218,17 +2216,17 @@
       string process_function_name = class_name_lc + "_process_"
         + initial_caps_to_underscores(service_function_name);
 
-      f_service_ << indent() << "{" << endl;
+      f_service_ << indent() << "{" << '\n';
       indent_up();
-      f_service_ << indent() << "\"" << service_function_name << "\"," << endl
-                 << indent() << process_function_name << endl;
+      f_service_ << indent() << "\"" << service_function_name << "\"," << '\n'
+                 << indent() << process_function_name << '\n';
       indent_down();
       f_service_ << indent() << "}"
-                 << (function_iter == --functions.end() ? "" : ",") << endl;
+                 << (function_iter == --functions.end() ? "" : ",") << '\n';
     }
     indent_down();
-    f_service_ << indent() << "};" << endl
-               << endl;
+    f_service_ << indent() << "};" << '\n'
+               << '\n';
   }
 
   // Generate the processor's processing functions
@@ -2262,76 +2260,76 @@
                     + initial_caps_to_underscores(service_function_name);
 
     args_indent = string(function_name.length() + 2, ' ');
-    f_service_ << "static gboolean" << endl << function_name << " (" << class_name << " *self,"
-               << endl << args_indent << "gint32 sequence_id," << endl << args_indent
-               << "ThriftProtocol *input_protocol," << endl << args_indent
-               << "ThriftProtocol *output_protocol," << endl << args_indent << "GError **error)"
-               << endl;
+    f_service_ << "static gboolean" << '\n' << function_name << " (" << class_name << " *self,"
+               << '\n' << args_indent << "gint32 sequence_id," << '\n' << args_indent
+               << "ThriftProtocol *input_protocol," << '\n' << args_indent
+               << "ThriftProtocol *output_protocol," << '\n' << args_indent << "GError **error)"
+               << '\n';
     scope_up(f_service_);
-    f_service_ << indent() << "gboolean result = TRUE;" << endl
-               << indent() << "ThriftTransport * transport;" << endl
-               << indent() << "ThriftApplicationException *xception;" << endl
-               << indent() << args_class_name + " * args =" << endl;
+    f_service_ << indent() << "gboolean result = TRUE;" << '\n'
+               << indent() << "ThriftTransport * transport;" << '\n'
+               << indent() << "ThriftApplicationException *xception;" << '\n'
+               << indent() << args_class_name + " * args =" << '\n';
     indent_up();
-    f_service_ << indent() << "g_object_new (" << args_class_type << ", NULL);" << endl << endl;
+    f_service_ << indent() << "g_object_new (" << args_class_type << ", NULL);" << '\n' << '\n';
     indent_down();
     if ((*function_iter)->is_oneway()) {
-      f_service_ << indent() << "THRIFT_UNUSED_VAR (sequence_id);" << endl << indent()
-                 << "THRIFT_UNUSED_VAR (output_protocol);" << endl << endl;
+      f_service_ << indent() << "THRIFT_UNUSED_VAR (sequence_id);" << '\n' << indent()
+                 << "THRIFT_UNUSED_VAR (output_protocol);" << '\n' << '\n';
     }
     f_service_ << indent() << "g_object_get (input_protocol, \"transport\", "
-               << "&transport, NULL);" << endl << endl;
+               << "&transport, NULL);" << '\n' << '\n';
 
     // Read the method's arguments from the caller
     f_service_ << indent() << "if ((thrift_struct_read (THRIFT_STRUCT (args), "
-               << "input_protocol, error) != -1) &&" << endl << indent()
+               << "input_protocol, error) != -1) &&" << '\n' << indent()
                << "    (thrift_protocol_read_message_end (input_protocol, "
-               << "error) != -1) &&" << endl << indent()
-               << "    (thrift_transport_read_end (transport, error) != FALSE))" << endl;
+               << "error) != -1) &&" << '\n' << indent()
+               << "    (thrift_transport_read_end (transport, error) != FALSE))" << '\n';
     scope_up(f_service_);
 
     for (arg_iter = args.begin(); arg_iter != args.end(); ++arg_iter) {
       f_service_ << indent() << property_type_name((*arg_iter)->get_type()) << " "
-                 << (*arg_iter)->get_name() << ";" << endl;
+                 << (*arg_iter)->get_name() << ";" << '\n';
     }
     for (xception_iter = xceptions.begin(); xception_iter != xceptions.end(); ++xception_iter) {
       f_service_ << indent() << type_name((*xception_iter)->get_type()) << " "
-                 << initial_caps_to_underscores((*xception_iter)->get_name()) << " = NULL;" << endl;
+                 << initial_caps_to_underscores((*xception_iter)->get_name()) << " = NULL;" << '\n';
     }
     if (has_return_value) {
-      f_service_ << indent() << property_type_name(return_type) << " return_value;" << endl;
+      f_service_ << indent() << property_type_name(return_type) << " return_value;" << '\n';
     }
     if (!(*function_iter)->is_oneway()) {
-      f_service_ << indent() << result_class_name << " * result_struct;" << endl;
+      f_service_ << indent() << result_class_name << " * result_struct;" << '\n';
     }
-    f_service_ << endl;
+    f_service_ << '\n';
 
     if (args.size() > 0) {
-      f_service_ << indent() << "g_object_get (args," << endl;
+      f_service_ << indent() << "g_object_get (args," << '\n';
       args_indent = indent() + string(14, ' ');
       for (arg_iter = args.begin(); arg_iter != args.end(); ++arg_iter) {
         string arg_name = (*arg_iter)->get_name();
 
-        f_service_ << args_indent << "\"" << arg_name << "\", &" << arg_name << "," << endl;
+        f_service_ << args_indent << "\"" << arg_name << "\", &" << arg_name << "," << '\n';
       }
-      f_service_ << args_indent << "NULL);" << endl << endl;
+      f_service_ << args_indent << "NULL);" << '\n' << '\n';
     }
 
     if (!(*function_iter)->is_oneway()) {
-      f_service_ << indent() << "g_object_unref (transport);" << endl << indent()
+      f_service_ << indent() << "g_object_unref (transport);" << '\n' << indent()
                  << "g_object_get (output_protocol, \"transport\", "
-                 << "&transport, NULL);" << endl << endl << indent()
-                 << "result_struct = g_object_new (" << result_class_type << ", NULL);" << endl;
+                 << "&transport, NULL);" << '\n' << '\n' << indent()
+                 << "result_struct = g_object_new (" << result_class_type << ", NULL);" << '\n';
       if (has_return_value) {
         f_service_ << indent() << "g_object_get (result_struct, "
-                                  "\"success\", &return_value, NULL);" << endl;
+                                  "\"success\", &return_value, NULL);" << '\n';
       }
-      f_service_ << endl;
+      f_service_ << '\n';
     }
 
     // Pass the arguments to the corresponding method in the handler
     f_service_ << indent() << "if (" << handler_function_name << " (" << this->nspace_uc
-               << service_name_uc << "_IF (self->handler)," << endl;
+               << service_name_uc << "_IF (self->handler)," << '\n';
     args_indent = indent() + string(handler_function_name.length() + 6, ' ');
     if (has_return_value) {
       string return_type_name = type_name(return_type);
@@ -2351,16 +2349,16 @@
         f_service_ << "(" << return_type_name << ")";
       }
 
-      f_service_ << "&return_value," << endl;
+      f_service_ << "&return_value," << '\n';
     }
     for (arg_iter = args.begin(); arg_iter != args.end(); ++arg_iter) {
-      f_service_ << args_indent << (*arg_iter)->get_name() << "," << endl;
+      f_service_ << args_indent << (*arg_iter)->get_name() << "," << '\n';
     }
     for (xception_iter = xceptions.begin(); xception_iter != xceptions.end(); ++xception_iter) {
       f_service_ << args_indent << "&" << initial_caps_to_underscores((*xception_iter)->get_name())
-                 << "," << endl;
+                 << "," << '\n';
     }
-    f_service_ << args_indent << "error) == TRUE)" << endl;
+    f_service_ << args_indent << "error) == TRUE)" << '\n';
     scope_up(f_service_);
 
     // The handler reported success; return the result, if any, to the caller
@@ -2373,24 +2371,24 @@
                      << "(" << type_name(return_type) << ")";
         }
         f_service_ << "return_value, "
-                   << "NULL);" << endl;
-        f_service_ << endl;
+                   << "NULL);" << '\n';
+        f_service_ << '\n';
       }
-      f_service_ << indent() << "result =" << endl;
+      f_service_ << indent() << "result =" << '\n';
       indent_up();
-      f_service_ << indent() << "((thrift_protocol_write_message_begin (output_protocol," << endl;
+      f_service_ << indent() << "((thrift_protocol_write_message_begin (output_protocol," << '\n';
       args_indent = indent() + string(39, ' ');
-      f_service_ << args_indent << "\"" << service_function_name << "\"," << endl << args_indent
-                 << "T_REPLY," << endl << args_indent << "sequence_id," << endl << args_indent
-                 << "error) != -1) &&" << endl << indent()
-                 << " (thrift_struct_write (THRIFT_STRUCT (result_struct)," << endl;
+      f_service_ << args_indent << "\"" << service_function_name << "\"," << '\n' << args_indent
+                 << "T_REPLY," << '\n' << args_indent << "sequence_id," << '\n' << args_indent
+                 << "error) != -1) &&" << '\n' << indent()
+                 << " (thrift_struct_write (THRIFT_STRUCT (result_struct)," << '\n';
       args_indent = indent() + string(23, ' ');
-      f_service_ << args_indent << "output_protocol," << endl << args_indent << "error) != -1));"
-                 << endl;
+      f_service_ << args_indent << "output_protocol," << '\n' << args_indent << "error) != -1));"
+                 << '\n';
       indent_down();
     }
     scope_down(f_service_);
-    f_service_ << indent() << "else" << endl;
+    f_service_ << indent() << "else" << '\n';
     scope_up(f_service_);
 
     // The handler reported failure; check to see if an application-defined
@@ -2399,28 +2397,28 @@
     if (xceptions.size() > 0) {
       for (xception_iter = xceptions.begin(); xception_iter != xceptions.end(); ++xception_iter) {
         f_service_ << "if (" << initial_caps_to_underscores((*xception_iter)->get_name())
-                   << " != NULL)" << endl;
+                   << " != NULL)" << '\n';
         scope_up(f_service_);
-        f_service_ << indent() << "g_object_set (result_struct," << endl;
+        f_service_ << indent() << "g_object_set (result_struct," << '\n';
         args_indent = indent() + string(14, ' ');
         f_service_ << args_indent << "\"" << (*xception_iter)->get_name() << "\", "
-                   << (*xception_iter)->get_name() << "," << endl << args_indent << "NULL);" << endl
-                   << endl;
-        f_service_ << indent() << "g_object_unref ("<< (*xception_iter)->get_name() <<");"<< endl;
-        f_service_ << indent() << "result =" << endl;
+                   << (*xception_iter)->get_name() << "," << '\n' << args_indent << "NULL);" << '\n'
+                   << '\n';
+        f_service_ << indent() << "g_object_unref ("<< (*xception_iter)->get_name() <<");"<< '\n';
+        f_service_ << indent() << "result =" << '\n';
         indent_up();
-        f_service_ << indent() << "((thrift_protocol_write_message_begin (output_protocol," << endl;
+        f_service_ << indent() << "((thrift_protocol_write_message_begin (output_protocol," << '\n';
         args_indent = indent() + string(39, ' ');
-        f_service_ << args_indent << "\"" << service_function_name << "\"," << endl << args_indent
-                   << "T_REPLY," << endl << args_indent << "sequence_id," << endl << args_indent
-                   << "error) != -1) &&" << endl << indent()
-                   << " (thrift_struct_write (THRIFT_STRUCT (result_struct)," << endl;
+        f_service_ << args_indent << "\"" << service_function_name << "\"," << '\n' << args_indent
+                   << "T_REPLY," << '\n' << args_indent << "sequence_id," << '\n' << args_indent
+                   << "error) != -1) &&" << '\n' << indent()
+                   << " (thrift_struct_write (THRIFT_STRUCT (result_struct)," << '\n';
         args_indent = indent() + string(23, ' ');
-        f_service_ << args_indent << "output_protocol," << endl << args_indent << "error) != -1));"
-                   << endl;
+        f_service_ << args_indent << "output_protocol," << '\n' << args_indent << "error) != -1));"
+                   << '\n';
         indent_down();
         scope_down(f_service_);
-        f_service_ << indent() << "else" << endl;
+        f_service_ << indent() << "else" << '\n';
       }
 
       scope_up(f_service_);
@@ -2430,41 +2428,41 @@
     // If the handler reported failure but raised no application-defined
     // exception, return a Thrift application exception with the information
     // returned via GLib's own error-reporting mechanism
-    f_service_ << "if (*error == NULL)" << endl;
+    f_service_ << "if (*error == NULL)" << '\n';
     indent_up();
     f_service_ << indent() << "g_warning (\"" << service_name_ << "."
-               << (*function_iter)->get_name() << " implementation returned FALSE \"" << endl
-               << indent() << string(11, ' ') << "\"but did not set an error\");" << endl << endl;
+               << (*function_iter)->get_name() << " implementation returned FALSE \"" << '\n'
+               << indent() << string(11, ' ') << "\"but did not set an error\");" << '\n' << '\n';
     indent_down();
-    f_service_ << indent() << "xception =" << endl;
+    f_service_ << indent() << "xception =" << '\n';
     indent_up();
-    f_service_ << indent() << "g_object_new (THRIFT_TYPE_APPLICATION_EXCEPTION," << endl;
+    f_service_ << indent() << "g_object_new (THRIFT_TYPE_APPLICATION_EXCEPTION," << '\n';
     args_indent = indent() + string(14, ' ');
-    f_service_ << args_indent << "\"type\",    *error != NULL ? (*error)->code :" << endl
+    f_service_ << args_indent << "\"type\",    *error != NULL ? (*error)->code :" << '\n'
                << args_indent << string(11, ' ') << "THRIFT_APPLICATION_EXCEPTION_ERROR_UNKNOWN,"
-               << endl << args_indent << "\"message\", *error != NULL ? (*error)->message : NULL,"
-               << endl << args_indent << "NULL);" << endl;
+               << '\n' << args_indent << "\"message\", *error != NULL ? (*error)->message : NULL,"
+               << '\n' << args_indent << "NULL);" << '\n';
     indent_down();
-    f_service_ << indent() << "g_clear_error (error);" << endl << endl << indent()
-               << "result =" << endl;
+    f_service_ << indent() << "g_clear_error (error);" << '\n' << '\n' << indent()
+               << "result =" << '\n';
     indent_up();
-    f_service_ << indent() << "((thrift_protocol_write_message_begin (output_protocol," << endl;
+    f_service_ << indent() << "((thrift_protocol_write_message_begin (output_protocol," << '\n';
     args_indent = indent() + string(39, ' ');
-    f_service_ << args_indent << "\"" << service_function_name << "\"," << endl << args_indent
-               << "T_EXCEPTION," << endl << args_indent << "sequence_id," << endl << args_indent
-               << "error) != -1) &&" << endl << indent()
-               << " (thrift_struct_write (THRIFT_STRUCT (xception)," << endl;
+    f_service_ << args_indent << "\"" << service_function_name << "\"," << '\n' << args_indent
+               << "T_EXCEPTION," << '\n' << args_indent << "sequence_id," << '\n' << args_indent
+               << "error) != -1) &&" << '\n' << indent()
+               << " (thrift_struct_write (THRIFT_STRUCT (xception)," << '\n';
     args_indent = indent() + string(23, ' ');
-    f_service_ << args_indent << "output_protocol," << endl << args_indent << "error) != -1));"
-               << endl;
+    f_service_ << args_indent << "output_protocol," << '\n' << args_indent << "error) != -1));"
+               << '\n';
     indent_down();
-    f_service_ << endl << indent() << "g_object_unref (xception);" << endl;
+    f_service_ << '\n' << indent() << "g_object_unref (xception);" << '\n';
 
     if (xceptions.size() > 0) {
       scope_down(f_service_);
     }
     scope_down(f_service_);
-    f_service_ << endl;
+    f_service_ << '\n';
 
     // Dellocate or unref retrieved argument values as necessary
     for (arg_iter = args.begin(); arg_iter != args.end(); ++arg_iter) {
@@ -2475,17 +2473,17 @@
         t_base_type* base_type = ((t_base_type*)arg_type);
 
         if (base_type->get_base() == t_base_type::TYPE_STRING) {
-          f_service_ << indent() << "if (" << arg_name << " != NULL)" << endl;
+          f_service_ << indent() << "if (" << arg_name << " != NULL)" << '\n';
           indent_up();
           if (base_type->is_binary()) {
-            f_service_ << indent() << "g_byte_array_unref (" << arg_name << ");" << endl;
+            f_service_ << indent() << "g_byte_array_unref (" << arg_name << ");" << '\n';
           } else {
-            f_service_ << indent() << "g_free (" << arg_name << ");" << endl;
+            f_service_ << indent() << "g_free (" << arg_name << ");" << '\n';
           }
           indent_down();
         }
       } else if (arg_type->is_container()) {
-        f_service_ << indent() << "if (" << arg_name << " != NULL)" << endl;
+        f_service_ << indent() << "if (" << arg_name << " != NULL)" << '\n';
         indent_up();
 
         if (arg_type->is_list()) {
@@ -2497,16 +2495,16 @@
           } else {
             f_service_ << "g_ptr_array_unref";
           }
-          f_service_ << " (" << arg_name << ");" << endl;
+          f_service_ << " (" << arg_name << ");" << '\n';
         } else if (arg_type->is_map() || arg_type->is_set()) {
-          f_service_ << indent() << "g_hash_table_unref (" << arg_name << ");" << endl;
+          f_service_ << indent() << "g_hash_table_unref (" << arg_name << ");" << '\n';
         }
 
         indent_down();
       } else if (arg_type->is_struct()) {
-        f_service_ << indent() << "if (" << arg_name << " != NULL)" << endl;
+        f_service_ << indent() << "if (" << arg_name << " != NULL)" << '\n';
         indent_up();
-        f_service_ << indent() << "g_object_unref (" << arg_name << ");" << endl;
+        f_service_ << indent() << "g_object_unref (" << arg_name << ");" << '\n';
         indent_down();
       }
     }
@@ -2518,17 +2516,17 @@
         if (return_type->is_base_type()) {
           t_base_type* base_type = ((t_base_type*)return_type);
             if (base_type->get_base() == t_base_type::TYPE_STRING) {
-            f_service_ << indent() << "if (return_value != NULL)" << endl;
+            f_service_ << indent() << "if (return_value != NULL)" << '\n';
             indent_up();
             if (base_type->is_binary()) {
-              f_service_ << indent() << "g_byte_array_unref (return_value);" << endl;
+              f_service_ << indent() << "g_byte_array_unref (return_value);" << '\n';
             } else {
-              f_service_ << indent() << "g_free (return_value);" << endl;
+              f_service_ << indent() << "g_free (return_value);" << '\n';
             }
             indent_down();
           }
         } else if (return_type->is_container()) {
-          f_service_ << indent() << "if (return_value != NULL)" << endl;
+          f_service_ << indent() << "if (return_value != NULL)" << '\n';
           indent_up();
 
           if (return_type->is_list()) {
@@ -2540,81 +2538,81 @@
             } else {
               f_service_ << "g_ptr_array_unref";
             }
-            f_service_ << " (return_value);" << endl;
+            f_service_ << " (return_value);" << '\n';
           } else if (return_type->is_map() || return_type->is_set()) {
-            f_service_ << indent() << "g_hash_table_unref (return_value);" << endl;
+            f_service_ << indent() << "g_hash_table_unref (return_value);" << '\n';
           }
 
           indent_down();
         } else if (return_type->is_struct()) {
-          f_service_ << indent() << "if (return_value != NULL)" << endl;
+          f_service_ << indent() << "if (return_value != NULL)" << '\n';
           indent_up();
-          f_service_ << indent() << "g_object_unref (return_value);" << endl;
+          f_service_ << indent() << "g_object_unref (return_value);" << '\n';
           indent_down();
         }
       }
-      f_service_ << indent() << "g_object_unref (result_struct);" << endl << endl << indent()
-                 << "if (result == TRUE)" << endl;
+      f_service_ << indent() << "g_object_unref (result_struct);" << '\n' << '\n' << indent()
+                 << "if (result == TRUE)" << '\n';
       indent_up();
-      f_service_ << indent() << "result =" << endl;
+      f_service_ << indent() << "result =" << '\n';
       indent_up();
       f_service_ << indent() << "((thrift_protocol_write_message_end "
-                 << "(output_protocol, error) != -1) &&" << endl << indent()
+                 << "(output_protocol, error) != -1) &&" << '\n' << indent()
                  << " (thrift_transport_write_end (transport, error) "
-                 << "!= FALSE) &&" << endl << indent()
+                 << "!= FALSE) &&" << '\n' << indent()
                  << " (thrift_transport_flush (transport, error) "
-                 << "!= FALSE));" << endl;
+                 << "!= FALSE));" << '\n';
       indent_down();
       indent_down();
     }
     scope_down(f_service_);
-    f_service_ << indent() << "else" << endl;
+    f_service_ << indent() << "else" << '\n';
     indent_up();
-    f_service_ << indent() << "result = FALSE;" << endl;
+    f_service_ << indent() << "result = FALSE;" << '\n';
     indent_down();
 
-    f_service_ << endl << indent() << "g_object_unref (transport);" << endl << indent()
-               << "g_object_unref (args);" << endl << endl << indent() << "return result;" << endl;
+    f_service_ << '\n' << indent() << "g_object_unref (transport);" << '\n' << indent()
+               << "g_object_unref (args);" << '\n' << '\n' << indent() << "return result;" << '\n';
     scope_down(f_service_);
 
-    f_service_ << endl;
+    f_service_ << '\n';
   }
 
   // Generate the processor's dispatch_call implementation
   function_name = class_name_lc + "_dispatch_call";
   args_indent = indent() + string(function_name.length() + 2, ' ');
-  f_service_ << "static gboolean" << endl << function_name
-             << " (ThriftDispatchProcessor *dispatch_processor," << endl << args_indent
-             << "ThriftProtocol *input_protocol," << endl << args_indent
-             << "ThriftProtocol *output_protocol," << endl << args_indent << "gchar *method_name,"
-             << endl << args_indent << "gint32 sequence_id," << endl << args_indent
-             << "GError **error)" << endl;
+  f_service_ << "static gboolean" << '\n' << function_name
+             << " (ThriftDispatchProcessor *dispatch_processor," << '\n' << args_indent
+             << "ThriftProtocol *input_protocol," << '\n' << args_indent
+             << "ThriftProtocol *output_protocol," << '\n' << args_indent << "gchar *method_name,"
+             << '\n' << args_indent << "gint32 sequence_id," << '\n' << args_indent
+             << "GError **error)" << '\n';
   scope_up(f_service_);
   f_service_ << indent() << class_name_lc << "_process_function_def *"
-             << "process_function_def;" << endl;
-  f_service_ << indent() << "gboolean dispatch_result = FALSE;" << endl << endl << indent()
-             << class_name << " *self = " << class_name_uc << " (dispatch_processor);" << endl;
+             << "process_function_def;" << '\n';
+  f_service_ << indent() << "gboolean dispatch_result = FALSE;" << '\n' << '\n' << indent()
+             << class_name << " *self = " << class_name_uc << " (dispatch_processor);" << '\n';
   f_service_ << indent() << parent_class_name << "Class "
-                                                 "*parent_class =" << endl;
+                                                 "*parent_class =" << '\n';
   indent_up();
   f_service_ << indent() << "g_type_class_peek_parent (" << class_name_uc << "_GET_CLASS (self));"
-             << endl;
+             << '\n';
   indent_down();
-  f_service_ << endl
+  f_service_ << '\n'
              << indent() << "process_function_def = "
-             << "g_hash_table_lookup (self->process_map, method_name);" << endl
-             << indent() << "if (process_function_def != NULL)" << endl;
+             << "g_hash_table_lookup (self->process_map, method_name);" << '\n'
+             << indent() << "if (process_function_def != NULL)" << '\n';
   scope_up(f_service_);
   args_indent = indent() + string(53, ' ');
-  f_service_ << indent() << "g_free (method_name);" << endl
+  f_service_ << indent() << "g_free (method_name);" << '\n'
              << indent() << "dispatch_result = "
-             << "(*process_function_def->function) (self," << endl
-             << args_indent << "sequence_id," << endl
-             << args_indent << "input_protocol," << endl
-             << args_indent << "output_protocol," << endl
-             << args_indent << "error);" << endl;
+             << "(*process_function_def->function) (self," << '\n'
+             << args_indent << "sequence_id," << '\n'
+             << args_indent << "input_protocol," << '\n'
+             << args_indent << "output_protocol," << '\n'
+             << args_indent << "error);" << '\n';
   scope_down(f_service_);
-  f_service_ << indent() << "else" << endl;
+  f_service_ << indent() << "else" << '\n';
   scope_up(f_service_);
 
   // Method name not recognized; chain up to our parent processor---note the
@@ -2622,160 +2620,160 @@
   // will return an application exception to the caller if no class in the
   // hierarchy recognizes the method name
   f_service_ << indent() << "dispatch_result = parent_class->dispatch_call "
-                            "(dispatch_processor," << endl;
+                            "(dispatch_processor," << '\n';
   args_indent = indent() + string(47, ' ');
-  f_service_ << args_indent << "input_protocol," << endl << args_indent << "output_protocol,"
-             << endl << args_indent << "method_name," << endl << args_indent << "sequence_id,"
-             << endl << args_indent << "error);" << endl;
+  f_service_ << args_indent << "input_protocol," << '\n' << args_indent << "output_protocol,"
+             << '\n' << args_indent << "method_name," << '\n' << args_indent << "sequence_id,"
+             << '\n' << args_indent << "error);" << '\n';
   scope_down(f_service_);
-  f_service_ << endl << indent() << "return dispatch_result;" << endl;
+  f_service_ << '\n' << indent() << "return dispatch_result;" << '\n';
   scope_down(f_service_);
-  f_service_ << endl;
+  f_service_ << '\n';
 
   // Generate the processor's property setter
   function_name = class_name_lc + "_set_property";
   args_indent = string(function_name.length() + 2, ' ');
-  f_service_ << "static void" << endl << function_name << " (GObject *object," << endl
-             << args_indent << "guint property_id," << endl << args_indent << "const GValue *value,"
-             << endl << args_indent << "GParamSpec *pspec)" << endl;
+  f_service_ << "static void" << '\n' << function_name << " (GObject *object," << '\n'
+             << args_indent << "guint property_id," << '\n' << args_indent << "const GValue *value,"
+             << '\n' << args_indent << "GParamSpec *pspec)" << '\n';
   scope_up(f_service_);
-  f_service_ << indent() << class_name << " *self = " << class_name_uc << " (object);" << endl
-             << endl << indent() << "switch (property_id)" << endl;
+  f_service_ << indent() << class_name << " *self = " << class_name_uc << " (object);" << '\n'
+             << '\n' << indent() << "switch (property_id)" << '\n';
   scope_up(f_service_);
-  f_service_ << indent() << "case PROP_" << class_name_uc << "_HANDLER:" << endl;
+  f_service_ << indent() << "case PROP_" << class_name_uc << "_HANDLER:" << '\n';
   indent_up();
-  f_service_ << indent() << "if (self->handler != NULL)" << endl;
+  f_service_ << indent() << "if (self->handler != NULL)" << '\n';
   indent_up();
-  f_service_ << indent() << "g_object_unref (self->handler);" << endl;
+  f_service_ << indent() << "g_object_unref (self->handler);" << '\n';
   indent_down();
-  f_service_ << indent() << "self->handler = g_value_get_object (value);" << endl << indent()
-             << "g_object_ref (self->handler);" << endl;
+  f_service_ << indent() << "self->handler = g_value_get_object (value);" << '\n' << indent()
+             << "g_object_ref (self->handler);" << '\n';
   if (extends_service) {
     // Chain up to set the handler in every superclass as well
-    f_service_ << endl << indent() << "G_OBJECT_CLASS (" << class_name_lc << "_parent_class)->"
-               << endl;
+    f_service_ << '\n' << indent() << "G_OBJECT_CLASS (" << class_name_lc << "_parent_class)->"
+               << '\n';
     indent_up();
-    f_service_ << indent() << "set_property (object, property_id, value, pspec);" << endl;
+    f_service_ << indent() << "set_property (object, property_id, value, pspec);" << '\n';
     indent_down();
   }
-  f_service_ << indent() << "break;" << endl;
+  f_service_ << indent() << "break;" << '\n';
   indent_down();
-  f_service_ << indent() << "default:" << endl;
+  f_service_ << indent() << "default:" << '\n';
   indent_up();
   f_service_ << indent() << "G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);"
-             << endl << indent() << "break;" << endl;
+             << '\n' << indent() << "break;" << '\n';
   indent_down();
   scope_down(f_service_);
   scope_down(f_service_);
-  f_service_ << endl;
+  f_service_ << '\n';
 
   // Generate processor's property getter
   function_name = class_name_lc + "_get_property";
   args_indent = string(function_name.length() + 2, ' ');
-  f_service_ << "static void" << endl << function_name << " (GObject *object," << endl
-             << args_indent << "guint property_id," << endl << args_indent << "GValue *value,"
-             << endl << args_indent << "GParamSpec *pspec)" << endl;
+  f_service_ << "static void" << '\n' << function_name << " (GObject *object," << '\n'
+             << args_indent << "guint property_id," << '\n' << args_indent << "GValue *value,"
+             << '\n' << args_indent << "GParamSpec *pspec)" << '\n';
   scope_up(f_service_);
-  f_service_ << indent() << class_name << " *self = " << class_name_uc << " (object);" << endl
-             << endl << indent() << "switch (property_id)" << endl;
+  f_service_ << indent() << class_name << " *self = " << class_name_uc << " (object);" << '\n'
+             << '\n' << indent() << "switch (property_id)" << '\n';
   scope_up(f_service_);
-  f_service_ << indent() << "case PROP_" << class_name_uc << "_HANDLER:" << endl;
+  f_service_ << indent() << "case PROP_" << class_name_uc << "_HANDLER:" << '\n';
   indent_up();
-  f_service_ << indent() << "g_value_set_object (value, self->handler);" << endl << indent()
-             << "break;" << endl;
+  f_service_ << indent() << "g_value_set_object (value, self->handler);" << '\n' << indent()
+             << "break;" << '\n';
   indent_down();
-  f_service_ << indent() << "default:" << endl;
+  f_service_ << indent() << "default:" << '\n';
   indent_up();
   f_service_ << indent() << "G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);"
-             << endl << indent() << "break;" << endl;
+             << '\n' << indent() << "break;" << '\n';
   indent_down();
   scope_down(f_service_);
   scope_down(f_service_);
-  f_service_ << endl;
+  f_service_ << '\n';
 
   // Generator the processor's dispose function
-  f_service_ << "static void" << endl << class_name_lc << "_dispose (GObject *gobject)" << endl;
+  f_service_ << "static void" << '\n' << class_name_lc << "_dispose (GObject *gobject)" << '\n';
   scope_up(f_service_);
-  f_service_ << indent() << class_name << " *self = " << class_name_uc << " (gobject);" << endl
-             << endl << indent() << "if (self->handler != NULL)" << endl;
+  f_service_ << indent() << class_name << " *self = " << class_name_uc << " (gobject);" << '\n'
+             << '\n' << indent() << "if (self->handler != NULL)" << '\n';
   scope_up(f_service_);
-  f_service_ << indent() << "g_object_unref (self->handler);" << endl << indent()
-             << "self->handler = NULL;" << endl;
+  f_service_ << indent() << "g_object_unref (self->handler);" << '\n' << indent()
+             << "self->handler = NULL;" << '\n';
   scope_down(f_service_);
-  f_service_ << endl << indent() << "G_OBJECT_CLASS (" << class_name_lc << "_parent_class)"
+  f_service_ << '\n' << indent() << "G_OBJECT_CLASS (" << class_name_lc << "_parent_class)"
                                                                            "->dispose (gobject);"
-             << endl;
+             << '\n';
   scope_down(f_service_);
-  f_service_ << endl;
+  f_service_ << '\n';
 
   // Generate processor finalize function
-  f_service_ << "static void" << endl << class_name_lc << "_finalize (GObject *gobject)" << endl;
+  f_service_ << "static void" << '\n' << class_name_lc << "_finalize (GObject *gobject)" << '\n';
   scope_up(f_service_);
   f_service_ << indent() << this->nspace << service_name_ << "Processor *self = " << this->nspace_uc
-             << service_name_uc << "_PROCESSOR (gobject);" << endl << endl << indent()
-             << "thrift_safe_hash_table_destroy (self->process_map);" << endl << endl << indent()
+             << service_name_uc << "_PROCESSOR (gobject);" << '\n' << '\n' << indent()
+             << "thrift_safe_hash_table_destroy (self->process_map);" << '\n' << '\n' << indent()
              << "G_OBJECT_CLASS (" << class_name_lc << "_parent_class)"
-                                                       "->finalize (gobject);" << endl;
+                                                       "->finalize (gobject);" << '\n';
   scope_down(f_service_);
-  f_service_ << endl;
+  f_service_ << '\n';
 
   // Generate processor instance initializer
-  f_service_ << "static void" << endl << class_name_lc << "_init (" << class_name << " *self)"
-             << endl;
+  f_service_ << "static void" << '\n' << class_name_lc << "_init (" << class_name << " *self)"
+             << '\n';
   scope_up(f_service_);
   if (functions.size() > 0) {
-    f_service_ << indent() << "guint index;" << endl
-               << endl;
+    f_service_ << indent() << "guint index;" << '\n'
+               << '\n';
   }
-  f_service_ << indent() << "self->handler = NULL;" << endl << indent()
+  f_service_ << indent() << "self->handler = NULL;" << '\n' << indent()
              << "self->process_map = "
-                "g_hash_table_new (g_str_hash, g_str_equal);" << endl;
+                "g_hash_table_new (g_str_hash, g_str_equal);" << '\n';
   if (functions.size() > 0) {
     args_indent = string(21, ' ');
-    f_service_ << endl
+    f_service_ << '\n'
                << indent() << "for (index = 0; index < "
-               << functions.size() << "; index += 1)" << endl;
+               << functions.size() << "; index += 1)" << '\n';
     indent_up();
-    f_service_ << indent() << "g_hash_table_insert (self->process_map," << endl
+    f_service_ << indent() << "g_hash_table_insert (self->process_map," << '\n'
                << indent() << args_indent
-               << class_name_lc << "_process_function_defs[index].name," << endl
+               << class_name_lc << "_process_function_defs[index].name," << '\n'
                << indent() << args_indent
                << "&" << class_name_lc << "_process_function_defs[index]" << ");"
-               << endl;
+               << '\n';
     indent_down();
   }
   scope_down(f_service_);
-  f_service_ << endl;
+  f_service_ << '\n';
 
   // Generate processor class initializer
-  f_service_ << "static void" << endl << class_name_lc << "_class_init (" << class_name
-             << "Class *cls)" << endl;
+  f_service_ << "static void" << '\n' << class_name_lc << "_class_init (" << class_name
+             << "Class *cls)" << '\n';
   scope_up(f_service_);
-  f_service_ << indent() << "GObjectClass *gobject_class = G_OBJECT_CLASS (cls);" << endl
-             << indent() << "ThriftDispatchProcessorClass *dispatch_processor_class =" << endl;
+  f_service_ << indent() << "GObjectClass *gobject_class = G_OBJECT_CLASS (cls);" << '\n'
+             << indent() << "ThriftDispatchProcessorClass *dispatch_processor_class =" << '\n';
   indent_up();
-  f_service_ << indent() << "THRIFT_DISPATCH_PROCESSOR_CLASS (cls);" << endl;
+  f_service_ << indent() << "THRIFT_DISPATCH_PROCESSOR_CLASS (cls);" << '\n';
   indent_down();
-  f_service_ << indent() << "GParamSpec *param_spec;" << endl << endl << indent()
-             << "gobject_class->dispose = " << class_name_lc << "_dispose;" << endl << indent()
-             << "gobject_class->finalize = " << class_name_lc << "_finalize;" << endl << indent()
-             << "gobject_class->set_property = " << class_name_lc << "_set_property;" << endl
+  f_service_ << indent() << "GParamSpec *param_spec;" << '\n' << '\n' << indent()
+             << "gobject_class->dispose = " << class_name_lc << "_dispose;" << '\n' << indent()
+             << "gobject_class->finalize = " << class_name_lc << "_finalize;" << '\n' << indent()
+             << "gobject_class->set_property = " << class_name_lc << "_set_property;" << '\n'
              << indent() << "gobject_class->get_property = " << class_name_lc << "_get_property;"
-             << endl << endl << indent()
+             << '\n' << '\n' << indent()
              << "dispatch_processor_class->dispatch_call = " << class_name_lc << "_dispatch_call;"
-             << endl << indent() << "cls->dispatch_call = " << class_name_lc << "_dispatch_call;"
-             << endl << endl << indent() << "param_spec = g_param_spec_object (\"handler\","
-             << endl;
+             << '\n' << indent() << "cls->dispatch_call = " << class_name_lc << "_dispatch_call;"
+             << '\n' << '\n' << indent() << "param_spec = g_param_spec_object (\"handler\","
+             << '\n';
   args_indent = indent() + string(34, ' ');
-  f_service_ << args_indent << "\"Service handler implementation\"," << endl << args_indent
-             << "\"The service handler implementation \"" << endl << args_indent
-             << "\"to which method calls are dispatched.\"," << endl << args_indent
-             << this->nspace_uc + "TYPE_" + service_name_uc + "_HANDLER," << endl << args_indent
-             << "G_PARAM_READWRITE);" << endl;
-  f_service_ << indent() << "g_object_class_install_property (gobject_class," << endl;
+  f_service_ << args_indent << "\"Service handler implementation\"," << '\n' << args_indent
+             << "\"The service handler implementation \"" << '\n' << args_indent
+             << "\"to which method calls are dispatched.\"," << '\n' << args_indent
+             << this->nspace_uc + "TYPE_" + service_name_uc + "_HANDLER," << '\n' << args_indent
+             << "G_PARAM_READWRITE);" << '\n';
+  f_service_ << indent() << "g_object_class_install_property (gobject_class," << '\n';
   args_indent = indent() + string(33, ' ');
-  f_service_ << args_indent << "PROP_" << class_name_uc << "_HANDLER," << endl << args_indent
-             << "param_spec);" << endl;
+  f_service_ << args_indent << "PROP_" << class_name_uc << "_HANDLER," << '\n' << args_indent
+             << "param_spec);" << '\n';
   scope_down(f_service_);
 }
 
@@ -2807,60 +2805,60 @@
   string args_indent;
 
   // write the instance definition
-  f_types_ << "struct _" << this->nspace << name << endl << "{ " << endl
-           << "  ThriftStruct parent; " << endl << endl << "  /* public */" << endl;
+  f_types_ << "struct _" << this->nspace << name << '\n' << "{ " << '\n'
+           << "  ThriftStruct parent; " << '\n' << '\n' << "  /* public */" << '\n';
 
   // for each field, add a member variable
   vector<t_field*>::const_iterator m_iter;
   const vector<t_field*>& members = tstruct->get_members();
   for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
     t_type* t = get_true_type((*m_iter)->get_type());
-    f_types_ << "  " << type_name(t) << " " << (*m_iter)->get_name() << ";" << endl;
+    f_types_ << "  " << type_name(t) << " " << (*m_iter)->get_name() << ";" << '\n';
     if ((*m_iter)->get_req() != t_field::T_REQUIRED) {
-      f_types_ << "  gboolean __isset_" << (*m_iter)->get_name() << ";" << endl;
+      f_types_ << "  gboolean __isset_" << (*m_iter)->get_name() << ";" << '\n';
     }
   }
 
   // close the structure definition and create a typedef
-  f_types_ << "};" << endl << "typedef struct _" << this->nspace << name << " " << this->nspace
-           << name << ";" << endl << endl;
+  f_types_ << "};" << '\n' << "typedef struct _" << this->nspace << name << " " << this->nspace
+           << name << ";" << '\n' << '\n';
 
   // write the class definition
-  f_types_ << "struct _" << this->nspace << name << "Class" << endl << "{" << endl
-           << "  ThriftStructClass parent;" << endl << "};" << endl << "typedef struct _"
-           << this->nspace << name << "Class " << this->nspace << name << "Class;" << endl << endl;
+  f_types_ << "struct _" << this->nspace << name << "Class" << '\n' << "{" << '\n'
+           << "  ThriftStructClass parent;" << '\n' << "};" << '\n' << "typedef struct _"
+           << this->nspace << name << "Class " << this->nspace << name << "Class;" << '\n' << '\n';
 
   // write the standard GObject boilerplate
-  f_types_ << "GType " << this->nspace_lc << name_u << "_get_type (void);" << endl << "#define "
+  f_types_ << "GType " << this->nspace_lc << name_u << "_get_type (void);" << '\n' << "#define "
            << this->nspace_uc << "TYPE_" << name_uc << " (" << this->nspace_lc << name_u
-           << "_get_type())" << endl << "#define " << this->nspace_uc << name_uc
+           << "_get_type())" << '\n' << "#define " << this->nspace_uc << name_uc
            << "(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), " << this->nspace_uc << "TYPE_" << name_uc
-           << ", " << this->nspace << name << "))" << endl << "#define " << this->nspace_uc
+           << ", " << this->nspace << name << "))" << '\n' << "#define " << this->nspace_uc
            << name_uc << "_CLASS(c) (G_TYPE_CHECK_CLASS_CAST ((c), " << this->nspace_uc << "_TYPE_"
-           << name_uc << ", " << this->nspace << name << "Class))" << endl << "#define "
+           << name_uc << ", " << this->nspace << name << "Class))" << '\n' << "#define "
            << this->nspace_uc << "IS_" << name_uc << "(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), "
-           << this->nspace_uc << "TYPE_" << name_uc << "))" << endl << "#define " << this->nspace_uc
+           << this->nspace_uc << "TYPE_" << name_uc << "))" << '\n' << "#define " << this->nspace_uc
            << "IS_" << name_uc << "_CLASS(c) (G_TYPE_CHECK_CLASS_TYPE ((c), " << this->nspace_uc
-           << "TYPE_" << name_uc << "))" << endl << "#define " << this->nspace_uc << name_uc
+           << "TYPE_" << name_uc << "))" << '\n' << "#define " << this->nspace_uc << name_uc
            << "_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), " << this->nspace_uc << "TYPE_"
-           << name_uc << ", " << this->nspace << name << "Class))" << endl << endl;
+           << name_uc << ", " << this->nspace << name << "Class))" << '\n' << '\n';
 
   // start writing the object implementation .c file
 
   // generate properties enum
   if (members.size() > 0) {
-    f_types_impl_ << "enum _" << class_name << "Properties" << endl << "{" << endl;
+    f_types_impl_ << "enum _" << class_name << "Properties" << '\n' << "{" << '\n';
     indent_up();
     f_types_impl_ << indent() << "PROP_" << class_name_uc << "_0";
     for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
       string member_name_uc
           = to_upper_case(to_lower_case(initial_caps_to_underscores((*m_iter)->get_name())));
 
-      f_types_impl_ << "," << endl << indent() << "PROP_" << class_name_uc << "_" << member_name_uc;
+      f_types_impl_ << "," << '\n' << indent() << "PROP_" << class_name_uc << "_" << member_name_uc;
     }
-    f_types_impl_ << endl;
+    f_types_impl_ << '\n';
     indent_down();
-    f_types_impl_ << "};" << endl << endl;
+    f_types_impl_ << "};" << '\n' << '\n';
   }
 
   // generate struct I/O methods
@@ -2874,12 +2872,12 @@
     // generate property setter
     function_name = class_name_lc + "_set_property";
     args_indent = string(function_name.length() + 2, ' ');
-    f_types_impl_ << "static void" << endl << function_name << " (GObject *object," << endl
-                  << args_indent << "guint property_id," << endl << args_indent
-                  << "const GValue *value," << endl << args_indent << "GParamSpec *pspec)" << endl;
+    f_types_impl_ << "static void" << '\n' << function_name << " (GObject *object," << '\n'
+                  << args_indent << "guint property_id," << '\n' << args_indent
+                  << "const GValue *value," << '\n' << args_indent << "GParamSpec *pspec)" << '\n';
     scope_up(f_types_impl_);
-    f_types_impl_ << indent() << class_name << " *self = " << class_name_uc << " (object);" << endl
-                  << endl << indent() << "switch (property_id)" << endl;
+    f_types_impl_ << indent() << class_name << " *self = " << class_name_uc << " (object);" << '\n'
+                  << '\n' << indent() << "switch (property_id)" << '\n';
     scope_up(f_types_impl_);
     for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
       t_field* member = (*m_iter);
@@ -2890,7 +2888,7 @@
 
       string property_identifier = "PROP_" + class_name_uc + "_" + member_name_uc;
 
-      f_types_impl_ << indent() << "case " << property_identifier + ":" << endl;
+      f_types_impl_ << indent() << "case " << property_identifier + ":" << '\n';
       indent_up();
 
       if (member_type->is_base_type()) {
@@ -2900,7 +2898,7 @@
         if (base_type->get_base() == t_base_type::TYPE_STRING) {
           string release_function_name;
 
-          f_types_impl_ << indent() << "if (self->" << member_name << " != NULL)" << endl;
+          f_types_impl_ << indent() << "if (self->" << member_name << " != NULL)" << '\n';
           indent_up();
 
           if (base_type->is_binary()) {
@@ -2912,7 +2910,7 @@
           }
 
           f_types_impl_ << indent() << release_function_name << " (self->" << member_name << ");"
-                        << endl;
+                        << '\n';
           indent_down();
         } else {
           switch (base_type->get_base()) {
@@ -2944,10 +2942,10 @@
         }
 
         f_types_impl_ << indent() << "self->" << member_name << " = " << assign_function_name
-                      << " (value);" << endl;
+                      << " (value);" << '\n';
       } else if (member_type->is_enum()) {
         f_types_impl_ << indent() << "self->" << member_name << " = g_value_get_int (value);"
-                      << endl;
+                      << '\n';
       } else if (member_type->is_container()) {
         string release_function_name;
         string assign_function_name;
@@ -2969,47 +2967,47 @@
           assign_function_name = "g_value_dup_boxed";
         }
 
-        f_types_impl_ << indent() << "if (self->" << member_name << " != NULL)" << endl;
+        f_types_impl_ << indent() << "if (self->" << member_name << " != NULL)" << '\n';
         indent_up();
         f_types_impl_ << indent() << release_function_name << " (self->" << member_name << ");"
-                      << endl;
+                      << '\n';
         indent_down();
         f_types_impl_ << indent() << "self->" << member_name << " = " << assign_function_name
-                      << " (value);" << endl;
+                      << " (value);" << '\n';
       } else if (member_type->is_struct() || member_type->is_xception()) {
-        f_types_impl_ << indent() << "if (self->" << member_name << " != NULL)" << endl;
+        f_types_impl_ << indent() << "if (self->" << member_name << " != NULL)" << '\n';
         indent_up();
-        f_types_impl_ << indent() << "g_object_unref (self->" << member_name << ");" << endl;
+        f_types_impl_ << indent() << "g_object_unref (self->" << member_name << ");" << '\n';
         indent_down();
         f_types_impl_ << indent() << "self->" << member_name << " = g_value_dup_object (value);"
-                      << endl;
+                      << '\n';
       }
 
       if (member->get_req() != t_field::T_REQUIRED) {
-        f_types_impl_ << indent() << "self->__isset_" << member_name << " = TRUE;" << endl;
+        f_types_impl_ << indent() << "self->__isset_" << member_name << " = TRUE;" << '\n';
       }
 
-      f_types_impl_ << indent() << "break;" << endl << endl;
+      f_types_impl_ << indent() << "break;" << '\n' << '\n';
       indent_down();
     }
-    f_types_impl_ << indent() << "default:" << endl;
+    f_types_impl_ << indent() << "default:" << '\n';
     indent_up();
     f_types_impl_ << indent() << "G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);"
-                  << endl << indent() << "break;" << endl;
+                  << '\n' << indent() << "break;" << '\n';
     indent_down();
     scope_down(f_types_impl_);
     scope_down(f_types_impl_);
-    f_types_impl_ << endl;
+    f_types_impl_ << '\n';
 
     // generate property getter
     function_name = class_name_lc + "_get_property";
     args_indent = string(function_name.length() + 2, ' ');
-    f_types_impl_ << "static void" << endl << function_name << " (GObject *object," << endl
-                  << args_indent << "guint property_id," << endl << args_indent << "GValue *value,"
-                  << endl << args_indent << "GParamSpec *pspec)" << endl;
+    f_types_impl_ << "static void" << '\n' << function_name << " (GObject *object," << '\n'
+                  << args_indent << "guint property_id," << '\n' << args_indent << "GValue *value,"
+                  << '\n' << args_indent << "GParamSpec *pspec)" << '\n';
     scope_up(f_types_impl_);
-    f_types_impl_ << indent() << class_name << " *self = " << class_name_uc << " (object);" << endl
-                  << endl << indent() << "switch (property_id)" << endl;
+    f_types_impl_ << indent() << class_name << " *self = " << class_name_uc << " (object);" << '\n'
+                  << '\n' << indent() << "switch (property_id)" << '\n';
     scope_up(f_types_impl_);
     for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
       t_field* member = (*m_iter);
@@ -3070,26 +3068,26 @@
               "unrecognized type for struct member \"" + member_name + "\"";
       }
 
-      f_types_impl_ << indent() << "case " << property_identifier + ":" << endl;
+      f_types_impl_ << indent() << "case " << property_identifier + ":" << '\n';
       indent_up();
       f_types_impl_ << indent() << setter_function_name << " (value, self->" << member_name << ");"
-                    << endl << indent() << "break;" << endl << endl;
+                    << '\n' << indent() << "break;" << '\n' << '\n';
       indent_down();
     }
-    f_types_impl_ << indent() << "default:" << endl;
+    f_types_impl_ << indent() << "default:" << '\n';
     indent_up();
     f_types_impl_ << indent() << "G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);"
-                  << endl << indent() << "break;" << endl;
+                  << '\n' << indent() << "break;" << '\n';
     indent_down();
     scope_down(f_types_impl_);
     scope_down(f_types_impl_);
-    f_types_impl_ << endl;
+    f_types_impl_ << '\n';
   }
 
   // generate the instance init function
 
-  f_types_impl_ << "static void " << endl << this->nspace_lc << name_u << "_instance_init ("
-                << this->nspace << name << " * object)" << endl << "{" << endl;
+  f_types_impl_ << "static void " << '\n' << this->nspace_lc << name_u << "_instance_init ("
+                << this->nspace << name << " * object)" << '\n' << "{" << '\n';
   indent_up();
 
   // generate default-value structures for container-type members
@@ -3109,9 +3107,9 @@
 
         // Generate an array with the list literal
         indent(f_types_impl_) << "static " << type_name(elem_type, false, true) << " __default_"
-                              << member_name << "[" << list.size() << "] = " << endl;
+                              << member_name << "[" << list.size() << "] = " << '\n';
         indent_up();
-        f_types_impl_ << indent() << constant_literal(member_type, member_value) << ";" << endl;
+        f_types_impl_ << indent() << constant_literal(member_type, member_value) << ";" << '\n';
         indent_down();
 
         constant_declaration_output = true;
@@ -3129,15 +3127,15 @@
   }
   if (constant_declaration_output) {
     if (string_list_constant_output) {
-      indent(f_types_impl_) << "unsigned int list_index;" << endl;
+      indent(f_types_impl_) << "unsigned int list_index;" << '\n';
     }
 
-    f_types_impl_ << endl;
+    f_types_impl_ << '\n';
   }
 
   // satisfy compilers with -Wall turned on
-  indent(f_types_impl_) << "/* satisfy -Wall */" << endl << indent()
-                        << "THRIFT_UNUSED_VAR (object);" << endl;
+  indent(f_types_impl_) << "/* satisfy -Wall */" << '\n' << indent()
+                        << "THRIFT_UNUSED_VAR (object);" << '\n';
 
   for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
     t_type* member_type = (*m_iter)->get_type();
@@ -3153,7 +3151,7 @@
       } else {
         dval += t->is_string() ? "NULL" : "0";
       }
-      indent(f_types_impl_) << "object->" << (*m_iter)->get_name() << dval << ";" << endl;
+      indent(f_types_impl_) << "object->" << (*m_iter)->get_name() << dval << ";" << '\n';
     } else if (t->is_struct()) {
       string name = (*m_iter)->get_name();
       t_program* type_program = member_type->get_program();
@@ -3163,10 +3161,10 @@
       string type_name_uc = to_upper_case(initial_caps_to_underscores(member_type->get_name()));
       indent(f_types_impl_) << "object->" << name << " = g_object_new ("
                             << to_upper_case(type_nspace_prefix) << "TYPE_" << type_name_uc
-                            << ", NULL);" << endl;
+                            << ", NULL);" << '\n';
     } else if (t->is_xception()) {
       string name = (*m_iter)->get_name();
-      indent(f_types_impl_) << "object->" << name << " = NULL;" << endl;
+      indent(f_types_impl_) << "object->" << name << " = NULL;" << '\n';
     } else if (t->is_container()) {
       string name = (*m_iter)->get_name();
       string init_function;
@@ -3184,7 +3182,7 @@
         init_function = generate_new_array_from_type(etype);
       }
 
-      indent(f_types_impl_) << "object->" << name << " = " << init_function << endl;
+      indent(f_types_impl_) << "object->" << name << " = " << init_function << '\n';
 
       // Pre-populate the container with the specified default values, if any
       if ((*m_iter)->get_value()) {
@@ -3196,17 +3194,17 @@
           if (is_numeric(etype)) {
             indent(f_types_impl_) <<
               "g_array_append_vals (object->" << name << ", &__default_" <<
-              name << ", " << list.size() << ");" << endl;
+              name << ", " << list.size() << ");" << '\n';
           }
           else {
             indent(f_types_impl_) <<
               "for (list_index = 0; list_index < " << list.size() << "; " <<
-              "list_index += 1)" << endl;
+              "list_index += 1)" << '\n';
             indent_up();
             indent(f_types_impl_) <<
-              "g_ptr_array_add (object->" << name << "," << endl <<
+              "g_ptr_array_add (object->" << name << "," << '\n' <<
               indent() << string(17, ' ') << "g_strdup (__default_" <<
-              name << "[list_index]));" << endl;
+              name << "[list_index]));" << '\n';
             indent_down();
           }
         }
@@ -3217,36 +3215,36 @@
 
     /* if not required, initialize the __isset variable */
     if ((*m_iter)->get_req() != t_field::T_REQUIRED) {
-      indent(f_types_impl_) << "object->__isset_" << (*m_iter)->get_name() << " = FALSE;" << endl;
+      indent(f_types_impl_) << "object->__isset_" << (*m_iter)->get_name() << " = FALSE;" << '\n';
     }
   }
 
   indent_down();
-  f_types_impl_ << "}" << endl << endl;
+  f_types_impl_ << "}" << '\n' << '\n';
 
   /* create the destructor */
-  f_types_impl_ << "static void " << endl << this->nspace_lc << name_u
-                << "_finalize (GObject *object)" << endl << "{" << endl;
+  f_types_impl_ << "static void " << '\n' << this->nspace_lc << name_u
+                << "_finalize (GObject *object)" << '\n' << "{" << '\n';
   indent_up();
 
   f_types_impl_ << indent() << this->nspace << name << " *tobject = " << this->nspace_uc << name_uc
-                << " (object);" << endl << endl;
+                << " (object);" << '\n' << '\n';
 
-  f_types_impl_ << indent() << "/* satisfy -Wall in case we don't use tobject */" << endl
-                << indent() << "THRIFT_UNUSED_VAR (tobject);" << endl;
+  f_types_impl_ << indent() << "/* satisfy -Wall in case we don't use tobject */" << '\n'
+                << indent() << "THRIFT_UNUSED_VAR (tobject);" << '\n';
 
   for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
     t_type* t = get_true_type((*m_iter)->get_type());
     if (t->is_container()) {
       string name = (*m_iter)->get_name();
       if (t->is_map() || t->is_set()) {
-        f_types_impl_ << indent() << "if (tobject->" << name << " != NULL)" << endl;
-        f_types_impl_ << indent() << "{" << endl;
+        f_types_impl_ << indent() << "if (tobject->" << name << " != NULL)" << '\n';
+        f_types_impl_ << indent() << "{" << '\n';
         indent_up();
-        f_types_impl_ << indent() << "g_hash_table_destroy (tobject->" << name << ");" << endl;
-        f_types_impl_ << indent() << "tobject->" << name << " = NULL;" << endl;
+        f_types_impl_ << indent() << "g_hash_table_destroy (tobject->" << name << ");" << '\n';
+        f_types_impl_ << indent() << "tobject->" << name << " = NULL;" << '\n';
         indent_down();
-        f_types_impl_ << indent() << "}" << endl;
+        f_types_impl_ << indent() << "}" << '\n';
       } else if (t->is_list()) {
         t_type* etype = ((t_list*)t)->get_elem_type();
         string destructor_function = "g_ptr_array_unref";
@@ -3273,59 +3271,59 @@
           destructor_function = "g_array_unref";
         }
 
-        f_types_impl_ << indent() << "if (tobject->" << name << " != NULL)" << endl;
-        f_types_impl_ << indent() << "{" << endl;
+        f_types_impl_ << indent() << "if (tobject->" << name << " != NULL)" << '\n';
+        f_types_impl_ << indent() << "{" << '\n';
         indent_up();
-        f_types_impl_ << indent() << destructor_function << " (tobject->" << name << ");" << endl;
-        f_types_impl_ << indent() << "tobject->" << name << " = NULL;" << endl;
+        f_types_impl_ << indent() << destructor_function << " (tobject->" << name << ");" << '\n';
+        f_types_impl_ << indent() << "tobject->" << name << " = NULL;" << '\n';
         indent_down();
-        f_types_impl_ << indent() << "}" << endl;
+        f_types_impl_ << indent() << "}" << '\n';
       }
     } else if (t->is_struct() || t->is_xception()) {
       string name = (*m_iter)->get_name();
       // TODO: g_clear_object needs glib >= 2.28
-      // f_types_impl_ << indent() << "g_clear_object (&(tobject->" << name << "));" << endl;
+      // f_types_impl_ << indent() << "g_clear_object (&(tobject->" << name << "));" << '\n';
       // does g_object_unref the trick?
-      f_types_impl_ << indent() << "if (tobject->" << name << " != NULL)" << endl;
-      f_types_impl_ << indent() << "{" << endl;
+      f_types_impl_ << indent() << "if (tobject->" << name << " != NULL)" << '\n';
+      f_types_impl_ << indent() << "{" << '\n';
       indent_up();
-      f_types_impl_ << indent() << "g_object_unref(tobject->" << name << ");" << endl;
-      f_types_impl_ << indent() << "tobject->" << name << " = NULL;" << endl;
+      f_types_impl_ << indent() << "g_object_unref(tobject->" << name << ");" << '\n';
+      f_types_impl_ << indent() << "tobject->" << name << " = NULL;" << '\n';
       indent_down();
-      f_types_impl_ << indent() << "}" << endl;
+      f_types_impl_ << indent() << "}" << '\n';
     } else if (t->is_string()) {
       string name = (*m_iter)->get_name();
-      f_types_impl_ << indent() << "if (tobject->" << name << " != NULL)" << endl;
-      f_types_impl_ << indent() << "{" << endl;
+      f_types_impl_ << indent() << "if (tobject->" << name << " != NULL)" << '\n';
+      f_types_impl_ << indent() << "{" << '\n';
       indent_up();
       f_types_impl_ << indent() << generate_free_func_from_type(t) << "(tobject->" << name << ");"
-                    << endl;
-      f_types_impl_ << indent() << "tobject->" << name << " = NULL;" << endl;
+                    << '\n';
+      f_types_impl_ << indent() << "tobject->" << name << " = NULL;" << '\n';
       indent_down();
-      f_types_impl_ << indent() << "}" << endl;
+      f_types_impl_ << indent() << "}" << '\n';
     }
   }
 
   indent_down();
-  f_types_impl_ << "}" << endl << endl;
+  f_types_impl_ << "}" << '\n' << '\n';
 
   // generate the class init function
 
-  f_types_impl_ << "static void" << endl << class_name_lc << "_class_init (" << class_name
-                << "Class * cls)" << endl;
+  f_types_impl_ << "static void" << '\n' << class_name_lc << "_class_init (" << class_name
+                << "Class * cls)" << '\n';
   scope_up(f_types_impl_);
 
-  f_types_impl_ << indent() << "GObjectClass *gobject_class = G_OBJECT_CLASS (cls);" << endl
+  f_types_impl_ << indent() << "GObjectClass *gobject_class = G_OBJECT_CLASS (cls);" << '\n'
                 << indent() << "ThriftStructClass *struct_class = "
-                << "THRIFT_STRUCT_CLASS (cls);" << endl << endl << indent()
-                << "struct_class->read = " << class_name_lc << "_read;" << endl << indent()
-                << "struct_class->write = " << class_name_lc << "_write;" << endl << endl
+                << "THRIFT_STRUCT_CLASS (cls);" << '\n' << '\n' << indent()
+                << "struct_class->read = " << class_name_lc << "_read;" << '\n' << indent()
+                << "struct_class->write = " << class_name_lc << "_write;" << '\n' << '\n'
                 << indent() << "gobject_class->finalize = " << class_name_lc << "_finalize;"
-                << endl;
+                << '\n';
   if (members.size() > 0) {
     f_types_impl_ << indent() << "gobject_class->get_property = " << class_name_lc
-                  << "_get_property;" << endl << indent()
-                  << "gobject_class->set_property = " << class_name_lc << "_set_property;" << endl;
+                  << "_get_property;" << '\n' << indent()
+                  << "gobject_class->set_property = " << class_name_lc << "_set_property;" << '\n';
 
     // install a property for each member
     for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
@@ -3338,11 +3336,11 @@
 
       string property_identifier = "PROP_" + class_name_uc + "_" + member_name_uc;
 
-      f_types_impl_ << endl << indent() << "g_object_class_install_property" << endl;
+      f_types_impl_ << '\n' << indent() << "g_object_class_install_property" << '\n';
       indent_up();
       args_indent = indent() + ' ';
-      f_types_impl_ << indent() << "(gobject_class," << endl << args_indent << property_identifier
-                    << "," << endl << args_indent;
+      f_types_impl_ << indent() << "(gobject_class," << '\n' << args_indent << property_identifier
+                    << "," << '\n' << args_indent;
 
       if (member_type->is_base_type()) {
         t_base_type::t_base base_type = ((t_base_type*)member_type)->get_base();
@@ -3350,27 +3348,27 @@
         if (base_type == t_base_type::TYPE_STRING) {
           if (((t_base_type*)member_type)->is_binary()) {
             args_indent += string(20, ' ');
-            f_types_impl_ << "g_param_spec_boxed (\"" << member_name << "\"," << endl << args_indent
-                          << "NULL," << endl << args_indent << "NULL," << endl << args_indent
-                          << "G_TYPE_BYTE_ARRAY," << endl << args_indent << "G_PARAM_READWRITE));"
-                          << endl;
+            f_types_impl_ << "g_param_spec_boxed (\"" << member_name << "\"," << '\n' << args_indent
+                          << "NULL," << '\n' << args_indent << "NULL," << '\n' << args_indent
+                          << "G_TYPE_BYTE_ARRAY," << '\n' << args_indent << "G_PARAM_READWRITE));"
+                          << '\n';
           } else {
             args_indent += string(21, ' ');
-            f_types_impl_ << "g_param_spec_string (\"" << member_name << "\"," << endl
-                          << args_indent << "NULL," << endl << args_indent << "NULL," << endl
+            f_types_impl_ << "g_param_spec_string (\"" << member_name << "\"," << '\n'
+                          << args_indent << "NULL," << '\n' << args_indent << "NULL," << '\n'
                           << args_indent
                           << ((member_value != NULL) ? "\"" + member_value->get_string() + "\""
-                                                     : "NULL") << "," << endl << args_indent
-                          << "G_PARAM_READWRITE));" << endl;
+                                                     : "NULL") << "," << '\n' << args_indent
+                          << "G_PARAM_READWRITE));" << '\n';
           }
         } else if (base_type == t_base_type::TYPE_BOOL) {
           args_indent += string(22, ' ');
-          f_types_impl_ << "g_param_spec_boolean (\"" << member_name << "\"," << endl << args_indent
-                        << "NULL," << endl << args_indent << "NULL," << endl << args_indent
+          f_types_impl_ << "g_param_spec_boolean (\"" << member_name << "\"," << '\n' << args_indent
+                        << "NULL," << '\n' << args_indent << "NULL," << '\n' << args_indent
                         << (((member_value != NULL) && (member_value->get_integer() != 0))
                                 ? "TRUE"
-                                : "FALSE") << "," << endl << args_indent << "G_PARAM_READWRITE));"
-                        << endl;
+                                : "FALSE") << "," << '\n' << args_indent << "G_PARAM_READWRITE));"
+                        << '\n';
         } else if ((base_type == t_base_type::TYPE_I8) || (base_type == t_base_type::TYPE_I16)
                    || (base_type == t_base_type::TYPE_I32) || (base_type == t_base_type::TYPE_I64)
                    || (base_type == t_base_type::TYPE_DOUBLE)) {
@@ -3423,11 +3421,11 @@
           }
 
           args_indent += string(param_spec_function_name.length() + 2, ' ');
-          f_types_impl_ << param_spec_function_name << " (\"" << member_name << "\"," << endl
-                        << args_indent << "NULL," << endl << args_indent << "NULL," << endl
-                        << args_indent << min_value << "," << endl << args_indent << max_value
-                        << "," << endl << args_indent << default_value.str() << "," << endl
-                        << args_indent << "G_PARAM_READWRITE));" << endl;
+          f_types_impl_ << param_spec_function_name << " (\"" << member_name << "\"," << '\n'
+                        << args_indent << "NULL," << '\n' << args_indent << "NULL," << '\n'
+                        << args_indent << min_value << "," << '\n' << args_indent << max_value
+                        << "," << '\n' << args_indent << default_value.str() << "," << '\n'
+                        << args_indent << "G_PARAM_READWRITE));" << '\n';
         }
 
         indent_down();
@@ -3438,11 +3436,11 @@
         int max_value = (enum_max_value != nullptr) ? enum_max_value->get_value() : 0;
 
         args_indent += string(18, ' ');
-        f_types_impl_ << "g_param_spec_int (\"" << member_name << "\"," << endl << args_indent
-                      << "NULL," << endl << args_indent << "NULL," << endl << args_indent
-                      << min_value << "," << endl << args_indent << max_value << "," << endl
-                      << args_indent << min_value << "," << endl << args_indent
-                      << "G_PARAM_READWRITE));" << endl;
+        f_types_impl_ << "g_param_spec_int (\"" << member_name << "\"," << '\n' << args_indent
+                      << "NULL," << '\n' << args_indent << "NULL," << '\n' << args_indent
+                      << min_value << "," << '\n' << args_indent << max_value << "," << '\n'
+                      << args_indent << min_value << "," << '\n' << args_indent
+                      << "G_PARAM_READWRITE));" << '\n';
         indent_down();
       } else if (member_type->is_struct() || member_type->is_xception()) {
         t_program* type_program = member_type->get_program();
@@ -3454,9 +3452,9 @@
                             + to_upper_case(initial_caps_to_underscores(member_type->get_name()));
 
         args_indent += string(20, ' ');
-        f_types_impl_ << "g_param_spec_object (\"" << member_name << "\"," << endl << args_indent
-                      << "NULL," << endl << args_indent << "NULL," << endl << args_indent
-                      << param_type << "," << endl << args_indent << "G_PARAM_READWRITE));" << endl;
+        f_types_impl_ << "g_param_spec_object (\"" << member_name << "\"," << '\n' << args_indent
+                      << "NULL," << '\n' << args_indent << "NULL," << '\n' << args_indent
+                      << param_type << "," << '\n' << args_indent << "G_PARAM_READWRITE));" << '\n';
         indent_down();
       } else if (member_type->is_list()) {
         t_type* elem_type = ((t_list*)member_type)->get_elem_type();
@@ -3469,38 +3467,38 @@
         }
 
         args_indent += string(20, ' ');
-        f_types_impl_ << "g_param_spec_boxed (\"" << member_name << "\"," << endl << args_indent
-                      << "NULL," << endl << args_indent << "NULL," << endl << args_indent
-                      << param_type << "," << endl << args_indent << "G_PARAM_READWRITE));" << endl;
+        f_types_impl_ << "g_param_spec_boxed (\"" << member_name << "\"," << '\n' << args_indent
+                      << "NULL," << '\n' << args_indent << "NULL," << '\n' << args_indent
+                      << param_type << "," << '\n' << args_indent << "G_PARAM_READWRITE));" << '\n';
         indent_down();
       } else if (member_type->is_set() || member_type->is_map()) {
         args_indent += string(20, ' ');
-        f_types_impl_ << "g_param_spec_boxed (\"" << member_name << "\"," << endl << args_indent
-                      << "NULL," << endl << args_indent << "NULL," << endl << args_indent
-                      << "G_TYPE_HASH_TABLE," << endl << args_indent << "G_PARAM_READWRITE));"
-                      << endl;
+        f_types_impl_ << "g_param_spec_boxed (\"" << member_name << "\"," << '\n' << args_indent
+                      << "NULL," << '\n' << args_indent << "NULL," << '\n' << args_indent
+                      << "G_TYPE_HASH_TABLE," << '\n' << args_indent << "G_PARAM_READWRITE));"
+                      << '\n';
         indent_down();
       }
     }
   }
   scope_down(f_types_impl_);
-  f_types_impl_ << endl;
+  f_types_impl_ << '\n';
 
-  f_types_impl_ << "GType" << endl << this->nspace_lc << name_u << "_get_type (void)" << endl << "{"
-                << endl << "  static GType type = 0;" << endl << endl << "  if (type == 0) " << endl
-                << "  {" << endl << "    static const GTypeInfo type_info = " << endl << "    {"
-                << endl << "      sizeof (" << this->nspace << name << "Class)," << endl
-                << "      NULL, /* base_init */" << endl << "      NULL, /* base_finalize */"
-                << endl << "      (GClassInitFunc) " << this->nspace_lc << name_u << "_class_init,"
-                << endl << "      NULL, /* class_finalize */" << endl
-                << "      NULL, /* class_data */" << endl << "      sizeof (" << this->nspace
-                << name << ")," << endl << "      0, /* n_preallocs */" << endl
+  f_types_impl_ << "GType" << '\n' << this->nspace_lc << name_u << "_get_type (void)" << '\n' << "{"
+                << '\n' << "  static GType type = 0;" << '\n' << '\n' << "  if (type == 0) " << '\n'
+                << "  {" << '\n' << "    static const GTypeInfo type_info = " << '\n' << "    {"
+                << '\n' << "      sizeof (" << this->nspace << name << "Class)," << '\n'
+                << "      NULL, /* base_init */" << '\n' << "      NULL, /* base_finalize */"
+                << '\n' << "      (GClassInitFunc) " << this->nspace_lc << name_u << "_class_init,"
+                << '\n' << "      NULL, /* class_finalize */" << '\n'
+                << "      NULL, /* class_data */" << '\n' << "      sizeof (" << this->nspace
+                << name << ")," << '\n' << "      0, /* n_preallocs */" << '\n'
                 << "      (GInstanceInitFunc) " << this->nspace_lc << name_u << "_instance_init,"
-                << endl << "      NULL, /* value_table */" << endl << "    };" << endl << endl
-                << "    type = g_type_register_static (THRIFT_TYPE_STRUCT, " << endl
+                << '\n' << "      NULL, /* value_table */" << '\n' << "    };" << '\n' << '\n'
+                << "    type = g_type_register_static (THRIFT_TYPE_STRUCT, " << '\n'
                 << "                                   \"" << this->nspace << name << "Type\","
-                << endl << "                                   &type_info, 0);" << endl << "  }"
-                << endl << endl << "  return type;" << endl << "}" << endl << endl;
+                << '\n' << "                                   &type_info, 0);" << '\n' << "  }"
+                << '\n' << '\n' << "  return type;" << '\n' << "}" << '\n' << '\n';
 }
 
 /**
@@ -3521,59 +3519,59 @@
 
   if (is_function) {
     error_ret = -1;
-    indent(out) << "static gint32" << endl << this->nspace_lc << name_u
+    indent(out) << "static gint32" << '\n' << this->nspace_lc << name_u
                 << "_write (ThriftStruct *object, ThriftProtocol *protocol, GError **error)"
-                << endl;
+                << '\n';
   }
-  indent(out) << "{" << endl;
+  indent(out) << "{" << '\n';
   indent_up();
 
-  out << indent() << "gint32 ret;" << endl << indent() << "gint32 xfer = 0;" << endl << endl;
+  out << indent() << "gint32 ret;" << '\n' << indent() << "gint32 xfer = 0;" << '\n' << '\n';
 
-  indent(out) << this_get << endl;
+  indent(out) << this_get << '\n';
   // satisfy -Wall in the case of an empty struct
   if (!this_get.empty()) {
-    indent(out) << "THRIFT_UNUSED_VAR (this_object);" << endl;
+    indent(out) << "THRIFT_UNUSED_VAR (this_object);" << '\n';
   }
 
   out << indent() << "if ((ret = thrift_protocol_write_struct_begin (protocol, \"" << name
-      << "\", error)) < 0)" << endl << indent() << "  return " << error_ret << ";" << endl
-      << indent() << "xfer += ret;" << endl;
+      << "\", error)) < 0)" << '\n' << indent() << "  return " << error_ret << ";" << '\n'
+      << indent() << "xfer += ret;" << '\n';
 
   for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
     if ((*f_iter)->get_req() == t_field::T_OPTIONAL) {
-      indent(out) << "if (this_object->__isset_" << (*f_iter)->get_name() << " == TRUE) {" << endl;
+      indent(out) << "if (this_object->__isset_" << (*f_iter)->get_name() << " == TRUE) {" << '\n';
       indent_up();
     }
 
     out << indent() << "if ((ret = thrift_protocol_write_field_begin (protocol, "
         << "\"" << (*f_iter)->get_name() << "\", " << type_to_enum((*f_iter)->get_type()) << ", "
-        << (*f_iter)->get_key() << ", error)) < 0)" << endl << indent() << "  return " << error_ret
-        << ";" << endl << indent() << "xfer += ret;" << endl;
+        << (*f_iter)->get_key() << ", error)) < 0)" << '\n' << indent() << "  return " << error_ret
+        << ";" << '\n' << indent() << "xfer += ret;" << '\n';
     generate_serialize_field(out, *f_iter, this_name, "", error_ret);
-    out << indent() << "if ((ret = thrift_protocol_write_field_end (protocol, error)) < 0)" << endl
-        << indent() << "  return " << error_ret << ";" << endl << indent() << "xfer += ret;"
-        << endl;
+    out << indent() << "if ((ret = thrift_protocol_write_field_end (protocol, error)) < 0)" << '\n'
+        << indent() << "  return " << error_ret << ";" << '\n' << indent() << "xfer += ret;"
+        << '\n';
 
     if ((*f_iter)->get_req() == t_field::T_OPTIONAL) {
       indent_down();
-      indent(out) << "}" << endl;
+      indent(out) << "}" << '\n';
     }
   }
 
   // write the struct map
-  out << indent() << "if ((ret = thrift_protocol_write_field_stop (protocol, error)) < 0)" << endl
-      << indent() << "  return " << error_ret << ";" << endl << indent() << "xfer += ret;" << endl
-      << indent() << "if ((ret = thrift_protocol_write_struct_end (protocol, error)) < 0)" << endl
-      << indent() << "  return " << error_ret << ";" << endl << indent() << "xfer += ret;" << endl
-      << endl;
+  out << indent() << "if ((ret = thrift_protocol_write_field_stop (protocol, error)) < 0)" << '\n'
+      << indent() << "  return " << error_ret << ";" << '\n' << indent() << "xfer += ret;" << '\n'
+      << indent() << "if ((ret = thrift_protocol_write_struct_end (protocol, error)) < 0)" << '\n'
+      << indent() << "  return " << error_ret << ";" << '\n' << indent() << "xfer += ret;" << '\n'
+      << '\n';
 
   if (is_function) {
-    indent(out) << "return xfer;" << endl;
+    indent(out) << "return xfer;" << '\n';
   }
 
   indent_down();
-  indent(out) << "}" << endl << endl;
+  indent(out) << "}" << '\n' << '\n';
 }
 
 /**
@@ -3593,127 +3591,127 @@
 
   if (is_function) {
     error_ret = -1;
-    indent(out) << "/* reads a " << name_u << " object */" << endl << "static gint32" << endl
+    indent(out) << "/* reads a " << name_u << " object */" << '\n' << "static gint32" << '\n'
                 << this->nspace_lc << name_u
-                << "_read (ThriftStruct *object, ThriftProtocol *protocol, GError **error)" << endl;
+                << "_read (ThriftStruct *object, ThriftProtocol *protocol, GError **error)" << '\n';
   }
 
-  indent(out) << "{" << endl;
+  indent(out) << "{" << '\n';
   indent_up();
 
   // declare stack temp variables
-  out << indent() << "gint32 ret;" << endl << indent() << "gint32 xfer = 0;" << endl << indent()
-      << "gchar *name = NULL;" << endl << indent() << "ThriftType ftype;" << endl << indent()
-      << "gint16 fid;" << endl << indent() << "guint32 len = 0;" << endl << indent()
-      << "gpointer data = NULL;" << endl << indent() << this_get << endl;
+  out << indent() << "gint32 ret;" << '\n' << indent() << "gint32 xfer = 0;" << '\n' << indent()
+      << "gchar *name = NULL;" << '\n' << indent() << "ThriftType ftype;" << '\n' << indent()
+      << "gint16 fid;" << '\n' << indent() << "guint32 len = 0;" << '\n' << indent()
+      << "gpointer data = NULL;" << '\n' << indent() << this_get << '\n';
 
   for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
     if ((*f_iter)->get_req() == t_field::T_REQUIRED) {
-      indent(out) << "gboolean isset_" << (*f_iter)->get_name() << " = FALSE;" << endl;
+      indent(out) << "gboolean isset_" << (*f_iter)->get_name() << " = FALSE;" << '\n';
     }
   }
 
-  out << endl;
+  out << '\n';
 
   // satisfy -Wall in case we don't use some variables
-  out << indent() << "/* satisfy -Wall in case these aren't used */" << endl << indent()
-      << "THRIFT_UNUSED_VAR (len);" << endl << indent() << "THRIFT_UNUSED_VAR (data);" << endl;
+  out << indent() << "/* satisfy -Wall in case these aren't used */" << '\n' << indent()
+      << "THRIFT_UNUSED_VAR (len);" << '\n' << indent() << "THRIFT_UNUSED_VAR (data);" << '\n';
 
   if (!this_get.empty()) {
-    out << indent() << "THRIFT_UNUSED_VAR (this_object);" << endl;
+    out << indent() << "THRIFT_UNUSED_VAR (this_object);" << '\n';
   }
-  out << endl;
+  out << '\n';
 
   // read the beginning of the structure marker
-  out << indent() << "/* read the struct begin marker */" << endl << indent()
-      << "if ((ret = thrift_protocol_read_struct_begin (protocol, &name, error)) < 0)" << endl
-      << indent() << "{" << endl << indent() << "  if (name) g_free (name);" << endl << indent()
-      << "  return " << error_ret << ";" << endl << indent() << "}" << endl << indent()
-      << "xfer += ret;" << endl << indent() << "if (name) g_free (name);" << endl << indent()
-      << "name = NULL;" << endl << endl;
+  out << indent() << "/* read the struct begin marker */" << '\n' << indent()
+      << "if ((ret = thrift_protocol_read_struct_begin (protocol, &name, error)) < 0)" << '\n'
+      << indent() << "{" << '\n' << indent() << "  if (name) g_free (name);" << '\n' << indent()
+      << "  return " << error_ret << ";" << '\n' << indent() << "}" << '\n' << indent()
+      << "xfer += ret;" << '\n' << indent() << "if (name) g_free (name);" << '\n' << indent()
+      << "name = NULL;" << '\n' << '\n';
 
   // read the struct fields
-  out << indent() << "/* read the struct fields */" << endl << indent() << "while (1)" << endl;
+  out << indent() << "/* read the struct fields */" << '\n' << indent() << "while (1)" << '\n';
   scope_up(out);
 
   // read beginning field marker
-  out << indent() << "/* read the beginning of a field */" << endl << indent()
+  out << indent() << "/* read the beginning of a field */" << '\n' << indent()
       << "if ((ret = thrift_protocol_read_field_begin (protocol, &name, &ftype, &fid, error)) < 0)"
-      << endl << indent() << "{" << endl << indent() << "  if (name) g_free (name);" << endl
-      << indent() << "  return " << error_ret << ";" << endl << indent() << "}" << endl << indent()
-      << "xfer += ret;" << endl << indent() << "if (name) g_free (name);" << endl << indent()
-      << "name = NULL;" << endl << endl;
+      << '\n' << indent() << "{" << '\n' << indent() << "  if (name) g_free (name);" << '\n'
+      << indent() << "  return " << error_ret << ";" << '\n' << indent() << "}" << '\n' << indent()
+      << "xfer += ret;" << '\n' << indent() << "if (name) g_free (name);" << '\n' << indent()
+      << "name = NULL;" << '\n' << '\n';
 
   // check for field STOP marker
-  out << indent() << "/* break if we get a STOP field */" << endl << indent()
-      << "if (ftype == T_STOP)" << endl << indent() << "{" << endl << indent() << "  break;" << endl
-      << indent() << "}" << endl << endl;
+  out << indent() << "/* break if we get a STOP field */" << '\n' << indent()
+      << "if (ftype == T_STOP)" << '\n' << indent() << "{" << '\n' << indent() << "  break;" << '\n'
+      << indent() << "}" << '\n' << '\n';
 
   // switch depending on the field type
-  indent(out) << "switch (fid)" << endl;
+  indent(out) << "switch (fid)" << '\n';
 
   // start switch
   scope_up(out);
 
   // generate deserialization code for known types
   for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
-    indent(out) << "case " << (*f_iter)->get_key() << ":" << endl;
+    indent(out) << "case " << (*f_iter)->get_key() << ":" << '\n';
     indent_up();
-    indent(out) << "if (ftype == " << type_to_enum((*f_iter)->get_type()) << ")" << endl;
-    indent(out) << "{" << endl;
+    indent(out) << "if (ftype == " << type_to_enum((*f_iter)->get_type()) << ")" << '\n';
+    indent(out) << "{" << '\n';
 
     indent_up();
     // generate deserialize field
     generate_deserialize_field(out, *f_iter, this_name, "", error_ret, false);
     indent_down();
 
-    out << indent() << "} else {" << endl << indent()
-        << "  if ((ret = thrift_protocol_skip (protocol, ftype, error)) < 0)" << endl << indent()
-        << "    return " << error_ret << ";" << endl << indent() << "  xfer += ret;" << endl
-        << indent() << "}" << endl << indent() << "break;" << endl;
+    out << indent() << "} else {" << '\n' << indent()
+        << "  if ((ret = thrift_protocol_skip (protocol, ftype, error)) < 0)" << '\n' << indent()
+        << "    return " << error_ret << ";" << '\n' << indent() << "  xfer += ret;" << '\n'
+        << indent() << "}" << '\n' << indent() << "break;" << '\n';
     indent_down();
   }
 
   // create the default case
-  out << indent() << "default:" << endl << indent()
-      << "  if ((ret = thrift_protocol_skip (protocol, ftype, error)) < 0)" << endl << indent()
-      << "    return " << error_ret << ";" << endl << indent() << "  xfer += ret;" << endl
-      << indent() << "  break;" << endl;
+  out << indent() << "default:" << '\n' << indent()
+      << "  if ((ret = thrift_protocol_skip (protocol, ftype, error)) < 0)" << '\n' << indent()
+      << "    return " << error_ret << ";" << '\n' << indent() << "  xfer += ret;" << '\n'
+      << indent() << "  break;" << '\n';
 
   // end switch
   scope_down(out);
 
   // read field end marker
-  out << indent() << "if ((ret = thrift_protocol_read_field_end (protocol, error)) < 0)" << endl
-      << indent() << "  return " << error_ret << ";" << endl << indent() << "xfer += ret;" << endl;
+  out << indent() << "if ((ret = thrift_protocol_read_field_end (protocol, error)) < 0)" << '\n'
+      << indent() << "  return " << error_ret << ";" << '\n' << indent() << "xfer += ret;" << '\n';
 
   // end while loop
   scope_down(out);
-  out << endl;
+  out << '\n';
 
   // read the end of the structure
-  out << indent() << "if ((ret = thrift_protocol_read_struct_end (protocol, error)) < 0)" << endl
-      << indent() << "  return " << error_ret << ";" << endl << indent() << "xfer += ret;" << endl
-      << endl;
+  out << indent() << "if ((ret = thrift_protocol_read_struct_end (protocol, error)) < 0)" << '\n'
+      << indent() << "  return " << error_ret << ";" << '\n' << indent() << "xfer += ret;" << '\n'
+      << '\n';
 
   // if a required field is missing, throw an error
   for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
     if ((*f_iter)->get_req() == t_field::T_REQUIRED) {
-      out << indent() << "if (!isset_" << (*f_iter)->get_name() << ")" << endl << indent() << "{"
-          << endl << indent() << "  g_set_error (error, THRIFT_PROTOCOL_ERROR," << endl << indent()
-          << "               THRIFT_PROTOCOL_ERROR_INVALID_DATA," << endl << indent()
-          << "               \"missing field\");" << endl << indent() << "  return -1;" << endl
-          << indent() << "}" << endl << endl;
+      out << indent() << "if (!isset_" << (*f_iter)->get_name() << ")" << '\n' << indent() << "{"
+          << '\n' << indent() << "  g_set_error (error, THRIFT_PROTOCOL_ERROR," << '\n' << indent()
+          << "               THRIFT_PROTOCOL_ERROR_INVALID_DATA," << '\n' << indent()
+          << "               \"missing field\");" << '\n' << indent() << "  return -1;" << '\n'
+          << indent() << "}" << '\n' << '\n';
     }
   }
 
   if (is_function) {
-    indent(out) << "return xfer;" << endl;
+    indent(out) << "return xfer;" << '\n';
   }
 
   // end the function/structure
   indent_down();
-  indent(out) << "}" << endl << endl;
+  indent(out) << "}" << '\n' << '\n';
 }
 
 void t_c_glib_generator::generate_serialize_field(ostream& out,
@@ -3773,9 +3771,9 @@
     } else {
       out << "i32 (protocol, (gint32) " << name;
     }
-    out << ", error)) < 0)" << endl
-        << indent() << "  return " << error_ret << ";" << endl
-        << indent() << "xfer += ret;" << endl << endl;
+    out << ", error)) < 0)" << '\n'
+        << indent() << "  return " << error_ret << ";" << '\n'
+        << indent() << "xfer += ret;" << '\n' << '\n';
   } else {
     throw std::logic_error("DO NOT KNOW HOW TO SERIALIZE FIELD '" + name + "' TYPE '"
                            + type_name(type));
@@ -3788,8 +3786,8 @@
                                                    int error_ret) {
   (void)tstruct;
   out << indent() << "if ((ret = thrift_struct_write (THRIFT_STRUCT (" << prefix
-      << "), protocol, error)) < 0)" << endl << indent() << "  return " << error_ret << ";" << endl
-      << indent() << "xfer += ret;" << endl << endl;
+      << "), protocol, error)) < 0)" << '\n' << indent() << "  return " << error_ret << ";" << '\n'
+      << indent() << "xfer += ret;" << '\n' << '\n';
 }
 
 void t_c_glib_generator::generate_serialize_container(ostream& out,
@@ -3826,39 +3824,39 @@
      * This is because we may exit early before we get a chance to free the
      * GList.
      */
-    out << indent() << "GList *key_list = NULL, *iter = NULL;" << endl
-        << indent() << tkey_name << tkey_ptr << "* keys;" << endl
-        << indent() << "int i = 0, key_count;" << endl
-        << endl
+    out << indent() << "GList *key_list = NULL, *iter = NULL;" << '\n'
+        << indent() << tkey_name << tkey_ptr << "* keys;" << '\n'
+        << indent() << "int i = 0, key_count;" << '\n'
+        << '\n'
         << indent() << "if ((ret = thrift_protocol_write_map_begin (protocol, "
         << type_to_enum(tkey) << ", " << type_to_enum(tval) << ", " << prefix << " ? "
         << "(gint32) g_hash_table_size ((GHashTable *) " << prefix << ") : 0"
-        << ", error)) < 0)" << endl;
+        << ", error)) < 0)" << '\n';
     indent_up();
-    out << indent() << "return " << error_ret << ";" << endl;
+    out << indent() << "return " << error_ret << ";" << '\n';
     indent_down();
-    out << indent() << "xfer += ret;" << endl
-        << indent() << "if (" << prefix << ")" << endl
+    out << indent() << "xfer += ret;" << '\n'
+        << indent() << "if (" << prefix << ")" << '\n'
         << indent() << "  g_hash_table_foreach ((GHashTable *) " << prefix
-        << ", thrift_hash_table_get_keys, &key_list);" << endl
-        << indent() << "key_count = g_list_length (key_list);" << endl
+        << ", thrift_hash_table_get_keys, &key_list);" << '\n'
+        << indent() << "key_count = g_list_length (key_list);" << '\n'
         << indent() << "keys = g_newa (" << tkey_name << tkey_ptr
-        << ", key_count);" << endl
+        << ", key_count);" << '\n'
         << indent() << "for (iter = g_list_first (key_list); iter; "
-           "iter = iter->next)" << endl;
+           "iter = iter->next)" << '\n';
     indent_up();
     out << indent() << "keys[i++] = (" << tkey_name << tkey_ptr
-        << ") iter->data;" << endl;
+        << ") iter->data;" << '\n';
     indent_down();
-    out << indent() << "g_list_free (key_list);" << endl
-        << endl
-        << indent() << "for (i = 0; i < key_count; ++i)" << endl;
+    out << indent() << "g_list_free (key_list);" << '\n'
+        << '\n'
+        << indent() << "for (i = 0; i < key_count; ++i)" << '\n';
     scope_up(out);
-    out << indent() << keyname << " = keys[i];" << endl
+    out << indent() << keyname << " = keys[i];" << '\n'
         << indent() << valname << " = (" << tval_name << tval_ptr
         << ") g_hash_table_lookup (((GHashTable *) " << prefix
-        << "), (gpointer) " << keyname << ");" << endl
-        << endl;
+        << "), (gpointer) " << keyname << ");" << '\n'
+        << '\n';
     generate_serialize_map_element(out,
                                    (t_map*)ttype,
                                    tkey_ptr + " " + keyname,
@@ -3866,84 +3864,84 @@
                                    error_ret);
     scope_down(out);
     out << indent() << "if ((ret = thrift_protocol_write_map_end (protocol, "
-           "error)) < 0)" << endl;
+           "error)) < 0)" << '\n';
     indent_up();
-    out << indent() << "return " << error_ret << ";" << endl;
+    out << indent() << "return " << error_ret << ";" << '\n';
     indent_down();
-    out << indent() << "xfer += ret;" << endl;
+    out << indent() << "xfer += ret;" << '\n';
   } else if (ttype->is_set()) {
     t_type* telem = ((t_set*)ttype)->get_elem_type();
     string telem_name = type_name(telem);
     string telem_ptr = telem->is_string() || !telem->is_base_type() ? "" : "*";
-    out << indent() << "GList *key_list = NULL, *iter = NULL;" << endl
-        << indent() << telem_name << telem_ptr << "* keys;" << endl
-        << indent() << "int i = 0, key_count;" << endl
-        << indent() << telem_name << telem_ptr << " elem;" << endl
-        << indent() << "gpointer value;" << endl
-        << indent() << "THRIFT_UNUSED_VAR (value);" << endl
-        << endl
+    out << indent() << "GList *key_list = NULL, *iter = NULL;" << '\n'
+        << indent() << telem_name << telem_ptr << "* keys;" << '\n'
+        << indent() << "int i = 0, key_count;" << '\n'
+        << indent() << telem_name << telem_ptr << " elem;" << '\n'
+        << indent() << "gpointer value;" << '\n'
+        << indent() << "THRIFT_UNUSED_VAR (value);" << '\n'
+        << '\n'
         << indent() << "if ((ret = thrift_protocol_write_set_begin (protocol, "
         << type_to_enum(telem) << ", " << prefix << " ? "
         << "(gint32) g_hash_table_size ((GHashTable *) " << prefix << ") : 0"
-        << ", error)) < 0)" << endl;
+        << ", error)) < 0)" << '\n';
     indent_up();
-    out << indent() << "return " << error_ret << ";" << endl;
+    out << indent() << "return " << error_ret << ";" << '\n';
     indent_down();
-    out << indent() << "xfer += ret;" << endl
-        << indent() << "if (" << prefix << ")" << endl
+    out << indent() << "xfer += ret;" << '\n'
+        << indent() << "if (" << prefix << ")" << '\n'
         << indent() << "  g_hash_table_foreach ((GHashTable *) " << prefix
-        << ", thrift_hash_table_get_keys, &key_list);" << endl
-        << indent() << "key_count = g_list_length (key_list);" << endl
+        << ", thrift_hash_table_get_keys, &key_list);" << '\n'
+        << indent() << "key_count = g_list_length (key_list);" << '\n'
         << indent() << "keys = g_newa (" << telem_name << telem_ptr
-        << ", key_count);" << endl
+        << ", key_count);" << '\n'
         << indent() << "for (iter = g_list_first (key_list); iter; "
-           "iter = iter->next)" << endl;
+           "iter = iter->next)" << '\n';
     indent_up();
     out << indent() << "keys[i++] = (" << telem_name << telem_ptr
-        << ") iter->data;" << endl;
+        << ") iter->data;" << '\n';
     indent_down();
-    out << indent() << "g_list_free (key_list);" << endl
-        << endl
-        << indent() << "for (i = 0; i < key_count; ++i)" << endl;
+    out << indent() << "g_list_free (key_list);" << '\n'
+        << '\n'
+        << indent() << "for (i = 0; i < key_count; ++i)" << '\n';
     scope_up(out);
-    out << indent() << "elem = keys[i];" << endl
+    out << indent() << "elem = keys[i];" << '\n'
         << indent() << "value = (gpointer) g_hash_table_lookup "
-           "(((GHashTable *) " << prefix << "), (gpointer) elem);" << endl
-        << endl;
+           "(((GHashTable *) " << prefix << "), (gpointer) elem);" << '\n'
+        << '\n';
     generate_serialize_set_element(out,
                                    (t_set*)ttype,
                                    telem_ptr + "elem",
                                    error_ret);
     scope_down(out);
     out << indent() << "if ((ret = thrift_protocol_write_set_end (protocol, "
-           "error)) < 0)" << endl;
+           "error)) < 0)" << '\n';
     indent_up();
-    out << indent() << "return " << error_ret << ";" << endl;
+    out << indent() << "return " << error_ret << ";" << '\n';
     indent_down();
-    out << indent() << "xfer += ret;" << endl;
+    out << indent() << "xfer += ret;" << '\n';
   } else if (ttype->is_list()) {
     string length = "(" + prefix + " ? " + prefix + "->len : 0)";
     string i = tmp("i");
-    out << indent() << "guint " << i << ";" << endl
-        << endl
+    out << indent() << "guint " << i << ";" << '\n'
+        << '\n'
         << indent() << "if ((ret = thrift_protocol_write_list_begin (protocol, "
         << type_to_enum(((t_list*)ttype)->get_elem_type()) << ", (gint32) "
-        << length << ", error)) < 0)" << endl;
+        << length << ", error)) < 0)" << '\n';
     indent_up();
-    out << indent() << "return " << error_ret << ";" << endl;
+    out << indent() << "return " << error_ret << ";" << '\n';
     indent_down();
-    out << indent() << "xfer += ret;" << endl
+    out << indent() << "xfer += ret;" << '\n'
         << indent() << "for (" << i << " = 0; " << i << " < " << length << "; "
-        << i << "++)" << endl;
+        << i << "++)" << '\n';
     scope_up(out);
     generate_serialize_list_element(out, (t_list*)ttype, prefix, i, error_ret);
     scope_down(out);
     out << indent() << "if ((ret = thrift_protocol_write_list_end (protocol, "
-           "error)) < 0)" << endl;
+           "error)) < 0)" << '\n';
     indent_up();
-    out << indent() << "return " << error_ret << ";" << endl;
+    out << indent() << "return " << error_ret << ";" << '\n';
     indent_down();
-    out << indent() << "xfer += ret;" << endl;
+    out << indent() << "xfer += ret;" << '\n';
   }
 
   scope_down(out);
@@ -4023,11 +4021,11 @@
   } else if (type->is_base_type()) {
     t_base_type::t_base tbase = ((t_base_type*)type)->get_base();
     if (tbase == t_base_type::TYPE_STRING) {
-      indent(out) << "if (" << name << " != NULL)" << endl << indent() << "{" << endl;
+      indent(out) << "if (" << name << " != NULL)" << '\n' << indent() << "{" << '\n';
       indent_up();
-      indent(out) << "g_free(" << name << ");" << endl << indent() << name << " = NULL;" << endl;
+      indent(out) << "g_free(" << name << ");" << '\n' << indent() << name << " = NULL;" << '\n';
       indent_down();
-      indent(out) << "}" << endl << endl;
+      indent(out) << "}" << '\n' << '\n';
     }
     indent(out) << "if ((ret = thrift_protocol_read_";
 
@@ -4063,22 +4061,22 @@
     default:
       throw "compiler error: no C reader for base type " + t_base_type::t_base_name(tbase) + name;
     }
-    out << ", error)) < 0)" << endl;
-    out << indent() << "  return " << error_ret << ";" << endl << indent() << "xfer += ret;"
-        << endl;
+    out << ", error)) < 0)" << '\n';
+    out << indent() << "  return " << error_ret << ";" << '\n' << indent() << "xfer += ret;"
+        << '\n';
 
     // load the byte array with the data
     if (tbase == t_base_type::TYPE_STRING && type->is_binary()) {
-      indent(out) << name << " = g_byte_array_new();" << endl;
-      indent(out) << "g_byte_array_append (" << name << ", (guint8 *) data, (guint) len);" << endl;
-      indent(out) << "g_free (data);" << endl;
+      indent(out) << name << " = g_byte_array_new();" << '\n';
+      indent(out) << "g_byte_array_append (" << name << ", (guint8 *) data, (guint) len);" << '\n';
+      indent(out) << "g_free (data);" << '\n';
     }
   } else if (type->is_enum()) {
     string t = tmp("ecast");
-    out << indent() << "gint32 " << t << ";" << endl << indent()
-        << "if ((ret = thrift_protocol_read_i32 (protocol, &" << t << ", error)) < 0)" << endl
-        << indent() << "  return " << error_ret << ";" << endl << indent() << "xfer += ret;" << endl
-        << indent() << name << " = (" << type_name(type) << ")" << t << ";" << endl;
+    out << indent() << "gint32 " << t << ";" << '\n' << indent()
+        << "if ((ret = thrift_protocol_read_i32 (protocol, &" << t << ", error)) < 0)" << '\n'
+        << indent() << "  return " << error_ret << ";" << '\n' << indent() << "xfer += ret;" << '\n'
+        << indent() << name << " = (" << type_name(type) << ")" << t << ";" << '\n';
   } else {
     throw std::logic_error("DO NOT KNOW HOW TO SERIALIZE FIELD '" + tfield->get_name() + "' TYPE '"
                            + type_name(type));
@@ -4088,9 +4086,9 @@
   // set the isset variable.  if the type is required, then set the
   // local variable indicating the value was set, so that we can do    // validation later.
   if (prefix != "" && tfield->get_req() != t_field::T_REQUIRED) {
-    indent(out) << prefix << "__isset_" << tfield->get_name() << suffix << " = TRUE;" << endl;
+    indent(out) << prefix << "__isset_" << tfield->get_name() << suffix << " = TRUE;" << '\n';
   } else if (prefix != "" && tfield->get_req() == t_field::T_REQUIRED) {
-    indent(out) << "isset_" << tfield->get_name() << " = TRUE;" << endl;
+    indent(out) << "isset_" << tfield->get_name() << " = TRUE;" << '\n';
   }
 }
 
@@ -4101,30 +4099,30 @@
                                                      bool allocate) {
   string name_uc = to_upper_case(initial_caps_to_underscores(tstruct->get_name()));
   if (tstruct->is_xception()) {
-    out << indent() << "/* This struct is an exception */" << endl;
+    out << indent() << "/* This struct is an exception */" << '\n';
     allocate = true;
   }
 
   if (allocate) {
-    out << indent() << "if ( " << prefix << " != NULL)" << endl << indent() << "{" << endl;
+    out << indent() << "if ( " << prefix << " != NULL)" << '\n' << indent() << "{" << '\n';
     indent_up();
-    out << indent() << "g_object_unref (" << prefix << ");" << endl;
+    out << indent() << "g_object_unref (" << prefix << ");" << '\n';
     indent_down();
-    out << indent() << "}" << endl << indent() << prefix << " = g_object_new (" << this->nspace_uc
-        << "TYPE_" << name_uc << ", NULL);" << endl;
+    out << indent() << "}" << '\n' << indent() << prefix << " = g_object_new (" << this->nspace_uc
+        << "TYPE_" << name_uc << ", NULL);" << '\n';
   }
   out << indent() << "if ((ret = thrift_struct_read (THRIFT_STRUCT (" << prefix
-      << "), protocol, error)) < 0)" << endl << indent() << "{" << endl;
+      << "), protocol, error)) < 0)" << '\n' << indent() << "{" << '\n';
   indent_up();
   if (allocate) {
-    indent(out) << "g_object_unref (" << prefix << ");" << endl;
+    indent(out) << "g_object_unref (" << prefix << ");" << '\n';
     if (tstruct->is_xception()) {
-      indent(out) << prefix << " = NULL;" << endl;
+      indent(out) << prefix << " = NULL;" << '\n';
     }
   }
-  out << indent() << "return " << error_ret << ";" << endl;
+  out << indent() << "return " << error_ret << ";" << '\n';
   indent_down();
-  out << indent() << "}" << endl << indent() << "xfer += ret;" << endl;
+  out << indent() << "}" << '\n' << indent() << "xfer += ret;" << '\n';
 }
 
 void t_c_glib_generator::generate_deserialize_container(ostream& out,
@@ -4134,80 +4132,80 @@
   scope_up(out);
 
   if (ttype->is_map()) {
-    out << indent() << "guint32 size;" << endl
-        << indent() << "guint32 i;" << endl
-        << indent() << "ThriftType key_type;" << endl
-        << indent() << "ThriftType value_type;" << endl
-        << endl
-        << indent() << "/* read the map begin marker */" << endl
+    out << indent() << "guint32 size;" << '\n'
+        << indent() << "guint32 i;" << '\n'
+        << indent() << "ThriftType key_type;" << '\n'
+        << indent() << "ThriftType value_type;" << '\n'
+        << '\n'
+        << indent() << "/* read the map begin marker */" << '\n'
         << indent() << "if ((ret = thrift_protocol_read_map_begin (protocol, "
-           "&key_type, &value_type, &size, error)) < 0)" << endl;
+           "&key_type, &value_type, &size, error)) < 0)" << '\n';
     indent_up();
-    out << indent() << "return " << error_ret << ";" << endl;
+    out << indent() << "return " << error_ret << ";" << '\n';
     indent_down();
-    out << indent() << "xfer += ret;" << endl
-        << endl;
+    out << indent() << "xfer += ret;" << '\n'
+        << '\n';
 
     // iterate over map elements
-    out << indent() << "/* iterate through each of the map's fields */" << endl
-        << indent() << "for (i = 0; i < size; i++)" << endl;
+    out << indent() << "/* iterate through each of the map's fields */" << '\n'
+        << indent() << "for (i = 0; i < size; i++)" << '\n';
     scope_up(out);
     generate_deserialize_map_element(out, (t_map*)ttype, prefix, error_ret);
     scope_down(out);
-    out << endl;
+    out << '\n';
 
     // read map end
-    out << indent() << "/* read the map end marker */" << endl
+    out << indent() << "/* read the map end marker */" << '\n'
         << indent() << "if ((ret = thrift_protocol_read_map_end (protocol, "
-           "error)) < 0)" << endl;
+           "error)) < 0)" << '\n';
     indent_up();
-    out << indent() << "return " << error_ret << ";" << endl;
+    out << indent() << "return " << error_ret << ";" << '\n';
     indent_down();
-    out << indent() << "xfer += ret;" << endl;
+    out << indent() << "xfer += ret;" << '\n';
   } else if (ttype->is_set()) {
-    out << indent() << "guint32 size;" << endl
-        << indent() << "guint32 i;" << endl
-        << indent() << "ThriftType element_type;" << endl
-        << endl
+    out << indent() << "guint32 size;" << '\n'
+        << indent() << "guint32 i;" << '\n'
+        << indent() << "ThriftType element_type;" << '\n'
+        << '\n'
         << indent() << "if ((ret = thrift_protocol_read_set_begin (protocol, "
-           "&element_type, &size, error)) < 0)" << endl;
+           "&element_type, &size, error)) < 0)" << '\n';
     indent_up();
-    out << indent() << "return " << error_ret << ";" << endl;
+    out << indent() << "return " << error_ret << ";" << '\n';
     indent_down();
-    out << indent() << "xfer += ret;" << endl
-        << endl;
+    out << indent() << "xfer += ret;" << '\n'
+        << '\n';
 
     // iterate over the elements
-    out << indent() << "/* iterate through the set elements */" << endl
-        << indent() << "for (i = 0; i < size; ++i)" << endl;
+    out << indent() << "/* iterate through the set elements */" << '\n'
+        << indent() << "for (i = 0; i < size; ++i)" << '\n';
     scope_up(out);
     generate_deserialize_set_element(out, (t_set*)ttype, prefix, error_ret);
     scope_down(out);
 
     // read set end
     out << indent() << "if ((ret = thrift_protocol_read_set_end (protocol, "
-           "error)) < 0)" << endl;
+           "error)) < 0)" << '\n';
     indent_up();
-    out << indent() << "return " << error_ret << ";" << endl;
+    out << indent() << "return " << error_ret << ";" << '\n';
     indent_down();
-    out << indent() << "xfer += ret;" << endl
-        << endl;
+    out << indent() << "xfer += ret;" << '\n'
+        << '\n';
   } else if (ttype->is_list()) {
-    out << indent() << "guint32 size;" << endl
-        << indent() << "guint32 i;" << endl
-        << indent() << "ThriftType element_type;" << endl
-        << endl
+    out << indent() << "guint32 size;" << '\n'
+        << indent() << "guint32 i;" << '\n'
+        << indent() << "ThriftType element_type;" << '\n'
+        << '\n'
         << indent() << "if ((ret = thrift_protocol_read_list_begin (protocol, "
-           "&element_type,&size, error)) < 0)" << endl;
+           "&element_type,&size, error)) < 0)" << '\n';
     indent_up();
-    out << indent() << "return " << error_ret << ";" << endl;
+    out << indent() << "return " << error_ret << ";" << '\n';
     indent_down();
-    out << indent() << "xfer += ret;" << endl
-        << endl;
+    out << indent() << "xfer += ret;" << '\n'
+        << '\n';
 
     // iterate over the elements
-    out << indent() << "/* iterate through list elements */" << endl
-        << indent() << "for (i = 0; i < size; i++)" << endl;
+    out << indent() << "/* iterate through list elements */" << '\n'
+        << indent() << "for (i = 0; i < size; i++)" << '\n';
     scope_up(out);
     generate_deserialize_list_element(out,
                                       (t_list*)ttype,
@@ -4218,11 +4216,11 @@
 
     // read list end
     out << indent() << "if ((ret = thrift_protocol_read_list_end (protocol, "
-           "error)) < 0)" << endl;
+           "error)) < 0)" << '\n';
     indent_up();
-    out << indent() << "return " << error_ret << ";" << endl;
+    out << indent() << "return " << error_ret << ";" << '\n';
     indent_down();
-    out << indent() << "xfer += ret;" << endl;
+    out << indent() << "xfer += ret;" << '\n';
   }
 
   scope_down(out);
@@ -4239,16 +4237,16 @@
   if (ttype->is_map()) {
     t_map* tmap = (t_map*)ttype;
     out << indent() << tname << ptr << " " << name << " = "
-        << generate_new_hash_from_type(tmap->get_key_type(), tmap->get_val_type()) << endl;
+        << generate_new_hash_from_type(tmap->get_key_type(), tmap->get_val_type()) << '\n';
   } else if (ttype->is_list()) {
     t_list* tlist = (t_list*)ttype;
     out << indent() << tname << ptr << " " << name << " = "
-        << generate_new_array_from_type(tlist->get_elem_type()) << endl;
+        << generate_new_array_from_type(tlist->get_elem_type()) << '\n';
   } else if (for_hash_table && ttype->is_enum()) {
-    out << indent() << tname << " " << name << ";" << endl;
+    out << indent() << tname << " " << name << ";" << '\n';
   } else {
     out << indent() << tname << ptr << " " << name
-        << (ptr != "" ? " = g_new (" + tname + ", 1)" : " = NULL") << ";" << endl;
+        << (ptr != "" ? " = g_new (" + tname + ", 1)" : " = NULL") << ";" << '\n';
   }
 }
 
@@ -4259,7 +4257,7 @@
   ttype = get_true_type(ttype);
   string ptr = ttype->is_string() || !ttype->is_base_type() ? " " : "* ";
   string init_val = ttype->is_enum() ? "" : " = NULL";
-  out << indent() << tname << ptr << name << init_val << ";" << endl;
+  out << indent() << tname << ptr << name << init_val << ";" << '\n';
 }
 
 void t_c_glib_generator::generate_deserialize_map_element(ostream& out,
@@ -4289,10 +4287,10 @@
   t_field fval(tval, tval_ptr + valname);
   generate_deserialize_field(out, &fval, "", "", error_ret);
 
-  indent(out) << "if (" << prefix << " && " << keyname << ")" << endl;
+  indent(out) << "if (" << prefix << " && " << keyname << ")" << '\n';
   indent_up();
   indent(out) << "g_hash_table_insert ((GHashTable *)" << prefix << ", (gpointer) " << keyname
-              << ", (gpointer) " << valname << ");" << endl;
+              << ", (gpointer) " << valname << ");" << '\n';
   indent_down();
 }
 
@@ -4309,10 +4307,10 @@
   t_field felem(telem, telem_ptr + elem);
   generate_deserialize_field(out, &felem, "", "", error_ret);
 
-  indent(out) << "if (" << prefix << " && " << elem << ")" << endl;
+  indent(out) << "if (" << prefix << " && " << elem << ")" << '\n';
   indent_up();
   indent(out) << "g_hash_table_insert ((GHashTable *) " << prefix << ", (gpointer) " << elem
-              << ", (gpointer) " << elem << ");" << endl;
+              << ", (gpointer) " << elem << ");" << '\n';
   indent_down();
 }
 
@@ -4334,10 +4332,10 @@
   if (ttype->is_void()) {
     throw std::runtime_error("compiler error: list element type cannot be void");
   } else if (is_numeric(ttype)) {
-    indent(out) << "g_array_append_vals (" << prefix << ", " << elem << ", 1);" << endl;
-    indent(out) << "g_free (" << elem << ");" << endl;
+    indent(out) << "g_array_append_vals (" << prefix << ", " << elem << ", 1);" << '\n';
+    indent(out) << "g_free (" << elem << ");" << '\n';
   } else {
-    indent(out) << "g_ptr_array_add (" << prefix << ", " << elem << ");" << endl;
+    indent(out) << "g_ptr_array_add (" << prefix << ", " << elem << ");" << '\n';
   }
 }
 
diff --git a/compiler/cpp/src/thrift/generate/t_cl_generator.cc b/compiler/cpp/src/thrift/generate/t_cl_generator.cc
index e0dcc46..dccecdc 100644
--- a/compiler/cpp/src/thrift/generate/t_cl_generator.cc
+++ b/compiler/cpp/src/thrift/generate/t_cl_generator.cc
@@ -130,9 +130,9 @@
   string f_vars_name = program_dir + "/" + program_name_ + "-vars.lisp";
 
   f_types_.open(f_types_name);
-  f_types_ << cl_autogen_comment() << endl;
+  f_types_ << cl_autogen_comment() << '\n';
   f_vars_.open(f_vars_name);
-  f_vars_ << cl_autogen_comment() << endl;
+  f_vars_ << cl_autogen_comment() << '\n';
 
   package_def(f_types_);
   package_in(f_types_);
@@ -141,7 +141,7 @@
   if (!no_asd) {
     string f_asd_name = program_dir + "/" + system_prefix + program_name_ + ".asd";
     f_asd_.open(f_asd_name);
-    f_asd_ << cl_autogen_comment() << endl;
+    f_asd_ << cl_autogen_comment() << '\n';
     asdf_def(f_asd_);
   }
 }
@@ -197,13 +197,13 @@
 }
 
 void t_cl_generator::asdf_def(std::ostream &out) {
-  out << "(asdf:defsystem #:" << system_prefix << program_name_ << endl;
+  out << "(asdf:defsystem #:" << system_prefix << program_name_ << '\n';
   indent_up();
   out << indent() << render_includes()
-      << indent() << ":serial t" << endl
+      << indent() << ":serial t" << '\n'
       << indent() << ":components ("
       << "(:file \"" << program_name_ << "-types\") "
-      << "(:file \"" << program_name_ << "-vars\")))" << endl;
+      << "(:file \"" << program_name_ << "-vars\")))" << '\n';
   indent_down();
 }
 
@@ -221,11 +221,11 @@
     }
     out << ")";
   }
-  out << ")" << endl << endl;
+  out << ")" << '\n' << '\n';
 }
 
 void t_cl_generator::package_in(std::ostream &out) {
-  out << "(cl:in-package :" << package() << ")" << endl << endl;
+  out << "(cl:in-package :" << package() << ")" << '\n' << '\n';
 }
 
 /**
@@ -238,7 +238,7 @@
 }
 
 void t_cl_generator::generate_enum(t_enum* tenum) {
-  f_types_ << "(thrift:def-enum " << prefix(tenum->get_name()) << endl;
+  f_types_ << "(thrift:def-enum " << prefix(tenum->get_name()) << '\n';
 
   vector<t_enum_value*> constants = tenum->get_constants();
   vector<t_enum_value*>::iterator c_iter;
@@ -249,12 +249,12 @@
   for (c_iter = constants.begin(); c_iter != constants.end(); ++c_iter) {
     value = (*c_iter)->get_value();
 
-    if(c_iter != constants.begin()) f_types_ << endl << indent() << " ";
+    if(c_iter != constants.begin()) f_types_ << '\n' << indent() << " ";
 
     f_types_ << "(\"" << (*c_iter)->get_name() << "\" . " << value << ")";
   }
   indent_down();
-  f_types_ << "))" << endl << endl;
+  f_types_ << "))" << '\n' << '\n';
 }
 
 /**
@@ -266,7 +266,7 @@
   t_const_value* value = tconst->get_value();
 
   f_vars_ << "(thrift:def-constant " << prefix(name) << " " << render_const_value(type, value) << ")"
-          << endl << endl;
+          << '\n' << '\n';
 }
 
 /**
@@ -306,7 +306,7 @@
     indent(out) << value->get_integer();
   } else if (type->is_struct() || type->is_xception()) {
     out << (type->is_struct() ? "(make-instance '" : "(make-exception '") <<
-           lowercase(type->get_name()) << " " << endl;
+           lowercase(type->get_name()) << " " << '\n';
     indent_up();
 
     const vector<t_field*>& fields = ((t_struct*)type)->get_members();
@@ -326,7 +326,7 @@
       }
 
       out << indent() << ":" << v_iter->first->get_string() << " " <<
-        render_const_value(field_type, v_iter->second) << endl;
+        render_const_value(field_type, v_iter->second) << '\n';
     }
     out << indent() << ")";
 
@@ -340,7 +340,7 @@
     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) {
-      out << endl << indent()
+      out << '\n' << indent()
           << "(cl:cons " << render_const_value(ktype, v_iter->first) << " "
           << render_const_value(vtype, v_iter->second) << ")";
     }
@@ -354,16 +354,16 @@
       etype = ((t_set*)type)->get_elem_type();
     }
     if (type->is_set()) {
-      out << "(thrift:set" << endl;
+      out << "(thrift:set" << '\n';
     } else {
-      out << "(thrift:list" << endl;
+      out << "(thrift:list" << '\n';
     }
     indent_up();
     indent_up();
     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) {
-      out << indent() << render_const_value(etype, *v_iter) << endl;
+      out << indent() << render_const_value(etype, *v_iter) << '\n';
     }
     out << indent() << ")";
     indent_down();
@@ -394,7 +394,7 @@
     t_type* type = (*m_iter)->get_type();
 
     if (m_iter != members.begin()) {
-      out << endl << indent() << " ";
+      out << '\n' << indent() << " ";
     }
     out << "(" << prefix((*m_iter)->get_name()) << " " <<
         ( (nullptr != value) ? render_const_value(type, value) : "nil" ) <<
@@ -421,16 +421,16 @@
 void t_cl_generator::generate_cl_struct(std::ostream& out, t_struct* tstruct, bool is_exception = false) {
   std::string name = type_name(tstruct);
   out << (is_exception ? "(thrift:def-exception " : "(thrift:def-struct ") <<
-      prefix(name) << endl;
+      prefix(name) << '\n';
   indent_up();
   if ( tstruct->has_doc() ) {
     out << indent() ;
-    out << "\"" << cl_docstring(tstruct->get_doc()) << "\"" << endl;
+    out << "\"" << cl_docstring(tstruct->get_doc()) << "\"" << '\n';
   }
   out << indent() ;
   generate_cl_struct_internal(out, tstruct, is_exception);
   indent_down();
-  out << ")" << endl << endl;
+  out << ")" << '\n' << '\n';
 }
 
 void t_cl_generator::generate_exception_sig(std::ostream& out, t_function* f) {
@@ -454,7 +454,7 @@
   indent_up();
 
   if ( tservice->has_doc()) {
-      f_types_ << endl << indent()
+      f_types_ << '\n' << indent()
                << "(:documentation \"" << cl_docstring(tservice->get_doc()) << "\")";
     }
 
@@ -465,23 +465,23 @@
     t_struct* exceptions = function->get_xceptions();
     const vector<t_field*>& xmembers = exceptions->get_members();
 
-    f_types_ << endl << indent() << "(:method " << prefix(fname);
+    f_types_ << '\n' << indent() << "(:method " << prefix(fname);
     f_types_ << " (" << signature << " "  << typespec((*f_iter)->get_returntype()) << ")";
     if (xmembers.size() > 0) {
-      f_types_ << endl << indent() << " :exceptions " ;
+      f_types_ << '\n' << indent() << " :exceptions " ;
       generate_exception_sig(f_types_, function);
     }
     if ( (*f_iter)->is_oneway() ) {
-      f_types_ << endl << indent() << " :oneway t";
+      f_types_ << '\n' << indent() << " :oneway t";
     }
     if ( (*f_iter)->has_doc() ) {
-      f_types_ << endl << indent() << " :documentation \""
+      f_types_ << '\n' << indent() << " :documentation \""
                << cl_docstring((*f_iter)->get_doc()) << "\"";
   }
     f_types_ << ")";
   }
 
-  f_types_ << ")" << endl << endl;
+  f_types_ << ")" << '\n' << '\n';
 
   indent_down();
 }
diff --git a/compiler/cpp/src/thrift/generate/t_cpp_generator.cc b/compiler/cpp/src/thrift/generate/t_cpp_generator.cc
index 9724fae..6984268 100644
--- a/compiler/cpp/src/thrift/generate/t_cpp_generator.cc
+++ b/compiler/cpp/src/thrift/generate/t_cpp_generator.cc
@@ -42,8 +42,6 @@
 using std::string;
 using std::vector;
 
-static const string endl = "\n"; // avoid ostream << std::endl flushes
-
 /**
  * C++ code generator. This is legitimacy incarnate.
  *
@@ -143,14 +141,17 @@
                                   std::ostream& force_cpp_out,
                                   t_struct* tstruct,
                                   bool setters = true,
-                                  bool is_user_struct = false);
+                                  bool is_user_struct = false,
+                                  bool pointers = false);
   void generate_copy_constructor(std::ostream& out, t_struct* tstruct, bool is_exception);
   void generate_move_constructor(std::ostream& out, t_struct* tstruct, bool is_exception);
+  void generate_default_constructor(std::ostream& out, t_struct* tstruct, bool is_exception);
   void generate_constructor_helper(std::ostream& out,
                                    t_struct* tstruct,
                                    bool is_excpetion,
                                    bool is_move);
   void generate_assignment_operator(std::ostream& out, t_struct* tstruct);
+  void generate_equality_operator(std::ostream& out, t_struct* tstruct);
   void generate_move_assignment_operator(std::ostream& out, t_struct* tstruct);
   void generate_assignment_helper(std::ostream& out, t_struct* tstruct, bool is_move);
   void generate_struct_reader(std::ostream& out, t_struct* tstruct, bool pointers = false);
@@ -293,13 +294,19 @@
            (ttype->annotations_.find("cpp.customostream") != ttype->annotations_.end());
   }
 
-  /** 
+  /**
    * Determine if all fields of t_struct's storage do not throw
    * Move/Copy Constructors and Assignments applicable for 'noexcept'
    * Move defaults to 'noexcept'
    */
   bool is_struct_storage_not_throwing(t_struct* tstruct) const;
 
+  /**
+   * Helper function to determine whether any of the members of our struct
+   * has a default value.
+   */
+  bool has_field_with_default_value(t_struct* tstruct);
+
 private:
   /**
    * Returns the include prefix to use for a file generated by program, or the
@@ -309,7 +316,7 @@
 
   /**
    * Returns the legal program name to use for a file generated by program, if the
-   * program name contains dots then replace it with underscores, otherwise return the 
+   * program name contains dots then replace it with underscores, otherwise return the
    * original program name.
    */
   std::string get_legal_program_name(std::string program_name);
@@ -429,69 +436,69 @@
   f_types_tcc_ << autogen_comment();
 
   // Start ifndef
-  f_types_ << "#ifndef " << program_name_ << "_TYPES_H" << endl << "#define " << program_name_
-           << "_TYPES_H" << endl << endl;
-  f_types_tcc_ << "#ifndef " << program_name_ << "_TYPES_TCC" << endl << "#define " << program_name_
-               << "_TYPES_TCC" << endl << endl;
+  f_types_ << "#ifndef " << program_name_ << "_TYPES_H" << '\n' << "#define " << program_name_
+           << "_TYPES_H" << '\n' << '\n';
+  f_types_tcc_ << "#ifndef " << program_name_ << "_TYPES_TCC" << '\n' << "#define " << program_name_
+               << "_TYPES_TCC" << '\n' << '\n';
 
   // Include base types
-  f_types_ << "#include <iosfwd>" << endl
-           << endl
-           << "#include <thrift/Thrift.h>" << endl
-           << "#include <thrift/TApplicationException.h>" << endl
-           << "#include <thrift/TBase.h>" << endl
-           << "#include <thrift/protocol/TProtocol.h>" << endl
-           << "#include <thrift/transport/TTransport.h>" << endl
-           << endl;
+  f_types_ << "#include <iosfwd>" << '\n'
+           << '\n'
+           << "#include <thrift/Thrift.h>" << '\n'
+           << "#include <thrift/TApplicationException.h>" << '\n'
+           << "#include <thrift/TBase.h>" << '\n'
+           << "#include <thrift/protocol/TProtocol.h>" << '\n'
+           << "#include <thrift/transport/TTransport.h>" << '\n'
+           << '\n';
   // Include C++xx compatibility header
-  f_types_ << "#include <functional>" << endl;
-  f_types_ << "#include <memory>" << endl;
+  f_types_ << "#include <functional>" << '\n';
+  f_types_ << "#include <memory>" << '\n';
 
   // Include other Thrift includes
   const vector<t_program*>& includes = program_->get_includes();
   for (auto include : includes) {
     f_types_ << "#include \"" << get_include_prefix(*include) << include->get_name()
-             << "_types.h\"" << endl;
+             << "_types.h\"" << '\n';
 
     // XXX(simpkins): If gen_templates_ is enabled, we currently assume all
     // included files were also generated with templates enabled.
     f_types_tcc_ << "#include \"" << get_include_prefix(*include) << include->get_name()
-                 << "_types.tcc\"" << endl;
+                 << "_types.tcc\"" << '\n';
   }
-  f_types_ << endl;
+  f_types_ << '\n';
 
   // Include custom headers
   const vector<string>& cpp_includes = program_->get_cpp_includes();
   for (const auto & cpp_include : cpp_includes) {
     if (cpp_include[0] == '<') {
-      f_types_ << "#include " << cpp_include << endl;
+      f_types_ << "#include " << cpp_include << '\n';
     } else {
-      f_types_ << "#include \"" << cpp_include << "\"" << endl;
+      f_types_ << "#include \"" << cpp_include << "\"" << '\n';
     }
   }
-  f_types_ << endl;
+  f_types_ << '\n';
 
   // Include the types file
   f_types_impl_ << "#include \"" << get_include_prefix(*get_program()) << program_name_
-                << "_types.h\"" << endl << endl;
+                << "_types.h\"" << '\n' << '\n';
   f_types_tcc_ << "#include \"" << get_include_prefix(*get_program()) << program_name_
-               << "_types.h\"" << endl << endl;
+               << "_types.h\"" << '\n' << '\n';
 
   // The swap() code needs <algorithm> for std::swap()
-  f_types_impl_ << "#include <algorithm>" << endl;
+  f_types_impl_ << "#include <algorithm>" << '\n';
   // for operator<<
-  f_types_impl_ << "#include <ostream>" << endl << endl;
-  f_types_impl_ << "#include <thrift/TToString.h>" << endl << endl;
+  f_types_impl_ << "#include <ostream>" << '\n' << '\n';
+  f_types_impl_ << "#include <thrift/TToString.h>" << '\n' << '\n';
 
   // Open namespace
   ns_open_ = namespace_open(program_->get_namespace("cpp"));
   ns_close_ = namespace_close(program_->get_namespace("cpp"));
 
-  f_types_ << ns_open_ << endl << endl;
+  f_types_ << ns_open_ << '\n' << '\n';
 
-  f_types_impl_ << ns_open_ << endl << endl;
+  f_types_impl_ << ns_open_ << '\n' << '\n';
 
-  f_types_tcc_ << ns_open_ << endl << endl;
+  f_types_tcc_ << ns_open_ << '\n' << '\n';
 }
 
 /**
@@ -499,21 +506,21 @@
  */
 void t_cpp_generator::close_generator() {
   // Close namespace
-  f_types_ << ns_close_ << endl << endl;
-  f_types_impl_ << ns_close_ << endl;
-  f_types_tcc_ << ns_close_ << endl << endl;
+  f_types_ << ns_close_ << '\n' << '\n';
+  f_types_impl_ << ns_close_ << '\n';
+  f_types_tcc_ << ns_close_ << '\n' << '\n';
 
   // Include the types.tcc file from the types header file,
   // so clients don't have to explicitly include the tcc file.
   // TODO(simpkins): Make this a separate option.
   if (gen_templates_) {
     f_types_ << "#include \"" << get_include_prefix(*get_program()) << program_name_
-             << "_types.tcc\"" << endl << endl;
+             << "_types.tcc\"" << '\n' << '\n';
   }
 
   // Close ifndef
-  f_types_ << "#endif" << endl;
-  f_types_tcc_ << "#endif" << endl;
+  f_types_ << "#endif" << '\n';
+  f_types_tcc_ << "#endif" << '\n';
 
   // Close output file
   f_types_.close();
@@ -535,7 +542,7 @@
 void t_cpp_generator::generate_typedef(t_typedef* ttypedef) {
   generate_java_doc(f_types_, ttypedef);
   f_types_ << indent() << "typedef " << type_name(ttypedef->get_type(), true) << " "
-           << ttypedef->get_symbolic() << ";" << endl << endl;
+           << ttypedef->get_symbolic() << ";" << '\n' << '\n';
 }
 
 void t_cpp_generator::generate_enum_constant_list(std::ostream& f,
@@ -543,7 +550,7 @@
                                                   const char* prefix,
                                                   const char* suffix,
                                                   bool include_values) {
-  f << " {" << endl;
+  f << " {" << '\n';
   indent_up();
 
   vector<t_enum_value*>::const_iterator c_iter;
@@ -552,7 +559,7 @@
     if (first) {
       first = false;
     } else {
-      f << "," << endl;
+      f << "," << '\n';
     }
     generate_java_doc(f, *c_iter);
     indent(f) << prefix << (*c_iter)->get_name() << suffix;
@@ -561,9 +568,9 @@
     }
   }
 
-  f << endl;
+  f << '\n';
   indent_down();
-  indent(f) << "};" << endl;
+  indent(f) << "};" << '\n';
 }
 
 /**
@@ -579,7 +586,7 @@
   if (!gen_pure_enums_) {
     enum_name = "type";
     generate_java_doc(f_types_, tenum);
-    f_types_ << indent() << "struct " << tenum->get_name() << " {" << endl;
+    f_types_ << indent() << "struct " << tenum->get_name() << " {" << '\n';
     indent_up();
   }
   f_types_ << indent() << "enum " << enum_name;
@@ -588,10 +595,10 @@
 
   if (!gen_pure_enums_) {
     indent_down();
-    f_types_ << "};" << endl;
+    f_types_ << "};" << '\n';
   }
 
-  f_types_ << endl;
+  f_types_ << '\n';
 
   /**
      Generate a character array of enum names for debugging purposes.
@@ -608,13 +615,13 @@
   generate_enum_constant_list(f_types_impl_, constants, "\"", "\"", false);
 
   f_types_ << indent() << "extern const std::map<int, const char*> _" << tenum->get_name()
-           << "_VALUES_TO_NAMES;" << endl << endl;
+           << "_VALUES_TO_NAMES;" << '\n' << '\n';
 
   f_types_impl_ << indent() << "const std::map<int, const char*> _" << tenum->get_name()
                 << "_VALUES_TO_NAMES(::apache::thrift::TEnumIterator(" << constants.size() << ", _k"
                 << tenum->get_name() << "Values"
                 << ", _k" << tenum->get_name() << "Names), "
-                << "::apache::thrift::TEnumIterator(-1, nullptr, nullptr));" << endl << endl;
+                << "::apache::thrift::TEnumIterator(-1, nullptr, nullptr));" << '\n' << '\n';
 
   generate_enum_ostream_operator_decl(f_types_, tenum);
   generate_enum_ostream_operator(f_types_impl_, tenum);
@@ -633,8 +640,8 @@
   } else {
     out << tenum->get_name() << "::type&";
   }
-  out << " val);" << endl;
-  out << endl;
+  out << " val);" << '\n';
+  out << '\n';
 }
 
 void t_cpp_generator::generate_enum_ostream_operator(std::ostream& out, t_enum* tenum) {
@@ -653,20 +660,20 @@
     scope_up(out);
 
     out << indent() << "std::map<int, const char*>::const_iterator it = _"
-             << tenum->get_name() << "_VALUES_TO_NAMES.find(val);" << endl;
-    out << indent() << "if (it != _" << tenum->get_name() << "_VALUES_TO_NAMES.end()) {" << endl;
+             << tenum->get_name() << "_VALUES_TO_NAMES.find(val);" << '\n';
+    out << indent() << "if (it != _" << tenum->get_name() << "_VALUES_TO_NAMES.end()) {" << '\n';
     indent_up();
-    out << indent() << "out << it->second;" << endl;
+    out << indent() << "out << it->second;" << '\n';
     indent_down();
-    out << indent() << "} else {" << endl;
+    out << indent() << "} else {" << '\n';
     indent_up();
-    out << indent() << "out << static_cast<int>(val);" << endl;
+    out << indent() << "out << static_cast<int>(val);" << '\n';
     indent_down();
-    out << indent() << "}" << endl;
+    out << indent() << "}" << '\n';
 
-    out << indent() << "return out;" << endl;
+    out << indent() << "return out;" << '\n';
     scope_down(out);
-    out << endl;
+    out << '\n';
   }
 }
 
@@ -677,8 +684,8 @@
   } else {
     out << tenum->get_name() << "::type&";
   }
-  out << " val);" << endl;
-  out << endl;
+  out << " val);" << '\n';
+  out << '\n';
 }
 
 void t_cpp_generator::generate_enum_to_string_helper_function(std::ostream& out, t_enum* tenum) {
@@ -693,19 +700,19 @@
     scope_up(out);
 
     out << indent() << "std::map<int, const char*>::const_iterator it = _"
-             << tenum->get_name() << "_VALUES_TO_NAMES.find(val);" << endl;
-    out << indent() << "if (it != _" << tenum->get_name() << "_VALUES_TO_NAMES.end()) {" << endl;
+             << tenum->get_name() << "_VALUES_TO_NAMES.find(val);" << '\n';
+    out << indent() << "if (it != _" << tenum->get_name() << "_VALUES_TO_NAMES.end()) {" << '\n';
     indent_up();
-    out << indent() << "return std::string(it->second);" << endl;
+    out << indent() << "return std::string(it->second);" << '\n';
     indent_down();
-    out << indent() << "} else {" << endl;
+    out << indent() << "} else {" << '\n';
     indent_up();
-    out << indent() << "return std::to_string(static_cast<int>(val));" << endl;
+    out << indent() << "return std::to_string(static_cast<int>(val));" << '\n';
     indent_down();
-    out << indent() << "}" << endl;
+    out << indent() << "}" << '\n';
 
     scope_down(out);
-    out << endl;
+    out << '\n';
   }
 }
 
@@ -727,28 +734,28 @@
     f_consts_impl << autogen_comment();
 
     // Start ifndef
-    f_consts << "#ifndef " << program_name_ << "_CONSTANTS_H" << endl << "#define " << program_name_
-             << "_CONSTANTS_H" << endl << endl << "#include \"" << get_include_prefix(*get_program())
-             << program_name_ << "_types.h\"" << endl << endl << ns_open_ << endl << endl;
+    f_consts << "#ifndef " << program_name_ << "_CONSTANTS_H" << '\n' << "#define " << program_name_
+             << "_CONSTANTS_H" << '\n' << '\n' << "#include \"" << get_include_prefix(*get_program())
+             << program_name_ << "_types.h\"" << '\n' << '\n' << ns_open_ << '\n' << '\n';
 
     f_consts_impl << "#include \"" << get_include_prefix(*get_program()) << program_name_
-                  << "_constants.h\"" << endl << endl << ns_open_ << endl << endl;
+                  << "_constants.h\"" << '\n' << '\n' << ns_open_ << '\n' << '\n';
 
-    f_consts << "class " << program_name_ << "Constants {" << endl << " public:" << endl << "  "
-             << program_name_ << "Constants();" << endl << endl;
+    f_consts << "class " << program_name_ << "Constants {" << '\n' << " public:" << '\n' << "  "
+             << program_name_ << "Constants();" << '\n' << '\n';
     indent_up();
     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();
-      f_consts << indent() << type_name(type) << " " << name << ";" << endl;
+      f_consts << indent() << type_name(type) << " " << name << ";" << '\n';
     }
     indent_down();
-    f_consts << "};" << endl;
+    f_consts << "};" << '\n';
 
     f_consts_impl << "const " << program_name_ << "Constants g_" << program_name_ << "_constants;"
-                  << endl << endl << program_name_ << "Constants::" << program_name_
-                  << "Constants() {" << endl;
+                  << '\n' << '\n' << program_name_ << "Constants::" << program_name_
+                  << "Constants() {" << '\n';
     indent_up();
     for (c_iter = consts.begin(); c_iter != consts.end(); ++c_iter) {
       print_const_value(f_consts_impl,
@@ -757,13 +764,13 @@
                         (*c_iter)->get_value());
     }
     indent_down();
-    indent(f_consts_impl) << "}" << endl;
+    indent(f_consts_impl) << "}" << '\n';
 
-    f_consts << endl << "extern const " << program_name_ << "Constants g_" << program_name_
-             << "_constants;" << endl << endl << ns_close_ << endl << endl << "#endif" << endl;
+    f_consts << '\n' << "extern const " << program_name_ << "Constants g_" << program_name_
+             << "_constants;" << '\n' << '\n' << ns_close_ << '\n' << '\n' << "#endif" << '\n';
     f_consts.close();
 
-    f_consts_impl << endl << ns_close_ << endl << endl;
+    f_consts_impl << '\n' << ns_close_ << '\n' << '\n';
     f_consts_impl.close();
   }
 }
@@ -780,11 +787,11 @@
   type = get_true_type(type);
   if (type->is_base_type()) {
     string v2 = render_const_value(out, name, type, value);
-    indent(out) << name << " = " << v2 << ";" << endl << endl;
+    indent(out) << name << " = " << v2 << ";" << '\n' << '\n';
   } else if (type->is_enum()) {
     indent(out) << name
                 << " = static_cast<" << type_name(type) << '>'
-                << '(' << value->get_integer() << ");" << endl << endl;
+                << '(' << value->get_integer() << ");" << '\n' << '\n';
   } else if (type->is_struct() || type->is_xception()) {
     const vector<t_field*>& fields = ((t_struct*)type)->get_members();
     vector<t_field*>::const_iterator f_iter;
@@ -804,12 +811,12 @@
         throw "type error: " + type->get_name() + " has no field " + v_iter->first->get_string();
       }
       string item_val = render_const_value(out, name, field_type, v_iter->second);
-      indent(out) << name << "." << v_iter->first->get_string() << " = " << item_val << ";" << endl;
+      indent(out) << name << "." << v_iter->first->get_string() << " = " << item_val << ";" << '\n';
       if (is_nonrequired_field) {
-        indent(out) << name << ".__isset." << v_iter->first->get_string() << " = true;" << endl;
+        indent(out) << name << ".__isset." << v_iter->first->get_string() << " = true;" << '\n';
       }
     }
-    out << endl;
+    out << '\n';
   } else if (type->is_map()) {
     t_type* ktype = ((t_map*)type)->get_key_type();
     t_type* vtype = ((t_map*)type)->get_val_type();
@@ -818,27 +825,27 @@
     for (v_iter = val.begin(); v_iter != val.end(); ++v_iter) {
       string key = render_const_value(out, name, ktype, v_iter->first);
       string item_val = render_const_value(out, name, vtype, v_iter->second);
-      indent(out) << name << ".insert(std::make_pair(" << key << ", " << item_val << "));" << endl;
+      indent(out) << name << ".insert(std::make_pair(" << key << ", " << item_val << "));" << '\n';
     }
-    out << endl;
+    out << '\n';
   } else if (type->is_list()) {
     t_type* etype = ((t_list*)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 item_val = render_const_value(out, name, etype, *v_iter);
-      indent(out) << name << ".push_back(" << item_val << ");" << endl;
+      indent(out) << name << ".push_back(" << item_val << ");" << '\n';
     }
-    out << endl;
+    out << '\n';
   } else if (type->is_set()) {
     t_type* 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 item_val = render_const_value(out, name, etype, *v_iter);
-      indent(out) << name << ".insert(" << item_val << ");" << endl;
+      indent(out) << name << ".insert(" << item_val << ");" << '\n';
     }
-    out << endl;
+    out << '\n';
   } else {
     throw "INVALID TYPE IN print_const_value: " + type->get_name();
   }
@@ -886,7 +893,7 @@
            << '(' << value->get_integer() << ')';
   } else {
     string t = tmp("tmp");
-    indent(out) << type_name(type) << " " << t << ";" << endl;
+    indent(out) << type_name(type) << " " << t << ";" << '\n';
     print_const_value(out, t, type, value);
     render << t;
   }
@@ -896,7 +903,7 @@
 
 void t_cpp_generator::generate_forward_declaration(t_struct* tstruct) {
   // Forward declare struct def
-  f_types_ << indent() << "class " << tstruct->get_name() << ";" << endl << endl;
+  f_types_ << indent() << "class " << tstruct->get_name() << ";" << '\n' << '\n';
 }
 
 /**
@@ -908,12 +915,15 @@
  */
 void t_cpp_generator::generate_cpp_struct(t_struct* tstruct, bool is_exception) {
   generate_struct_declaration(f_types_, tstruct, is_exception, false, true, true, true, true);
-  generate_struct_definition(f_types_impl_, f_types_impl_, tstruct, true, true);
+  generate_struct_definition(f_types_impl_, f_types_impl_, tstruct, true, true, false);
 
   std::ostream& out = (gen_templates_ ? f_types_tcc_ : f_types_impl_);
   generate_struct_reader(out, tstruct);
   generate_struct_writer(out, tstruct);
   generate_struct_swap(f_types_impl_, tstruct);
+  if (!gen_no_default_operators_) {
+    generate_equality_operator(f_types_impl_, tstruct);
+  }
   generate_copy_constructor(f_types_impl_, tstruct, is_exception);
   if (gen_moveable_) {
     generate_move_constructor(f_types_impl_, tstruct, is_exception);
@@ -934,6 +944,130 @@
   has_members_ = true;
 }
 
+void t_cpp_generator::generate_equality_operator(std::ostream& out, t_struct* tstruct) {
+  // Get members
+  vector<t_field*>::const_iterator m_iter;
+  const vector<t_field*>& members = tstruct->get_members();
+
+  out << indent() << "bool " << tstruct->get_name()
+      << "::operator==(const " << tstruct->get_name() << " & "
+      << (members.size() > 0 ? "rhs" : "/* rhs */") << ") const" << '\n';
+  scope_up(out);
+  for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
+    // Most existing Thrift code does not use isset or optional/required,
+    // so we treat "default" fields as required.
+    if ((*m_iter)->get_req() != t_field::T_OPTIONAL) {
+      out << indent() << "if (!(" << (*m_iter)->get_name() << " == rhs."
+          << (*m_iter)->get_name() << "))" << '\n' << indent() << "  return false;" << '\n';
+    } else {
+      out << indent() << "if (__isset." << (*m_iter)->get_name() << " != rhs.__isset."
+          << (*m_iter)->get_name() << ")" << '\n' << indent() << "  return false;" << '\n'
+          << indent() << "else if (__isset." << (*m_iter)->get_name() << " && !("
+          << (*m_iter)->get_name() << " == rhs." << (*m_iter)->get_name() << "))" << '\n'
+          << indent() << "  return false;" << '\n';
+    }
+  }
+  indent(out) << "return true;" << '\n';
+  scope_down(out);
+  out << '\n';
+}
+
+bool t_cpp_generator::has_field_with_default_value(t_struct* tstruct)
+{
+  vector<t_field*>::const_iterator m_iter;
+  const vector<t_field*>& members = tstruct->get_members();
+
+  for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
+    t_type* t = get_true_type((*m_iter)->get_type());
+    if (is_reference(*m_iter) || t->is_string() || t->is_uuid()) {
+      t_const_value* cv = (*m_iter)->get_value();
+      if (cv != nullptr) {
+        return true;
+      }
+    }
+  }
+
+  return false;
+}
+
+void t_cpp_generator::generate_default_constructor(ostream& out,
+                                                   t_struct* tstruct,
+                                                   bool is_exception) {
+  // Get members
+  vector<t_field*>::const_iterator m_iter;
+  const vector<t_field*>& members = tstruct->get_members();
+
+  bool has_default_value = has_field_with_default_value(tstruct);
+
+  std::string clsname_ctor = tstruct->get_name() + "::" + tstruct->get_name() + "()";
+  indent(out) << clsname_ctor << (has_default_value ? "" : " noexcept");
+
+  //
+  // Start generating initializer list
+  //
+
+  bool init_ctor = false;
+  std::string args_indent("   ");
+
+  // Default-initialize TException, if it is our base type
+  if (is_exception)
+  {
+    out << '\n';
+    indent(out) << " : ";
+    out << "TException()";
+    init_ctor = true;
+  }
+
+  // Default-initialize all members that should be initialized in
+  // the initializer block
+  for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
+    t_type* t = get_true_type((*m_iter)->get_type());
+    if (t->is_base_type() || t->is_enum() || is_reference(*m_iter)) {
+      string dval;
+      t_const_value* cv = (*m_iter)->get_value();
+      if (cv != nullptr) {
+        dval += render_const_value(out, (*m_iter)->get_name(), t, cv);
+      } else if (t->is_enum()) {
+        dval += "static_cast<" + type_name(t) + ">(0)";
+      } else {
+        dval += (t->is_string() || is_reference(*m_iter) || t->is_uuid()) ? "" : "0";
+      }
+      if (!init_ctor) {
+        init_ctor = true;
+        if(has_default_value) {
+          out << " : ";
+        } else {
+          out << '\n' << args_indent << ": ";
+          args_indent.append("  ");
+        }
+      } else {
+        out << ",\n" << args_indent;
+      }
+
+      out << (*m_iter)->get_name() << "(" << dval << ")";
+    }
+  }
+
+  //
+  // Start generating body
+  //
+
+  out << " {" << '\n';
+  indent_up();
+  // TODO(dreiss): When everything else in Thrift is perfect,
+  // do more of these in the initializer list.
+  for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
+    t_type* t = get_true_type((*m_iter)->get_type());
+    if (!t->is_base_type() && !t->is_enum() && !is_reference(*m_iter)) {
+      t_const_value* cv = (*m_iter)->get_value();
+      if (cv != nullptr) {
+        print_const_value(out, (*m_iter)->get_name(), t, cv);
+      }
+    }
+  }
+  scope_down(out);
+}
+
 void t_cpp_generator::generate_copy_constructor(ostream& out,
                                                 t_struct* tstruct,
                                                 bool is_exception) {
@@ -975,14 +1109,14 @@
     out << "noexcept ";
   if (is_exception)
     out << ": TException() ";
-  out << "{" << endl;
+  out << "{" << '\n';
   indent_up();
 
   const vector<t_field*>& members = tstruct->get_members();
 
   // eliminate compiler unused warning
   if (members.empty())
-    indent(out) << "(void) " << tmp_name << ";" << endl;
+    indent(out) << "(void) " << tmp_name << ";" << '\n';
 
   vector<t_field*>::const_iterator f_iter;
   bool has_nonrequired_fields = false;
@@ -991,17 +1125,17 @@
       has_nonrequired_fields = true;
     indent(out) << (*f_iter)->get_name() << " = "
                 << maybeMove(
-                    tmp_name + "." + (*f_iter)->get_name(), 
+                    tmp_name + "." + (*f_iter)->get_name(),
                     is_move && is_complex_type((*f_iter)->get_type()))
-                << ";" << endl;
+                << ";" << '\n';
   }
 
   if (has_nonrequired_fields) {
-    indent(out) << "__isset = " << maybeMove(tmp_name + ".__isset", false) << ";" << endl;
+    indent(out) << "__isset = " << maybeMove(tmp_name + ".__isset", false) << ";" << '\n';
   }
 
   indent_down();
-  indent(out) << "}" << endl;
+  indent(out) << "}" << '\n';
 }
 
 void t_cpp_generator::generate_assignment_operator(ostream& out, t_struct* tstruct) {
@@ -1025,14 +1159,14 @@
   out << tmp_name << ") ";
   if(is_move || is_struct_storage_not_throwing(tstruct))
     out << "noexcept ";
-  out << "{" << endl;
+  out << "{" << '\n';
   indent_up();
 
   const vector<t_field*>& members = tstruct->get_members();
 
   // eliminate compiler unused warning
   if (members.empty())
-    indent(out) << "(void) " << tmp_name << ";" << endl;
+    indent(out) << "(void) " << tmp_name << ";" << '\n';
 
   vector<t_field*>::const_iterator f_iter;
   bool has_nonrequired_fields = false;
@@ -1041,17 +1175,17 @@
       has_nonrequired_fields = true;
     indent(out) << (*f_iter)->get_name() << " = "
                 << maybeMove(
-                    tmp_name + "." + (*f_iter)->get_name(), 
+                    tmp_name + "." + (*f_iter)->get_name(),
                     is_move && is_complex_type((*f_iter)->get_type()))
-                << ";" << endl;
+                << ";" << '\n';
   }
   if (has_nonrequired_fields) {
-    indent(out) << "__isset = " << maybeMove(tmp_name + ".__isset", false) << ";" << endl;
+    indent(out) << "__isset = " << maybeMove(tmp_name + ".__isset", false) << ";" << '\n';
   }
 
-  indent(out) << "return *this;" << endl;
+  indent(out) << "return *this;" << '\n';
   indent_down();
-  indent(out) << "}" << endl;
+  indent(out) << "}" << '\n';
 }
 
 /**
@@ -1094,7 +1228,7 @@
 
   if (has_nonrequired_fields && (!pointers || read)) {
 
-    out << indent() << "typedef struct _" << tstruct->get_name() << "__isset {" << endl;
+    out << indent() << "typedef struct _" << tstruct->get_name() << "__isset {" << '\n';
     indent_up();
 
     indent(out) << "_" << tstruct->get_name() << "__isset() ";
@@ -1111,113 +1245,58 @@
         out << ", " << (*m_iter)->get_name() << "(" << isSet << ")";
       }
     }
-    out << " {}" << endl;
+    out << " {}" << '\n';
 
     for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
       if ((*m_iter)->get_req() != t_field::T_REQUIRED) {
-        indent(out) << "bool " << (*m_iter)->get_name() << " :1;" << endl;
+        indent(out) << "bool " << (*m_iter)->get_name() << " :1;" << '\n';
       }
     }
 
     indent_down();
-    indent(out) << "} _" << tstruct->get_name() << "__isset;" << endl;
+    indent(out) << "} _" << tstruct->get_name() << "__isset;" << '\n';
   }
 
-  out << endl;
+  out << '\n';
 
   generate_java_doc(out, tstruct);
 
   // Open struct def
-  out << indent() << "class " << tstruct->get_name() << extends << " {" << endl << indent()
-      << " public:" << endl << endl;
+  out << indent() << "class " << tstruct->get_name() << extends << " {" << '\n' << indent()
+      << " public:" << '\n' << '\n';
   indent_up();
 
   if (!pointers) {
     bool ok_noexcept = is_struct_storage_not_throwing(tstruct);
     // Copy constructor
     indent(out) << tstruct->get_name() << "(const " << tstruct->get_name() << "&)"
-                << (ok_noexcept? " noexcept" : "") << ';' << endl;
+                << (ok_noexcept? " noexcept" : "") << ';' << '\n';
 
     // Move constructor
     if (gen_moveable_) {
-      indent(out) << tstruct->get_name() << "(" << tstruct->get_name() << "&&) noexcept;" 
-                  << endl;
+      indent(out) << tstruct->get_name() << "(" << tstruct->get_name() << "&&) noexcept;"
+                  << '\n';
     }
 
     // Assignment Operator
     indent(out) << tstruct->get_name() << "& operator=(const " << tstruct->get_name() << "&)"
-                << (ok_noexcept? " noexcept" : "") << ';' << endl;
+                << (ok_noexcept? " noexcept" : "") << ';' << '\n';
 
     // Move assignment operator
     if (gen_moveable_) {
-      indent(out) << tstruct->get_name() << "& operator=(" << tstruct->get_name() << "&&) noexcept;" 
-                  << endl;
+      indent(out) << tstruct->get_name() << "& operator=(" << tstruct->get_name() << "&&) noexcept;"
+                  << '\n';
     }
 
-    bool has_default_value = false;
-    for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
-      t_type* t = get_true_type((*m_iter)->get_type());
-      if (is_reference(*m_iter) || t->is_string()) {
-        t_const_value* cv = (*m_iter)->get_value();
-        if (cv != nullptr) {
-          has_default_value = true;
-          break;
-        }
-      }
-    }
+    bool has_default_value = has_field_with_default_value(tstruct);
 
     // Default constructor
     std::string clsname_ctor = tstruct->get_name() + "()";
-    indent(out) << clsname_ctor << (has_default_value ? "" : " noexcept");
-
-    bool init_ctor = false;
-    std::string args_indent(
-      indent().size() + clsname_ctor.size() + (has_default_value ? 3 : -1), ' ');
-
-    for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
-      t_type* t = get_true_type((*m_iter)->get_type());
-      if (t->is_base_type() || t->is_enum() || is_reference(*m_iter)) {
-        string dval;
-        t_const_value* cv = (*m_iter)->get_value();
-        if (cv != nullptr) {
-          dval += render_const_value(out, (*m_iter)->get_name(), t, cv);
-        } else if (t->is_enum()) {
-          dval += "static_cast<" + type_name(t) + ">(0)";
-        } else {
-          dval += (t->is_string() || is_reference(*m_iter)) ? "" : "0";
-        }
-        if (!init_ctor) {
-          init_ctor = true;
-          if(has_default_value) {
-            out << " : ";
-          } else {
-            out << '\n' << args_indent << ": ";
-            args_indent.append("  ");
-          }
-        } else {
-          out << ",\n" << args_indent;
-        }
-        out << (*m_iter)->get_name() << "(" << dval << ")";
-      }
-    }
-    out << " {" << endl;
-    indent_up();
-    // TODO(dreiss): When everything else in Thrift is perfect,
-    // do more of these in the initializer list.
-    for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
-      t_type* t = get_true_type((*m_iter)->get_type());
-      if (!t->is_base_type() && !t->is_enum() && !is_reference(*m_iter)) {
-        t_const_value* cv = (*m_iter)->get_value();
-        if (cv != nullptr) {
-          print_const_value(out, (*m_iter)->get_name(), t, cv);
-        }
-      }
-    }
-    scope_down(out);
+    indent(out) << clsname_ctor << (has_default_value ? "" : " noexcept") << ";" << '\n';
   }
 
   if (tstruct->annotations_.find("final") == tstruct->annotations_.end()) {
-    out << endl << indent() << "virtual ~" << tstruct->get_name() << "() noexcept;" << endl;
+    out << '\n' << indent() << "virtual ~" << tstruct->get_name() << "() noexcept;" << '\n';
   }
 
   // Declare all fields
@@ -1226,12 +1305,12 @@
     indent(out) << declare_field(*m_iter,
                                  false,
                                  (pointers && !(*m_iter)->get_type()->is_xception()),
-                                 !read) << endl;
+                                 !read) << '\n';
   }
 
   // Add the __isset data member if we need it, using the definition from above
   if (has_nonrequired_fields && (!pointers || read)) {
-    out << endl << indent() << "_" << tstruct->get_name() << "__isset __isset;" << endl;
+    out << '\n' << indent() << "_" << tstruct->get_name() << "__isset __isset;" << '\n';
   }
 
   // Create a setter function for each field
@@ -1240,104 +1319,87 @@
       continue;
     }
     if (is_reference((*m_iter))) {
-      out << endl << indent() << "void __set_" << (*m_iter)->get_name() << "(::std::shared_ptr<"
+      out << '\n' << indent() << "void __set_" << (*m_iter)->get_name() << "(::std::shared_ptr<"
           << type_name((*m_iter)->get_type(), false, false) << ">";
-      out << " val);" << endl;
+      out << " val);" << '\n';
     } else {
-      out << endl << indent() << "void __set_" << (*m_iter)->get_name() << "("
+      out << '\n' << indent() << "void __set_" << (*m_iter)->get_name() << "("
           << type_name((*m_iter)->get_type(), false, true);
-      out << " val);" << endl;
+      out << " val);" << '\n';
     }
   }
-  out << endl;
+  out << '\n';
 
   if (!pointers) {
     // Should we generate default operators?
     if (!gen_no_default_operators_) {
-      // Generate an equality testing operator.  Make it inline since the compiler
-      // will do a better job than we would when deciding whether to inline it.
+      // Generate an equality testing operator.
       out << indent() << "bool operator == (const " << tstruct->get_name() << " & "
-          << (members.size() > 0 ? "rhs" : "/* rhs */") << ") const" << endl;
-      scope_up(out);
-      for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
-        // Most existing Thrift code does not use isset or optional/required,
-        // so we treat "default" fields as required.
-        if ((*m_iter)->get_req() != t_field::T_OPTIONAL) {
-          out << indent() << "if (!(" << (*m_iter)->get_name() << " == rhs."
-              << (*m_iter)->get_name() << "))" << endl << indent() << "  return false;" << endl;
-        } else {
-          out << indent() << "if (__isset." << (*m_iter)->get_name() << " != rhs.__isset."
-              << (*m_iter)->get_name() << ")" << endl << indent() << "  return false;" << endl
-              << indent() << "else if (__isset." << (*m_iter)->get_name() << " && !("
-              << (*m_iter)->get_name() << " == rhs." << (*m_iter)->get_name() << "))" << endl
-              << indent() << "  return false;" << endl;
-        }
-      }
-      indent(out) << "return true;" << endl;
-      scope_down(out);
+          << (members.size() > 0 ? "rhs" : "/* rhs */") << ") const;" << '\n';
+
       out << indent() << "bool operator != (const " << tstruct->get_name() << " &rhs) const {"
-          << endl << indent() << "  return !(*this == rhs);" << endl << indent() << "}" << endl
-          << endl;
+          << '\n' << indent() << "  return !(*this == rhs);" << '\n' << indent() << "}" << '\n'
+          << '\n';
 
       // Generate the declaration of a less-than operator.  This must be
       // implemented by the application developer if they wish to use it.  (They
       // will get a link error if they try to use it without an implementation.)
-      out << indent() << "bool operator < (const " << tstruct->get_name() << " & ) const;" << endl
-          << endl;
+      out << indent() << "bool operator < (const " << tstruct->get_name() << " & ) const;" << '\n'
+          << '\n';
     }
   }
 
   if (read) {
     if (gen_templates_) {
-      out << indent() << "template <class Protocol_>" << endl << indent()
-          << "uint32_t read(Protocol_* iprot);" << endl;
+      out << indent() << "template <class Protocol_>" << '\n' << indent()
+          << "uint32_t read(Protocol_* iprot);" << '\n';
     } else {
       out << indent() << "uint32_t read("
           << "::apache::thrift::protocol::TProtocol* iprot)";
       if(!is_exception && !extends.empty())
         out << " override";
-      out << ';' << endl;
+      out << ';' << '\n';
     }
   }
   if (write) {
     if (gen_templates_) {
-      out << indent() << "template <class Protocol_>" << endl << indent()
-          << "uint32_t write(Protocol_* oprot) const;" << endl;
+      out << indent() << "template <class Protocol_>" << '\n' << indent()
+          << "uint32_t write(Protocol_* oprot) const;" << '\n';
     } else {
       out << indent() << "uint32_t write("
           << "::apache::thrift::protocol::TProtocol* oprot) const";
       if(!is_exception && !extends.empty())
         out << " override";
-      out << ';' << endl;
+      out << ';' << '\n';
     }
   }
-  out << endl;
+  out << '\n';
 
   if (is_user_struct && !has_custom_ostream(tstruct)) {
     out << indent() << "virtual ";
     generate_struct_print_method_decl(out, nullptr);
-    out << ";" << endl;
+    out << ";" << '\n';
   }
 
   // std::exception::what()
   if (is_exception) {
-    out << indent() << "mutable std::string thriftTExceptionMessageHolder_;" << endl;
+    out << indent() << "mutable std::string thriftTExceptionMessageHolder_;" << '\n';
     out << indent();
     generate_exception_what_method_decl(out, tstruct, false);
-    out << ";" << endl;
+    out << ";" << '\n';
   }
 
   indent_down();
-  indent(out) << "};" << endl << endl;
+  indent(out) << "};" << '\n' << '\n';
 
   if (swap) {
     // Generate a namespace-scope swap() function
     if (tstruct->get_name() == "a" || tstruct->get_name() == "b") {
       out << indent() << "void swap(" << tstruct->get_name() << " &a1, " << tstruct->get_name()
-          << " &a2);" << endl << endl;
+          << " &a2);" << '\n' << '\n';
     } else {
        out << indent() << "void swap(" << tstruct->get_name() << " &a, " << tstruct->get_name()
-           << " &b);" << endl << endl;
+           << " &b);" << '\n' << '\n';
     }
   }
 
@@ -1350,51 +1412,60 @@
                                                  ostream& force_cpp_out,
                                                  t_struct* tstruct,
                                                  bool setters,
-                                                 bool is_user_struct) {
+                                                 bool is_user_struct,
+                                                 bool pointers) {
   // Get members
   vector<t_field*>::const_iterator m_iter;
   const vector<t_field*>& members = tstruct->get_members();
 
   // Destructor
   if (tstruct->annotations_.find("final") == tstruct->annotations_.end()) {
-    force_cpp_out << endl << indent() << tstruct->get_name() << "::~" << tstruct->get_name()
-                  << "() noexcept {" << endl;
+    force_cpp_out << '\n' << indent() << tstruct->get_name() << "::~" << tstruct->get_name()
+                  << "() noexcept {" << '\n';
     indent_up();
 
     indent_down();
-    force_cpp_out << indent() << "}" << endl << endl;
+    force_cpp_out << indent() << "}" << '\n' << '\n';
+  }
+
+  if (!pointers)
+  {
+		// 'force_cpp_out' always goes into the .cpp file, and never into a .tcc
+		// file in case templates are involved. Since the constructor is not templated,
+		// putting it into the (later included) .tcc file would cause ODR violations.
+    generate_default_constructor(force_cpp_out, tstruct, false);
   }
 
   // Create a setter function for each field
   if (setters) {
     for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
       if (is_reference((*m_iter))) {
-        out << endl << indent() << "void " << tstruct->get_name() << "::__set_"
+        out << '\n' << indent() << "void " << tstruct->get_name() << "::__set_"
             << (*m_iter)->get_name() << "(::std::shared_ptr<"
             << type_name((*m_iter)->get_type(), false, false) << ">";
-        out << " val) {" << endl;
+        out << " val) {" << '\n';
       } else {
-        out << endl << indent() << "void " << tstruct->get_name() << "::__set_"
+        out << '\n' << indent() << "void " << tstruct->get_name() << "::__set_"
             << (*m_iter)->get_name() << "(" << type_name((*m_iter)->get_type(), false, true);
-        out << " val) {" << endl;
+        out << " val) {" << '\n';
       }
       indent_up();
-      out << indent() << "this->" << (*m_iter)->get_name() << " = val;" << endl;
+      out << indent() << "this->" << (*m_iter)->get_name() << " = val;" << '\n';
       indent_down();
 
       // assume all fields are required except optional fields.
       // for optional fields change __isset.name to true
       bool is_optional = (*m_iter)->get_req() == t_field::T_OPTIONAL;
       if (is_optional) {
-        out << indent() << indent() << "__isset." << (*m_iter)->get_name() << " = true;" << endl;
+        out << indent() << indent() << "__isset." << (*m_iter)->get_name() << " = true;" << '\n';
       }
-      out << indent() << "}" << endl;
+      out << indent() << "}" << '\n';
     }
   }
   if (is_user_struct) {
     generate_struct_ostream_operator(out, tstruct);
   }
-  out << endl;
+  out << '\n';
 }
 
 /**
@@ -1405,11 +1476,11 @@
  */
 void t_cpp_generator::generate_struct_reader(ostream& out, t_struct* tstruct, bool pointers) {
   if (gen_templates_) {
-    out << indent() << "template <class Protocol_>" << endl << indent() << "uint32_t "
-        << tstruct->get_name() << "::read(Protocol_* iprot) {" << endl;
+    out << indent() << "template <class Protocol_>" << '\n' << indent() << "uint32_t "
+        << tstruct->get_name() << "::read(Protocol_* iprot) {" << '\n';
   } else {
     indent(out) << "uint32_t " << tstruct->get_name()
-                << "::read(::apache::thrift::protocol::TProtocol* iprot) {" << endl;
+                << "::read(::apache::thrift::protocol::TProtocol* iprot) {" << '\n';
   }
   indent_up();
 
@@ -1417,49 +1488,49 @@
   vector<t_field*>::const_iterator f_iter;
 
   // Declare stack tmp variables
-  out << endl
-      << indent() << "::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot);" << endl
-      << indent() << "uint32_t xfer = 0;" << endl
-      << indent() << "std::string fname;" << endl
-      << indent() << "::apache::thrift::protocol::TType ftype;" << endl
-      << indent() << "int16_t fid;" << endl
-      << endl
-      << indent() << "xfer += iprot->readStructBegin(fname);" << endl
-      << endl
-      << indent() << "using ::apache::thrift::protocol::TProtocolException;" << endl
-      << endl;
+  out << '\n'
+      << indent() << "::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot);" << '\n'
+      << indent() << "uint32_t xfer = 0;" << '\n'
+      << indent() << "std::string fname;" << '\n'
+      << indent() << "::apache::thrift::protocol::TType ftype;" << '\n'
+      << indent() << "int16_t fid;" << '\n'
+      << '\n'
+      << indent() << "xfer += iprot->readStructBegin(fname);" << '\n'
+      << '\n'
+      << indent() << "using ::apache::thrift::protocol::TProtocolException;" << '\n'
+      << '\n';
 
   // 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 ((*f_iter)->get_req() == t_field::T_REQUIRED)
-      indent(out) << "bool isset_" << (*f_iter)->get_name() << " = false;" << endl;
+      indent(out) << "bool isset_" << (*f_iter)->get_name() << " = false;" << '\n';
   }
-  out << endl;
+  out << '\n';
 
   // Loop over reading in fields
-  indent(out) << "while (true)" << endl;
+  indent(out) << "while (true)" << '\n';
   scope_up(out);
 
   // Read beginning field marker
-  indent(out) << "xfer += iprot->readFieldBegin(fname, ftype, fid);" << endl;
+  indent(out) << "xfer += iprot->readFieldBegin(fname, ftype, fid);" << '\n';
 
   // Check for field STOP marker
-  out << indent() << "if (ftype == ::apache::thrift::protocol::T_STOP) {" << endl << indent()
-      << "  break;" << endl << indent() << "}" << endl;
+  out << indent() << "if (ftype == ::apache::thrift::protocol::T_STOP) {" << '\n' << indent()
+      << "  break;" << '\n' << indent() << "}" << '\n';
 
   if (fields.empty()) {
-    out << indent() << "xfer += iprot->skip(ftype);" << endl;
+    out << indent() << "xfer += iprot->skip(ftype);" << '\n';
   } else {
     // Switch statement on the field we are reading
-    indent(out) << "switch (fid)" << endl;
+    indent(out) << "switch (fid)" << '\n';
 
     scope_up(out);
 
     // Generate deserialization code for known cases
     for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
-      indent(out) << "case " << (*f_iter)->get_key() << ":" << endl;
+      indent(out) << "case " << (*f_iter)->get_key() << ":" << '\n';
       indent_up();
-      indent(out) << "if (ftype == " << type_to_enum((*f_iter)->get_type()) << ") {" << endl;
+      indent(out) << "if (ftype == " << type_to_enum((*f_iter)->get_type()) << ") {" << '\n';
       indent_up();
 
       const char* isset_prefix = ((*f_iter)->get_req() != t_field::T_REQUIRED) ? "this->__isset."
@@ -1471,8 +1542,8 @@
           // TODO(dreiss): Generate this code and "if" it out to make it easier
           // for people recompiling thrift to include it.
           out <<
-            indent() << "if (" << isset_prefix << (*f_iter)->get_name() << ")" << endl <<
-            indent() << "  throw TProtocolException(TProtocolException::INVALID_DATA);" << endl;
+            indent() << "if (" << isset_prefix << (*f_iter)->get_name() << ")" << '\n' <<
+            indent() << "  throw TProtocolException(TProtocolException::INVALID_DATA);" << '\n';
 #endif
 
       if (pointers && !(*f_iter)->get_type()->is_xception()) {
@@ -1480,44 +1551,44 @@
       } else {
         generate_deserialize_field(out, *f_iter, "this->");
       }
-      out << indent() << isset_prefix << (*f_iter)->get_name() << " = true;" << endl;
+      out << indent() << isset_prefix << (*f_iter)->get_name() << " = true;" << '\n';
       indent_down();
-      out << indent() << "} else {" << endl << indent() << "  xfer += iprot->skip(ftype);" << endl
+      out << indent() << "} else {" << '\n' << indent() << "  xfer += iprot->skip(ftype);" << '\n'
           <<
           // TODO(dreiss): Make this an option when thrift structs
           // have a common base class.
-          // indent() << "  throw TProtocolException(TProtocolException::INVALID_DATA);" << endl <<
-          indent() << "}" << endl << indent() << "break;" << endl;
+          // indent() << "  throw TProtocolException(TProtocolException::INVALID_DATA);" << '\n' <<
+          indent() << "}" << '\n' << indent() << "break;" << '\n';
       indent_down();
     }
 
     // In the default case we skip the field
-    out << indent() << "default:" << endl << indent() << "  xfer += iprot->skip(ftype);" << endl
-        << indent() << "  break;" << endl;
+    out << indent() << "default:" << '\n' << indent() << "  xfer += iprot->skip(ftype);" << '\n'
+        << indent() << "  break;" << '\n';
 
     scope_down(out);
   } //!fields.empty()
   // Read field end marker
-  indent(out) << "xfer += iprot->readFieldEnd();" << endl;
+  indent(out) << "xfer += iprot->readFieldEnd();" << '\n';
 
   scope_down(out);
 
-  out << endl << indent() << "xfer += iprot->readStructEnd();" << endl;
+  out << '\n' << indent() << "xfer += iprot->readStructEnd();" << '\n';
 
   // Throw if any required fields are missing.
   // We do this after reading the struct end so that
   // there might possibly be a chance of continuing.
-  out << endl;
+  out << '\n';
   for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
     if ((*f_iter)->get_req() == t_field::T_REQUIRED)
-      out << indent() << "if (!isset_" << (*f_iter)->get_name() << ')' << endl << indent()
-          << "  throw TProtocolException(TProtocolException::INVALID_DATA);" << endl;
+      out << indent() << "if (!isset_" << (*f_iter)->get_name() << ')' << '\n' << indent()
+          << "  throw TProtocolException(TProtocolException::INVALID_DATA);" << '\n';
   }
 
-  indent(out) << "return xfer;" << endl;
+  indent(out) << "return xfer;" << '\n';
 
   indent_down();
-  indent(out) << "}" << endl << endl;
+  indent(out) << "}" << '\n' << '\n';
 }
 
 /**
@@ -1532,33 +1603,33 @@
   vector<t_field*>::const_iterator f_iter;
 
   if (gen_templates_) {
-    out << indent() << "template <class Protocol_>" << endl << indent() << "uint32_t "
-        << tstruct->get_name() << "::write(Protocol_* oprot) const {" << endl;
+    out << indent() << "template <class Protocol_>" << '\n' << indent() << "uint32_t "
+        << tstruct->get_name() << "::write(Protocol_* oprot) const {" << '\n';
   } else {
     indent(out) << "uint32_t " << tstruct->get_name()
-                << "::write(::apache::thrift::protocol::TProtocol* oprot) const {" << endl;
+                << "::write(::apache::thrift::protocol::TProtocol* oprot) const {" << '\n';
   }
   indent_up();
 
-  out << indent() << "uint32_t xfer = 0;" << endl;
+  out << indent() << "uint32_t xfer = 0;" << '\n';
 
-  indent(out) << "::apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot);" << endl;
-  indent(out) << "xfer += oprot->writeStructBegin(\"" << name << "\");" << endl;
+  indent(out) << "::apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot);" << '\n';
+  indent(out) << "xfer += oprot->writeStructBegin(\"" << name << "\");" << '\n';
 
   for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
     bool check_if_set = (*f_iter)->get_req() == t_field::T_OPTIONAL
                         || (*f_iter)->get_type()->is_xception();
     if (check_if_set) {
-      out << endl << indent() << "if (this->__isset." << (*f_iter)->get_name() << ") {" << endl;
+      out << '\n' << indent() << "if (this->__isset." << (*f_iter)->get_name() << ") {" << '\n';
       indent_up();
     } else {
-      out << endl;
+      out << '\n';
     }
 
     // Write field header
     out << indent() << "xfer += oprot->writeFieldBegin("
         << "\"" << (*f_iter)->get_name() << "\", " << type_to_enum((*f_iter)->get_type()) << ", "
-        << (*f_iter)->get_key() << ");" << endl;
+        << (*f_iter)->get_key() << ");" << '\n';
     // Write field contents
     if (pointers && !(*f_iter)->get_type()->is_xception()) {
       generate_serialize_field(out, *f_iter, "(*(this->", "))");
@@ -1566,22 +1637,22 @@
       generate_serialize_field(out, *f_iter, "this->");
     }
     // Write field closer
-    indent(out) << "xfer += oprot->writeFieldEnd();" << endl;
+    indent(out) << "xfer += oprot->writeFieldEnd();" << '\n';
     if (check_if_set) {
       indent_down();
       indent(out) << '}';
     }
   }
 
-  out << endl;
+  out << '\n';
 
   // Write the struct map
-  out << indent() << "xfer += oprot->writeFieldStop();" << endl << indent()
-      << "xfer += oprot->writeStructEnd();" << endl << indent()
-      << "return xfer;" << endl;
+  out << indent() << "xfer += oprot->writeFieldStop();" << '\n' << indent()
+      << "xfer += oprot->writeStructEnd();" << '\n' << indent()
+      << "return xfer;" << '\n';
 
   indent_down();
-  indent(out) << "}" << endl << endl;
+  indent(out) << "}" << '\n' << '\n';
 }
 
 /**
@@ -1600,35 +1671,35 @@
   vector<t_field*>::const_iterator f_iter;
 
   if (gen_templates_) {
-    out << indent() << "template <class Protocol_>" << endl << indent() << "uint32_t "
-        << tstruct->get_name() << "::write(Protocol_* oprot) const {" << endl;
+    out << indent() << "template <class Protocol_>" << '\n' << indent() << "uint32_t "
+        << tstruct->get_name() << "::write(Protocol_* oprot) const {" << '\n';
   } else {
     indent(out) << "uint32_t " << tstruct->get_name()
-                << "::write(::apache::thrift::protocol::TProtocol* oprot) const {" << endl;
+                << "::write(::apache::thrift::protocol::TProtocol* oprot) const {" << '\n';
   }
   indent_up();
 
-  out << endl << indent() << "uint32_t xfer = 0;" << endl << endl;
+  out << '\n' << indent() << "uint32_t xfer = 0;" << '\n' << '\n';
 
-  indent(out) << "xfer += oprot->writeStructBegin(\"" << name << "\");" << endl;
+  indent(out) << "xfer += oprot->writeStructBegin(\"" << name << "\");" << '\n';
 
   bool first = true;
   for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
     if (first) {
       first = false;
-      out << endl << indent() << "if ";
+      out << '\n' << indent() << "if ";
     } else {
       out << " else if ";
     }
 
-    out << "(this->__isset." << (*f_iter)->get_name() << ") {" << endl;
+    out << "(this->__isset." << (*f_iter)->get_name() << ") {" << '\n';
 
     indent_up();
 
     // Write field header
     out << indent() << "xfer += oprot->writeFieldBegin("
         << "\"" << (*f_iter)->get_name() << "\", " << type_to_enum((*f_iter)->get_type()) << ", "
-        << (*f_iter)->get_key() << ");" << endl;
+        << (*f_iter)->get_key() << ");" << '\n';
     // Write field contents
     if (pointers) {
       generate_serialize_field(out, *f_iter, "(*(this->", "))");
@@ -1636,18 +1707,18 @@
       generate_serialize_field(out, *f_iter, "this->");
     }
     // Write field closer
-    indent(out) << "xfer += oprot->writeFieldEnd();" << endl;
+    indent(out) << "xfer += oprot->writeFieldEnd();" << '\n';
 
     indent_down();
     indent(out) << "}";
   }
 
   // Write the struct map
-  out << endl << indent() << "xfer += oprot->writeFieldStop();" << endl << indent()
-      << "xfer += oprot->writeStructEnd();" << endl << indent() << "return xfer;" << endl;
+  out << '\n' << indent() << "xfer += oprot->writeFieldStop();" << '\n' << indent()
+      << "xfer += oprot->writeStructEnd();" << '\n' << indent() << "return xfer;" << '\n';
 
   indent_down();
-  indent(out) << "}" << endl << endl;
+  indent(out) << "}" << '\n' << '\n';
 }
 
 /**
@@ -1659,10 +1730,10 @@
 void t_cpp_generator::generate_struct_swap(ostream& out, t_struct* tstruct) {
   if (tstruct->get_name() == "a" || tstruct->get_name() == "b") {
     out << indent() << "void swap(" << tstruct->get_name() << " &a1, " << tstruct->get_name()
-        << " &a2) {" << endl; 
+        << " &a2) {" << '\n';
   } else {
     out << indent() << "void swap(" << tstruct->get_name() << " &a, " << tstruct->get_name()
-        << " &b) {" << endl;
+        << " &b) {" << '\n';
   }
 
   indent_up();
@@ -1670,7 +1741,7 @@
   // Let argument-dependent name lookup find the correct swap() function to
   // use based on the argument types.  If none is found in the arguments'
   // namespaces, fall back to ::std::swap().
-  out << indent() << "using ::std::swap;" << endl;
+  out << indent() << "using ::std::swap;" << '\n';
 
   bool has_nonrequired_fields = false;
   const vector<t_field*>& fields = tstruct->get_members();
@@ -1681,41 +1752,41 @@
 
     if (tstruct->get_name() == "a" || tstruct->get_name() == "b") {
       out << indent() << "swap(a1." << tfield->get_name() << ", a2." << tfield->get_name() << ");"
-          << endl;
+          << '\n';
     } else {
       out << indent() << "swap(a." << tfield->get_name() << ", b." << tfield->get_name() << ");"
-          << endl;
+          << '\n';
     }
   }
 
   if (has_nonrequired_fields) {
     if (tstruct->get_name() == "a" || tstruct->get_name() == "b") {
-      out << indent() << "swap(a1.__isset, a2.__isset);" << endl; 
+      out << indent() << "swap(a1.__isset, a2.__isset);" << '\n';
     } else {
-      out << indent() << "swap(a.__isset, b.__isset);" << endl;
+      out << indent() << "swap(a.__isset, b.__isset);" << '\n';
     }
   }
 
   // handle empty structs
   if (fields.size() == 0) {
     if (tstruct->get_name() == "a" || tstruct->get_name() == "b") {
-      out << indent() << "(void) a1;" << endl;
-      out << indent() << "(void) a2;" << endl;
+      out << indent() << "(void) a1;" << '\n';
+      out << indent() << "(void) a2;" << '\n';
     } else {
-      out << indent() << "(void) a;" << endl;
-      out << indent() << "(void) b;" << endl;
+      out << indent() << "(void) a;" << '\n';
+      out << indent() << "(void) b;" << '\n';
     }
   }
 
   scope_down(out);
-  out << endl;
+  out << '\n';
 }
 
 void t_cpp_generator::generate_struct_ostream_operator_decl(std::ostream& out, t_struct* tstruct) {
   out << "std::ostream& operator<<(std::ostream& out, const "
       << tstruct->get_name()
-      << "& obj);" << endl;
-  out << endl;
+      << "& obj);" << '\n';
+  out << '\n';
 }
 
 void t_cpp_generator::generate_struct_ostream_operator(std::ostream& out, t_struct* tstruct) {
@@ -1723,12 +1794,12 @@
     // thrift defines this behavior
     out << "std::ostream& operator<<(std::ostream& out, const "
         << tstruct->get_name()
-        << "& obj)" << endl;
+        << "& obj)" << '\n';
     scope_up(out);
-    out << indent() << "obj.printTo(out);" << endl
-        << indent() << "return out;" << endl;
+    out << indent() << "obj.printTo(out);" << '\n'
+        << indent() << "return out;" << '\n';
     scope_down(out);
-    out << endl;
+    out << '\n';
   }
 }
 
@@ -1793,7 +1864,7 @@
     }
 
     generate_field(out, *it);
-    out << ";" << endl;
+    out << ";" << '\n';
   }
 }
 }
@@ -1804,17 +1875,17 @@
 void t_cpp_generator::generate_struct_print_method(std::ostream& out, t_struct* tstruct) {
   out << indent();
   generate_struct_print_method_decl(out, tstruct);
-  out << " {" << endl;
+  out << " {" << '\n';
 
   indent_up();
 
-  out << indent() << "using ::apache::thrift::to_string;" << endl;
-  out << indent() << "out << \"" << tstruct->get_name() << "(\";" << endl;
+  out << indent() << "using ::apache::thrift::to_string;" << '\n';
+  out << indent() << "out << \"" << tstruct->get_name() << "(\";" << '\n';
   struct_ostream_operator_generator::generate_fields(out, tstruct->get_members(), indent());
-  out << indent() << "out << \")\";" << endl;
+  out << indent() << "out << \")\";" << '\n';
 
   indent_down();
-  out << "}" << endl << endl;
+  out << "}" << '\n' << '\n';
 }
 
 /**
@@ -1823,29 +1894,29 @@
 void t_cpp_generator::generate_exception_what_method(std::ostream& out, t_struct* tstruct) {
   out << indent();
   generate_exception_what_method_decl(out, tstruct, true);
-  out << " {" << endl;
+  out << " {" << '\n';
 
   indent_up();
-  out << indent() << "try {" << endl;
+  out << indent() << "try {" << '\n';
 
   indent_up();
-  out << indent() << "std::stringstream ss;" << endl;
-  out << indent() << "ss << \"TException - service has thrown: \" << *this;" << endl;
-  out << indent() << "this->thriftTExceptionMessageHolder_ = ss.str();" << endl;
-  out << indent() << "return this->thriftTExceptionMessageHolder_.c_str();" << endl;
+  out << indent() << "std::stringstream ss;" << '\n';
+  out << indent() << "ss << \"TException - service has thrown: \" << *this;" << '\n';
+  out << indent() << "this->thriftTExceptionMessageHolder_ = ss.str();" << '\n';
+  out << indent() << "return this->thriftTExceptionMessageHolder_.c_str();" << '\n';
   indent_down();
 
-  out << indent() << "} catch (const std::exception&) {" << endl;
+  out << indent() << "} catch (const std::exception&) {" << '\n';
 
   indent_up();
   out << indent() << "return \"TException - service has thrown: " << tstruct->get_name() << "\";"
-      << endl;
+      << '\n';
   indent_down();
 
-  out << indent() << "}" << endl;
+  out << indent() << "}" << '\n';
 
   indent_down();
-  out << "}" << endl << endl;
+  out << "}" << '\n' << '\n';
 }
 
 /**
@@ -1865,30 +1936,30 @@
 
   // Print header file includes
   f_header_ << autogen_comment();
-  f_header_ << "#ifndef " << svcname << "_H" << endl << "#define " << svcname << "_H" << endl
-            << endl;
+  f_header_ << "#ifndef " << svcname << "_H" << '\n' << "#define " << svcname << "_H" << '\n'
+            << '\n';
   if (gen_cob_style_) {
-    f_header_ << "#include <thrift/transport/TBufferTransports.h>" << endl // TMemoryBuffer
-              << "#include <functional>" << endl 
-              << "namespace apache { namespace thrift { namespace async {" << endl
-              << "class TAsyncChannel;" << endl << "}}}" << endl;
+    f_header_ << "#include <thrift/transport/TBufferTransports.h>" << '\n' // TMemoryBuffer
+              << "#include <functional>" << '\n'
+              << "namespace apache { namespace thrift { namespace async {" << '\n'
+              << "class TAsyncChannel;" << '\n' << "}}}" << '\n';
   }
-  f_header_ << "#include <thrift/TDispatchProcessor.h>" << endl;
+  f_header_ << "#include <thrift/TDispatchProcessor.h>" << '\n';
   if (gen_cob_style_) {
-    f_header_ << "#include <thrift/async/TAsyncDispatchProcessor.h>" << endl;
+    f_header_ << "#include <thrift/async/TAsyncDispatchProcessor.h>" << '\n';
   }
-  f_header_ << "#include <thrift/async/TConcurrentClientSyncInfo.h>" << endl;
-  f_header_ << "#include <memory>" << endl;
+  f_header_ << "#include <thrift/async/TConcurrentClientSyncInfo.h>" << '\n';
+  f_header_ << "#include <memory>" << '\n';
   f_header_ << "#include \"" << get_include_prefix(*get_program()) << program_name_ << "_types.h\""
-            << endl;
+            << '\n';
 
   t_service* extends_service = tservice->get_extends();
   if (extends_service != nullptr) {
     f_header_ << "#include \"" << get_include_prefix(*(extends_service->get_program()))
-              << extends_service->get_name() << ".h\"" << endl;
+              << extends_service->get_name() << ".h\"" << '\n';
   }
 
-  f_header_ << endl << ns_open_ << endl << endl;
+  f_header_ << '\n' << ns_open_ << '\n' << '\n';
 
   f_header_ << "#ifdef _MSC_VER\n"
                "  #pragma warning( push )\n"
@@ -1899,30 +1970,30 @@
   string f_service_name = get_out_dir() + svcname + ".cpp";
   f_service_.open(f_service_name.c_str());
   f_service_ << autogen_comment();
-  f_service_ << "#include \"" << get_include_prefix(*get_program()) << svcname << ".h\"" << endl;
+  f_service_ << "#include \"" << get_include_prefix(*get_program()) << svcname << ".h\"" << '\n';
   if (gen_cob_style_) {
-    f_service_ << "#include \"thrift/async/TAsyncChannel.h\"" << endl;
+    f_service_ << "#include \"thrift/async/TAsyncChannel.h\"" << '\n';
   }
   if (gen_templates_) {
     f_service_ << "#include \"" << get_include_prefix(*get_program()) << svcname << ".tcc\""
-               << endl;
+               << '\n';
 
     string f_service_tcc_name = get_out_dir() + svcname + ".tcc";
     f_service_tcc_.open(f_service_tcc_name.c_str());
     f_service_tcc_ << autogen_comment();
     f_service_tcc_ << "#include \"" << get_include_prefix(*get_program()) << svcname << ".h\""
-                   << endl;
+                   << '\n';
 
-    f_service_tcc_ << "#ifndef " << svcname << "_TCC" << endl << "#define " << svcname << "_TCC"
-                   << endl << endl;
+    f_service_tcc_ << "#ifndef " << svcname << "_TCC" << '\n' << "#define " << svcname << "_TCC"
+                   << '\n' << '\n';
 
     if (gen_cob_style_) {
-      f_service_tcc_ << "#include \"thrift/async/TAsyncChannel.h\"" << endl;
+      f_service_tcc_ << "#include \"thrift/async/TAsyncChannel.h\"" << '\n';
     }
   }
 
-  f_service_ << endl << ns_open_ << endl << endl;
-  f_service_tcc_ << endl << ns_open_ << endl << endl;
+  f_service_ << '\n' << ns_open_ << '\n' << '\n';
+  f_service_tcc_ << '\n' << ns_open_ << '\n' << '\n';
 
   // Generate all the components
   generate_service_interface(tservice, "");
@@ -1959,19 +2030,19 @@
                "#endif\n\n";
 
   // Close the namespace
-  f_service_ << ns_close_ << endl << endl;
-  f_service_tcc_ << ns_close_ << endl << endl;
-  f_header_ << ns_close_ << endl << endl;
+  f_service_ << ns_close_ << '\n' << '\n';
+  f_service_tcc_ << ns_close_ << '\n' << '\n';
+  f_header_ << ns_close_ << '\n' << '\n';
 
   // TODO(simpkins): Make this a separate option
   if (gen_templates_) {
-    f_header_ << "#include \"" << get_include_prefix(*get_program()) << svcname << ".tcc\"" << endl
+    f_header_ << "#include \"" << get_include_prefix(*get_program()) << svcname << ".tcc\"" << '\n'
               << "#include \"" << get_include_prefix(*get_program()) << program_name_
-              << "_types.tcc\"" << endl << endl;
+              << "_types.tcc\"" << '\n' << '\n';
   }
 
-  f_header_ << "#endif" << endl;
-  f_service_tcc_ << "#endif" << endl;
+  f_header_ << "#endif" << '\n';
+  f_service_tcc_ << "#endif" << '\n';
 
   // Close the files
   f_service_tcc_.close();
@@ -2000,9 +2071,10 @@
     generate_struct_definition(out, f_service_, ts, false);
     generate_struct_reader(out, ts);
     generate_struct_writer(out, ts);
+
     ts->set_name(tservice->get_name() + "_" + (*f_iter)->get_name() + "_pargs");
     generate_struct_declaration(f_header_, ts, false, true, false, true);
-    generate_struct_definition(out, f_service_, ts, false);
+    generate_struct_definition(out, f_service_, ts, false, false, true);
     generate_struct_writer(out, ts, true);
     ts->set_name(name_orig);
 
@@ -2024,9 +2096,9 @@
     if (gen_templates_) {
       client_name += "T";
       service_if_name += "T";
-      indent(f_header_) << "template <class Protocol_>" << endl;
+      indent(f_header_) << "template <class Protocol_>" << '\n';
     }
-    indent(f_header_) << "class " << client_name << ";" << endl << endl;
+    indent(f_header_) << "class " << client_name << ";" << '\n' << '\n';
   }
 
   string extends = "";
@@ -2040,31 +2112,31 @@
   }
 
   if (style == "CobCl" && gen_templates_) {
-    f_header_ << "template <class Protocol_>" << endl;
+    f_header_ << "template <class Protocol_>" << '\n';
   }
 
   generate_java_doc(f_header_, tservice);
 
-  f_header_ << "class " << service_if_name << extends << " {" << endl << " public:" << endl;
+  f_header_ << "class " << service_if_name << extends << " {" << '\n' << " public:" << '\n';
   indent_up();
-  f_header_ << indent() << "virtual ~" << service_if_name << "() {}" << endl;
+  f_header_ << indent() << "virtual ~" << service_if_name << "() {}" << '\n';
 
   vector<t_function*> functions = tservice->get_functions();
   vector<t_function*>::iterator f_iter;
   for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
     if ((*f_iter)->has_doc())
-      f_header_ << endl;
+      f_header_ << '\n';
     generate_java_doc(f_header_, *f_iter);
-    f_header_ << indent() << "virtual " << function_signature(*f_iter, style) << " = 0;" << endl;
+    f_header_ << indent() << "virtual " << function_signature(*f_iter, style) << " = 0;" << '\n';
   }
   indent_down();
-  f_header_ << "};" << endl << endl;
+  f_header_ << "};" << '\n' << '\n';
 
   if (style == "CobCl" && gen_templates_) {
     // generate a backwards-compatible typedef for clients that do not
     // know about the new template-style code
     f_header_ << "typedef " << service_if_name << "< ::apache::thrift::protocol::TProtocol> "
-              << service_name_ << style << "If;" << endl << endl;
+              << service_name_ << style << "If;" << '\n' << '\n';
   }
 }
 
@@ -2107,37 +2179,37 @@
     extends = " : virtual public " + type_name(tservice->get_extends()) + style + "IfFactory";
   }
 
-  f_header_ << "class " << factory_name << extends << " {" << endl << " public:" << endl;
+  f_header_ << "class " << factory_name << extends << " {" << '\n' << " public:" << '\n';
   indent_up();
-  f_header_ << indent() << "typedef " << service_if_name << " Handler;" << endl << endl << indent()
-            << "virtual ~" << factory_name << "() {}" << endl << endl << indent() << "virtual "
+  f_header_ << indent() << "typedef " << service_if_name << " Handler;" << '\n' << '\n' << indent()
+            << "virtual ~" << factory_name << "() {}" << '\n' << '\n' << indent() << "virtual "
             << service_if_name << "* getHandler("
             << "const ::apache::thrift::TConnectionInfo& connInfo)"
-            << (extends.empty() ? "" : " override") << " = 0;" << endl << indent()
+            << (extends.empty() ? "" : " override") << " = 0;" << '\n' << indent()
             << "virtual void releaseHandler(" << base_if_name << "* /* handler */)"
-            << (extends.empty() ? "" : " override") << " = 0;" << endl << indent();
+            << (extends.empty() ? "" : " override") << " = 0;" << '\n' << indent();
 
   indent_down();
-  f_header_ << "};" << endl << endl;
+  f_header_ << "};" << '\n' << '\n';
 
   // Generate the singleton factory class
   string singleton_factory_name = service_if_name + "SingletonFactory";
   f_header_ << "class " << singleton_factory_name << " : virtual public " << factory_name << " {"
-            << endl << " public:" << endl;
+            << '\n' << " public:" << '\n';
   indent_up();
   f_header_ << indent() << singleton_factory_name << "(const ::std::shared_ptr<" << service_if_name
-            << ">& iface) : iface_(iface) {}" << endl << indent() << "virtual ~"
-            << singleton_factory_name << "() {}" << endl << endl << indent() << "virtual "
+            << ">& iface) : iface_(iface) {}" << '\n' << indent() << "virtual ~"
+            << singleton_factory_name << "() {}" << '\n' << '\n' << indent() << "virtual "
             << service_if_name << "* getHandler("
-            << "const ::apache::thrift::TConnectionInfo&) override {" << endl << indent()
-            << "  return iface_.get();" << endl << indent() << "}" << endl << indent()
-            << "virtual void releaseHandler(" << base_if_name << "* /* handler */) override {}" << endl;
+            << "const ::apache::thrift::TConnectionInfo&) override {" << '\n' << indent()
+            << "  return iface_.get();" << '\n' << indent() << "}" << '\n' << indent()
+            << "virtual void releaseHandler(" << base_if_name << "* /* handler */) override {}" << '\n';
 
-  f_header_ << endl << " protected:" << endl << indent() << "::std::shared_ptr<" << service_if_name
-            << "> iface_;" << endl;
+  f_header_ << '\n' << " protected:" << '\n' << indent() << "::std::shared_ptr<" << service_if_name
+            << "> iface_;" << '\n';
 
   indent_down();
-  f_header_ << "};" << endl << endl;
+  f_header_ << "};" << '\n' << '\n';
 }
 
 /**
@@ -2151,14 +2223,14 @@
     extends = " , virtual public " + type_name(tservice->get_extends()) + style + "Null";
   }
   f_header_ << "class " << service_name_ << style << "Null : virtual public " << service_name_
-            << style << "If" << extends << " {" << endl << " public:" << endl;
+            << style << "If" << extends << " {" << '\n' << " public:" << '\n';
   indent_up();
-  f_header_ << indent() << "virtual ~" << service_name_ << style << "Null() {}" << endl;
+  f_header_ << indent() << "virtual ~" << service_name_ << style << "Null() {}" << '\n';
   vector<t_function*> functions = tservice->get_functions();
   vector<t_function*>::iterator f_iter;
   for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
     f_header_ << indent() << function_signature(*f_iter, style, "", false)
-              << " override {" << endl;
+              << " override {" << '\n';
     indent_up();
 
     t_type* returntype = (*f_iter)->get_returntype();
@@ -2166,18 +2238,18 @@
 
     if (style == "") {
       if (returntype->is_void() || is_complex_type(returntype)) {
-        f_header_ << indent() << "return;" << endl;
+        f_header_ << indent() << "return;" << '\n';
       } else {
-        f_header_ << indent() << declare_field(&returnfield, true) << endl << indent()
-                  << "return _return;" << endl;
+        f_header_ << indent() << declare_field(&returnfield, true) << '\n' << indent()
+                  << "return _return;" << '\n';
       }
     } else if (style == "CobSv") {
       if (returntype->is_void()) {
-        f_header_ << indent() << "return cob();" << endl;
+        f_header_ << indent() << "return cob();" << '\n';
       } else {
         t_field returnfield(returntype, "_return");
-        f_header_ << indent() << declare_field(&returnfield, true) << endl << indent()
-                  << "return cob(_return);" << endl;
+        f_header_ << indent() << declare_field(&returnfield, true) << '\n' << indent()
+                  << "return cob(_return);" << '\n';
       }
 
     } else {
@@ -2185,10 +2257,10 @@
     }
 
     indent_down();
-    f_header_ << indent() << "}" << endl;
+    f_header_ << indent() << "}" << '\n';
   }
   indent_down();
-  f_header_ << "};" << endl << endl;
+  f_header_ << "};" << '\n' << '\n';
 }
 
 void t_cpp_generator::generate_function_call(ostream& out,
@@ -2219,7 +2291,7 @@
     }
     out << arg_prefix << (*f_iter)->get_name();
   }
-  out << ");" << endl;
+  out << ");" << '\n';
 }
 
 void t_cpp_generator::generate_service_async_skeleton(t_service* tservice) {
@@ -2233,58 +2305,58 @@
   ofstream_with_content_based_conditional_update f_skeleton;
   f_skeleton.open(f_skeleton_name.c_str());
   f_skeleton << "// This autogenerated skeleton file illustrates one way to adapt a synchronous"
-             << endl << "// interface into an asynchronous interface. You should copy it to another"
-             << endl
+             << '\n' << "// interface into an asynchronous interface. You should copy it to another"
+             << '\n'
              << "// filename to avoid overwriting it and rewrite as asynchronous any functions"
-             << endl << "// that would otherwise introduce unwanted latency." << endl << endl
-             << "#include \"" << get_include_prefix(*get_program()) << svcname << ".h\"" << endl
-             << "#include <thrift/protocol/TBinaryProtocol.h>" << endl
-             << "#include <thrift/async/TAsyncProtocolProcessor.h>" << endl
-             << "#include <thrift/async/TEvhttpServer.h>" << endl
-             << "#include <event.h>" << endl
-             << "#include <evhttp.h>" << endl << endl
-             << "using namespace ::apache::thrift;" << endl
-             << "using namespace ::apache::thrift::protocol;" << endl
-             << "using namespace ::apache::thrift::transport;" << endl
-             << "using namespace ::apache::thrift::async;" << endl << endl;
+             << '\n' << "// that would otherwise introduce unwanted latency." << '\n' << '\n'
+             << "#include \"" << get_include_prefix(*get_program()) << svcname << ".h\"" << '\n'
+             << "#include <thrift/protocol/TBinaryProtocol.h>" << '\n'
+             << "#include <thrift/async/TAsyncProtocolProcessor.h>" << '\n'
+             << "#include <thrift/async/TEvhttpServer.h>" << '\n'
+             << "#include <event.h>" << '\n'
+             << "#include <evhttp.h>" << '\n' << '\n'
+             << "using namespace ::apache::thrift;" << '\n'
+             << "using namespace ::apache::thrift::protocol;" << '\n'
+             << "using namespace ::apache::thrift::transport;" << '\n'
+             << "using namespace ::apache::thrift::async;" << '\n' << '\n';
 
   // the following code would not compile:
   // using namespace ;
   // using namespace ::;
   if ((!ns.empty()) && (ns.compare(" ::") != 0)) {
-    f_skeleton << "using namespace " << string(ns, 0, ns.size() - 2) << ";" << endl << endl;
+    f_skeleton << "using namespace " << string(ns, 0, ns.size() - 2) << ";" << '\n' << '\n';
   }
 
-  f_skeleton << "class " << svcname << "Handler : virtual public " << svcname << "If {" << endl
-             << " public:" << endl;
+  f_skeleton << "class " << svcname << "Handler : virtual public " << svcname << "If {" << '\n'
+             << " public:" << '\n';
   indent_up();
-  f_skeleton << indent() << svcname << "Handler() {" << endl << indent()
-             << "  // Your initialization goes here" << endl << indent() << "}" << endl << endl;
+  f_skeleton << indent() << svcname << "Handler() {" << '\n' << indent()
+             << "  // Your initialization goes here" << '\n' << indent() << "}" << '\n' << '\n';
 
   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_java_doc(f_skeleton, *f_iter);
-    f_skeleton << indent() << function_signature(*f_iter, "") << " {" << endl << indent()
-               << "  // Your implementation goes here" << endl << indent() << "  printf(\""
-               << (*f_iter)->get_name() << "\\n\");" << endl << indent() << "}" << endl << endl;
+    f_skeleton << indent() << function_signature(*f_iter, "") << " {" << '\n' << indent()
+               << "  // Your implementation goes here" << '\n' << indent() << "  printf(\""
+               << (*f_iter)->get_name() << "\\n\");" << '\n' << indent() << "}" << '\n' << '\n';
   }
 
   indent_down();
-  f_skeleton << "};" << endl << endl;
+  f_skeleton << "};" << '\n' << '\n';
 
   f_skeleton << "class " << svcname << "AsyncHandler : "
-             << "public " << svcname << "CobSvIf {" << endl << " public:" << endl;
+             << "public " << svcname << "CobSvIf {" << '\n' << " public:" << '\n';
   indent_up();
-  f_skeleton << indent() << svcname << "AsyncHandler() {" << endl << indent()
+  f_skeleton << indent() << svcname << "AsyncHandler() {" << '\n' << indent()
              << "  syncHandler_ = std::unique_ptr<" << svcname << "Handler>(new " << svcname
-             << "Handler);" << endl << indent() << "  // Your initialization goes here" << endl
-             << indent() << "}" << endl;
-  f_skeleton << indent() << "virtual ~" << service_name_ << "AsyncHandler();" << endl;
+             << "Handler);" << '\n' << indent() << "  // Your initialization goes here" << '\n'
+             << indent() << "}" << '\n';
+  f_skeleton << indent() << "virtual ~" << service_name_ << "AsyncHandler();" << '\n';
 
   for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
-    f_skeleton << endl << indent() << function_signature(*f_iter, "CobSv", "", true) << " {"
-               << endl;
+    f_skeleton << '\n' << indent() << function_signature(*f_iter, "CobSv", "", true) << " {"
+               << '\n';
     indent_up();
 
     t_type* returntype = (*f_iter)->get_returntype();
@@ -2292,32 +2364,32 @@
 
     string target = returntype->is_void() ? "" : "_return";
     if (!returntype->is_void()) {
-      f_skeleton << indent() << declare_field(&returnfield, true) << endl;
+      f_skeleton << indent() << declare_field(&returnfield, true) << '\n';
     }
     generate_function_call(f_skeleton, *f_iter, target, "syncHandler_", "");
-    f_skeleton << indent() << "return cob(" << target << ");" << endl;
+    f_skeleton << indent() << "return cob(" << target << ");" << '\n';
 
     scope_down(f_skeleton);
   }
-  f_skeleton << endl << " protected:" << endl << indent() << "std::unique_ptr<" << svcname
-             << "Handler> syncHandler_;" << endl;
+  f_skeleton << '\n' << " protected:" << '\n' << indent() << "std::unique_ptr<" << svcname
+             << "Handler> syncHandler_;" << '\n';
   indent_down();
-  f_skeleton << "};" << endl << endl;
+  f_skeleton << "};" << '\n' << '\n';
 
-  f_skeleton << indent() << "int main(int argc, char **argv) {" << endl;
+  f_skeleton << indent() << "int main(int argc, char **argv) {" << '\n';
   indent_up();
   f_skeleton
-      << indent() << "int port = 9090;" << endl << indent() << "::std::shared_ptr<" << svcname
-      << "AsyncHandler> handler(new " << svcname << "AsyncHandler());" << endl << indent()
-      << "::std::shared_ptr<" << svcname << "AsyncProcessor> processor(new " << svcname << "AsyncProcessor(handler));" << endl
+      << indent() << "int port = 9090;" << '\n' << indent() << "::std::shared_ptr<" << svcname
+      << "AsyncHandler> handler(new " << svcname << "AsyncHandler());" << '\n' << indent()
+      << "::std::shared_ptr<" << svcname << "AsyncProcessor> processor(new " << svcname << "AsyncProcessor(handler));" << '\n'
       << indent() << "::std::shared_ptr<TProtocolFactory> protocolFactory(new TBinaryProtocolFactory());"
-      << endl
+      << '\n'
       << indent() << "::std::shared_ptr<TAsyncProtocolProcessor> protocolProcessor(new TAsyncProtocolProcessor(processor, protocolFactory));"
-      << endl << endl << indent()
+      << '\n' << '\n' << indent()
       << "TEvhttpServer server(protocolProcessor, port);"
-      << endl << indent() << "server.serve();" << endl << indent() << "return 0;" << endl;
+      << '\n' << indent() << "server.serve();" << '\n' << indent() << "return 0;" << '\n';
   indent_down();
-  f_skeleton << "}" << endl << endl;
+  f_skeleton << "}" << '\n' << '\n';
 }
 
 /**
@@ -2343,35 +2415,35 @@
 
   // Generate the header portion
   f_header_ << "class " << service_name_ << "Multiface : "
-            << "virtual public " << service_name_ << "If" << extends_multiface << " {" << endl
-            << " public:" << endl;
+            << "virtual public " << service_name_ << "If" << extends_multiface << " {" << '\n'
+            << " public:" << '\n';
   indent_up();
   f_header_ << indent() << service_name_ << "Multiface(" << list_type
-            << "& ifaces) : ifaces_(ifaces) {" << endl;
+            << "& ifaces) : ifaces_(ifaces) {" << '\n';
   if (!extends.empty()) {
     f_header_ << indent()
               << "  std::vector<std::shared_ptr<" + service_name_ + "If> >::iterator iter;"
-              << endl << indent() << "  for (iter = ifaces.begin(); iter != ifaces.end(); ++iter) {"
-              << endl << indent() << "    " << extends << "Multiface::add(*iter);" << endl
-              << indent() << "  }" << endl;
+              << '\n' << indent() << "  for (iter = ifaces.begin(); iter != ifaces.end(); ++iter) {"
+              << '\n' << indent() << "    " << extends << "Multiface::add(*iter);" << '\n'
+              << indent() << "  }" << '\n';
   }
-  f_header_ << indent() << "}" << endl << indent() << "virtual ~" << service_name_
-            << "Multiface() {}" << endl;
+  f_header_ << indent() << "}" << '\n' << indent() << "virtual ~" << service_name_
+            << "Multiface() {}" << '\n';
   indent_down();
 
   // Protected data members
-  f_header_ << " protected:" << endl;
+  f_header_ << " protected:" << '\n';
   indent_up();
-  f_header_ << indent() << list_type << " ifaces_;" << endl << indent() << service_name_
-            << "Multiface() {}" << endl << indent() << "void add(::std::shared_ptr<"
-            << service_name_ << "If> iface) {" << endl;
+  f_header_ << indent() << list_type << " ifaces_;" << '\n' << indent() << service_name_
+            << "Multiface() {}" << '\n' << indent() << "void add(::std::shared_ptr<"
+            << service_name_ << "If> iface) {" << '\n';
   if (!extends.empty()) {
-    f_header_ << indent() << "  " << extends << "Multiface::add(iface);" << endl;
+    f_header_ << indent() << "  " << extends << "Multiface::add(iface);" << '\n';
   }
-  f_header_ << indent() << "  ifaces_.push_back(iface);" << endl << indent() << "}" << endl;
+  f_header_ << indent() << "  ifaces_.push_back(iface);" << '\n' << indent() << "}" << '\n';
   indent_down();
 
-  f_header_ << indent() << " public:" << endl;
+  f_header_ << indent() << " public:" << '\n';
   indent_up();
 
   for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
@@ -2396,31 +2468,31 @@
     }
     call += ")";
 
-    f_header_ << indent() << function_signature(*f_iter, "") << " override {" << endl;
+    f_header_ << indent() << function_signature(*f_iter, "") << " override {" << '\n';
     indent_up();
-    f_header_ << indent() << "size_t sz = ifaces_.size();" << endl << indent() << "size_t i = 0;"
-              << endl << indent() << "for (; i < (sz - 1); ++i) {" << endl;
+    f_header_ << indent() << "size_t sz = ifaces_.size();" << '\n' << indent() << "size_t i = 0;"
+              << '\n' << indent() << "for (; i < (sz - 1); ++i) {" << '\n';
     indent_up();
-    f_header_ << indent() << call << ";" << endl;
+    f_header_ << indent() << call << ";" << '\n';
     indent_down();
-    f_header_ << indent() << "}" << endl;
+    f_header_ << indent() << "}" << '\n';
 
     if (!(*f_iter)->get_returntype()->is_void()) {
       if (is_complex_type((*f_iter)->get_returntype())) {
-        f_header_ << indent() << call << ";" << endl << indent() << "return;" << endl;
+        f_header_ << indent() << call << ";" << '\n' << indent() << "return;" << '\n';
       } else {
-        f_header_ << indent() << "return " << call << ";" << endl;
+        f_header_ << indent() << "return " << call << ";" << '\n';
       }
     } else {
-      f_header_ << indent() << call << ";" << endl;
+      f_header_ << indent() << call << ";" << '\n';
     }
 
     indent_down();
-    f_header_ << indent() << "}" << endl << endl;
+    f_header_ << indent() << "}" << '\n' << '\n';
   }
 
   indent_down();
-  f_header_ << indent() << "};" << endl << endl;
+  f_header_ << indent() << "};" << '\n' << '\n';
 }
 
 /**
@@ -2471,7 +2543,7 @@
   f_header_ << template_header << "class " << service_name_ << style << "Client" << short_suffix
             << " : "
             << "virtual public " << service_name_ << ifstyle << if_suffix << extends_client << " {"
-            << endl << " public:" << endl;
+            << '\n' << " public:" << '\n';
 
   indent_up();
   if (style != "Cob") {
@@ -2484,18 +2556,18 @@
 
     if (extends.empty()) {
       if (style == "Concurrent") {
-        f_header_ << ": sync_(sync)" << endl;
+        f_header_ << ": sync_(sync)" << '\n';
       }
-      f_header_ << "{" << endl;
-      f_header_ << indent() << "  setProtocol" << short_suffix << "(prot);" << endl << indent()
-                << "}" << endl;
+      f_header_ << "{" << '\n';
+      f_header_ << indent() << "  setProtocol" << short_suffix << "(prot);" << '\n' << indent()
+                << "}" << '\n';
     } else {
-      f_header_ << ":" << endl;
+      f_header_ << ":" << '\n';
       f_header_ << indent() << "  " << extends << style << client_suffix << "(prot, prot";
       if (style == "Concurrent") {
           f_header_ << ", sync";
       }
-      f_header_ << ") {}" << endl;
+      f_header_ << ") {}" << '\n';
     }
 
     f_header_ << indent() << service_name_ << style << "Client" << short_suffix << "(" << prot_ptr
@@ -2504,41 +2576,41 @@
         f_header_ << ", std::shared_ptr< ::apache::thrift::async::TConcurrentClientSyncInfo> sync";
     }
     f_header_ << ") ";
-    
+
     if (extends.empty()) {
       if (style == "Concurrent") {
-        f_header_ << ": sync_(sync)" << endl;
+        f_header_ << ": sync_(sync)" << '\n';
       }
-      f_header_ << "{" << endl;
-      f_header_ << indent() << "  setProtocol" << short_suffix << "(iprot,oprot);" << endl
-                << indent() << "}" << endl;
+      f_header_ << "{" << '\n';
+      f_header_ << indent() << "  setProtocol" << short_suffix << "(iprot,oprot);" << '\n'
+                << indent() << "}" << '\n';
     } else {
       f_header_ << ":" << indent() << "  " << extends << style << client_suffix
                 << "(iprot, oprot";
       if (style == "Concurrent") {
           f_header_ << ", sync";
       }
-      f_header_ << ") {}" << endl;
+      f_header_ << ") {}" << '\n';
     }
 
     // create the setProtocol methods
     if (extends.empty()) {
-      f_header_ << " private:" << endl;
+      f_header_ << " private:" << '\n';
       // 1: one parameter
       f_header_ << indent() << "void setProtocol" << short_suffix << "(" << prot_ptr << " prot) {"
-                << endl;
-      f_header_ << indent() << "setProtocol" << short_suffix << "(prot,prot);" << endl;
-      f_header_ << indent() << "}" << endl;
+                << '\n';
+      f_header_ << indent() << "setProtocol" << short_suffix << "(prot,prot);" << '\n';
+      f_header_ << indent() << "}" << '\n';
       // 2: two parameter
       f_header_ << indent() << "void setProtocol" << short_suffix << "(" << prot_ptr << " iprot, "
-                << prot_ptr << " oprot) {" << endl;
+                << prot_ptr << " oprot) {" << '\n';
 
-      f_header_ << indent() << "  piprot_=iprot;" << endl << indent() << "  poprot_=oprot;" << endl
-                << indent() << "  iprot_ = iprot.get();" << endl << indent()
-                << "  oprot_ = oprot.get();" << endl;
+      f_header_ << indent() << "  piprot_=iprot;" << '\n' << indent() << "  poprot_=oprot;" << '\n'
+                << indent() << "  iprot_ = iprot.get();" << '\n' << indent()
+                << "  oprot_ = oprot.get();" << '\n';
 
-      f_header_ << indent() << "}" << endl;
-      f_header_ << " public:" << endl;
+      f_header_ << indent() << "}" << '\n';
+      f_header_ << " public:" << '\n';
     }
 
     // Generate getters for the protocols.
@@ -2546,45 +2618,45 @@
     // TODO(simpkins): should they be templated?
     f_header_ << indent()
               << "std::shared_ptr< ::apache::thrift::protocol::TProtocol> getInputProtocol() {"
-              << endl << indent() << "  return " << _this << "piprot_;" << endl << indent() << "}"
-              << endl;
+              << '\n' << indent() << "  return " << _this << "piprot_;" << '\n' << indent() << "}"
+              << '\n';
 
     f_header_ << indent()
               << "std::shared_ptr< ::apache::thrift::protocol::TProtocol> getOutputProtocol() {"
-              << endl << indent() << "  return " << _this << "poprot_;" << endl << indent() << "}"
-              << endl;
+              << '\n' << indent() << "  return " << _this << "poprot_;" << '\n' << indent() << "}"
+              << '\n';
 
   } else /* if (style == "Cob") */ {
     f_header_ << indent() << service_name_ << style << "Client" << short_suffix << "("
               << "std::shared_ptr< ::apache::thrift::async::TAsyncChannel> channel, "
-              << "::apache::thrift::protocol::TProtocolFactory* protocolFactory) :" << endl;
+              << "::apache::thrift::protocol::TProtocolFactory* protocolFactory) :" << '\n';
     if (extends.empty()) {
-      f_header_ << indent() << "  channel_(channel)," << endl << indent()
-                << "  itrans_(new ::apache::thrift::transport::TMemoryBuffer())," << endl
+      f_header_ << indent() << "  channel_(channel)," << '\n' << indent()
+                << "  itrans_(new ::apache::thrift::transport::TMemoryBuffer())," << '\n'
                 << indent() << "  otrans_(new ::apache::thrift::transport::TMemoryBuffer()),"
-                << endl;
+                << '\n';
       if (gen_templates_) {
         // TProtocolFactory classes return generic TProtocol pointers.
         // We have to dynamic cast to the Protocol_ type we are expecting.
         f_header_ << indent() << "  piprot_(::std::dynamic_pointer_cast<Protocol_>("
-                  << "protocolFactory->getProtocol(itrans_)))," << endl << indent()
+                  << "protocolFactory->getProtocol(itrans_)))," << '\n' << indent()
                   << "  poprot_(::std::dynamic_pointer_cast<Protocol_>("
-                  << "protocolFactory->getProtocol(otrans_))) {" << endl;
+                  << "protocolFactory->getProtocol(otrans_))) {" << '\n';
         // Throw a TException if either dynamic cast failed.
-        f_header_ << indent() << "  if (!piprot_ || !poprot_) {" << endl << indent()
+        f_header_ << indent() << "  if (!piprot_ || !poprot_) {" << '\n' << indent()
                   << "    throw ::apache::thrift::TException(\""
                   << "TProtocolFactory returned unexpected protocol type in " << service_name_
-                  << style << "Client" << short_suffix << " constructor\");" << endl << indent()
-                  << "  }" << endl;
+                  << style << "Client" << short_suffix << " constructor\");" << '\n' << indent()
+                  << "  }" << '\n';
       } else {
-        f_header_ << indent() << "  piprot_(protocolFactory->getProtocol(itrans_))," << endl
-                  << indent() << "  poprot_(protocolFactory->getProtocol(otrans_)) {" << endl;
+        f_header_ << indent() << "  piprot_(protocolFactory->getProtocol(itrans_))," << '\n'
+                  << indent() << "  poprot_(protocolFactory->getProtocol(otrans_)) {" << '\n';
       }
-      f_header_ << indent() << "  iprot_ = piprot_.get();" << endl << indent()
-                << "  oprot_ = poprot_.get();" << endl << indent() << "}" << endl;
+      f_header_ << indent() << "  iprot_ = piprot_.get();" << '\n' << indent()
+                << "  oprot_ = poprot_.get();" << '\n' << indent() << "}" << '\n';
     } else {
       f_header_ << indent() << "  " << extends << style << client_suffix
-                << "(channel, protocolFactory) {}" << endl;
+                << "(channel, protocolFactory) {}" << '\n';
     }
   }
 
@@ -2592,10 +2664,10 @@
     generate_java_doc(f_header_, tservice);
 
     f_header_ << indent()
-              << "::std::shared_ptr< ::apache::thrift::async::TAsyncChannel> getChannel() {" << endl
-              << indent() << "  return " << _this << "channel_;" << endl << indent() << "}" << endl;
+              << "::std::shared_ptr< ::apache::thrift::async::TAsyncChannel> getChannel() {" << '\n'
+              << indent() << "  return " << _this << "channel_;" << '\n' << indent() << "}" << '\n';
     if (!gen_no_client_completion_) {
-      f_header_ << indent() << "virtual void completed__(bool /* success */) {}" << endl;
+      f_header_ << indent() << "virtual void completed__(bool /* success */) {}" << '\n';
     }
   }
 
@@ -2603,8 +2675,8 @@
   vector<t_function*>::const_iterator f_iter;
   for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
     generate_java_doc(f_header_, *f_iter);
-    indent(f_header_) << function_signature(*f_iter, ifstyle) 
-                      << " override;" << endl;
+    indent(f_header_) << function_signature(*f_iter, ifstyle)
+                      << " override;" << '\n';
     // TODO(dreiss): Use private inheritance to avoid generating thise in cob-style.
     if (style == "Concurrent" && !(*f_iter)->is_oneway()) {
       // concurrent clients need to move the seqid from the send function to the
@@ -2613,12 +2685,12 @@
       t_function send_function(g_type_i32, /*returning seqid*/
                                string("send_") + (*f_iter)->get_name(),
                                (*f_iter)->get_arglist());
-      indent(f_header_) << function_signature(&send_function, "") << ";" << endl;
+      indent(f_header_) << function_signature(&send_function, "") << ";" << '\n';
     } else {
       t_function send_function(g_type_void,
                                string("send_") + (*f_iter)->get_name(),
                                (*f_iter)->get_arglist());
-      indent(f_header_) << function_signature(&send_function, "") << ";" << endl;
+      indent(f_header_) << function_signature(&send_function, "") << ";" << '\n';
     }
     if (!(*f_iter)->is_oneway()) {
       if (style == "Concurrent") {
@@ -2628,52 +2700,52 @@
         t_function recv_function((*f_iter)->get_returntype(),
                                  string("recv_") + (*f_iter)->get_name(),
                                  &seqIdArgStruct);
-        indent(f_header_) << function_signature(&recv_function, "") << ";" << endl;
+        indent(f_header_) << function_signature(&recv_function, "") << ";" << '\n';
       } else {
         t_struct noargs(program_);
         t_function recv_function((*f_iter)->get_returntype(),
                                  string("recv_") + (*f_iter)->get_name(),
                                  &noargs);
-        indent(f_header_) << function_signature(&recv_function, "") << ";" << endl;
+        indent(f_header_) << function_signature(&recv_function, "") << ";" << '\n';
       }
     }
   }
   indent_down();
 
   if (extends.empty()) {
-    f_header_ << " protected:" << endl;
+    f_header_ << " protected:" << '\n';
     indent_up();
 
     if (style == "Cob") {
       f_header_ << indent()
-                << "::std::shared_ptr< ::apache::thrift::async::TAsyncChannel> channel_;" << endl
+                << "::std::shared_ptr< ::apache::thrift::async::TAsyncChannel> channel_;" << '\n'
                 << indent()
-                << "::std::shared_ptr< ::apache::thrift::transport::TMemoryBuffer> itrans_;" << endl
+                << "::std::shared_ptr< ::apache::thrift::transport::TMemoryBuffer> itrans_;" << '\n'
                 << indent()
                 << "::std::shared_ptr< ::apache::thrift::transport::TMemoryBuffer> otrans_;"
-                << endl;
+                << '\n';
     }
     f_header_ <<
-      indent() << prot_ptr << " piprot_;" << endl <<
-      indent() << prot_ptr << " poprot_;" << endl <<
-      indent() << protocol_type << "* iprot_;" << endl <<
-      indent() << protocol_type << "* oprot_;" << endl;
+      indent() << prot_ptr << " piprot_;" << '\n' <<
+      indent() << prot_ptr << " poprot_;" << '\n' <<
+      indent() << protocol_type << "* iprot_;" << '\n' <<
+      indent() << protocol_type << "* oprot_;" << '\n';
 
     if (style == "Concurrent") {
       f_header_ <<
-        indent() << "std::shared_ptr< ::apache::thrift::async::TConcurrentClientSyncInfo> sync_;"<<endl;
+        indent() << "std::shared_ptr< ::apache::thrift::async::TConcurrentClientSyncInfo> sync_;" << '\n';
     }
     indent_down();
   }
 
-  f_header_ << "};" << endl << endl;
+  f_header_ << "};" << '\n' << '\n';
 
   if (gen_templates_) {
     // Output a backwards compatibility typedef using
     // TProtocol as the template parameter.
     f_header_ << "typedef " << service_name_ << style
               << "ClientT< ::apache::thrift::protocol::TProtocol> " << service_name_ << style
-              << "Client;" << endl << endl;
+              << "Client;" << '\n' << '\n';
   }
 
   string scope = service_name_ + style + client_suffix + "::";
@@ -2695,7 +2767,7 @@
     if (gen_templates_) {
       indent(out) << template_header;
     }
-    indent(out) << function_signature(*f_iter, ifstyle, scope) << endl;
+    indent(out) << function_signature(*f_iter, ifstyle, scope) << '\n';
     scope_up(out);
     indent(out) << seqIdCapture << "send_" << funname << "(";
 
@@ -2714,33 +2786,33 @@
       }
       out << (*fld_iter)->get_name();
     }
-    out << ");" << endl;
+    out << ");" << '\n';
 
     if (style != "Cob") {
       if (!(*f_iter)->is_oneway()) {
         out << indent();
         if (!(*f_iter)->get_returntype()->is_void()) {
           if (is_complex_type((*f_iter)->get_returntype())) {
-            out << "recv_" << funname << "(_return" << seqIdCommaUse << ");" << endl;
+            out << "recv_" << funname << "(_return" << seqIdCommaUse << ");" << '\n';
           } else {
-            out << "return recv_" << funname << "(" << seqIdUse << ");" << endl;
+            out << "return recv_" << funname << "(" << seqIdUse << ");" << '\n';
           }
         } else {
-          out << "recv_" << funname << "(" << seqIdUse << ");" << endl;
+          out << "recv_" << funname << "(" << seqIdUse << ");" << '\n';
         }
       }
     } else {
       if (!(*f_iter)->is_oneway()) {
         out << indent() << _this << "channel_->sendAndRecvMessage("
             << "::std::bind(cob, this), " << _this << "otrans_.get(), " << _this << "itrans_.get());"
-            << endl;
+            << '\n';
       } else {
         out << indent() << _this << "channel_->sendMessage("
-            << "::std::bind(cob, this), " << _this << "otrans_.get());" << endl;
+            << "::std::bind(cob, this), " << _this << "otrans_.get());" << '\n';
       }
     }
     scope_down(out);
-    out << endl;
+    out << '\n';
 
     // if (style != "Cob") // TODO(dreiss): Libify the client and don't generate this for cob-style
     if (true) {
@@ -2757,7 +2829,7 @@
       if (gen_templates_) {
         indent(out) << template_header;
       }
-      indent(out) << function_signature(&send_function, "", scope) << endl;
+      indent(out) << function_signature(&send_function, "", scope) << '\n';
       scope_up(out);
 
       // Function arguments and results
@@ -2772,41 +2844,41 @@
       }
       // Serialize the request
       out <<
-        indent() << "int32_t cseqid = " << cseqidVal << ";" << endl;
+        indent() << "int32_t cseqid = " << cseqidVal << ";" << '\n';
       if(style == "Concurrent") {
         out <<
-          indent() << "::apache::thrift::async::TConcurrentSendSentry sentry(this->sync_.get());" << endl;
+          indent() << "::apache::thrift::async::TConcurrentSendSentry sentry(this->sync_.get());" << '\n';
       }
       if (style == "Cob") {
         out <<
-          indent() << _this << "otrans_->resetBuffer();" << endl;
+          indent() << _this << "otrans_->resetBuffer();" << '\n';
       }
       out <<
         indent() << _this << "oprot_->writeMessageBegin(\"" <<
         (*f_iter)->get_name() <<
         "\", ::apache::thrift::protocol::" << ((*f_iter)->is_oneway() ? "T_ONEWAY" : "T_CALL") <<
-        ", cseqid);" << endl << endl <<
-        indent() << argsname << " args;" << endl;
+        ", cseqid);" << '\n' << '\n' <<
+        indent() << argsname << " args;" << '\n';
 
       for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) {
         out << indent() << "args." << (*fld_iter)->get_name() << " = &" << (*fld_iter)->get_name()
-            << ";" << endl;
+            << ";" << '\n';
       }
 
-      out << indent() << "args.write(" << _this << "oprot_);" << endl << endl << indent() << _this
-          << "oprot_->writeMessageEnd();" << endl << indent() << _this
-          << "oprot_->getTransport()->writeEnd();" << endl << indent() << _this
-          << "oprot_->getTransport()->flush();" << endl;
+      out << indent() << "args.write(" << _this << "oprot_);" << '\n' << '\n' << indent() << _this
+          << "oprot_->writeMessageEnd();" << '\n' << indent() << _this
+          << "oprot_->getTransport()->writeEnd();" << '\n' << indent() << _this
+          << "oprot_->getTransport()->flush();" << '\n';
 
       if (style == "Concurrent") {
-        out << endl << indent() << "sentry.commit();" << endl;
+        out << '\n' << indent() << "sentry.commit();" << '\n';
 
         if (!(*f_iter)->is_oneway()) {
-          out << indent() << "return cseqid;" << endl;
+          out << indent() << "return cseqid;" << '\n';
         }
       }
       scope_down(out);
-      out << endl;
+      out << '\n';
 
       // Generate recv function only if not an oneway function
       if (!(*f_iter)->is_oneway()) {
@@ -2828,124 +2900,123 @@
         if (gen_templates_) {
           indent(out) << template_header;
         }
-        indent(out) << function_signature(&recv_function, "", scope) << endl;
+        indent(out) << function_signature(&recv_function, "", scope) << '\n';
         scope_up(out);
 
-        out << endl <<
-          indent() << "int32_t rseqid = 0;" << endl <<
-          indent() << "std::string fname;" << endl <<
-          indent() << "::apache::thrift::protocol::TMessageType mtype;" << endl;
+        out << '\n' <<
+          indent() << "int32_t rseqid = 0;" << '\n' <<
+          indent() << "std::string fname;" << '\n' <<
+          indent() << "::apache::thrift::protocol::TMessageType mtype;" << '\n';
         if(style == "Concurrent") {
-          out <<
-            endl <<
-            indent() << "// the read mutex gets dropped and reacquired as part of waitForWork()" << endl <<
-            indent() << "// The destructor of this sentry wakes up other clients" << endl <<
-            indent() << "::apache::thrift::async::TConcurrentRecvSentry sentry(this->sync_.get(), seqid);" << endl;
+          out << '\n' <<
+            indent() << "// the read mutex gets dropped and reacquired as part of waitForWork()" << '\n' <<
+            indent() << "// The destructor of this sentry wakes up other clients" << '\n' <<
+            indent() << "::apache::thrift::async::TConcurrentRecvSentry sentry(this->sync_.get(), seqid);" << '\n';
         }
         if (style == "Cob" && !gen_no_client_completion_) {
-          out << indent() << "bool completed = false;" << endl << endl << indent() << "try {";
+          out << indent() << "bool completed = false;" << '\n' << '\n' << indent() << "try {";
           indent_up();
         }
-        out << endl;
+        out << '\n';
         if (style == "Concurrent") {
           out <<
-            indent() << "while(true) {" << endl <<
-            indent() << "  if(!this->sync_->getPending(fname, mtype, rseqid)) {" << endl;
+            indent() << "while(true) {" << '\n' <<
+            indent() << "  if(!this->sync_->getPending(fname, mtype, rseqid)) {" << '\n';
           indent_up();
           indent_up();
         }
         out <<
-          indent() << _this << "iprot_->readMessageBegin(fname, mtype, rseqid);" << endl;
+          indent() << _this << "iprot_->readMessageBegin(fname, mtype, rseqid);" << '\n';
         if (style == "Concurrent") {
           scope_down(out);
-          out << indent() << "if(seqid == rseqid) {" << endl;
+          out << indent() << "if(seqid == rseqid) {" << '\n';
           indent_up();
         }
         out <<
-          indent() << "if (mtype == ::apache::thrift::protocol::T_EXCEPTION) {" << endl <<
-          indent() << "  ::apache::thrift::TApplicationException x;" << endl <<
-          indent() << "  x.read(" << _this << "iprot_);" << endl <<
-          indent() << "  " << _this << "iprot_->readMessageEnd();" << endl <<
-          indent() << "  " << _this << "iprot_->getTransport()->readEnd();" << endl;
+          indent() << "if (mtype == ::apache::thrift::protocol::T_EXCEPTION) {" << '\n' <<
+          indent() << "  ::apache::thrift::TApplicationException x;" << '\n' <<
+          indent() << "  x.read(" << _this << "iprot_);" << '\n' <<
+          indent() << "  " << _this << "iprot_->readMessageEnd();" << '\n' <<
+          indent() << "  " << _this << "iprot_->getTransport()->readEnd();" << '\n';
         if (style == "Cob" && !gen_no_client_completion_) {
-          out << indent() << "  completed = true;" << endl << indent() << "  completed__(true);"
-              << endl;
+          out << indent() << "  completed = true;" << '\n' << indent() << "  completed__(true);"
+              << '\n';
         }
         if (style == "Concurrent") {
-          out << indent() << "  sentry.commit();" << endl;
+          out << indent() << "  sentry.commit();" << '\n';
         }
         out <<
-          indent() << "  throw x;" << endl <<
-          indent() << "}" << endl <<
-          indent() << "if (mtype != ::apache::thrift::protocol::T_REPLY) {" << endl <<
-          indent() << "  " << _this << "iprot_->skip(" << "::apache::thrift::protocol::T_STRUCT);" << endl <<
-          indent() << "  " << _this << "iprot_->readMessageEnd();" << endl <<
-          indent() << "  " << _this << "iprot_->getTransport()->readEnd();" << endl;
+          indent() << "  throw x;" << '\n' <<
+          indent() << "}" << '\n' <<
+          indent() << "if (mtype != ::apache::thrift::protocol::T_REPLY) {" << '\n' <<
+          indent() << "  " << _this << "iprot_->skip(" << "::apache::thrift::protocol::T_STRUCT);" << '\n' <<
+          indent() << "  " << _this << "iprot_->readMessageEnd();" << '\n' <<
+          indent() << "  " << _this << "iprot_->getTransport()->readEnd();" << '\n';
         if (style == "Cob" && !gen_no_client_completion_) {
-          out << indent() << "  completed = true;" << endl << indent() << "  completed__(false);"
-              << endl;
+          out << indent() << "  completed = true;" << '\n' << indent() << "  completed__(false);"
+              << '\n';
         }
         out <<
-          indent() << "}" << endl <<
-          indent() << "if (fname.compare(\"" << (*f_iter)->get_name() << "\") != 0) {" << endl <<
-          indent() << "  " << _this << "iprot_->skip(" << "::apache::thrift::protocol::T_STRUCT);" << endl <<
-          indent() << "  " << _this << "iprot_->readMessageEnd();" << endl <<
-          indent() << "  " << _this << "iprot_->getTransport()->readEnd();" << endl;
+          indent() << "}" << '\n' <<
+          indent() << "if (fname.compare(\"" << (*f_iter)->get_name() << "\") != 0) {" << '\n' <<
+          indent() << "  " << _this << "iprot_->skip(" << "::apache::thrift::protocol::T_STRUCT);" << '\n' <<
+          indent() << "  " << _this << "iprot_->readMessageEnd();" << '\n' <<
+          indent() << "  " << _this << "iprot_->getTransport()->readEnd();" << '\n';
         if (style == "Cob" && !gen_no_client_completion_) {
-          out << indent() << "  completed = true;" << endl << indent() << "  completed__(false);"
-              << endl;
+          out << indent() << "  completed = true;" << '\n' << indent() << "  completed__(false);"
+              << '\n';
         }
         if (style == "Concurrent") {
-          out << endl <<
-            indent() << "  // in a bad state, don't commit" << endl <<
-            indent() << "  using ::apache::thrift::protocol::TProtocolException;" << endl <<
-            indent() << "  throw TProtocolException(TProtocolException::INVALID_DATA);" << endl;
+          out << '\n' <<
+            indent() << "  // in a bad state, don't commit" << '\n' <<
+            indent() << "  using ::apache::thrift::protocol::TProtocolException;" << '\n' <<
+            indent() << "  throw TProtocolException(TProtocolException::INVALID_DATA);" << '\n';
         }
-        out << indent() << "}" << endl;
+        out << indent() << "}" << '\n';
 
         if (!(*f_iter)->get_returntype()->is_void()
             && !is_complex_type((*f_iter)->get_returntype())) {
           t_field returnfield((*f_iter)->get_returntype(), "_return");
-          out << indent() << declare_field(&returnfield) << endl;
+          out << indent() << declare_field(&returnfield) << '\n';
         }
 
-        out << indent() << resultname << " result;" << endl;
+        out << indent() << resultname << " result;" << '\n';
 
         if (!(*f_iter)->get_returntype()->is_void()) {
-          out << indent() << "result.success = &_return;" << endl;
+          out << indent() << "result.success = &_return;" << '\n';
         }
 
-        out << indent() << "result.read(" << _this << "iprot_);" << endl << indent() << _this
-            << "iprot_->readMessageEnd();" << endl << indent() << _this
-            << "iprot_->getTransport()->readEnd();" << endl << endl;
+        out << indent() << "result.read(" << _this << "iprot_);" << '\n' << indent() << _this
+            << "iprot_->readMessageEnd();" << '\n' << indent() << _this
+            << "iprot_->getTransport()->readEnd();" << '\n' << '\n';
 
         // Careful, only look for _result if not a void function
         if (!(*f_iter)->get_returntype()->is_void()) {
           if (is_complex_type((*f_iter)->get_returntype())) {
             out <<
-              indent() << "if (result.__isset.success) {" << endl;
+              indent() << "if (result.__isset.success) {" << '\n';
             out <<
-              indent() << "  // _return pointer has now been filled" << endl;
+              indent() << "  // _return pointer has now been filled" << '\n';
             if (style == "Cob" && !gen_no_client_completion_) {
-              out << indent() << "  completed = true;" << endl << indent() << "  completed__(true);"
-                  << endl;
+              out << indent() << "  completed = true;" << '\n' << indent() << "  completed__(true);"
+                  << '\n';
             }
             if (style == "Concurrent") {
-              out << indent() << "  sentry.commit();" << endl;
+              out << indent() << "  sentry.commit();" << '\n';
             }
             out <<
-              indent() << "  return;" << endl <<
-              indent() << "}" << endl;
+              indent() << "  return;" << '\n' <<
+              indent() << "}" << '\n';
           } else {
-            out << indent() << "if (result.__isset.success) {" << endl;
+            out << indent() << "if (result.__isset.success) {" << '\n';
             if (style == "Cob" && !gen_no_client_completion_) {
-              out << indent() << "  completed = true;" << endl << indent() << "  completed__(true);"
-                  << endl;
+              out << indent() << "  completed = true;" << '\n' << indent() << "  completed__(true);"
+                  << '\n';
             }
             if (style == "Concurrent") {
-              out << indent() << "  sentry.commit();" << endl;
+              out << indent() << "  sentry.commit();" << '\n';
             }
-            out << indent() << "  return _return;" << endl << indent() << "}" << endl;
+            out << indent() << "  return _return;" << '\n' << indent() << "}" << '\n';
           }
         }
 
@@ -2953,62 +3024,62 @@
         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) {
-          out << indent() << "if (result.__isset." << (*x_iter)->get_name() << ") {" << endl;
+          out << indent() << "if (result.__isset." << (*x_iter)->get_name() << ") {" << '\n';
           if (style == "Cob" && !gen_no_client_completion_) {
-            out << indent() << "  completed = true;" << endl << indent() << "  completed__(true);"
-                << endl;
+            out << indent() << "  completed = true;" << '\n' << indent() << "  completed__(true);"
+                << '\n';
           }
           if (style == "Concurrent") {
-            out << indent() << "  sentry.commit();" << endl;
+            out << indent() << "  sentry.commit();" << '\n';
           }
-          out << indent() << "  throw result." << (*x_iter)->get_name() << ";" << endl << indent()
-              << "}" << endl;
+          out << indent() << "  throw result." << (*x_iter)->get_name() << ";" << '\n' << indent()
+              << "}" << '\n';
         }
 
         // We only get here if we are a void function
         if ((*f_iter)->get_returntype()->is_void()) {
           if (style == "Cob" && !gen_no_client_completion_) {
-            out << indent() << "completed = true;" << endl << indent() << "completed__(true);"
-                << endl;
+            out << indent() << "completed = true;" << '\n' << indent() << "completed__(true);"
+                << '\n';
           }
           if (style == "Concurrent") {
-            out << indent() << "sentry.commit();" << endl;
+            out << indent() << "sentry.commit();" << '\n';
           }
-          indent(out) << "return;" << endl;
+          indent(out) << "return;" << '\n';
         } else {
           if (style == "Cob" && !gen_no_client_completion_) {
-            out << indent() << "completed = true;" << endl << indent() << "completed__(true);"
-                << endl;
+            out << indent() << "completed = true;" << '\n' << indent() << "completed__(true);"
+                << '\n';
           }
           if (style == "Concurrent") {
-            out << indent() << "// in a bad state, don't commit" << endl;
+            out << indent() << "// in a bad state, don't commit" << '\n';
           }
           out << indent() << "throw "
                              "::apache::thrift::TApplicationException(::apache::thrift::"
                              "TApplicationException::MISSING_RESULT, \"" << (*f_iter)->get_name()
-              << " failed: unknown result\");" << endl;
+              << " failed: unknown result\");" << '\n';
         }
         if (style == "Concurrent") {
           indent_down();
           indent_down();
-          out <<
-            indent() << "  }" << endl <<
-            indent() << "  // seqid != rseqid" << endl <<
-            indent() << "  this->sync_->updatePending(fname, mtype, rseqid);" << endl <<
-            endl <<
-            indent() << "  // this will temporarily unlock the readMutex, and let other clients get work done" << endl <<
-            indent() << "  this->sync_->waitForWork(seqid);" << endl <<
-            indent() << "} // end while(true)" << endl;
+          out << indent() << "  }" << '\n'
+              << indent() << "  // seqid != rseqid" << '\n'
+              << indent() << "  this->sync_->updatePending(fname, mtype, rseqid);" << '\n'
+              << '\n'
+              << indent()
+              << "  // this will temporarily unlock the readMutex, and let other clients get work done" << '\n'
+              << indent() << "  this->sync_->waitForWork(seqid);" << '\n'
+              << indent() << "} // end while(true)" << '\n';
         }
         if (style == "Cob" && !gen_no_client_completion_) {
           indent_down();
-          out << indent() << "} catch (...) {" << endl << indent() << "  if (!completed) {" << endl
-              << indent() << "    completed__(false);" << endl << indent() << "  }" << endl
-              << indent() << "  throw;" << endl << indent() << "}" << endl;
+          out << indent() << "} catch (...) {" << '\n' << indent() << "  if (!completed) {" << '\n'
+              << indent() << "    completed__(false);" << '\n' << indent() << "  }" << '\n'
+              << indent() << "  throw;" << '\n' << indent() << "}" << '\n';
         }
         // Close function
         scope_down(out);
-        out << endl;
+        out << '\n';
       }
     }
   }
@@ -3144,61 +3215,61 @@
 
   // Generate the header portion
   f_header_ << template_header_ << "class " << class_name_ << " : public " << parent_class << " {"
-            << endl;
+            << '\n';
 
   // Protected data members
-  f_header_ << " protected:" << endl;
+  f_header_ << " protected:" << '\n';
   indent_up();
-  f_header_ << indent() << "::std::shared_ptr<" << if_name_ << "> iface_;" << endl;
+  f_header_ << indent() << "::std::shared_ptr<" << if_name_ << "> iface_;" << '\n';
   f_header_ << indent() << "virtual " << ret_type_ << "dispatchCall(" << finish_cob_
             << "::apache::thrift::protocol::TProtocol* iprot, "
             << "::apache::thrift::protocol::TProtocol* oprot, "
-            << "const std::string& fname, int32_t seqid" << call_context_ 
-            << ") override;" << endl;
+            << "const std::string& fname, int32_t seqid" << call_context_
+            << ") override;" << '\n';
   if (generator_->gen_templates_) {
     f_header_ << indent() << "virtual " << ret_type_ << "dispatchCallTemplated(" << finish_cob_
               << "Protocol_* iprot, Protocol_* oprot, "
-              << "const std::string& fname, int32_t seqid" << call_context_ << ");" << endl;
+              << "const std::string& fname, int32_t seqid" << call_context_ << ");" << '\n';
   }
   indent_down();
 
   // Process function declarations
-  f_header_ << " private:" << endl;
+  f_header_ << " private:" << '\n';
   indent_up();
 
   // Declare processMap_
   f_header_ << indent() << "typedef  void (" << class_name_ << "::*"
             << "ProcessFunction)(" << finish_cob_decl_ << "int32_t, "
             << "::apache::thrift::protocol::TProtocol*, "
-            << "::apache::thrift::protocol::TProtocol*" << call_context_decl_ << ");" << endl;
+            << "::apache::thrift::protocol::TProtocol*" << call_context_decl_ << ");" << '\n';
   if (generator_->gen_templates_) {
     f_header_ << indent() << "typedef void (" << class_name_ << "::*"
               << "SpecializedProcessFunction)(" << finish_cob_decl_ << "int32_t, "
-              << "Protocol_*, Protocol_*" << call_context_decl_ << ");" << endl << indent()
-              << "struct ProcessFunctions {" << endl << indent() << "  ProcessFunction generic;"
-              << endl << indent() << "  SpecializedProcessFunction specialized;" << endl << indent()
+              << "Protocol_*, Protocol_*" << call_context_decl_ << ");" << '\n' << indent()
+              << "struct ProcessFunctions {" << '\n' << indent() << "  ProcessFunction generic;"
+              << '\n' << indent() << "  SpecializedProcessFunction specialized;" << '\n' << indent()
               << "  ProcessFunctions(ProcessFunction g, "
-              << "SpecializedProcessFunction s) :" << endl << indent() << "    generic(g)," << endl
-              << indent() << "    specialized(s) {}" << endl << indent()
+              << "SpecializedProcessFunction s) :" << '\n' << indent() << "    generic(g)," << '\n'
+              << indent() << "    specialized(s) {}" << '\n' << indent()
               << "  ProcessFunctions() : generic(nullptr), specialized(nullptr) "
-              << "{}" << endl << indent() << "};" << endl << indent()
+              << "{}" << '\n' << indent() << "};" << '\n' << indent()
               << "typedef std::map<std::string, ProcessFunctions> "
-              << "ProcessMap;" << endl;
+              << "ProcessMap;" << '\n';
   } else {
     f_header_ << indent() << "typedef std::map<std::string, ProcessFunction> "
-              << "ProcessMap;" << endl;
+              << "ProcessMap;" << '\n';
   }
-  f_header_ << indent() << "ProcessMap processMap_;" << endl;
+  f_header_ << indent() << "ProcessMap processMap_;" << '\n';
 
   for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
     indent(f_header_) << "void process_" << (*f_iter)->get_name() << "(" << finish_cob_
                       << "int32_t seqid, ::apache::thrift::protocol::TProtocol* iprot, "
                          "::apache::thrift::protocol::TProtocol* oprot" << call_context_ << ");"
-                      << endl;
+                      << '\n';
     if (generator_->gen_templates_) {
       indent(f_header_) << "void process_" << (*f_iter)->get_name() << "(" << finish_cob_
                         << "int32_t seqid, Protocol_* iprot, Protocol_* oprot" << call_context_
-                        << ");" << endl;
+                        << ");" << '\n';
     }
     if (style_ == "Cob") {
       // XXX Factor this out, even if it is a pain.
@@ -3208,56 +3279,56 @@
       f_header_ << indent() << "void return_" << (*f_iter)->get_name()
                 << "(::std::function<void(bool ok)> cob, int32_t seqid, "
                 << "::apache::thrift::protocol::TProtocol* oprot, "
-                << "void* ctx" << ret_arg << ");" << endl;
+                << "void* ctx" << ret_arg << ");" << '\n';
       if (generator_->gen_templates_) {
         f_header_ << indent() << "void return_" << (*f_iter)->get_name()
                   << "(::std::function<void(bool ok)> cob, int32_t seqid, "
-                  << "Protocol_* oprot, void* ctx" << ret_arg << ");" << endl;
+                  << "Protocol_* oprot, void* ctx" << ret_arg << ");" << '\n';
       }
       // XXX Don't declare throw if it doesn't exist
       f_header_ << indent() << "void throw_" << (*f_iter)->get_name()
                 << "(::std::function<void(bool ok)> cob, int32_t seqid, "
                 << "::apache::thrift::protocol::TProtocol* oprot, void* ctx, "
-                << "::apache::thrift::TDelayedException* _throw);" << endl;
+                << "::apache::thrift::TDelayedException* _throw);" << '\n';
       if (generator_->gen_templates_) {
         f_header_ << indent() << "void throw_" << (*f_iter)->get_name()
                   << "(::std::function<void(bool ok)> cob, int32_t seqid, "
                   << "Protocol_* oprot, void* ctx, "
-                  << "::apache::thrift::TDelayedException* _throw);" << endl;
+                  << "::apache::thrift::TDelayedException* _throw);" << '\n';
       }
     }
   }
 
-  f_header_ << " public:" << endl << indent() << class_name_ << "(::std::shared_ptr<" << if_name_
-            << "> iface) :" << endl;
+  f_header_ << " public:" << '\n' << indent() << class_name_ << "(::std::shared_ptr<" << if_name_
+            << "> iface) :" << '\n';
   if (!extends_.empty()) {
-    f_header_ << indent() << "  " << extends_ << "(iface)," << endl;
+    f_header_ << indent() << "  " << extends_ << "(iface)," << '\n';
   }
-  f_header_ << indent() << "  iface_(iface) {" << endl;
+  f_header_ << indent() << "  iface_(iface) {" << '\n';
   indent_up();
 
   for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
     f_header_ << indent() << "processMap_[\"" << (*f_iter)->get_name() << "\"] = ";
     if (generator_->gen_templates_) {
-      f_header_ << "ProcessFunctions(" << endl;
+      f_header_ << "ProcessFunctions(" << '\n';
       if (generator_->gen_templates_only_) {
-        indent(f_header_) << "  nullptr," << endl;
+        indent(f_header_) << "  nullptr," << '\n';
       } else {
         indent(f_header_) << "  &" << class_name_ << "::process_" << (*f_iter)->get_name() << ","
-                          << endl;
+                          << '\n';
       }
       indent(f_header_) << "  &" << class_name_ << "::process_" << (*f_iter)->get_name() << ")";
     } else {
       f_header_ << "&" << class_name_ << "::process_" << (*f_iter)->get_name();
     }
-    f_header_ << ";" << endl;
+    f_header_ << ";" << '\n';
   }
 
   indent_down();
-  f_header_ << indent() << "}" << endl << endl << indent() << "virtual ~" << class_name_ << "() {}"
-            << endl;
+  f_header_ << indent() << "}" << '\n' << '\n' << indent() << "virtual ~" << class_name_ << "() {}"
+            << '\n';
   indent_down();
-  f_header_ << "};" << endl << endl;
+  f_header_ << "};" << '\n' << '\n';
 
   if (generator_->gen_templates_) {
     // Generate a backwards compatible typedef, for callers who don't know
@@ -3270,7 +3341,7 @@
     // Therefore, we define TDummyProtocol solely so we can use it as the
     // template parameter here.
     f_header_ << "typedef " << class_name_ << "< ::apache::thrift::protocol::TDummyProtocol > "
-              << service_name_ << pstyle_ << "Processor;" << endl << endl;
+              << service_name_ << pstyle_ << "Processor;" << '\n' << '\n';
   }
 }
 
@@ -3292,32 +3363,32 @@
   f_out_ << template_header_ << ret_type_ << class_name_ << template_suffix_ << "::dispatchCall"
          << function_suffix << "(" << finish_cob_ << protocol << "* iprot, " << protocol
          << "* oprot, "
-         << "const std::string& fname, int32_t seqid" << call_context_ << ") {" << endl;
+         << "const std::string& fname, int32_t seqid" << call_context_ << ") {" << '\n';
   indent_up();
 
   // HOT: member function pointer map
-  f_out_ << indent() << typename_str_ << "ProcessMap::iterator pfn;" << endl << indent()
-         << "pfn = processMap_.find(fname);" << endl << indent()
-         << "if (pfn == processMap_.end()) {" << endl;
+  f_out_ << indent() << typename_str_ << "ProcessMap::iterator pfn;" << '\n' << indent()
+         << "pfn = processMap_.find(fname);" << '\n' << indent()
+         << "if (pfn == processMap_.end()) {" << '\n';
   if (extends_.empty()) {
-    f_out_ << indent() << "  iprot->skip(::apache::thrift::protocol::T_STRUCT);" << endl << indent()
-           << "  iprot->readMessageEnd();" << endl << indent()
-           << "  iprot->getTransport()->readEnd();" << endl << indent()
+    f_out_ << indent() << "  iprot->skip(::apache::thrift::protocol::T_STRUCT);" << '\n' << indent()
+           << "  iprot->readMessageEnd();" << '\n' << indent()
+           << "  iprot->getTransport()->readEnd();" << '\n' << indent()
            << "  ::apache::thrift::TApplicationException "
               "x(::apache::thrift::TApplicationException::UNKNOWN_METHOD, \"Invalid method name: "
-              "'\"+fname+\"'\");" << endl << indent()
+              "'\"+fname+\"'\");" << '\n' << indent()
            << "  oprot->writeMessageBegin(fname, ::apache::thrift::protocol::T_EXCEPTION, seqid);"
-           << endl << indent() << "  x.write(oprot);" << endl << indent()
-           << "  oprot->writeMessageEnd();" << endl << indent()
-           << "  oprot->getTransport()->writeEnd();" << endl << indent()
-           << "  oprot->getTransport()->flush();" << endl << indent()
-           << (style_ == "Cob" ? "  return cob(true);" : "  return true;") << endl;
+           << '\n' << indent() << "  x.write(oprot);" << '\n' << indent()
+           << "  oprot->writeMessageEnd();" << '\n' << indent()
+           << "  oprot->getTransport()->writeEnd();" << '\n' << indent()
+           << "  oprot->getTransport()->flush();" << '\n' << indent()
+           << (style_ == "Cob" ? "  return cob(true);" : "  return true;") << '\n';
   } else {
     f_out_ << indent() << "  return " << extends_ << "::dispatchCall("
            << (style_ == "Cob" ? "cob, " : "") << "iprot, oprot, fname, seqid" << call_context_arg_
-           << ");" << endl;
+           << ");" << '\n';
   }
-  f_out_ << indent() << "}" << endl;
+  f_out_ << indent() << "}" << '\n';
   if (template_protocol) {
     f_out_ << indent() << "(this->*(pfn->second.specialized))";
   } else {
@@ -3331,17 +3402,17 @@
       f_out_ << indent() << "(this->*(pfn->second))";
     }
   }
-  f_out_ << "(" << cob_arg_ << "seqid, iprot, oprot" << call_context_arg_ << ");" << endl;
+  f_out_ << "(" << cob_arg_ << "seqid, iprot, oprot" << call_context_arg_ << ");" << '\n';
 
   // TODO(dreiss): return pfn ret?
   if (style_ == "Cob") {
-    f_out_ << indent() << "return;" << endl;
+    f_out_ << indent() << "return;" << '\n';
   } else {
-    f_out_ << indent() << "return true;" << endl;
+    f_out_ << indent() << "return true;" << '\n';
   }
 
   indent_down();
-  f_out_ << "}" << endl << endl;
+  f_out_ << "}" << '\n' << '\n';
 }
 
 void ProcessorGenerator::generate_process_functions() {
@@ -3363,49 +3434,49 @@
   // Generate the factory class definition
   f_header_ << template_header_ << "class " << factory_class_name_ << " : public ::apache::thrift::"
             << (style_ == "Cob" ? "async::TAsyncProcessorFactory" : "TProcessorFactory") << " {"
-            << endl << " public:" << endl;
+            << '\n' << " public:" << '\n';
   indent_up();
 
   f_header_ << indent() << factory_class_name_ << "(const ::std::shared_ptr< " << if_factory_name
-            << " >& handlerFactory) noexcept :" << endl << indent()
-            << "    handlerFactory_(handlerFactory) {}" << endl << endl << indent()
+            << " >& handlerFactory) noexcept :" << '\n' << indent()
+            << "    handlerFactory_(handlerFactory) {}" << '\n' << '\n' << indent()
             << "::std::shared_ptr< ::apache::thrift::"
             << (style_ == "Cob" ? "async::TAsyncProcessor" : "TProcessor") << " > "
             << "getProcessor(const ::apache::thrift::TConnectionInfo& connInfo) override;"
-            << endl;
+            << '\n';
 
-  f_header_ << endl << " protected:" << endl << indent() << "::std::shared_ptr< "
-            << if_factory_name << " > handlerFactory_;" << endl;
+  f_header_ << '\n' << " protected:" << '\n' << indent() << "::std::shared_ptr< "
+            << if_factory_name << " > handlerFactory_;" << '\n';
 
   indent_down();
-  f_header_ << "};" << endl << endl;
+  f_header_ << "};" << '\n' << '\n';
 
   // If we are generating templates, output a typedef for the plain
   // factory name.
   if (generator_->gen_templates_) {
     f_header_ << "typedef " << factory_class_name_
               << "< ::apache::thrift::protocol::TDummyProtocol > " << service_name_ << pstyle_
-              << "ProcessorFactory;" << endl << endl;
+              << "ProcessorFactory;" << '\n' << '\n';
   }
 
   // Generate the getProcessor() method
   f_out_ << template_header_ << indent() << "::std::shared_ptr< ::apache::thrift::"
          << (style_ == "Cob" ? "async::TAsyncProcessor" : "TProcessor") << " > "
          << factory_class_name_ << template_suffix_ << "::getProcessor("
-         << "const ::apache::thrift::TConnectionInfo& connInfo) {" << endl;
+         << "const ::apache::thrift::TConnectionInfo& connInfo) {" << '\n';
   indent_up();
 
   f_out_ << indent() << "::apache::thrift::ReleaseHandler< " << if_factory_name
-         << " > cleanup(handlerFactory_);" << endl << indent() << "::std::shared_ptr< "
+         << " > cleanup(handlerFactory_);" << '\n' << indent() << "::std::shared_ptr< "
          << if_name_ << " > handler("
-         << "handlerFactory_->getHandler(connInfo), cleanup);" << endl << indent()
+         << "handlerFactory_->getHandler(connInfo), cleanup);" << '\n' << indent()
          << "::std::shared_ptr< ::apache::thrift::"
          << (style_ == "Cob" ? "async::TAsyncProcessor" : "TProcessor") << " > "
-         << "processor(new " << class_name_ << template_suffix_ << "(handler));" << endl << indent()
-         << "return processor;" << endl;
+         << "processor(new " << class_name_ << template_suffix_ << "(handler));" << '\n' << indent()
+         << "return processor;" << '\n';
 
   indent_down();
-  f_out_ << indent() << "}" << endl << endl;
+  f_out_ << indent() << "}" << '\n' << '\n';
 }
 
 /**
@@ -3450,7 +3521,7 @@
 
   result.set_name(tservice->get_name() + "_" + tfunction->get_name() + "_presult");
   generate_struct_declaration(f_header_, &result, false, true, true, gen_cob_style_);
-  generate_struct_definition(out, f_service_, &result, false);
+  generate_struct_definition(out, f_service_, &result, false, false, true);
   generate_struct_reader(out, &result, true);
   if (gen_cob_style_) {
     generate_struct_writer(out, &result, true);
@@ -3487,45 +3558,45 @@
   if (style != "Cob") {
     // Open function
     if (gen_templates_) {
-      out << indent() << "template <class Protocol_>" << endl;
+      out << indent() << "template <class Protocol_>" << '\n';
     }
     const bool unnamed_oprot_seqid = tfunction->is_oneway() && !(gen_templates_ && !specialized);
     out << "void " << tservice->get_name() << "Processor" << class_suffix << "::"
         << "process_" << tfunction->get_name() << "("
         << "int32_t" << (unnamed_oprot_seqid ? ", " : " seqid, ") << prot_type << "* iprot, "
         << prot_type << "*" << (unnamed_oprot_seqid ? ", " : " oprot, ") << "void* callContext)"
-        << endl;
+        << '\n';
     scope_up(out);
 
     string argsname = tservice->get_name() + "_" + tfunction->get_name() + "_args";
     string resultname = tservice->get_name() + "_" + tfunction->get_name() + "_result";
 
     if (tfunction->is_oneway() && !unnamed_oprot_seqid) {
-      out << indent() << "(void) seqid;" << endl << indent() << "(void) oprot;" << endl;
+      out << indent() << "(void) seqid;" << '\n' << indent() << "(void) oprot;" << '\n';
     }
 
-    out << indent() << "void* ctx = nullptr;" << endl << indent()
-        << "if (this->eventHandler_.get() != nullptr) {" << endl << indent()
+    out << indent() << "void* ctx = nullptr;" << '\n' << indent()
+        << "if (this->eventHandler_.get() != nullptr) {" << '\n' << indent()
         << "  ctx = this->eventHandler_->getContext(" << service_func_name << ", callContext);"
-        << endl << indent() << "}" << endl << indent()
+        << '\n' << indent() << "}" << '\n' << indent()
         << "::apache::thrift::TProcessorContextFreer freer("
-        << "this->eventHandler_.get(), ctx, " << service_func_name << ");" << endl << endl
-        << indent() << "if (this->eventHandler_.get() != nullptr) {" << endl << indent()
-        << "  this->eventHandler_->preRead(ctx, " << service_func_name << ");" << endl << indent()
-        << "}" << endl << endl << indent() << argsname << " args;" << endl << indent()
-        << "args.read(iprot);" << endl << indent() << "iprot->readMessageEnd();" << endl << indent()
-        << "uint32_t bytes = iprot->getTransport()->readEnd();" << endl << endl << indent()
-        << "if (this->eventHandler_.get() != nullptr) {" << endl << indent()
-        << "  this->eventHandler_->postRead(ctx, " << service_func_name << ", bytes);" << endl
-        << indent() << "}" << endl << endl;
+        << "this->eventHandler_.get(), ctx, " << service_func_name << ");" << '\n' << '\n'
+        << indent() << "if (this->eventHandler_.get() != nullptr) {" << '\n' << indent()
+        << "  this->eventHandler_->preRead(ctx, " << service_func_name << ");" << '\n' << indent()
+        << "}" << '\n' << '\n' << indent() << argsname << " args;" << '\n' << indent()
+        << "args.read(iprot);" << '\n' << indent() << "iprot->readMessageEnd();" << '\n' << indent()
+        << "uint32_t bytes = iprot->getTransport()->readEnd();" << '\n' << '\n' << indent()
+        << "if (this->eventHandler_.get() != nullptr) {" << '\n' << indent()
+        << "  this->eventHandler_->postRead(ctx, " << service_func_name << ", bytes);" << '\n'
+        << indent() << "}" << '\n' << '\n';
 
     // Declare result
     if (!tfunction->is_oneway()) {
-      out << indent() << resultname << " result;" << endl;
+      out << indent() << resultname << " result;" << '\n';
     }
 
     // Try block for functions with exceptions
-    out << indent() << "try {" << endl;
+    out << indent() << "try {" << '\n';
     indent_up();
 
     // Generate the function call
@@ -3549,11 +3620,11 @@
       }
       out << "args." << (*f_iter)->get_name();
     }
-    out << ");" << endl;
+    out << ");" << '\n';
 
     // Set isset on success field
     if (!tfunction->is_oneway() && !tfunction->get_returntype()->is_void()) {
-      out << indent() << "result.__isset.success = true;" << endl;
+      out << indent() << "result.__isset.success = true;" << '\n';
     }
 
     indent_down();
@@ -3562,12 +3633,12 @@
     if (!tfunction->is_oneway()) {
       for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) {
         out << " catch (" << type_name((*x_iter)->get_type()) << " &" << (*x_iter)->get_name()
-            << ") {" << endl;
+            << ") {" << '\n';
         if (!tfunction->is_oneway()) {
           indent_up();
           out << indent() << "result." << (*x_iter)->get_name()
-                          << " = std::move(" << (*x_iter)->get_name() << ");" << endl
-              << indent() << "result.__isset." << (*x_iter)->get_name() << " = true;" << endl;
+                          << " = std::move(" << (*x_iter)->get_name() << ");" << '\n'
+              << indent() << "result.__isset." << (*x_iter)->get_name() << " = true;" << '\n';
           indent_down();
           out << indent() << "}";
         } else {
@@ -3577,53 +3648,53 @@
     }
 
     if (!tfunction->is_oneway()) {
-      out << " catch (const std::exception& e) {" << endl;
+      out << " catch (const std::exception& e) {" << '\n';
     } else {
-      out << " catch (const std::exception&) {" << endl;
+      out << " catch (const std::exception&) {" << '\n';
     }
 
     indent_up();
-    out << indent() << "if (this->eventHandler_.get() != nullptr) {" << endl << indent()
-        << "  this->eventHandler_->handlerError(ctx, " << service_func_name << ");" << endl
-        << indent() << "}" << endl;
+    out << indent() << "if (this->eventHandler_.get() != nullptr) {" << '\n' << indent()
+        << "  this->eventHandler_->handlerError(ctx, " << service_func_name << ");" << '\n'
+        << indent() << "}" << '\n';
 
     if (!tfunction->is_oneway()) {
-      out << endl << indent() << "::apache::thrift::TApplicationException x(e.what());" << endl
+      out << '\n' << indent() << "::apache::thrift::TApplicationException x(e.what());" << '\n'
           << indent() << "oprot->writeMessageBegin(\"" << tfunction->get_name()
-          << "\", ::apache::thrift::protocol::T_EXCEPTION, seqid);" << endl << indent()
-          << "x.write(oprot);" << endl << indent() << "oprot->writeMessageEnd();" << endl
-          << indent() << "oprot->getTransport()->writeEnd();" << endl << indent()
-          << "oprot->getTransport()->flush();" << endl;
+          << "\", ::apache::thrift::protocol::T_EXCEPTION, seqid);" << '\n' << indent()
+          << "x.write(oprot);" << '\n' << indent() << "oprot->writeMessageEnd();" << '\n'
+          << indent() << "oprot->getTransport()->writeEnd();" << '\n' << indent()
+          << "oprot->getTransport()->flush();" << '\n';
     }
-    out << indent() << "return;" << endl;
+    out << indent() << "return;" << '\n';
     indent_down();
-    out << indent() << "}" << endl << endl;
+    out << indent() << "}" << '\n' << '\n';
 
     // Shortcut out here for oneway functions
     if (tfunction->is_oneway()) {
-      out << indent() << "if (this->eventHandler_.get() != nullptr) {" << endl << indent()
-          << "  this->eventHandler_->asyncComplete(ctx, " << service_func_name << ");" << endl
-          << indent() << "}" << endl << endl << indent() << "return;" << endl;
+      out << indent() << "if (this->eventHandler_.get() != nullptr) {" << '\n' << indent()
+          << "  this->eventHandler_->asyncComplete(ctx, " << service_func_name << ");" << '\n'
+          << indent() << "}" << '\n' << '\n' << indent() << "return;" << '\n';
       indent_down();
-      out << "}" << endl << endl;
+      out << "}" << '\n' << '\n';
       return;
     }
 
     // Serialize the result into a struct
-    out << indent() << "if (this->eventHandler_.get() != nullptr) {" << endl << indent()
-        << "  this->eventHandler_->preWrite(ctx, " << service_func_name << ");" << endl << indent()
-        << "}" << endl << endl << indent() << "oprot->writeMessageBegin(\"" << tfunction->get_name()
-        << "\", ::apache::thrift::protocol::T_REPLY, seqid);" << endl << indent()
-        << "result.write(oprot);" << endl << indent() << "oprot->writeMessageEnd();" << endl
-        << indent() << "bytes = oprot->getTransport()->writeEnd();" << endl << indent()
-        << "oprot->getTransport()->flush();" << endl << endl << indent()
-        << "if (this->eventHandler_.get() != nullptr) {" << endl << indent()
-        << "  this->eventHandler_->postWrite(ctx, " << service_func_name << ", bytes);" << endl
-        << indent() << "}" << endl;
+    out << indent() << "if (this->eventHandler_.get() != nullptr) {" << '\n' << indent()
+        << "  this->eventHandler_->preWrite(ctx, " << service_func_name << ");" << '\n' << indent()
+        << "}" << '\n' << '\n' << indent() << "oprot->writeMessageBegin(\"" << tfunction->get_name()
+        << "\", ::apache::thrift::protocol::T_REPLY, seqid);" << '\n' << indent()
+        << "result.write(oprot);" << '\n' << indent() << "oprot->writeMessageEnd();" << '\n'
+        << indent() << "bytes = oprot->getTransport()->writeEnd();" << '\n' << indent()
+        << "oprot->getTransport()->flush();" << '\n' << '\n' << indent()
+        << "if (this->eventHandler_.get() != nullptr) {" << '\n' << indent()
+        << "  this->eventHandler_->postWrite(ctx, " << service_func_name << ", bytes);" << '\n'
+        << indent() << "}" << '\n';
 
     // Close function
     scope_down(out);
-    out << endl;
+    out << '\n';
   }
 
   // Cob style.
@@ -3631,11 +3702,11 @@
     // Processor entry point.
     // TODO(edhall) update for callContext when TEventServer is ready
     if (gen_templates_) {
-      out << indent() << "template <class Protocol_>" << endl;
+      out << indent() << "template <class Protocol_>" << '\n';
     }
     out << "void " << tservice->get_name() << "AsyncProcessor" << class_suffix << "::process_"
         << tfunction->get_name() << "(::std::function<void(bool ok)> cob, int32_t seqid, "
-        << prot_type << "* iprot, " << prot_type << "* oprot)" << endl;
+        << prot_type << "* iprot, " << prot_type << "* oprot)" << '\n';
     scope_up(out);
 
     // TODO(simpkins): we could try to consoldate this
@@ -3643,55 +3714,55 @@
     if (gen_templates_ && !specialized) {
       // If these are instances of Protocol_, instead of any old TProtocol,
       // use the specialized process function instead.
-      out << indent() << "Protocol_* _iprot = dynamic_cast<Protocol_*>(iprot);" << endl << indent()
-          << "Protocol_* _oprot = dynamic_cast<Protocol_*>(oprot);" << endl << indent()
-          << "if (_iprot && _oprot) {" << endl << indent() << "  return process_"
-          << tfunction->get_name() << "(cob, seqid, _iprot, _oprot);" << endl << indent() << "}"
-          << endl << indent() << "T_GENERIC_PROTOCOL(this, iprot, _iprot);" << endl << indent()
-          << "T_GENERIC_PROTOCOL(this, oprot, _oprot);" << endl << endl;
+      out << indent() << "Protocol_* _iprot = dynamic_cast<Protocol_*>(iprot);" << '\n' << indent()
+          << "Protocol_* _oprot = dynamic_cast<Protocol_*>(oprot);" << '\n' << indent()
+          << "if (_iprot && _oprot) {" << '\n' << indent() << "  return process_"
+          << tfunction->get_name() << "(cob, seqid, _iprot, _oprot);" << '\n' << indent() << "}"
+          << '\n' << indent() << "T_GENERIC_PROTOCOL(this, iprot, _iprot);" << '\n' << indent()
+          << "T_GENERIC_PROTOCOL(this, oprot, _oprot);" << '\n' << '\n';
     }
 
     if (tfunction->is_oneway()) {
-      out << indent() << "(void) seqid;" << endl << indent() << "(void) oprot;" << endl;
+      out << indent() << "(void) seqid;" << '\n' << indent() << "(void) oprot;" << '\n';
     }
 
-    out << indent() << tservice->get_name() + "_" + tfunction->get_name() << "_args args;" << endl
-        << indent() << "void* ctx = nullptr;" << endl << indent()
-        << "if (this->eventHandler_.get() != nullptr) {" << endl << indent()
-        << "  ctx = this->eventHandler_->getContext(" << service_func_name << ", nullptr);" << endl
-        << indent() << "}" << endl << indent() << "::apache::thrift::TProcessorContextFreer freer("
-        << "this->eventHandler_.get(), ctx, " << service_func_name << ");" << endl << endl
-        << indent() << "try {" << endl;
+    out << indent() << tservice->get_name() + "_" + tfunction->get_name() << "_args args;" << '\n'
+        << indent() << "void* ctx = nullptr;" << '\n' << indent()
+        << "if (this->eventHandler_.get() != nullptr) {" << '\n' << indent()
+        << "  ctx = this->eventHandler_->getContext(" << service_func_name << ", nullptr);" << '\n'
+        << indent() << "}" << '\n' << indent() << "::apache::thrift::TProcessorContextFreer freer("
+        << "this->eventHandler_.get(), ctx, " << service_func_name << ");" << '\n' << '\n'
+        << indent() << "try {" << '\n';
     indent_up();
-    out << indent() << "if (this->eventHandler_.get() != nullptr) {" << endl << indent()
-        << "  this->eventHandler_->preRead(ctx, " << service_func_name << ");" << endl << indent()
-        << "}" << endl << indent() << "args.read(iprot);" << endl << indent()
-        << "iprot->readMessageEnd();" << endl << indent()
-        << "uint32_t bytes = iprot->getTransport()->readEnd();" << endl << indent()
-        << "if (this->eventHandler_.get() != nullptr) {" << endl << indent()
-        << "  this->eventHandler_->postRead(ctx, " << service_func_name << ", bytes);" << endl
-        << indent() << "}" << endl;
+    out << indent() << "if (this->eventHandler_.get() != nullptr) {" << '\n' << indent()
+        << "  this->eventHandler_->preRead(ctx, " << service_func_name << ");" << '\n' << indent()
+        << "}" << '\n' << indent() << "args.read(iprot);" << '\n' << indent()
+        << "iprot->readMessageEnd();" << '\n' << indent()
+        << "uint32_t bytes = iprot->getTransport()->readEnd();" << '\n' << indent()
+        << "if (this->eventHandler_.get() != nullptr) {" << '\n' << indent()
+        << "  this->eventHandler_->postRead(ctx, " << service_func_name << ", bytes);" << '\n'
+        << indent() << "}" << '\n';
     scope_down(out);
 
     // TODO(dreiss): Handle TExceptions?  Expose to server?
-    out << indent() << "catch (const std::exception&) {" << endl << indent()
-        << "  if (this->eventHandler_.get() != nullptr) {" << endl << indent()
-        << "    this->eventHandler_->handlerError(ctx, " << service_func_name << ");" << endl
-        << indent() << "  }" << endl << indent() << "  return cob(false);" << endl << indent()
-        << "}" << endl;
+    out << indent() << "catch (const std::exception&) {" << '\n' << indent()
+        << "  if (this->eventHandler_.get() != nullptr) {" << '\n' << indent()
+        << "    this->eventHandler_->handlerError(ctx, " << service_func_name << ");" << '\n'
+        << indent() << "  }" << '\n' << indent() << "  return cob(false);" << '\n' << indent()
+        << "}" << '\n';
 
     if (tfunction->is_oneway()) {
-      out << indent() << "if (this->eventHandler_.get() != nullptr) {" << endl << indent()
-          << "  this->eventHandler_->asyncComplete(ctx, " << service_func_name << ");" << endl
-          << indent() << "}" << endl;
+      out << indent() << "if (this->eventHandler_.get() != nullptr) {" << '\n' << indent()
+          << "  this->eventHandler_->asyncComplete(ctx, " << service_func_name << ");" << '\n'
+          << indent() << "}" << '\n';
     }
     // TODO(dreiss): Figure out a strategy for exceptions in async handlers.
-    out << indent() << "freer.unregister();" << endl;
+    out << indent() << "freer.unregister();" << '\n';
     if (tfunction->is_oneway()) {
       // No return.  Just hand off our cob.
       // TODO(dreiss): Call the cob immediately?
       out << indent() << "iface_->" << tfunction->get_name() << "("
-          << "::std::bind(cob, true)" << endl;
+          << "::std::bind(cob, true)" << '\n';
       indent_up();
       indent_up();
     } else {
@@ -3707,38 +3778,38 @@
       out << indent() << "void (" << tservice->get_name() << "AsyncProcessor" << class_suffix
           << "::*return_fn)(::std::function<void(bool ok)> "
           << "cob, int32_t seqid, " << prot_type << "* oprot, void* ctx" << ret_arg
-          << ") =" << endl;
+          << ") =" << '\n';
       out << indent() << "  &" << tservice->get_name() << "AsyncProcessor" << class_suffix
-          << "::return_" << tfunction->get_name() << ";" << endl;
+          << "::return_" << tfunction->get_name() << ";" << '\n';
       if (!xceptions.empty()) {
         out << indent() << "void (" << tservice->get_name() << "AsyncProcessor" << class_suffix
             << "::*throw_fn)(::std::function<void(bool ok)> "
             << "cob, int32_t seqid, " << prot_type << "* oprot, void* ctx, "
-            << "::apache::thrift::TDelayedException* _throw) =" << endl;
+            << "::apache::thrift::TDelayedException* _throw) =" << '\n';
         out << indent() << "  &" << tservice->get_name() << "AsyncProcessor" << class_suffix
-            << "::throw_" << tfunction->get_name() << ";" << endl;
+            << "::throw_" << tfunction->get_name() << ";" << '\n';
       }
 
-      out << indent() << "iface_->" << tfunction->get_name() << "(" << endl;
+      out << indent() << "iface_->" << tfunction->get_name() << "(" << '\n';
       indent_up();
       indent_up();
       out << indent() << "::std::bind(return_fn, this, cob, seqid, oprot, ctx" << ret_placeholder
           << ")";
       if (!xceptions.empty()) {
-        out << ',' << endl << indent() << "::std::bind(throw_fn, this, cob, seqid, oprot, "
+        out << ',' << '\n' << indent() << "::std::bind(throw_fn, this, cob, seqid, oprot, "
             << "ctx, ::std::placeholders::_1)";
       }
     }
 
     // XXX Whitespace cleanup.
     for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
-      out << ',' << endl << indent() << "args." << (*f_iter)->get_name();
+      out << ',' << '\n' << indent() << "args." << (*f_iter)->get_name();
     }
-    out << ");" << endl;
+    out << ");" << '\n';
     indent_down();
     indent_down();
     scope_down(out);
-    out << endl;
+    out << '\n';
 
     // Normal return.
     if (!tfunction->is_oneway()) {
@@ -3748,128 +3819,128 @@
         ret_arg_name = ", _return";
       }
       if (gen_templates_) {
-        out << indent() << "template <class Protocol_>" << endl;
+        out << indent() << "template <class Protocol_>" << '\n';
       }
       out << "void " << tservice->get_name() << "AsyncProcessor" << class_suffix << "::return_"
           << tfunction->get_name() << "(::std::function<void(bool ok)> cob, int32_t seqid, "
-          << prot_type << "* oprot, void* ctx" << ret_arg_decl << ')' << endl;
+          << prot_type << "* oprot, void* ctx" << ret_arg_decl << ')' << '\n';
       scope_up(out);
 
       if (gen_templates_ && !specialized) {
         // If oprot is a Protocol_ instance,
         // use the specialized return function instead.
-        out << indent() << "Protocol_* _oprot = dynamic_cast<Protocol_*>(oprot);" << endl
-            << indent() << "if (_oprot) {" << endl << indent() << "  return return_"
-            << tfunction->get_name() << "(cob, seqid, _oprot, ctx" << ret_arg_name << ");" << endl
-            << indent() << "}" << endl << indent() << "T_GENERIC_PROTOCOL(this, oprot, _oprot);"
-            << endl << endl;
+        out << indent() << "Protocol_* _oprot = dynamic_cast<Protocol_*>(oprot);" << '\n'
+            << indent() << "if (_oprot) {" << '\n' << indent() << "  return return_"
+            << tfunction->get_name() << "(cob, seqid, _oprot, ctx" << ret_arg_name << ");" << '\n'
+            << indent() << "}" << '\n' << indent() << "T_GENERIC_PROTOCOL(this, oprot, _oprot);"
+            << '\n' << '\n';
       }
 
       out << indent() << tservice->get_name() << "_" << tfunction->get_name() << "_presult result;"
-          << endl;
+          << '\n';
       if (!tfunction->get_returntype()->is_void()) {
         // The const_cast here is unfortunate, but it would be a pain to avoid,
         // and we only do a write with this struct, which is const-safe.
         out << indent() << "result.success = const_cast<" << type_name(tfunction->get_returntype())
-            << "*>(&_return);" << endl << indent() << "result.__isset.success = true;" << endl;
+            << "*>(&_return);" << '\n' << indent() << "result.__isset.success = true;" << '\n';
       }
       // Serialize the result into a struct
-      out << endl << indent() << "if (this->eventHandler_.get() != nullptr) {" << endl << indent()
-          << "  ctx = this->eventHandler_->getContext(" << service_func_name << ", nullptr);" << endl
-          << indent() << "}" << endl << indent()
+      out << '\n' << indent() << "if (this->eventHandler_.get() != nullptr) {" << '\n' << indent()
+          << "  ctx = this->eventHandler_->getContext(" << service_func_name << ", nullptr);" << '\n'
+          << indent() << "}" << '\n' << indent()
           << "::apache::thrift::TProcessorContextFreer freer("
-          << "this->eventHandler_.get(), ctx, " << service_func_name << ");" << endl << endl
-          << indent() << "if (this->eventHandler_.get() != nullptr) {" << endl << indent()
-          << "  this->eventHandler_->preWrite(ctx, " << service_func_name << ");" << endl
-          << indent() << "}" << endl << endl << indent() << "oprot->writeMessageBegin(\""
-          << tfunction->get_name() << "\", ::apache::thrift::protocol::T_REPLY, seqid);" << endl
-          << indent() << "result.write(oprot);" << endl << indent() << "oprot->writeMessageEnd();"
-          << endl << indent() << "uint32_t bytes = oprot->getTransport()->writeEnd();" << endl
-          << indent() << "oprot->getTransport()->flush();" << endl << indent()
-          << "if (this->eventHandler_.get() != nullptr) {" << endl << indent()
-          << "  this->eventHandler_->postWrite(ctx, " << service_func_name << ", bytes);" << endl
-          << indent() << "}" << endl << indent() << "return cob(true);" << endl;
+          << "this->eventHandler_.get(), ctx, " << service_func_name << ");" << '\n' << '\n'
+          << indent() << "if (this->eventHandler_.get() != nullptr) {" << '\n' << indent()
+          << "  this->eventHandler_->preWrite(ctx, " << service_func_name << ");" << '\n'
+          << indent() << "}" << '\n' << '\n' << indent() << "oprot->writeMessageBegin(\""
+          << tfunction->get_name() << "\", ::apache::thrift::protocol::T_REPLY, seqid);" << '\n'
+          << indent() << "result.write(oprot);" << '\n' << indent() << "oprot->writeMessageEnd();"
+          << '\n' << indent() << "uint32_t bytes = oprot->getTransport()->writeEnd();" << '\n'
+          << indent() << "oprot->getTransport()->flush();" << '\n' << indent()
+          << "if (this->eventHandler_.get() != nullptr) {" << '\n' << indent()
+          << "  this->eventHandler_->postWrite(ctx, " << service_func_name << ", bytes);" << '\n'
+          << indent() << "}" << '\n' << indent() << "return cob(true);" << '\n';
       scope_down(out);
-      out << endl;
+      out << '\n';
     }
 
     // Exception return.
     if (!tfunction->is_oneway() && !xceptions.empty()) {
       if (gen_templates_) {
-        out << indent() << "template <class Protocol_>" << endl;
+        out << indent() << "template <class Protocol_>" << '\n';
       }
       out << "void " << tservice->get_name() << "AsyncProcessor" << class_suffix << "::throw_"
           << tfunction->get_name() << "(::std::function<void(bool ok)> cob, int32_t seqid, "
           << prot_type << "* oprot, void* ctx, "
-          << "::apache::thrift::TDelayedException* _throw)" << endl;
+          << "::apache::thrift::TDelayedException* _throw)" << '\n';
       scope_up(out);
 
       if (gen_templates_ && !specialized) {
         // If oprot is a Protocol_ instance,
         // use the specialized throw function instead.
-        out << indent() << "Protocol_* _oprot = dynamic_cast<Protocol_*>(oprot);" << endl
-            << indent() << "if (_oprot) {" << endl << indent() << "  return throw_"
-            << tfunction->get_name() << "(cob, seqid, _oprot, ctx, _throw);" << endl << indent()
-            << "}" << endl << indent() << "T_GENERIC_PROTOCOL(this, oprot, _oprot);" << endl
-            << endl;
+        out << indent() << "Protocol_* _oprot = dynamic_cast<Protocol_*>(oprot);" << '\n'
+            << indent() << "if (_oprot) {" << '\n' << indent() << "  return throw_"
+            << tfunction->get_name() << "(cob, seqid, _oprot, ctx, _throw);" << '\n' << indent()
+            << "}" << '\n' << indent() << "T_GENERIC_PROTOCOL(this, oprot, _oprot);" << '\n'
+            << '\n';
       }
 
       // Get the event handler context
-      out << endl << indent() << "if (this->eventHandler_.get() != nullptr) {" << endl << indent()
-          << "  ctx = this->eventHandler_->getContext(" << service_func_name << ", nullptr);" << endl
-          << indent() << "}" << endl << indent()
+      out << '\n' << indent() << "if (this->eventHandler_.get() != nullptr) {" << '\n' << indent()
+          << "  ctx = this->eventHandler_->getContext(" << service_func_name << ", nullptr);" << '\n'
+          << indent() << "}" << '\n' << indent()
           << "::apache::thrift::TProcessorContextFreer freer("
-          << "this->eventHandler_.get(), ctx, " << service_func_name << ");" << endl << endl;
+          << "this->eventHandler_.get(), ctx, " << service_func_name << ");" << '\n' << '\n';
 
       // Throw the TDelayedException, and catch the result
       out << indent() << tservice->get_name() << "_" << tfunction->get_name() << "_result result;"
-          << endl << endl << indent() << "try {" << endl;
+          << '\n' << '\n' << indent() << "try {" << '\n';
       indent_up();
-      out << indent() << "_throw->throw_it();" << endl << indent() << "return cob(false);"
-          << endl; // Is this possible?  TBD.
+      out << indent() << "_throw->throw_it();" << '\n' << indent() << "return cob(false);"
+          << '\n'; // Is this possible?  TBD.
       indent_down();
       out << indent() << '}';
       for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) {
         out << "  catch (" << type_name((*x_iter)->get_type()) << " &" << (*x_iter)->get_name()
-            << ") {" << endl;
+            << ") {" << '\n';
         indent_up();
         out << indent() << "result." << (*x_iter)->get_name() << " = " << (*x_iter)->get_name()
-            << ";" << endl << indent() << "result.__isset." << (*x_iter)->get_name() << " = true;"
-            << endl;
+            << ";" << '\n' << indent() << "result.__isset." << (*x_iter)->get_name() << " = true;"
+            << '\n';
         scope_down(out);
       }
 
       // Handle the case where an undeclared exception is thrown
-      out << " catch (std::exception& e) {" << endl;
+      out << " catch (std::exception& e) {" << '\n';
       indent_up();
-      out << indent() << "if (this->eventHandler_.get() != nullptr) {" << endl << indent()
-          << "  this->eventHandler_->handlerError(ctx, " << service_func_name << ");" << endl
-          << indent() << "}" << endl << endl << indent()
-          << "::apache::thrift::TApplicationException x(e.what());" << endl << indent()
+      out << indent() << "if (this->eventHandler_.get() != nullptr) {" << '\n' << indent()
+          << "  this->eventHandler_->handlerError(ctx, " << service_func_name << ");" << '\n'
+          << indent() << "}" << '\n' << '\n' << indent()
+          << "::apache::thrift::TApplicationException x(e.what());" << '\n' << indent()
           << "oprot->writeMessageBegin(\"" << tfunction->get_name()
-          << "\", ::apache::thrift::protocol::T_EXCEPTION, seqid);" << endl << indent()
-          << "x.write(oprot);" << endl << indent() << "oprot->writeMessageEnd();" << endl
-          << indent() << "oprot->getTransport()->writeEnd();" << endl << indent()
-          << "oprot->getTransport()->flush();" << endl <<
+          << "\", ::apache::thrift::protocol::T_EXCEPTION, seqid);" << '\n' << indent()
+          << "x.write(oprot);" << '\n' << indent() << "oprot->writeMessageEnd();" << '\n'
+          << indent() << "oprot->getTransport()->writeEnd();" << '\n' << indent()
+          << "oprot->getTransport()->flush();" << '\n' <<
           // We pass true to the cob here, since we did successfully write a
           // response, even though it is an exception response.
           // It looks like the argument is currently ignored, anyway.
-          indent() << "return cob(true);" << endl;
+          indent() << "return cob(true);" << '\n';
       scope_down(out);
 
       // Serialize the result into a struct
-      out << indent() << "if (this->eventHandler_.get() != nullptr) {" << endl << indent()
-          << "  this->eventHandler_->preWrite(ctx, " << service_func_name << ");" << endl
-          << indent() << "}" << endl << endl << indent() << "oprot->writeMessageBegin(\""
-          << tfunction->get_name() << "\", ::apache::thrift::protocol::T_REPLY, seqid);" << endl
-          << indent() << "result.write(oprot);" << endl << indent() << "oprot->writeMessageEnd();"
-          << endl << indent() << "uint32_t bytes = oprot->getTransport()->writeEnd();" << endl
-          << indent() << "oprot->getTransport()->flush();" << endl << indent()
-          << "if (this->eventHandler_.get() != nullptr) {" << endl << indent()
-          << "  this->eventHandler_->postWrite(ctx, " << service_func_name << ", bytes);" << endl
-          << indent() << "}" << endl << indent() << "return cob(true);" << endl;
+      out << indent() << "if (this->eventHandler_.get() != nullptr) {" << '\n' << indent()
+          << "  this->eventHandler_->preWrite(ctx, " << service_func_name << ");" << '\n'
+          << indent() << "}" << '\n' << '\n' << indent() << "oprot->writeMessageBegin(\""
+          << tfunction->get_name() << "\", ::apache::thrift::protocol::T_REPLY, seqid);" << '\n'
+          << indent() << "result.write(oprot);" << '\n' << indent() << "oprot->writeMessageEnd();"
+          << '\n' << indent() << "uint32_t bytes = oprot->getTransport()->writeEnd();" << '\n'
+          << indent() << "oprot->getTransport()->flush();" << '\n' << indent()
+          << "if (this->eventHandler_.get() != nullptr) {" << '\n' << indent()
+          << "  this->eventHandler_->postWrite(ctx, " << service_func_name << ", bytes);" << '\n'
+          << indent() << "}" << '\n' << indent() << "return cob(true);" << '\n';
       scope_down(out);
-      out << endl;
+      out << '\n';
     } // for each function
   }   // cob style
 }
@@ -3889,58 +3960,58 @@
 
   ofstream_with_content_based_conditional_update f_skeleton;
   f_skeleton.open(f_skeleton_name.c_str());
-  f_skeleton << "// This autogenerated skeleton file illustrates how to build a server." << endl
-             << "// You should copy it to another filename to avoid overwriting it." << endl << endl
-             << "#include \"" << get_include_prefix(*get_program()) << svcname << ".h\"" << endl
-             << "#include <thrift/protocol/TBinaryProtocol.h>" << endl
-             << "#include <thrift/server/TSimpleServer.h>" << endl
-             << "#include <thrift/transport/TServerSocket.h>" << endl
-             << "#include <thrift/transport/TBufferTransports.h>" << endl << endl
-             << "using namespace ::apache::thrift;" << endl
-             << "using namespace ::apache::thrift::protocol;" << endl
-             << "using namespace ::apache::thrift::transport;" << endl
-             << "using namespace ::apache::thrift::server;" << endl << endl;
+  f_skeleton << "// This autogenerated skeleton file illustrates how to build a server." << '\n'
+             << "// You should copy it to another filename to avoid overwriting it." << '\n' << '\n'
+             << "#include \"" << get_include_prefix(*get_program()) << svcname << ".h\"" << '\n'
+             << "#include <thrift/protocol/TBinaryProtocol.h>" << '\n'
+             << "#include <thrift/server/TSimpleServer.h>" << '\n'
+             << "#include <thrift/transport/TServerSocket.h>" << '\n'
+             << "#include <thrift/transport/TBufferTransports.h>" << '\n' << '\n'
+             << "using namespace ::apache::thrift;" << '\n'
+             << "using namespace ::apache::thrift::protocol;" << '\n'
+             << "using namespace ::apache::thrift::transport;" << '\n'
+             << "using namespace ::apache::thrift::server;" << '\n' << '\n';
 
   // the following code would not compile:
   // using namespace ;
   // using namespace ::;
   if ((!ns.empty()) && (ns.compare(" ::") != 0)) {
-    f_skeleton << "using namespace " << string(ns, 0, ns.size() - 2) << ";" << endl << endl;
+    f_skeleton << "using namespace " << string(ns, 0, ns.size() - 2) << ";" << '\n' << '\n';
   }
 
-  f_skeleton << "class " << svcname << "Handler : virtual public " << svcname << "If {" << endl
-             << " public:" << endl;
+  f_skeleton << "class " << svcname << "Handler : virtual public " << svcname << "If {" << '\n'
+             << " public:" << '\n';
   indent_up();
-  f_skeleton << indent() << svcname << "Handler() {" << endl << indent()
-             << "  // Your initialization goes here" << endl << indent() << "}" << endl << endl;
+  f_skeleton << indent() << svcname << "Handler() {" << '\n' << indent()
+             << "  // Your initialization goes here" << '\n' << indent() << "}" << '\n' << '\n';
 
   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_java_doc(f_skeleton, *f_iter);
-    f_skeleton << indent() << function_signature(*f_iter, "") << " {" << endl << indent()
-               << "  // Your implementation goes here" << endl << indent() << "  printf(\""
-               << (*f_iter)->get_name() << "\\n\");" << endl << indent() << "}" << endl << endl;
+    f_skeleton << indent() << function_signature(*f_iter, "") << " {" << '\n' << indent()
+               << "  // Your implementation goes here" << '\n' << indent() << "  printf(\""
+               << (*f_iter)->get_name() << "\\n\");" << '\n' << indent() << "}" << '\n' << '\n';
   }
 
   indent_down();
-  f_skeleton << "};" << endl << endl;
+  f_skeleton << "};" << '\n' << '\n';
 
-  f_skeleton << indent() << "int main(int argc, char **argv) {" << endl;
+  f_skeleton << indent() << "int main(int argc, char **argv) {" << '\n';
   indent_up();
   f_skeleton
-      << indent() << "int port = 9090;" << endl << indent() << "::std::shared_ptr<" << svcname
-      << "Handler> handler(new " << svcname << "Handler());" << endl << indent()
-      << "::std::shared_ptr<TProcessor> processor(new " << svcname << "Processor(handler));" << endl
+      << indent() << "int port = 9090;" << '\n' << indent() << "::std::shared_ptr<" << svcname
+      << "Handler> handler(new " << svcname << "Handler());" << '\n' << indent()
+      << "::std::shared_ptr<TProcessor> processor(new " << svcname << "Processor(handler));" << '\n'
       << indent() << "::std::shared_ptr<TServerTransport> serverTransport(new TServerSocket(port));"
-      << endl << indent()
-      << "::std::shared_ptr<TTransportFactory> transportFactory(new TBufferedTransportFactory());" << endl
+      << '\n' << indent()
+      << "::std::shared_ptr<TTransportFactory> transportFactory(new TBufferedTransportFactory());" << '\n'
       << indent() << "::std::shared_ptr<TProtocolFactory> protocolFactory(new TBinaryProtocolFactory());"
-      << endl << endl << indent()
+      << '\n' << '\n' << indent()
       << "TSimpleServer server(processor, serverTransport, transportFactory, protocolFactory);"
-      << endl << indent() << "server.serve();" << endl << indent() << "return 0;" << endl;
+      << '\n' << indent() << "server.serve();" << '\n' << indent() << "return 0;" << '\n';
   indent_down();
-  f_skeleton << "}" << endl << endl;
+  f_skeleton << "}" << '\n' << '\n';
 
   // Close the files
   f_skeleton.close();
@@ -3972,6 +4043,9 @@
     case t_base_type::TYPE_VOID:
       throw "compiler error: cannot serialize void field in a struct: " + name;
       break;
+    case t_base_type::TYPE_UUID:
+      out << "readUUID(" << name << ");";
+      break;
     case t_base_type::TYPE_STRING:
       if (type->is_binary()) {
         out << "readBinary(" << name << ");";
@@ -3998,14 +4072,14 @@
       out << "readDouble(" << name << ");";
       break;
     default:
-      throw "compiler error: no C++ reader for base type " + t_base_type::t_base_name(tbase) + name;
+      throw "compiler error: no C++ reader for base type " + t_base_type::t_base_name(tbase) + " " + name;
     }
-    out << endl;
+    out << '\n';
   } else if (type->is_enum()) {
     string t = tmp("ecast");
-    out << indent() << "int32_t " << t << ";" << endl << indent() << "xfer += iprot->readI32(" << t
-        << ");" << endl << indent() << name << " = static_cast<" 
-        << type_name(type) << ">(" << t << ");" << endl;
+    out << indent() << "int32_t " << t << ";" << '\n' << indent() << "xfer += iprot->readI32(" << t
+        << ");" << '\n' << indent() << name << " = static_cast<"
+        << type_name(type) << ">(" << t << ");" << '\n';
   } else {
     printf("DO NOT KNOW HOW TO DESERIALIZE FIELD '%s' TYPE '%s'\n",
            tfield->get_name().c_str(),
@@ -4024,22 +4098,22 @@
                                                   string prefix,
                                                   bool pointer) {
   if (pointer) {
-    indent(out) << "if (!" << prefix << ") { " << endl;
+    indent(out) << "if (!" << prefix << ") { " << '\n';
     indent(out) << "  " << prefix << " = ::std::shared_ptr<" << type_name(tstruct) << ">(new "
-                << type_name(tstruct) << ");" << endl;
-    indent(out) << "}" << endl;
-    indent(out) << "xfer += " << prefix << "->read(iprot);" << endl;
-    indent(out) << "bool wasSet = false;" << endl;
+                << type_name(tstruct) << ");" << '\n';
+    indent(out) << "}" << '\n';
+    indent(out) << "xfer += " << prefix << "->read(iprot);" << '\n';
+    indent(out) << "bool wasSet = false;" << '\n';
     const vector<t_field*>& members = tstruct->get_members();
     vector<t_field*>::const_iterator f_iter;
     for (f_iter = members.begin(); f_iter != members.end(); ++f_iter) {
 
       indent(out) << "if (" << prefix << "->__isset." << (*f_iter)->get_name()
-                  << ") { wasSet = true; }" << endl;
+                  << ") { wasSet = true; }" << '\n';
     }
-    indent(out) << "if (!wasSet) { " << prefix << ".reset(); }" << endl;
+    indent(out) << "if (!wasSet) { " << prefix << ".reset(); }" << '\n';
   } else {
-    indent(out) << "xfer += " << prefix << ".read(iprot);" << endl;
+    indent(out) << "xfer += " << prefix << ".read(iprot);" << '\n';
   }
 }
 
@@ -4054,28 +4128,28 @@
   t_container* tcontainer = (t_container*)ttype;
   bool use_push = tcontainer->has_cpp_name();
 
-  indent(out) << prefix << ".clear();" << endl << indent() << "uint32_t " << size << ";" << endl;
+  indent(out) << prefix << ".clear();" << '\n' << indent() << "uint32_t " << size << ";" << '\n';
 
   // Declare variables, read header
   if (ttype->is_map()) {
-    out << indent() << "::apache::thrift::protocol::TType " << ktype << ";" << endl << indent()
-        << "::apache::thrift::protocol::TType " << vtype << ";" << endl << indent()
-        << "xfer += iprot->readMapBegin(" << ktype << ", " << vtype << ", " << size << ");" << endl;
+    out << indent() << "::apache::thrift::protocol::TType " << ktype << ";" << '\n' << indent()
+        << "::apache::thrift::protocol::TType " << vtype << ";" << '\n' << indent()
+        << "xfer += iprot->readMapBegin(" << ktype << ", " << vtype << ", " << size << ");" << '\n';
   } else if (ttype->is_set()) {
-    out << indent() << "::apache::thrift::protocol::TType " << etype << ";" << endl << indent()
-        << "xfer += iprot->readSetBegin(" << etype << ", " << size << ");" << endl;
+    out << indent() << "::apache::thrift::protocol::TType " << etype << ";" << '\n' << indent()
+        << "xfer += iprot->readSetBegin(" << etype << ", " << size << ");" << '\n';
   } else if (ttype->is_list()) {
-    out << indent() << "::apache::thrift::protocol::TType " << etype << ";" << endl << indent()
-        << "xfer += iprot->readListBegin(" << etype << ", " << size << ");" << endl;
+    out << indent() << "::apache::thrift::protocol::TType " << etype << ";" << '\n' << indent()
+        << "xfer += iprot->readListBegin(" << etype << ", " << size << ");" << '\n';
     if (!use_push) {
-      indent(out) << prefix << ".resize(" << size << ");" << endl;
+      indent(out) << prefix << ".resize(" << size << ");" << '\n';
     }
   }
 
   // For loop iterates over elements
   string i = tmp("_i");
-  out << indent() << "uint32_t " << i << ";" << endl << indent() << "for (" << i << " = 0; " << i
-      << " < " << size << "; ++" << i << ")" << endl;
+  out << indent() << "uint32_t " << i << ";" << '\n' << indent() << "for (" << i << " = 0; " << i
+      << " < " << size << "; ++" << i << ")" << '\n';
 
   scope_up(out);
 
@@ -4091,11 +4165,11 @@
 
   // Read container end
   if (ttype->is_map()) {
-    indent(out) << "xfer += iprot->readMapEnd();" << endl;
+    indent(out) << "xfer += iprot->readMapEnd();" << '\n';
   } else if (ttype->is_set()) {
-    indent(out) << "xfer += iprot->readSetEnd();" << endl;
+    indent(out) << "xfer += iprot->readSetEnd();" << '\n';
   } else if (ttype->is_list()) {
-    indent(out) << "xfer += iprot->readListEnd();" << endl;
+    indent(out) << "xfer += iprot->readListEnd();" << '\n';
   }
 
   scope_down(out);
@@ -4110,11 +4184,11 @@
   t_field fkey(tmap->get_key_type(), key);
   t_field fval(tmap->get_val_type(), val);
 
-  out << indent() << declare_field(&fkey) << endl;
+  out << indent() << declare_field(&fkey) << '\n';
 
   generate_deserialize_field(out, &fkey);
   indent(out) << declare_field(&fval, false, false, false, true) << " = " << prefix << "[" << key
-              << "];" << endl;
+              << "];" << '\n';
 
   generate_deserialize_field(out, &fval);
 }
@@ -4123,11 +4197,11 @@
   string elem = tmp("_elem");
   t_field felem(tset->get_elem_type(), elem);
 
-  indent(out) << declare_field(&felem) << endl;
+  indent(out) << declare_field(&felem) << '\n';
 
   generate_deserialize_field(out, &felem);
 
-  indent(out) << prefix << ".insert(" << elem << ");" << endl;
+  indent(out) << prefix << ".insert(" << elem << ");" << '\n';
 }
 
 void t_cpp_generator::generate_deserialize_list_element(ostream& out,
@@ -4138,9 +4212,9 @@
   if (use_push) {
     string elem = tmp("_elem");
     t_field felem(tlist->get_elem_type(), elem);
-    indent(out) << declare_field(&felem) << endl;
+    indent(out) << declare_field(&felem) << '\n';
     generate_deserialize_field(out, &felem);
-    indent(out) << prefix << ".push_back(" << elem << ");" << endl;
+    indent(out) << prefix << ".push_back(" << elem << ");" << '\n';
   } else {
     t_field felem(tlist->get_elem_type(), prefix + "[" + index + "]");
     generate_deserialize_field(out, &felem);
@@ -4180,6 +4254,9 @@
       case t_base_type::TYPE_VOID:
         throw "compiler error: cannot serialize void field in a struct: " + name;
         break;
+      case t_base_type::TYPE_UUID:
+        out << "writeUUID(" << name << ");";
+        break;
       case t_base_type::TYPE_STRING:
         if (type->is_binary()) {
           out << "writeBinary(" << name << ");";
@@ -4207,12 +4284,12 @@
         break;
       default:
         throw "compiler error: no C++ writer for base type " + t_base_type::t_base_name(tbase)
-            + name;
+            + " " + name;
       }
     } else if (type->is_enum()) {
       out << "writeI32(static_cast<int32_t>(" << name << "));";
     }
-    out << endl;
+    out << '\n';
   } else {
     printf("DO NOT KNOW HOW TO SERIALIZE FIELD '%s' TYPE '%s'\n",
            name.c_str(),
@@ -4231,15 +4308,15 @@
                                                 string prefix,
                                                 bool pointer) {
   if (pointer) {
-    indent(out) << "if (" << prefix << ") {" << endl;
-    indent(out) << "  xfer += " << prefix << "->write(oprot); " << endl;
+    indent(out) << "if (" << prefix << ") {" << '\n';
+    indent(out) << "  xfer += " << prefix << "->write(oprot); " << '\n';
     indent(out) << "} else {"
-                << "oprot->writeStructBegin(\"" << tstruct->get_name() << "\"); " << endl;
-    indent(out) << "  oprot->writeStructEnd();" << endl;
-    indent(out) << "  oprot->writeFieldStop();" << endl;
-    indent(out) << "}" << endl;
+                << "oprot->writeStructBegin(\"" << tstruct->get_name() << "\"); " << '\n';
+    indent(out) << "  oprot->writeStructEnd();" << '\n';
+    indent(out) << "  oprot->writeFieldStop();" << '\n';
+    indent(out) << "}" << '\n';
   } else {
-    indent(out) << "xfer += " << prefix << ".write(oprot);" << endl;
+    indent(out) << "xfer += " << prefix << ".write(oprot);" << '\n';
   }
 }
 
@@ -4249,21 +4326,21 @@
   if (ttype->is_map()) {
     indent(out) << "xfer += oprot->writeMapBegin(" << type_to_enum(((t_map*)ttype)->get_key_type())
                 << ", " << type_to_enum(((t_map*)ttype)->get_val_type()) << ", "
-                << "static_cast<uint32_t>(" << prefix << ".size()));" << endl;
+                << "static_cast<uint32_t>(" << prefix << ".size()));" << '\n';
   } else if (ttype->is_set()) {
     indent(out) << "xfer += oprot->writeSetBegin(" << type_to_enum(((t_set*)ttype)->get_elem_type())
                 << ", "
-                << "static_cast<uint32_t>(" << prefix << ".size()));" << endl;
+                << "static_cast<uint32_t>(" << prefix << ".size()));" << '\n';
   } else if (ttype->is_list()) {
     indent(out) << "xfer += oprot->writeListBegin("
                 << type_to_enum(((t_list*)ttype)->get_elem_type()) << ", "
-                << "static_cast<uint32_t>(" << prefix << ".size()));" << endl;
+                << "static_cast<uint32_t>(" << prefix << ".size()));" << '\n';
   }
 
   string iter = tmp("_iter");
-  out << indent() << type_name(ttype) << "::const_iterator " << iter << ";" << endl << indent()
+  out << indent() << type_name(ttype) << "::const_iterator " << iter << ";" << '\n' << indent()
       << "for (" << iter << " = " << prefix << ".begin(); " << iter << " != " << prefix
-      << ".end(); ++" << iter << ")" << endl;
+      << ".end(); ++" << iter << ")" << '\n';
   scope_up(out);
   if (ttype->is_map()) {
     generate_serialize_map_element(out, (t_map*)ttype, iter);
@@ -4275,11 +4352,11 @@
   scope_down(out);
 
   if (ttype->is_map()) {
-    indent(out) << "xfer += oprot->writeMapEnd();" << endl;
+    indent(out) << "xfer += oprot->writeMapEnd();" << '\n';
   } else if (ttype->is_set()) {
-    indent(out) << "xfer += oprot->writeSetEnd();" << endl;
+    indent(out) << "xfer += oprot->writeSetEnd();" << '\n';
   } else if (ttype->is_list()) {
-    indent(out) << "xfer += oprot->writeListEnd();" << endl;
+    indent(out) << "xfer += oprot->writeListEnd();" << '\n';
   }
 
   scope_down(out);
@@ -4494,6 +4571,8 @@
     return "int64_t";
   case t_base_type::TYPE_DOUBLE:
     return "double";
+  case t_base_type::TYPE_UUID:
+    return "apache::thrift::TUuid";
   default:
     throw "compiler error: no C++ base type name for base type " + t_base_type::t_base_name(tbase);
   }
@@ -4534,6 +4613,7 @@
       switch (tbase) {
       case t_base_type::TYPE_VOID:
       case t_base_type::TYPE_STRING:
+      case t_base_type::TYPE_UUID:
         break;
       case t_base_type::TYPE_BOOL:
         result += " = false";
@@ -4661,6 +4741,8 @@
       return "::apache::thrift::protocol::T_I64";
     case t_base_type::TYPE_DOUBLE:
       return "::apache::thrift::protocol::T_DOUBLE";
+    case t_base_type::TYPE_UUID:
+      return "::apache::thrift::protocol::T_UUID";
     default:
       break;
     }
@@ -4699,6 +4781,7 @@
       case t_base_type::TYPE_I32:
       case t_base_type::TYPE_I64:
       case t_base_type::TYPE_DOUBLE:
+      case t_base_type::TYPE_UUID:
         continue;
       case t_base_type::TYPE_VOID:
       case t_base_type::TYPE_STRING:
diff --git a/compiler/cpp/src/thrift/generate/t_d_generator.cc b/compiler/cpp/src/thrift/generate/t_d_generator.cc
index 38194c2..61988df 100644
--- a/compiler/cpp/src/thrift/generate/t_d_generator.cc
+++ b/compiler/cpp/src/thrift/generate/t_d_generator.cc
@@ -43,8 +43,6 @@
 using std::string;
 using std::vector;
 
-static const string endl = "\n"; // avoid ostream << std::endl flushes
-
 /**
  * D code generator.
  *
@@ -105,7 +103,7 @@
 
     // Print header
     f_types_ << autogen_comment() << "module " << render_package(*program_) << program_name_
-             << "_types;" << endl << endl;
+             << "_types;" << '\n' << '\n';
 
     print_default_imports(f_types_);
 
@@ -113,10 +111,10 @@
     const vector<t_program*>& includes = program_->get_includes();
     for (auto include : includes) {
       f_types_ << "public import " << render_package(*include) << include->get_name()
-               << "_types;" << endl;
+               << "_types;" << '\n';
     }
     if (!includes.empty())
-      f_types_ << endl;
+      f_types_ << '\n';
   }
 
   void close_generator() override {
@@ -131,22 +129,22 @@
       f_consts.open(f_consts_name.c_str());
 
       f_consts << autogen_comment() << "module " << render_package(*program_) << program_name_
-               << "_constants;" << endl << endl;
+               << "_constants;" << '\n' << '\n';
 
       print_default_imports(f_consts);
 
-      f_consts << "import " << render_package(*get_program()) << program_name_ << "_types;" << endl
-               << endl;
+      f_consts << "import " << render_package(*get_program()) << program_name_ << "_types;" << '\n'
+               << '\n';
 
       vector<t_const*>::iterator c_iter;
       for (c_iter = consts.begin(); c_iter != consts.end(); ++c_iter) {
         this->emit_doc(*c_iter, f_consts);
         string name = suffix_if_reserved((*c_iter)->get_name());
         t_type* type = (*c_iter)->get_type();
-        indent(f_consts) << "immutable(" << render_type_name(type) << ") " << name << ";" << endl;
+        indent(f_consts) << "immutable(" << render_type_name(type) << ") " << name << ";" << '\n';
       }
 
-      f_consts << endl << "shared static this() {" << endl;
+      f_consts << '\n' << "shared static this() {" << '\n';
       indent_up();
 
       bool first = true;
@@ -154,24 +152,24 @@
         if (first) {
           first = false;
         } else {
-          f_consts << endl;
+          f_consts << '\n';
         }
         t_type* type = (*c_iter)->get_type();
         indent(f_consts) << suffix_if_reserved((*c_iter)->get_name()) << " = ";
         if (!is_immutable_type(type)) {
           f_consts << "cast(immutable(" << render_type_name(type) << ")) ";
         }
-        f_consts << render_const_value(type, (*c_iter)->get_value()) << ";" << endl;
+        f_consts << render_const_value(type, (*c_iter)->get_value()) << ";" << '\n';
       }
       indent_down();
-      indent(f_consts) << "}" << endl;
+      indent(f_consts) << "}" << '\n';
     }
   }
 
   void generate_typedef(t_typedef* ttypedef) override {
     this->emit_doc(ttypedef, f_types_);
     f_types_ << indent() << "alias " << render_type_name(ttypedef->get_type()) << " "
-             << ttypedef->get_symbolic() << ";" << endl << endl;
+             << ttypedef->get_symbolic() << ";" << '\n' << '\n';
   }
 
   void generate_enum(t_enum* tenum) override {
@@ -179,7 +177,7 @@
 
     this->emit_doc(tenum, f_types_);
     string enum_name = suffix_if_reserved(tenum->get_name());
-    f_types_ << indent() << "enum " << enum_name << " {" << endl;
+    f_types_ << indent() << "enum " << enum_name << " {" << '\n';
 
     indent_up();
 
@@ -190,11 +188,11 @@
       f_types_ << " = " << (*c_iter)->get_value() << ",";
     }
 
-    f_types_ << endl;
+    f_types_ << '\n';
     indent_down();
-    indent(f_types_) << "}" << endl;
+    indent(f_types_) << "}" << '\n';
 
-    f_types_ << endl;
+    f_types_ << '\n';
   }
 
   void generate_struct(t_struct* tstruct) override {
@@ -213,19 +211,19 @@
     ofstream_with_content_based_conditional_update f_service;
     f_service.open(f_servicename.c_str());
     f_service << autogen_comment() << "module " << suffix_if_reserved(render_package(*program_)) << svc_name << ";"
-              << endl << endl;
+              << '\n' << '\n';
 
     print_default_imports(f_service);
 
-    f_service << "import " << suffix_if_reserved(render_package(*get_program())) << program_name_ << "_types;" << endl;
+    f_service << "import " << suffix_if_reserved(render_package(*get_program())) << program_name_ << "_types;" << '\n';
 
     t_service* extends_service = tservice->get_extends();
     if (extends_service != nullptr) {
       f_service << "import " << suffix_if_reserved(render_package(*(extends_service->get_program())))
-                << suffix_if_reserved(extends_service->get_name()) << ";" << endl;
+                << suffix_if_reserved(extends_service->get_name()) << ";" << '\n';
     }
 
-    f_service << endl;
+    f_service << '\n';
 
     string extends = "";
     if (tservice->get_extends() != nullptr) {
@@ -233,7 +231,7 @@
     }
 
     this->emit_doc(tservice, f_service);
-    f_service << indent() << "interface " << svc_name << extends << " {" << endl;
+    f_service << indent() << "interface " << svc_name << extends << " {" << '\n';
     indent_up();
 
     // Collect all the exception types service methods can throw so we can
@@ -247,7 +245,7 @@
       this->emit_doc(*fn_iter, f_service);
       f_service << indent();
       print_function_signature(f_service, *fn_iter);
-      f_service << ";" << endl;
+      f_service << ";" << '\n';
 
       const vector<t_field*>& exceptions = (*fn_iter)->get_xceptions()->get_members();
       vector<t_field*>::const_iterator ex_iter;
@@ -258,13 +256,13 @@
 
     // Alias the exception types into the current scope.
     if (!exception_types.empty())
-      f_service << endl;
+      f_service << '\n';
     set<t_type*>::const_iterator et_iter;
     for (et_iter = exception_types.begin(); et_iter != exception_types.end(); ++et_iter) {
       indent(f_service) << "alias " << render_package(*(*et_iter)->get_program())
                         << (*et_iter)->get_program()->get_name() << "_types"
                         << "." << (*et_iter)->get_name() << " " << (*et_iter)->get_name() << ";"
-                        << endl;
+                        << '\n';
     }
 
     // Write the method metadata.
@@ -283,7 +281,7 @@
         meta << ",";
       }
 
-      meta << endl << indent() << "TMethodMeta(`" << suffix_if_reserved((*fn_iter)->get_name()) << "`, " << endl;
+      meta << '\n' << indent() << "TMethodMeta(`" << suffix_if_reserved((*fn_iter)->get_name()) << "`, " << '\n';
       indent_up();
       indent(meta) << "[";
 
@@ -309,7 +307,7 @@
       meta << "]";
 
       if (!(*fn_iter)->get_xceptions()->get_members().empty() || (*fn_iter)->is_oneway()) {
-        meta << "," << endl << indent() << "[";
+        meta << "," << '\n' << indent() << "[";
 
         bool first = true;
         const vector<t_field*>& exceptions = (*fn_iter)->get_xceptions()->get_members();
@@ -329,22 +327,22 @@
       }
 
       if ((*fn_iter)->is_oneway()) {
-        meta << "," << endl << indent() << "TMethodType.ONEWAY";
+        meta << "," << '\n' << indent() << "TMethodType.ONEWAY";
       }
 
       indent_down();
-      meta << endl << indent() << ")";
+      meta << '\n' << indent() << ")";
     }
     indent_down();
 
     string meta_str(meta.str());
     if (!meta_str.empty()) {
-      f_service << endl << indent() << "enum methodMeta = [" << meta_str << endl << indent() << "];"
-                << endl;
+      f_service << '\n' << indent() << "enum methodMeta = [" << meta_str << '\n' << indent() << "];"
+                << '\n';
     }
 
     indent_down();
-    indent(f_service) << "}" << endl;
+    indent(f_service) << "}" << '\n';
 
     // Server skeleton generation.
     string f_skeletonname = package_dir_ + svc_name + "_server.skeleton.d";
@@ -358,14 +356,14 @@
     if (!doc->has_doc()) {
       return;
     }
-    indent(out) << "/**" << std::endl;
+    indent(out) << "/**" << '\n';
     indent_up();
-    // No endl -- comments reliably have a newline at the end.
+    // No line break -- comments reliably have a newline at the end.
     // This is true even for stuff like:
     //     /** method infos */ void foo(/** huh?*/ 1: i64 stuff)
     indent(out) << doc->get_doc();
     indent_down();
-    indent(out) << "*/" << std::endl;
+    indent(out) << "*/" << '\n';
   }
 
 private:
@@ -376,59 +374,59 @@
   void print_server_skeleton(ostream& out, t_service* tservice) {
     string svc_name = suffix_if_reserved(tservice->get_name());
 
-    out << "/*" << endl
-        << " * This auto-generated skeleton file illustrates how to build a server. If you" << endl
-        << " * intend to customize it, you should edit a copy with another file name to " << endl
-        << " * avoid overwriting it when running the generator again." << endl << " */" << endl
-        << "module " << render_package(*tservice->get_program()) << svc_name << "_server;" << endl
-        << endl << "import std.stdio;" << endl << "import thrift.codegen.processor;" << endl
-        << "import thrift.protocol.binary;" << endl << "import thrift.server.simple;" << endl
-        << "import thrift.server.transport.socket;" << endl << "import thrift.transport.buffered;"
-        << endl << "import thrift.util.hashset;" << endl << endl << "import "
-        << render_package(*tservice->get_program()) << svc_name << ";" << endl << "import "
-        << render_package(*get_program()) << program_name_ << "_types;" << endl << endl << endl
-        << "class " << svc_name << "Handler : " << svc_name << " {" << endl;
+    out << "/*" << '\n'
+        << " * This auto-generated skeleton file illustrates how to build a server. If you" << '\n'
+        << " * intend to customize it, you should edit a copy with another file name to " << '\n'
+        << " * avoid overwriting it when running the generator again." << '\n' << " */" << '\n'
+        << "module " << render_package(*tservice->get_program()) << svc_name << "_server;" << '\n'
+        << '\n' << "import std.stdio;" << '\n' << "import thrift.codegen.processor;" << '\n'
+        << "import thrift.protocol.binary;" << '\n' << "import thrift.server.simple;" << '\n'
+        << "import thrift.server.transport.socket;" << '\n' << "import thrift.transport.buffered;"
+        << '\n' << "import thrift.util.hashset;" << '\n' << '\n' << "import "
+        << render_package(*tservice->get_program()) << svc_name << ";" << '\n' << "import "
+        << render_package(*get_program()) << program_name_ << "_types;" << '\n' << '\n' << '\n'
+        << "class " << svc_name << "Handler : " << svc_name << " {" << '\n';
 
     indent_up();
-    out << indent() << "this() {" << endl << indent() << "  // Your initialization goes here."
-        << endl << indent() << "}" << endl << endl;
+    out << indent() << "this() {" << '\n' << indent() << "  // Your initialization goes here."
+        << '\n' << indent() << "}" << '\n' << '\n';
 
     vector<t_function*> functions = tservice->get_functions();
     vector<t_function*>::iterator f_iter;
     for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
       out << indent();
       print_function_signature(out, *f_iter);
-      out << " {" << endl;
+      out << " {" << '\n';
 
       indent_up();
 
-      out << indent() << "// Your implementation goes here." << endl << indent() << "writeln(\""
-          << suffix_if_reserved((*f_iter)->get_name()) << " called\");" << endl;
+      out << indent() << "// Your implementation goes here." << '\n' << indent() << "writeln(\""
+          << suffix_if_reserved((*f_iter)->get_name()) << " called\");" << '\n';
 
       t_type* rt = (*f_iter)->get_returntype();
       if (!rt->is_void()) {
-        indent(out) << "return typeof(return).init;" << endl;
+        indent(out) << "return typeof(return).init;" << '\n';
       }
 
       indent_down();
 
-      out << indent() << "}" << endl << endl;
+      out << indent() << "}" << '\n' << '\n';
     }
 
     indent_down();
-    out << "}" << endl << endl;
+    out << "}" << '\n' << '\n';
 
-    out << indent() << "void main() {" << endl;
+    out << indent() << "void main() {" << '\n';
     indent_up();
-    out << indent() << "auto protocolFactory = new TBinaryProtocolFactory!();" << endl << indent()
+    out << indent() << "auto protocolFactory = new TBinaryProtocolFactory!();" << '\n' << indent()
         << "auto processor = new TServiceProcessor!" << svc_name << "(new " << svc_name
-        << "Handler);" << endl << indent() << "auto serverTransport = new TServerSocket(9090);"
-        << endl << indent() << "auto transportFactory = new TBufferedTransportFactory;" << endl
-        << indent() << "auto server = new TSimpleServer(" << endl << indent()
-        << "  processor, serverTransport, transportFactory, protocolFactory);" << endl << indent()
-        << "server.serve();" << endl;
+        << "Handler);" << '\n' << indent() << "auto serverTransport = new TServerSocket(9090);"
+        << '\n' << indent() << "auto transportFactory = new TBufferedTransportFactory;" << '\n'
+        << indent() << "auto server = new TSimpleServer(" << '\n' << indent()
+        << "  processor, serverTransport, transportFactory, protocolFactory);" << '\n' << indent()
+        << "server.serve();" << '\n';
     indent_down();
-    out << "}" << endl;
+    out << "}" << '\n';
   }
 
   /**
@@ -439,9 +437,9 @@
     const vector<t_field*>& members = tstruct->get_members();
 
     if (is_exception) {
-      indent(out) << "class " << suffix_if_reserved(tstruct->get_name()) << " : TException {" << endl;
+      indent(out) << "class " << suffix_if_reserved(tstruct->get_name()) << " : TException {" << '\n';
     } else {
-      indent(out) << "struct " << suffix_if_reserved(tstruct->get_name()) << " {" << endl;
+      indent(out) << "struct " << suffix_if_reserved(tstruct->get_name()) << " {" << '\n';
     }
     indent_up();
 
@@ -449,11 +447,11 @@
     vector<t_field*>::const_iterator m_iter;
     for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
       indent(out) << render_type_name((*m_iter)->get_type()) << " " << suffix_if_reserved((*m_iter)->get_name()) << ";"
-                  << endl;
+                  << '\n';
     }
 
     if (!members.empty())
-      indent(out) << endl;
+      indent(out) << '\n';
     indent(out) << "mixin TStructHelpers!(";
 
     if (!members.empty()) {
@@ -471,7 +469,7 @@
         } else {
           out << ",";
         }
-        out << endl;
+        out << '\n';
 
         indent(out) << "TFieldMeta(`" << suffix_if_reserved((*m_iter)->get_name()) << "`, " << (*m_iter)->get_key();
 
@@ -485,13 +483,13 @@
       }
 
       indent_down();
-      out << endl << indent() << "]";
+      out << '\n' << indent() << "]";
     }
 
-    out << ");" << endl;
+    out << ");" << '\n';
 
     indent_down();
-    indent(out) << "}" << endl << endl;
+    indent(out) << "}" << '\n' << '\n';
   }
 
   /**
@@ -559,13 +557,13 @@
     } else if (type->is_enum()) {
       out << "cast(" << render_type_name(type) << ")" << value->get_integer();
     } else {
-      out << "{" << endl;
+      out << "{" << '\n';
       indent_up();
 
-      indent(out) << render_type_name(type) << " v;" << endl;
+      indent(out) << render_type_name(type) << " v;" << '\n';
       if (type->is_struct() || type->is_xception()) {
         indent(out) << "v = " << (type->is_xception() ? "new " : "") << render_type_name(type)
-                    << "();" << endl;
+                    << "();" << '\n';
 
         const vector<t_field*>& fields = ((t_struct*)type)->get_members();
         vector<t_field*>::const_iterator f_iter;
@@ -583,7 +581,7 @@
                 + v_iter->first->get_string();
           }
           string val = render_const_value(field_type, v_iter->second);
-          indent(out) << "v.set!`" << v_iter->first->get_string() << "`(" << val << ");" << endl;
+          indent(out) << "v.set!`" << v_iter->first->get_string() << "`(" << val << ");" << '\n';
         }
       } else if (type->is_map()) {
         t_type* ktype = ((t_map*)type)->get_key_type();
@@ -597,7 +595,7 @@
           if (!is_immutable_type(ktype)) {
             out << "cast(immutable(" << render_type_name(ktype) << "))";
           }
-          out << key << "] = " << val << ";" << endl;
+          out << key << "] = " << val << ";" << '\n';
         }
       } else if (type->is_list()) {
         t_type* etype = ((t_list*)type)->get_elem_type();
@@ -605,7 +603,7 @@
         vector<t_const_value*>::const_iterator v_iter;
         for (v_iter = val.begin(); v_iter != val.end(); ++v_iter) {
           string val = render_const_value(etype, *v_iter);
-          indent(out) << "v ~= " << val << ";" << endl;
+          indent(out) << "v ~= " << val << ";" << '\n';
         }
       } else if (type->is_set()) {
         t_type* etype = ((t_set*)type)->get_elem_type();
@@ -613,12 +611,12 @@
         vector<t_const_value*>::const_iterator v_iter;
         for (v_iter = val.begin(); v_iter != val.end(); ++v_iter) {
           string val = render_const_value(etype, *v_iter);
-          indent(out) << "v ~= " << val << ";" << endl;
+          indent(out) << "v ~= " << val << ";" << '\n';
         }
       } else {
         throw "Compiler error: Invalid type in render_const_value: " + type->get_name();
       }
-      indent(out) << "return v;" << endl;
+      indent(out) << "return v;" << '\n';
 
       indent_down();
       indent(out) << "}()";
@@ -728,8 +726,8 @@
    */
 
   void print_default_imports(ostream& out) {
-    indent(out) << "import thrift.base;" << endl << "import thrift.codegen.base;" << endl
-                << "import thrift.util.hashset;" << endl << endl;
+    indent(out) << "import thrift.base;" << '\n' << "import thrift.codegen.base;" << '\n'
+                << "import thrift.util.hashset;" << '\n' << '\n';
   }
 
   /**
diff --git a/compiler/cpp/src/thrift/generate/t_dart_generator.cc b/compiler/cpp/src/thrift/generate/t_dart_generator.cc
index fda989b..0055043 100644
--- a/compiler/cpp/src/thrift/generate/t_dart_generator.cc
+++ b/compiler/cpp/src/thrift/generate/t_dart_generator.cc
@@ -37,9 +37,6 @@
 using std::stringstream;
 using std::vector;
 
-static const string endl = "\n"; // avoid ostream << std::endl flushes
-static const string endl2 = "\n\n";
-
 /**
  * Use the current Thrift version for static libraries.  When releasing, update
  * the version in these files.
@@ -89,11 +86,11 @@
   }
 
   void scope_up(std::ostream& out, std::string prefix=" ") {
-    out << prefix << "{" << endl;
+    out << prefix << "{" << '\n';
     indent_up();
   }
 
-  void scope_down(std::ostream& out, std::string postfix=endl) {
+  void scope_down(std::ostream& out, std::string postfix="\n") {
     indent_down();
     indent(out) << "}" << postfix;
   }
@@ -339,7 +336,7 @@
  * @return List of imports for services
  */
 string t_dart_generator::service_imports() {
-  return "import 'dart:async';" + endl;
+  return string("import 'dart:async';") + "\n";
 }
 
 /**
@@ -348,14 +345,14 @@
  * @return List of imports necessary for thrift
  */
 string t_dart_generator::dart_thrift_imports() {
-  string imports = "import 'dart:typed_data' show Uint8List;" + endl +
-                   "import 'package:thrift/thrift.dart';" + endl;
+  string imports = string("import 'dart:typed_data' show Uint8List;") + "\n" +
+                   string("import 'package:thrift/thrift.dart';") + "\n";
 
   // add import for this library
   if (package_prefix_.empty()) {
-    imports += "import 'package:" + library_name_ + "/" + library_name_ + ".dart';" + endl;
+    imports += "import 'package:" + library_name_ + "/" + library_name_ + ".dart';" + "\n";
   } else {
-    imports += "import 'package:" + package_prefix_ + library_name_ + ".dart';" + endl;
+    imports += "import 'package:" + package_prefix_ + library_name_ + ".dart';" + "\n";
   }
 
   // add imports for included thrift files
@@ -364,9 +361,9 @@
     string include_name = find_library_name(include);
     string named_import = "t_" + include_name;
     if (package_prefix_.empty()) {
-      imports += "import 'package:" + include_name + "/" + include_name + ".dart' as " + named_import + ";" + endl;
+      imports += "import 'package:" + include_name + "/" + include_name + ".dart' as " + named_import + ";" + "\n";
     } else {
-      imports += "import 'package:" + package_prefix_ + include_name + ".dart' as " + named_import + ";" + endl;
+      imports += "import 'package:" + package_prefix_ + include_name + ".dart' as " + named_import + ";" + "\n";
     }
   }
 
@@ -395,8 +392,8 @@
   ofstream_with_content_based_conditional_update f_library;
   f_library.open(f_library_name.c_str());
 
-  f_library << autogen_comment() << endl;
-  f_library << "library " << library_prefix_ << library_name_ << ";" << endl2;
+  f_library << autogen_comment() << '\n';
+  f_library << "library " << library_prefix_ << library_name_ << ";" << '\n' << '\n';
   f_library << library_exports_;
 
   f_library.close();
@@ -409,7 +406,7 @@
   } else {
     subdir = library_name_;
   }
-  library_exports_ += "export '" + subdir + "/" + file_name + ".dart' show " + class_name + ";" + endl;
+  library_exports_ += "export '" + subdir + "/" + file_name + ".dart' show " + class_name + ";" + "\n";
 }
 
 void t_dart_generator::generate_dart_pubspec() {
@@ -417,30 +414,30 @@
   ofstream_with_content_based_conditional_update f_pubspec;
   f_pubspec.open(f_pubspec_name.c_str());
 
-  indent(f_pubspec) << "name: " << library_name_ << endl;
-  indent(f_pubspec) << "version: 0.0.1" << endl;
-  indent(f_pubspec) << "description: Autogenerated by Thrift Compiler" << endl;
-  f_pubspec << endl;
+  indent(f_pubspec) << "name: " << library_name_ << '\n';
+  indent(f_pubspec) << "version: 0.0.1" << '\n';
+  indent(f_pubspec) << "description: Autogenerated by Thrift Compiler" << '\n';
+  f_pubspec << '\n';
 
-  indent(f_pubspec) << "environment:" << endl;
+  indent(f_pubspec) << "environment:" << '\n';
   indent_up();
-  indent(f_pubspec) << "sdk: '>=1.24.3 <3.0.0'" << endl;
+  indent(f_pubspec) << "sdk: '>=1.24.3 <3.0.0'" << '\n';
   indent_down();
-  f_pubspec << endl;
+  f_pubspec << '\n';
 
-  indent(f_pubspec) << "dependencies:" << endl;
+  indent(f_pubspec) << "dependencies:" << '\n';
   indent_up();
 
   if (pubspec_lib_.empty()) {
     // default to relative path within working directory, which works for tests
-    indent(f_pubspec) << "thrift:  # ^" << dart_thrift_version << endl;
+    indent(f_pubspec) << "thrift:  # ^" << dart_thrift_version << '\n';
     indent_up();
-    indent(f_pubspec) << "path: ../../../../lib/dart" << endl;
+    indent(f_pubspec) << "path: ../../../../lib/dart" << '\n';
     indent_down();
   } else {
     const vector<std::string> lines = split(pubspec_lib_, '|');
     for (const auto & line : lines) {
-      indent(f_pubspec) << line << endl;
+      indent(f_pubspec) << line << '\n';
     }
   }
 
@@ -448,14 +445,14 @@
   const vector<t_program*>& includes = program_->get_includes();
   for (auto include : includes) {
     string include_name = find_library_name(include);
-    indent(f_pubspec) << include_name << ":" << endl;
+    indent(f_pubspec) << include_name << ":" << '\n';
     indent_up();
-    indent(f_pubspec) << "path: ../" << include_name << endl;
+    indent(f_pubspec) << "path: ../" << include_name << '\n';
     indent_down();
   }
 
   indent_down();
-  f_pubspec << endl;
+  f_pubspec << '\n';
 
   f_pubspec.close();
 }
@@ -483,7 +480,7 @@
   f_enum.open(f_enum_name.c_str());
 
   // Comment and add library
-  f_enum << autogen_comment() << dart_library(file_name) << endl;
+  f_enum << autogen_comment() << dart_library(file_name) << '\n';
 
   string class_name = tenum->get_name();
   export_class_to_library(file_name, class_name);
@@ -495,34 +492,34 @@
   for (c_iter = constants.begin(); c_iter != constants.end(); ++c_iter) {
     int value = (*c_iter)->get_value();
     indent(f_enum) << "static const int " << (*c_iter)->get_name() << " = " << value << ";"
-                   << endl;
+                   << '\n';
   }
 
   // Create a static Set with all valid values for this enum
-  f_enum << endl;
+  f_enum << '\n';
 
-  indent(f_enum) << "static final Set<int> VALID_VALUES = new Set.from([" << endl;
+  indent(f_enum) << "static final Set<int> VALID_VALUES = new Set.from([" << '\n';
   indent_up();
   bool firstValue = true;
   for (c_iter = constants.begin(); c_iter != constants.end(); ++c_iter) {
     // populate set
     indent(f_enum) << (firstValue ? "" : ", ");
-    f_enum << (*c_iter)->get_name() << endl;
+    f_enum << (*c_iter)->get_name() << '\n';
     firstValue = false;
   }
   indent_down();
-  indent(f_enum) << "]);" << endl;
+  indent(f_enum) << "]);" << '\n';
 
-  indent(f_enum) << "static final Map<int, String> VALUES_TO_NAMES = {" << endl;
+  indent(f_enum) << "static final Map<int, String> VALUES_TO_NAMES = {" << '\n';
   indent_up();
   firstValue = true;
   for (c_iter = constants.begin(); c_iter != constants.end(); ++c_iter) {
     indent(f_enum) << (firstValue ? "" : ", ");
-    f_enum  << (*c_iter)->get_name() << ": '" << (*c_iter)->get_name() << "'" << endl;
+    f_enum  << (*c_iter)->get_name() << ": '" << (*c_iter)->get_name() << "'" << '\n';
     firstValue = false;
   }
   indent_down();
-  indent(f_enum) << "};" << endl;
+  indent(f_enum) << "};" << '\n';
 
   scope_down(f_enum); // end class
 
@@ -545,8 +542,8 @@
   f_consts.open(f_consts_name.c_str());
 
   // Print header
-  f_consts << autogen_comment() << dart_library(file_name) << endl;
-  f_consts << dart_thrift_imports() << endl;
+  f_consts << autogen_comment() << dart_library(file_name) << '\n';
+  f_consts << dart_thrift_imports() << '\n';
 
   export_class_to_library(file_name, class_name);
   indent(f_consts) << "class " << class_name;
@@ -559,7 +556,7 @@
                       (*c_iter)->get_type(),
                       (*c_iter)->get_value(),
                       false);
-    f_consts << endl;
+    f_consts << '\n';
   }
 
   scope_down(f_consts);
@@ -585,13 +582,13 @@
     }
     string v2 = render_const_value(out, name, type, value);
     out << name;
-    out << " = " << v2 << ";" << endl << endl;
+    out << " = " << v2 << ";" << '\n' << '\n';
   } else if (type->is_enum()) {
     if (!defval) {
       out << type_name(type) << " ";
     }
     out << name;
-    out << " = " << value->get_integer() << ";" << endl << endl;
+    out << " = " << value->get_integer() << ";" << '\n' << '\n';
   } else if (type->is_struct() || type->is_xception()) {
     const vector<t_field*>& fields = ((t_struct*)type)->get_members();
     vector<t_field*>::const_iterator f_iter;
@@ -610,11 +607,11 @@
         throw "type error: " + type->get_name() + " has no field " + v_iter->first->get_string();
       }
       string val = render_const_value(out, name, field_type, v_iter->second);
-      out << endl;
+      out << '\n';
       indent(out) << ".." << v_iter->first->get_string() << " = " << val;
     }
     indent_down();
-    out << ";" << endl;
+    out << ";" << '\n';
   } else if (type->is_map()) {
     if (!defval) {
       out << type_name(type) << " ";
@@ -630,11 +627,11 @@
     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) << key << ": " << val << "," << endl;
+      indent(out) << key << ": " << val << "," << '\n';
     }
-    scope_down(out, ";" + endl);
+    scope_down(out, string(";") + "\n");
 
-    out << endl;
+    out << '\n';
   } else if (type->is_list() || type->is_set()) {
     if (!defval) {
       out << type_name(type) << " ";
@@ -642,10 +639,10 @@
     out << name << " = ";
     t_type* etype;
     if (type->is_list()) {
-      out << "[" << endl;
+      out << "[" << '\n';
       etype = ((t_list*)type)->get_elem_type();
     } else {
-      out << "new " << type_name(type) << ".from([" << endl;
+      out << "new " << type_name(type) << ".from([" << '\n';
       etype = ((t_set*)type)->get_elem_type();
     }
     const vector<t_const_value*>& val = value->get_list();
@@ -654,14 +651,14 @@
     indent_up();
     for (v_iter = val.begin(); v_iter != val.end(); ++v_iter) {
       string val = render_const_value(out, name, etype, *v_iter);
-      indent(out) << val << "," << endl;
+      indent(out) << val << "," << '\n';
     }
     indent_down();
 
     if (type->is_list()) {
-      indent(out) << "];" << endl;
+      indent(out) << "];" << '\n';
     } else {
-      indent(out) << "]);" << endl;
+      indent(out) << "]);" << '\n';
     }
 
   } else {
@@ -707,7 +704,7 @@
   } else {
     string t = tmp("tmp");
     print_const_value(out, t, type, value, true);
-    out << endl;
+    out << '\n';
     render << t;
   }
 
@@ -744,11 +741,11 @@
   ofstream_with_content_based_conditional_update f_struct;
   f_struct.open(f_struct_name.c_str());
 
-  f_struct << autogen_comment() << dart_library(file_name) << endl;
+  f_struct << autogen_comment() << dart_library(file_name) << '\n';
 
   string imports;
 
-  f_struct << dart_thrift_imports() << endl;
+  f_struct << dart_thrift_imports() << '\n';
 
   generate_dart_struct_definition(f_struct, tstruct, is_exception, false, file_name);
 
@@ -785,7 +782,7 @@
   scope_up(out);
 
   indent(out) << "static final TStruct _STRUCT_DESC = new TStruct(\"" << class_name
-              << "\");" << endl;
+              << "\");" << '\n';
 
   // Members are public for -dart, private for -dartbean
   const vector<t_field*>& members = tstruct->get_members();
@@ -795,33 +792,33 @@
     indent(out) << "static final TField _" << constant_name((*m_iter)->get_name())
                 << "_FIELD_DESC = new TField(\"" << (*m_iter)->get_name() << "\", "
                 << type_to_enum((*m_iter)->get_type()) << ", " << (*m_iter)->get_key() << ");"
-                << endl;
+                << '\n';
   }
 
-  out << endl;
+  out << '\n';
 
   for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
     generate_dart_doc(out, *m_iter);
     indent(out) << type_name((*m_iter)->get_type()) + " _"
-                << get_member_name((*m_iter)->get_name()) << init_value(*m_iter) << ";" << endl;
+                << get_member_name((*m_iter)->get_name()) << init_value(*m_iter) << ";" << '\n';
 
     indent(out) << "static const int " << upcase_string((*m_iter)->get_name())
-                << " = " << (*m_iter)->get_key() << ";" << endl;
+                << " = " << (*m_iter)->get_key() << ";" << '\n';
   }
 
-  out << endl;
+  out << '\n';
 
   // Inner Isset class
   if (members.size() > 0) {
     for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
       if (!type_can_be_null((*m_iter)->get_type())) {
         string field_name = get_member_name((*m_iter)->get_name());
-        indent(out) << "bool __isset_" << field_name << " = false;" << endl;
+        indent(out) << "bool __isset_" << field_name << " = false;" << '\n';
       }
     }
   }
 
-  out << endl;
+  out << '\n';
 
   // Default constructor
   indent(out) << tstruct->get_name() << "()";
@@ -838,7 +835,7 @@
     }
   }
   scope_down(out);
-  out << endl;
+  out << '\n';
 
   generate_dart_bean_boilerplate(out, tstruct);
   generate_generic_field_getters(out, tstruct);
@@ -854,7 +851,7 @@
   generate_dart_struct_tostring(out, tstruct);
   generate_dart_validator(out, tstruct);
   scope_down(out);
-  out << endl;
+  out << '\n';
 }
 
 /**
@@ -870,20 +867,20 @@
   vector<t_field*>::const_iterator f_iter;
 
   // Declare stack tmp variables and read struct header
-  indent(out) << "TField field;" << endl;
-  indent(out) << "iprot.readStructBegin();" << endl;
+  indent(out) << "TField field;" << '\n';
+  indent(out) << "iprot.readStructBegin();" << '\n';
 
   // Loop over reading in fields
   indent(out) << "while (true)";
   scope_up(out);
 
   // Read beginning field marker
-  indent(out) << "field = iprot.readFieldBegin();" << endl;
+  indent(out) << "field = iprot.readFieldBegin();" << '\n';
 
   // Check for field STOP marker and break
   indent(out) << "if (field.type == TType.STOP)";
   scope_up(out);
-  indent(out) << "break;" << endl;
+  indent(out) << "break;" << '\n';
   scope_down(out);
 
   // Switch statement on the field we are reading
@@ -892,7 +889,7 @@
 
   // Generate deserialization code for known cases
   for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
-    indent(out) << "case " << upcase_string((*f_iter)->get_name()) << ":" << endl;
+    indent(out) << "case " << upcase_string((*f_iter)->get_name()) << ":" << '\n';
     indent_up();
 
     indent(out) << "if (field.type == " << type_to_enum((*f_iter)->get_type()) << ")";
@@ -903,33 +900,33 @@
 
     scope_down(out, " else");
     scope_up(out);
-    indent(out) << "TProtocolUtil.skip(iprot, field.type);" << endl;
+    indent(out) << "TProtocolUtil.skip(iprot, field.type);" << '\n';
     scope_down(out);
 
-    indent(out) << "break;" << endl;
+    indent(out) << "break;" << '\n';
     indent_down();
   }
 
   // In the default case we skip the field
-  indent(out) << "default:" << endl;
+  indent(out) << "default:" << '\n';
   indent_up();
-  indent(out) << "TProtocolUtil.skip(iprot, field.type);" << endl;
-  indent(out) << "break;" << endl;
+  indent(out) << "TProtocolUtil.skip(iprot, field.type);" << '\n';
+  indent(out) << "break;" << '\n';
   indent_down();
 
   scope_down(out);
 
   // Read field end marker
-  indent(out) << "iprot.readFieldEnd();" << endl;
+  indent(out) << "iprot.readFieldEnd();" << '\n';
 
   scope_down(out);
 
-  indent(out) << "iprot.readStructEnd();" << endl2;
+  indent(out) << "iprot.readStructEnd();" << '\n' << '\n';
 
   // in non-beans style, check for required fields of primitive type
   // (which can be checked here but not in the general validate method)
   indent(out) << "// check for required fields of primitive type, which can't be "
-                 "checked in the validate method" << endl;
+                 "checked in the validate method" << '\n';
   for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
     if ((*f_iter)->get_req() == t_field::T_REQUIRED && !type_can_be_null((*f_iter)->get_type())) {
       string field_name = get_member_name((*f_iter)->get_name());
@@ -937,15 +934,15 @@
       scope_up(out);
       indent(out) << "  throw new TProtocolError(TProtocolErrorType.UNKNOWN, \"Required field '"
           << field_name
-          << "' was not found in serialized data! Struct: \" + toString());" << endl;
-      scope_down(out, endl2);
+          << "' was not found in serialized data! Struct: \" + toString());" << '\n';
+      scope_down(out, "\n\n");
     }
   }
 
   // performs various checks (e.g. check that all required fields are set)
-  indent(out) << "validate();" << endl;
+  indent(out) << "validate();" << '\n';
 
-  scope_down(out, endl2);
+  scope_down(out, "\n\n");
 }
 
 // generates dart method to perform various checks
@@ -957,7 +954,7 @@
   const vector<t_field*>& fields = tstruct->get_members();
   vector<t_field*>::const_iterator f_iter;
 
-  indent(out) << "// check for required fields" << endl;
+  indent(out) << "// check for required fields" << '\n';
   for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
     if ((*f_iter)->get_req() == t_field::T_REQUIRED) {
       string field_name = get_member_name((*f_iter)->get_name());
@@ -966,17 +963,17 @@
         scope_up(out);
         indent(out) << "throw new TProtocolError(TProtocolErrorType.UNKNOWN, \"Required field '"
                     << field_name << "' was not present! Struct: \" + toString());"
-                    << endl;
+                    << '\n';
         scope_down(out);
       } else {
         indent(out) << "// alas, we cannot check '" << field_name
-                    << "' because it's a primitive and you chose the non-beans generator." << endl;
+                    << "' because it's a primitive and you chose the non-beans generator." << '\n';
       }
     }
   }
 
   // check that fields of type enum have valid values
-  indent(out) << "// check that fields of type enum have valid values" << endl;
+  indent(out) << "// check that fields of type enum have valid values" << '\n';
   for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
     t_field* field = (*f_iter);
     t_type* type = field->get_type();
@@ -988,12 +985,12 @@
       scope_up(out);
       indent(out) << "throw new TProtocolError(TProtocolErrorType.UNKNOWN, \"The field '"
                   << field_name << "' has been assigned the invalid value "
-                  << "$" << field_name << "\");" << endl;
+                  << "$" << field_name << "\");" << '\n';
       scope_down(out);
     }
   }
 
-  scope_down(out, endl2);
+  scope_down(out, "\n\n");
 }
 
 /**
@@ -1009,9 +1006,9 @@
   vector<t_field*>::const_iterator f_iter;
 
   // performs various checks (e.g. check that all required fields are set)
-  indent(out) << "validate();" << endl2;
+  indent(out) << "validate();" << '\n' << '\n';
 
-  indent(out) << "oprot.writeStructBegin(_STRUCT_DESC);" << endl;
+  indent(out) << "oprot.writeStructBegin(_STRUCT_DESC);" << '\n';
 
   for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
     string field_name = get_member_name((*f_iter)->get_name());
@@ -1027,13 +1024,13 @@
     }
 
     indent(out) << "oprot.writeFieldBegin(_" << constant_name((*f_iter)->get_name())
-                << "_FIELD_DESC);" << endl;
+                << "_FIELD_DESC);" << '\n';
 
     // Write field contents
     generate_serialize_field(out, *f_iter, "this.");
 
     // Write field closer
-    indent(out) << "oprot.writeFieldEnd();" << endl;
+    indent(out) << "oprot.writeFieldEnd();" << '\n';
 
     if (null_allowed) {
       scope_down(out);
@@ -1043,10 +1040,10 @@
     }
   }
   // Write the struct map
-  indent(out) << "oprot.writeFieldStop();" << endl << indent() << "oprot.writeStructEnd();"
-      << endl;
+  indent(out) << "oprot.writeFieldStop();" << '\n' << indent() << "oprot.writeStructEnd();"
+      << '\n';
 
-  scope_down(out, endl2);
+  scope_down(out, "\n\n");
 }
 
 /**
@@ -1064,7 +1061,7 @@
   const vector<t_field*>& fields = tstruct->get_sorted_members();
   vector<t_field*>::const_iterator f_iter;
 
-  indent(out) << "oprot.writeStructBegin(_STRUCT_DESC);" << endl2;
+  indent(out) << "oprot.writeStructBegin(_STRUCT_DESC);" << '\n' << '\n';
 
   bool first = true;
   for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
@@ -1079,23 +1076,23 @@
     scope_up(out);
 
     indent(out) << "oprot.writeFieldBegin(_" << constant_name((*f_iter)->get_name())
-                << "_FIELD_DESC);" << endl;
+                << "_FIELD_DESC);" << '\n';
 
     // Write field contents
     generate_serialize_field(out, *f_iter, "this.");
 
     // Write field closer
-    indent(out) << "oprot.writeFieldEnd();" << endl;
+    indent(out) << "oprot.writeFieldEnd();" << '\n';
 
     scope_down(out, "");
   }
-  out << endl;
+  out << '\n';
 
   // Write the struct map
-  indent(out) << "oprot.writeFieldStop();" << endl << indent()
-      << "oprot.writeStructEnd();" << endl;
+  indent(out) << "oprot.writeFieldStop();" << '\n' << indent()
+      << "oprot.writeStructEnd();" << '\n';
 
-  scope_down(out, endl2);
+  scope_down(out, "\n\n");
 }
 
 void t_dart_generator::generate_generic_field_getters(std::ostream& out,
@@ -1113,19 +1110,19 @@
     t_field* field = *f_iter;
     std::string field_name = get_member_name(field->get_name());
 
-    indent(out) << "case " << upcase_string(field_name) << ":" << endl;
+    indent(out) << "case " << upcase_string(field_name) << ":" << '\n';
     indent_up();
-    indent(out) << "return this." << field_name << ";" << endl;
+    indent(out) << "return this." << field_name << ";" << '\n';
     indent_down();
   }
 
-  indent(out) << "default:" << endl;
+  indent(out) << "default:" << '\n';
   indent_up();
-  indent(out) << "throw new ArgumentError(\"Field $fieldID doesn't exist!\");" << endl;
+  indent(out) << "throw new ArgumentError(\"Field $fieldID doesn't exist!\");" << '\n';
   indent_down();
 
   scope_down(out);  // switch
-  scope_down(out, endl2);  // method
+  scope_down(out, "\n\n");  // method
 }
 
 void t_dart_generator::generate_generic_field_setters(std::ostream& out,
@@ -1145,31 +1142,31 @@
     t_field* field = *f_iter;
     std::string field_name = get_member_name(field->get_name());
 
-    indent(out) << "case " << upcase_string(field_name) << ":" << endl;
+    indent(out) << "case " << upcase_string(field_name) << ":" << '\n';
     indent_up();
 
     indent(out) << "if (value == null)";
     scope_up(out);
-    indent(out) << "unset" << get_cap_name(field_name) << "();" << endl;
+    indent(out) << "unset" << get_cap_name(field_name) << "();" << '\n';
 
     scope_down(out, " else");
     scope_up(out);
-    indent(out) << "this." << field_name << " = value;" << endl;
+    indent(out) << "this." << field_name << " = value;" << '\n';
     scope_down(out);
 
-    indent(out) << "break;" << endl;
+    indent(out) << "break;" << '\n';
 
     indent_down();
-    out << endl;
+    out << '\n';
   }
 
-  indent(out) << "default:" << endl;
+  indent(out) << "default:" << '\n';
   indent_up();
-  indent(out) << "throw new ArgumentError(\"Field $fieldID doesn't exist!\");" << endl;
+  indent(out) << "throw new ArgumentError(\"Field $fieldID doesn't exist!\");" << '\n';
   indent_down();
 
   scope_down(out);  // switch
-  scope_down(out, endl2);  // method
+  scope_down(out, "\n\n");  // method
 }
 
 // Creates a generic isSet method that takes the field number as argument
@@ -1179,7 +1176,7 @@
 
   // create the isSet method
   indent(out) << "// Returns true if field corresponding to fieldID is set (has been assigned a "
-                 "value) and false otherwise" << endl;
+                 "value) and false otherwise" << '\n';
   indent(out) << "bool isSet(int fieldID)";
   scope_up(out);
 
@@ -1188,19 +1185,19 @@
 
   for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
     t_field* field = *f_iter;
-    indent(out) << "case " << upcase_string(field->get_name()) << ":" << endl;
+    indent(out) << "case " << upcase_string(field->get_name()) << ":" << '\n';
     indent_up();
-    indent(out) << "return " << generate_isset_check(field) << ";" << endl;
+    indent(out) << "return " << generate_isset_check(field) << ";" << '\n';
     indent_down();
   }
 
-  indent(out) << "default:" << endl;
+  indent(out) << "default:" << '\n';
   indent_up();
-  indent(out) << "throw new ArgumentError(\"Field $fieldID doesn't exist!\");" << endl;
+  indent(out) << "throw new ArgumentError(\"Field $fieldID doesn't exist!\");" << '\n';
   indent_down();
 
   scope_down(out);  // switch
-  scope_down(out, endl2);  // method
+  scope_down(out, "\n\n");  // method
 }
 
 /**
@@ -1219,37 +1216,37 @@
     std::string field_name = get_member_name(field->get_name());
     std::string cap_name = get_cap_name(field_name);
 
-    indent(out) << "// " << field_name << endl;
+    indent(out) << "// " << field_name << '\n';
 
     // Simple getter
     generate_dart_doc(out, field);
-    indent(out) << type_name(type) << " get " << field_name << " => this._" << field_name << ";" << endl2;
+    indent(out) << type_name(type) << " get " << field_name << " => this._" << field_name << ";" << '\n' << '\n';
 
     // Simple setter
     generate_dart_doc(out, field);
     indent(out) << "set " << field_name << "(" << type_name(type) << " " << field_name << ")";
     scope_up(out);
-    indent(out) << "this._" << field_name << " = " << field_name << ";" << endl;
+    indent(out) << "this._" << field_name << " = " << field_name << ";" << '\n';
     generate_isset_set(out, field);
-    scope_down(out, endl2);
+    scope_down(out, "\n\n");
 
     // isSet method
     indent(out) << "bool is" << get_cap_name("set") << cap_name << "()";
     if (type_can_be_null(type)) {
-      out << " => this." << field_name << " != null;" << endl2;
+      out << " => this." << field_name << " != null;" << '\n' << '\n';
     } else {
-      out << " => this.__isset_" << field_name << ";" << endl2;
+      out << " => this.__isset_" << field_name << ";" << '\n' << '\n';
     }
 
     // Unsetter
     indent(out) << "unset" << cap_name << "()";
     scope_up(out);
     if (type_can_be_null(type)) {
-      indent(out) << "this." << field_name << " = null;" << endl;
+      indent(out) << "this." << field_name << " = null;" << '\n';
     } else {
-      indent(out) << "this.__isset_" << field_name << " = false;" << endl;
+      indent(out) << "this.__isset_" << field_name << " = false;" << '\n';
     }
-    scope_down(out, endl2);
+    scope_down(out, "\n\n");
   }
 }
 
@@ -1264,7 +1261,7 @@
   scope_up(out);
 
   indent(out) << "StringBuffer ret = new StringBuffer(\""
-              << tstruct->get_name() << "(\");" << endl2;
+              << tstruct->get_name() << "(\");" << '\n' << '\n';
 
   const vector<t_field*>& fields = tstruct->get_members();
   vector<t_field*>::const_iterator f_iter;
@@ -1281,36 +1278,36 @@
     std::string field_name = get_member_name(field->get_name());
 
     if (!first) {
-      indent(out) << "ret.write(\", \");" << endl;
+      indent(out) << "ret.write(\", \");" << '\n';
     }
-    indent(out) << "ret.write(\"" << field_name << ":\");" << endl;
+    indent(out) << "ret.write(\"" << field_name << ":\");" << '\n';
     bool can_be_null = type_can_be_null(field->get_type());
     if (can_be_null) {
       indent(out) << "if (this." << field_name << " == null)";
       scope_up(out);
-      indent(out) << "ret.write(\"null\");" << endl;
+      indent(out) << "ret.write(\"null\");" << '\n';
       scope_down(out, " else");
       scope_up(out);
     }
 
     if (field->get_type()->is_binary()) {
-      indent(out) << "ret.write(\"BINARY\");" << endl;
+      indent(out) << "ret.write(\"BINARY\");" << '\n';
     } else if (field->get_type()->is_enum()) {
       indent(out) << "String " << field_name << "_name = "
                   << get_ttype_class_name(field->get_type())
-                  << ".VALUES_TO_NAMES[this." << field_name << "];" << endl;
+                  << ".VALUES_TO_NAMES[this." << field_name << "];" << '\n';
       indent(out) << "if (" << field_name << "_name != null)";
       scope_up(out);
-      indent(out) << "ret.write(" << field_name << "_name);" << endl;
-      indent(out) << "ret.write(\" (\");" << endl;
+      indent(out) << "ret.write(" << field_name << "_name);" << '\n';
+      indent(out) << "ret.write(\" (\");" << '\n';
       scope_down(out);
-      indent(out) << "ret.write(this." << field_name << ");" << endl;
+      indent(out) << "ret.write(this." << field_name << ");" << '\n';
       indent(out) << "if (" << field_name << "_name != null)";
       scope_up(out);
-      indent(out) << "ret.write(\")\");" << endl;
+      indent(out) << "ret.write(\")\");" << '\n';
       scope_down(out);
     } else {
-      indent(out) << "ret.write(this." << field_name << ");" << endl;
+      indent(out) << "ret.write(this." << field_name << ");" << '\n';
     }
 
     if (can_be_null) {
@@ -1320,15 +1317,15 @@
       scope_down(out);
     }
 
-    out << endl;
+    out << '\n';
     first = false;
   }
 
-  indent(out) << "ret.write(\")\");" << endl2;
+  indent(out) << "ret.write(\")\");" << '\n' << '\n';
 
-  indent(out) << "return ret.toString();" << endl;
+  indent(out) << "return ret.toString();" << '\n';
 
-  scope_down(out, endl2);
+  scope_down(out, "\n\n");
 }
 
 /**
@@ -1391,9 +1388,9 @@
   string f_service_name = src_dir_ + "/" + file_name + ".dart";
   f_service_.open(f_service_name.c_str());
 
-  f_service_ << autogen_comment() << dart_library(file_name) << endl;
-  f_service_ << service_imports() << dart_thrift_imports() << endl;
-  f_service_ << endl;
+  f_service_ << autogen_comment() << dart_library(file_name) << '\n';
+  f_service_ << service_imports() << dart_thrift_imports() << '\n';
+  f_service_ << '\n';
 
   generate_service_interface(tservice);
   generate_service_client(tservice);
@@ -1424,12 +1421,12 @@
   vector<t_function*> functions = tservice->get_functions();
   vector<t_function*>::iterator f_iter;
   for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
-    f_service_ << endl;
+    f_service_ << '\n';
     generate_dart_doc(f_service_, *f_iter);
-    indent(f_service_) << function_signature(*f_iter) << ";" << endl;
+    indent(f_service_) << function_signature(*f_iter) << ";" << '\n';
   }
 
-  scope_down(f_service_, endl2);
+  scope_down(f_service_, "\n\n");
 }
 
 /**
@@ -1465,31 +1462,31 @@
   indent(f_service_) << "class " << class_name << extends_client
                      << " implements " << service_name_;
   scope_up(f_service_);
-  f_service_ << endl;
+  f_service_ << '\n';
 
   indent(f_service_) << class_name << "(TProtocol iprot, [TProtocol oprot = null])";
 
   if (!extends.empty()) {
     indent_up();
-    f_service_ << endl;
-    indent(f_service_) << ": super(iprot, oprot);" << endl;
+    f_service_ << '\n';
+    indent(f_service_) << ": super(iprot, oprot);" << '\n';
     indent_down();
   } else {
     scope_up(f_service_);
-    indent(f_service_) << "_iprot = iprot;" << endl;
-    indent(f_service_) << "_oprot = (oprot == null) ? iprot : oprot;" << endl;
+    indent(f_service_) << "_iprot = iprot;" << '\n';
+    indent(f_service_) << "_oprot = (oprot == null) ? iprot : oprot;" << '\n';
     scope_down(f_service_);
   }
-  f_service_ << endl;
+  f_service_ << '\n';
 
   if (extends.empty()) {
-    indent(f_service_) << "TProtocol _iprot;" << endl2;
-    indent(f_service_) << "TProtocol get iprot => _iprot;" << endl2;
-    indent(f_service_) << "TProtocol _oprot;" << endl2;
-    indent(f_service_) << "TProtocol get oprot => _oprot;" << endl2;
-    indent(f_service_) << "int _seqid = 0;" << endl2;
-    indent(f_service_) << "int get seqid => _seqid;" << endl2;
-    indent(f_service_) << "int nextSeqid() => ++_seqid;" << endl2;
+    indent(f_service_) << "TProtocol _iprot;" << '\n' << '\n';
+    indent(f_service_) << "TProtocol get iprot => _iprot;" << '\n' << '\n';
+    indent(f_service_) << "TProtocol _oprot;" << '\n' << '\n';
+    indent(f_service_) << "TProtocol get oprot => _oprot;" << '\n' << '\n';
+    indent(f_service_) << "int _seqid = 0;" << '\n' << '\n';
+    indent(f_service_) << "int get seqid => _seqid;" << '\n' << '\n';
+    indent(f_service_) << "int nextSeqid() => ++_seqid;" << '\n' << '\n';
   }
 
   // Generate client method implementations
@@ -1510,40 +1507,40 @@
     // Serialize the request
     indent(f_service_) << "oprot.writeMessageBegin(new TMessage(\"" << (*f_iter)->get_name() << "\", "
                << ((*f_iter)->is_oneway() ? "TMessageType.ONEWAY" : "TMessageType.CALL")
-               << ", nextSeqid()));" << endl;
-    indent(f_service_) << argsname << " args = new " << argsname << "();" << endl;
+               << ", nextSeqid()));" << '\n';
+    indent(f_service_) << argsname << " args = new " << argsname << "();" << '\n';
 
     for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) {
       string arg_field_name = get_member_name((*fld_iter)->get_name());
       indent(f_service_) << "args." << arg_field_name << " = "
-                 << arg_field_name << ";" << endl;
+                 << arg_field_name << ";" << '\n';
     }
 
-    indent(f_service_) << "args.write(oprot);" << endl;
-    indent(f_service_) << "oprot.writeMessageEnd();" << endl2;
+    indent(f_service_) << "args.write(oprot);" << '\n';
+    indent(f_service_) << "oprot.writeMessageEnd();" << '\n' << '\n';
 
-    indent(f_service_) << "await oprot.transport.flush();" << endl2;
+    indent(f_service_) << "await oprot.transport.flush();" << '\n' << '\n';
 
     if (!(*f_iter)->is_oneway()) {
-      indent(f_service_) << "TMessage msg = iprot.readMessageBegin();" << endl;
+      indent(f_service_) << "TMessage msg = iprot.readMessageBegin();" << '\n';
       indent(f_service_) << "if (msg.type == TMessageType.EXCEPTION)";
       scope_up(f_service_);
-      indent(f_service_) << "TApplicationError error = TApplicationError.read(iprot);" << endl;
-      indent(f_service_) << "iprot.readMessageEnd();" << endl;
-      indent(f_service_) << "throw error;" << endl;
-      scope_down(f_service_, endl2);
+      indent(f_service_) << "TApplicationError error = TApplicationError.read(iprot);" << '\n';
+      indent(f_service_) << "iprot.readMessageEnd();" << '\n';
+      indent(f_service_) << "throw error;" << '\n';
+      scope_down(f_service_, "\n\n");
 
       string result_class = get_result_class_name((*f_iter)->get_name());
-      indent(f_service_) << result_class << " result = new " << result_class << "();" << endl;
-      indent(f_service_) << "result.read(iprot);" << endl;
-      indent(f_service_) << "iprot.readMessageEnd();" << endl;
+      indent(f_service_) << result_class << " result = new " << result_class << "();" << '\n';
+      indent(f_service_) << "result.read(iprot);" << '\n';
+      indent(f_service_) << "iprot.readMessageEnd();" << '\n';
 
       // Careful, only return _result if not a void function
       if (!(*f_iter)->get_returntype()->is_void()) {
         indent(f_service_) << "if (result." << generate_isset_check("success") << ")";
         scope_up(f_service_);
-        indent(f_service_) << "return result.success;" << endl;
-        scope_down(f_service_, endl2);
+        indent(f_service_) << "return result.success;" << '\n';
+        scope_down(f_service_, "\n\n");
       }
 
       t_struct* xs = (*f_iter)->get_xceptions();
@@ -1553,23 +1550,23 @@
         string result_field_name = get_member_name((*x_iter)->get_name());
         indent(f_service_) << "if (result." << result_field_name << " != null)";
         scope_up(f_service_);
-        indent(f_service_) << "throw result." << result_field_name << ";" << endl;
+        indent(f_service_) << "throw result." << result_field_name << ";" << '\n';
         scope_down(f_service_);
       }
 
       // If you get here it's an exception, unless a void function
       if ((*f_iter)->get_returntype()->is_void()) {
-        indent(f_service_) << "return;" << endl;
+        indent(f_service_) << "return;" << '\n';
       } else {
         indent(f_service_) << "throw new TApplicationError(TApplicationErrorType.MISSING_RESULT, \""
-                   << (*f_iter)->get_name() << " failed: unknown result\");" << endl;
+                   << (*f_iter)->get_name() << " failed: unknown result\");" << '\n';
       }
     }
 
-    scope_down(f_service_, endl2);
+    scope_down(f_service_, "\n\n");
   }
 
-  scope_down(f_service_, endl2);
+  scope_down(f_service_, "\n\n");
 }
 
 /**
@@ -1583,7 +1580,7 @@
   vector<t_function*>::iterator f_iter;
 
   // typedef
-  indent(f_service_) << "typedef void ProcessFunction(int seqid, TProtocol iprot, TProtocol oprot);" << endl2;
+  indent(f_service_) << "typedef void ProcessFunction(int seqid, TProtocol iprot, TProtocol oprot);" << '\n' << '\n';
 
   // Extends stuff
   string extends = "";
@@ -1602,57 +1599,57 @@
   indent(f_service_) << class_name << "(" << service_name_ << " iface)";
   if (!extends.empty()) {
     indent_up();
-    f_service_ << endl;
+    f_service_ << '\n';
     indent(f_service_) << ": super(iface)";
     indent_down();
   }
   scope_up(f_service_);
 
   if (extends.empty()) {
-    indent(f_service_) << "iface_ = iface;" << endl;
+    indent(f_service_) << "iface_ = iface;" << '\n';
   }
 
   for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
     indent(f_service_) << "PROCESS_MAP[\"" << (*f_iter)->get_name()
-               << "\"] = " << get_member_name((*f_iter)->get_name()) << ";" << endl;
+               << "\"] = " << get_member_name((*f_iter)->get_name()) << ";" << '\n';
   }
-  scope_down(f_service_, endl2);
+  scope_down(f_service_, "\n\n");
 
-  indent(f_service_) << service_name_ << " iface_;" << endl;
+  indent(f_service_) << service_name_ << " iface_;" << '\n';
 
   if (extends.empty()) {
-    indent(f_service_) << "final Map<String, ProcessFunction> PROCESS_MAP = {};" << endl;
+    indent(f_service_) << "final Map<String, ProcessFunction> PROCESS_MAP = {};" << '\n';
   }
 
-  f_service_ << endl;
+  f_service_ << '\n';
 
   // Generate the server implementation
   indent(f_service_) << "bool process(TProtocol iprot, TProtocol oprot)";
   scope_up(f_service_);
-  indent(f_service_) << "TMessage msg = iprot.readMessageBegin();" << endl;
-  indent(f_service_) << "ProcessFunction fn = PROCESS_MAP[msg.name];" << endl;
+  indent(f_service_) << "TMessage msg = iprot.readMessageBegin();" << '\n';
+  indent(f_service_) << "ProcessFunction fn = PROCESS_MAP[msg.name];" << '\n';
   indent(f_service_) << "if (fn == null)";
   scope_up(f_service_);
-  indent(f_service_) << "TProtocolUtil.skip(iprot, TType.STRUCT);" << endl;
-  indent(f_service_) << "iprot.readMessageEnd();" << endl;
+  indent(f_service_) << "TProtocolUtil.skip(iprot, TType.STRUCT);" << '\n';
+  indent(f_service_) << "iprot.readMessageEnd();" << '\n';
   indent(f_service_) << "TApplicationError x = new TApplicationError(TApplicationErrorType.UNKNOWN_METHOD, "
-         "\"Invalid method name: '\"+msg.name+\"'\");" << endl;
-  indent(f_service_) << "oprot.writeMessageBegin(new TMessage(msg.name, TMessageType.EXCEPTION, msg.seqid));" << endl;
-  indent(f_service_) << "x.write(oprot);" << endl;
-  indent(f_service_) << "oprot.writeMessageEnd();" << endl;
-  indent(f_service_) << "oprot.transport.flush();" << endl;
-  indent(f_service_) << "return true;" << endl;
+         "\"Invalid method name: '\"+msg.name+\"'\");" << '\n';
+  indent(f_service_) << "oprot.writeMessageBegin(new TMessage(msg.name, TMessageType.EXCEPTION, msg.seqid));" << '\n';
+  indent(f_service_) << "x.write(oprot);" << '\n';
+  indent(f_service_) << "oprot.writeMessageEnd();" << '\n';
+  indent(f_service_) << "oprot.transport.flush();" << '\n';
+  indent(f_service_) << "return true;" << '\n';
   scope_down(f_service_);
-  indent(f_service_) << "fn(msg.seqid, iprot, oprot);" << endl;
-  indent(f_service_) << "return true;" << endl;
-  scope_down(f_service_, endl2); // process function
+  indent(f_service_) << "fn(msg.seqid, iprot, oprot);" << '\n';
+  indent(f_service_) << "return true;" << '\n';
+  scope_down(f_service_, "\n\n"); // process function
 
   // Generate the process subfunctions
   for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
     generate_process_function(tservice, *f_iter);
   }
 
-  scope_down(f_service_, endl2); // class
+  scope_down(f_service_, "\n\n"); // class
 }
 
 /**
@@ -1700,16 +1697,16 @@
   string argsname = get_args_class_name(tfunction->get_name());
   string resultname = get_result_class_name(tfunction->get_name());
 
-  indent(f_service_) << argsname << " args = new " << argsname << "();" << endl;
-  indent(f_service_) << "args.read(iprot);" << endl;
-  indent(f_service_) << "iprot.readMessageEnd();" << endl;
+  indent(f_service_) << argsname << " args = new " << argsname << "();" << '\n';
+  indent(f_service_) << "args.read(iprot);" << '\n';
+  indent(f_service_) << "iprot.readMessageEnd();" << '\n';
 
   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()) {
-    indent(f_service_) << resultname << " result = new " << resultname << "();" << endl;
+    indent(f_service_) << resultname << " result = new " << resultname << "();" << '\n';
   }
 
   if (!tfunction->is_oneway() && xceptions.size() > 0) {
@@ -1736,7 +1733,7 @@
     }
     f_service_ << "args." << get_member_name((*f_iter)->get_name());
   }
-  f_service_ << ");" << endl;
+  f_service_ << ");" << '\n';
 
   if (!tfunction->is_oneway() && xceptions.size() > 0) {
     for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) {
@@ -1747,36 +1744,36 @@
       scope_up(f_service_);
       if (!tfunction->is_oneway()) {
         indent(f_service_) << "result." << result_field_name << " = "
-                   << result_field_name << ";" << endl;
+                   << result_field_name << ";" << '\n';
       }
     }
     scope_down(f_service_, " ");
     f_service_ << "catch (th)";
     scope_up(f_service_);
-    indent(f_service_) << "// Internal error" << endl;
+    indent(f_service_) << "// Internal error" << '\n';
     indent(f_service_) << "TApplicationError x = new "
                "TApplicationError(TApplicationErrorType.INTERNAL_ERROR, \"Internal error processing "
-               << tfunction->get_name() << "\");" << endl;
+               << tfunction->get_name() << "\");" << '\n';
     indent(f_service_) << "oprot.writeMessageBegin(new TMessage(\"" << tfunction->get_name()
-               << "\", TMessageType.EXCEPTION, seqid));" << endl;
-    indent(f_service_) << "x.write(oprot);" << endl;
-    indent(f_service_) << "oprot.writeMessageEnd();" << endl;
-    indent(f_service_) << "oprot.transport.flush();" << endl;
-    indent(f_service_) << "return;" << endl;
+               << "\", TMessageType.EXCEPTION, seqid));" << '\n';
+    indent(f_service_) << "x.write(oprot);" << '\n';
+    indent(f_service_) << "oprot.writeMessageEnd();" << '\n';
+    indent(f_service_) << "oprot.transport.flush();" << '\n';
+    indent(f_service_) << "return;" << '\n';
     scope_down(f_service_);
   }
 
   if (tfunction->is_oneway()) {
-    indent(f_service_) << "return;" << endl;
+    indent(f_service_) << "return;" << '\n';
   } else {
     indent(f_service_) << "oprot.writeMessageBegin(new TMessage(\"" << tfunction->get_name()
-               << "\", TMessageType.REPLY, seqid));" << endl;
-    indent(f_service_) << "result.write(oprot);" << endl;
-    indent(f_service_) << "oprot.writeMessageEnd();" << endl;
-    indent(f_service_) << "oprot.transport.flush();" << endl;
+               << "\", TMessageType.REPLY, seqid));" << '\n';
+    indent(f_service_) << "result.write(oprot);" << '\n';
+    indent(f_service_) << "oprot.writeMessageEnd();" << '\n';
+    indent(f_service_) << "oprot.transport.flush();" << '\n';
   }
 
-  scope_down(f_service_, endl2);
+  scope_down(f_service_, "\n\n");
 }
 
 /**
@@ -1840,7 +1837,7 @@
     } else if (type->is_enum()) {
       out << "readI32();";
     }
-    out << endl;
+    out << '\n';
   } else {
     printf("DO NOT KNOW HOW TO DESERIALIZE FIELD '%s' TYPE '%s'\n",
            field_name.c_str(),
@@ -1852,8 +1849,8 @@
  * Generates an unserializer for a struct, invokes read()
  */
 void t_dart_generator::generate_deserialize_struct(ostream& out, t_struct* tstruct, string prefix) {
-  indent(out) << prefix << " = new " << type_name(tstruct) << "();" << endl;
-  indent(out) << prefix << ".read(iprot);" << endl;
+  indent(out) << prefix << " = new " << type_name(tstruct) << "();" << '\n';
+  indent(out) << prefix << ".read(iprot);" << '\n';
 }
 
 /**
@@ -1875,14 +1872,14 @@
 
   // Declare variables, read header
   if (ttype->is_map()) {
-    indent(out) << "TMap " << obj << " = iprot.readMapBegin();" << endl;
+    indent(out) << "TMap " << obj << " = iprot.readMapBegin();" << '\n';
   } else if (ttype->is_set()) {
-    indent(out) << "TSet " << obj << " = iprot.readSetBegin();" << endl;
+    indent(out) << "TSet " << obj << " = iprot.readSetBegin();" << '\n';
   } else if (ttype->is_list()) {
-    indent(out) << "TList " << obj << " = iprot.readListBegin();" << endl;
+    indent(out) << "TList " << obj << " = iprot.readListBegin();" << '\n';
   }
 
-  indent(out) << prefix << " = new " << type_name(ttype) << "();" << endl;
+  indent(out) << prefix << " = new " << type_name(ttype) << "();" << '\n';
 
   // For loop iterates over elements
   string i = tmp("_i");
@@ -1903,11 +1900,11 @@
 
   // Read container end
   if (ttype->is_map()) {
-    indent(out) << "iprot.readMapEnd();" << endl;
+    indent(out) << "iprot.readMapEnd();" << '\n';
   } else if (ttype->is_set()) {
-    indent(out) << "iprot.readSetEnd();" << endl;
+    indent(out) << "iprot.readSetEnd();" << '\n';
   } else if (ttype->is_list()) {
-    indent(out) << "iprot.readListEnd();" << endl;
+    indent(out) << "iprot.readListEnd();" << '\n';
   }
 
   scope_down(out);
@@ -1922,13 +1919,13 @@
   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;
+  indent(out) << declare_field(&fkey) << '\n';
+  indent(out) << declare_field(&fval) << '\n';
 
   generate_deserialize_field(out, &fkey);
   generate_deserialize_field(out, &fval);
 
-  indent(out) << prefix << "[" << key << "] = " << val << ";" << endl;
+  indent(out) << prefix << "[" << key << "] = " << val << ";" << '\n';
 }
 
 /**
@@ -1938,11 +1935,11 @@
   string elem = tmp("_elem");
   t_field felem(tset->get_elem_type(), elem);
 
-  indent(out) << declare_field(&felem) << endl;
+  indent(out) << declare_field(&felem) << '\n';
 
   generate_deserialize_field(out, &felem);
 
-  indent(out) << prefix << ".add(" << elem << ");" << endl;
+  indent(out) << prefix << ".add(" << elem << ");" << '\n';
 }
 
 /**
@@ -1954,11 +1951,11 @@
   string elem = tmp("_elem");
   t_field felem(tlist->get_elem_type(), elem);
 
-  indent(out) << declare_field(&felem) << endl;
+  indent(out) << declare_field(&felem) << '\n';
 
   generate_deserialize_field(out, &felem);
 
-  indent(out) << prefix << ".add(" << elem << ");" << endl;
+  indent(out) << prefix << ".add(" << elem << ");" << '\n';
 }
 
 /**
@@ -2022,7 +2019,7 @@
     } else if (type->is_enum()) {
       out << "writeI32(" << name << ");";
     }
-    out << endl;
+    out << '\n';
   } else {
     printf("DO NOT KNOW HOW TO SERIALIZE FIELD '%s%s' TYPE '%s'\n",
            prefix.c_str(),
@@ -2039,7 +2036,7 @@
  */
 void t_dart_generator::generate_serialize_struct(ostream& out, t_struct* tstruct, string prefix) {
   (void)tstruct;
-  indent(out) << prefix << ".write(oprot);" << endl;
+  indent(out) << prefix << ".write(oprot);" << '\n';
 }
 
 /**
@@ -2056,14 +2053,14 @@
     string iter = tmp("_key");
     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 << ".length));"
-                << endl;
+                << '\n';
   } else if (ttype->is_set()) {
     indent(out) << "oprot.writeSetBegin(new TSet(" << type_to_enum(((t_set*)ttype)->get_elem_type())
-                << ", " << prefix << ".length));" << endl;
+                << ", " << prefix << ".length));" << '\n';
   } else if (ttype->is_list()) {
     indent(out) << "oprot.writeListBegin(new TList("
                 << type_to_enum(((t_list*)ttype)->get_elem_type()) << ", " << prefix << ".length));"
-                << endl;
+                << '\n';
   }
 
   string iter = tmp("elem");
@@ -2086,11 +2083,11 @@
   scope_down(out);
 
   if (ttype->is_map()) {
-    indent(out) << "oprot.writeMapEnd();" << endl;
+    indent(out) << "oprot.writeMapEnd();" << '\n';
   } else if (ttype->is_set()) {
-    indent(out) << "oprot.writeSetEnd();" << endl;
+    indent(out) << "oprot.writeSetEnd();" << '\n';
   } else if (ttype->is_list()) {
-    indent(out) << "oprot.writeListEnd();" << endl;
+    indent(out) << "oprot.writeListEnd();" << '\n';
   }
 
   scope_down(out);
@@ -2496,7 +2493,7 @@
 void t_dart_generator::generate_isset_set(ostream& out, t_field* field) {
   if (!type_can_be_null(field->get_type())) {
     string field_name = get_member_name(field->get_name());
-    indent(out) << "this.__isset_" << field_name << " = true;" << endl;
+    indent(out) << "this.__isset_" << field_name << " = true;" << '\n';
   }
 }
 
diff --git a/compiler/cpp/src/thrift/generate/t_delphi_generator.cc b/compiler/cpp/src/thrift/generate/t_delphi_generator.cc
index c91ff33..2a428dc 100644
--- a/compiler/cpp/src/thrift/generate/t_delphi_generator.cc
+++ b/compiler/cpp/src/thrift/generate/t_delphi_generator.cc
@@ -53,8 +53,6 @@
 using std::stringstream;
 using std::vector;
 
-static const string endl = "\n"; // avoid ostream << std::endl flushes
-
 class t_delphi_generator : public t_oop_generator {
 public:
   t_delphi_generator(t_program* program,
@@ -68,7 +66,6 @@
     has_const = false;
     std::map<std::string, std::string>::const_iterator iter;
 
-    ansistr_binary_ = false;
     register_types_ = false;
     constprefix_ = false;
     old_names_ = false;
@@ -78,10 +75,7 @@
     com_types_ = false;
     rtti_ = false;
     for( iter = parsed_options.begin(); iter != parsed_options.end(); ++iter) {
-      if( iter->first.compare("ansistr_binary") == 0) {
-        ansistr_binary_ = true;
-        pwarning(0, "The 'ansistr_binary' option is deprecated.");
-      } else if( iter->first.compare("register_types") == 0) {
+      if( iter->first.compare("register_types") == 0) {
         register_types_ = true;
       } else if( iter->first.compare("old_names") == 0) {
         old_names_ = true;
@@ -102,10 +96,6 @@
       }
     }
 
-    if(com_types_ && ansistr_binary_) {
-      throw "com_types and ansistr_binary are mutually exclusive";
-    }
-
     out_dir_base_ = "gen-delphi";
     escape_.clear();
     escape_['\''] = "''";
@@ -201,6 +191,9 @@
                                              t_struct* tstruct,
                                              bool is_exception);
 
+  bool is_deprecated(std::map<std::string, std::vector<std::string>>& annotations);
+  std::string render_deprecation_attribute(std::map<std::string, std::vector<std::string>>& annotations, std::string prefix, std::string postfix);
+
   bool const_needs_var(t_type* type);
   void print_const_prop(std::ostream& out, string name, t_type* type, t_const_value* value);
   void print_private_field(std::ostream& out, string name, t_type* type, t_const_value* value);
@@ -417,12 +410,12 @@
 
   const std::string DELPHI_KEYWORDS[81] = {
     // keywords
-    "and", "array", "as", "asm", "at", "automated", "begin", "case", "class", "const", "constructor", 
-    "destructor", "dispinterface", "div", "do", "downto", "else", "end", "except", "exports", "file", 
-    "finalization", "finally", "for", "function", "goto", "if", "implementation", "in", "inherited", 
-    "initialization", "inline", "interface", "is", "label", "library", "mod", "nil", "not", "object", 
-    "of", "on", "or", "out", "packed", "private", "procedure", "program", "property", "protected", 
-    "public", "published", "raise", "record", "repeat", "resourcestring", "set", "shl", "shr", "string", 
+    "and", "array", "as", "asm", "at", "automated", "begin", "case", "class", "const", "constructor",
+    "destructor", "dispinterface", "div", "do", "downto", "else", "end", "except", "exports", "file",
+    "finalization", "finally", "for", "function", "goto", "if", "implementation", "in", "inherited",
+    "initialization", "inline", "interface", "is", "label", "library", "mod", "nil", "not", "object",
+    "of", "on", "or", "out", "packed", "private", "procedure", "program", "property", "protected",
+    "public", "published", "raise", "record", "repeat", "resourcestring", "set", "shl", "shr", "string",
     "then", "threadvar", "to", "try", "type", "unit", "until", "uses", "var", "while", "with", "xor",
     // predefined types (lowercase!)
     "ansistring", "boolean", "double", "int64", "integer", "shortint", "smallint", "string", "unicodestring"
@@ -435,19 +428,19 @@
 
   // reserved method names (lowercase!)
   const std::string DELPHI_RESERVED_METHOD[31] = {
-    "afterconstruction", "beforedestruction", "classinfo", "classname", "classnameis", "classparent", 
-    "classtype", "cleanupinstance", "create", "defaulthandler", "destroy", "dispatch", "equals", 
-    "fieldaddress", "free", "freeinstance", "gethashcode", "getinterface", "getinterfaceentry", 
-    "getinterfacetable", "inheritsfrom", "initinstance", "instancesize", "methodaddress", "methodname", 
+    "afterconstruction", "beforedestruction", "classinfo", "classname", "classnameis", "classparent",
+    "classtype", "cleanupinstance", "create", "defaulthandler", "destroy", "dispatch", "equals",
+    "fieldaddress", "free", "freeinstance", "gethashcode", "getinterface", "getinterfaceentry",
+    "getinterfacetable", "inheritsfrom", "initinstance", "instancesize", "methodaddress", "methodname",
     "newinstance", "read", "safecallexception", "tostring", "unitname", "write"
   };
 
   // reserved exception class method names (lowercase!)
   const std::string DELPHI_RESERVED_METHOD_EXCEPTION[23] = {
-    "setinnerexception", "setstackinfo", "getstacktrace", "raisingexception", "createfmt", "createres", 
-    "createresfmt", "createhelp", "createfmthelp", "createreshelp", "createresfmthelp", "getbaseexception", 
-    "baseexception", "helpcontext", "innerexception", "message", "stacktrace", "stackinfo", 
-    "getexceptionstackinfoproc", "getstackinfostringproc", "cleanupstackinfoproc", "raiseouterexception", 
+    "setinnerexception", "setstackinfo", "getstacktrace", "raisingexception", "createfmt", "createres",
+    "createresfmt", "createhelp", "createfmthelp", "createreshelp", "createresfmthelp", "getbaseexception",
+    "baseexception", "helpcontext", "innerexception", "message", "stacktrace", "stackinfo",
+    "getexceptionstackinfoproc", "getstackinfostringproc", "cleanupstackinfoproc", "raiseouterexception",
     "throwouterexception"
   };
 
@@ -468,7 +461,6 @@
   void init_known_types_list();
   bool is_void(t_type* type);
   int indent_impl_;
-  bool ansistr_binary_;
   bool register_types_;
   bool constprefix_;
   bool old_names_;
@@ -637,10 +629,10 @@
   }
 
   // neither reserved nor keyword?
-  if (!(b_reserved || b_keyword)) {  
+  if (!(b_reserved || b_keyword)) {
     return name;
   }
-  
+
   // apply the rule: old style '_' postfix or more modern '&' prefix?
   // underscore always on non-keywords or when explicitly asked via arg
   if( (!b_keyword) || old_names_ || b_force_underscore) {
@@ -716,25 +708,25 @@
   }
 
   unitname = normalize_name(unitname,false,false,true/*force underscore*/);
-  
+
   std::string f_name = get_out_dir() + "/" + unitname + ".pas";
   ofstream_with_content_based_conditional_update f_all;
 
   f_all.open(f_name);
 
-  f_all << autogen_comment() << endl;
+  f_all << autogen_comment() << '\n';
   generate_delphi_doc(f_all, program_);
-  f_all << "unit " << unitname << ";" << endl << endl;
-  f_all << "{$WARN SYMBOL_DEPRECATED OFF}" << endl;
+  f_all << "unit " << unitname << ";" << '\n' << '\n';
+  f_all << "{$WARN SYMBOL_DEPRECATED OFF}" << '\n';
   if(com_types_) {
-    f_all << "{$MINENUMSIZE 4}" << endl;
+    f_all << "{$MINENUMSIZE 4}" << '\n';
   }
   if(rtti_) {
-    f_all << "{$IFOPT M+} {$DEFINE TYPEINFO_WAS_ON} {$ELSE} {$UNDEF TYPEINFO_WAS_ON} {$ENDIF}" << endl;
+    f_all << "{$IFOPT M+} {$DEFINE TYPEINFO_WAS_ON} {$ELSE} {$UNDEF TYPEINFO_WAS_ON} {$ENDIF}" << '\n';
   }
-  f_all << endl;
-  f_all << "interface" << endl << endl;
-  f_all << "uses" << endl;
+  f_all << '\n';
+  f_all << "interface" << '\n' << '\n';
+  f_all << "uses" << '\n';
 
   indent_up();
 
@@ -742,12 +734,12 @@
   for (s_iter = uses_list.begin(); s_iter != uses_list.end(); ++s_iter) {
     if (s_iter != uses_list.begin()) {
       f_all << ",";
-      f_all << endl;
+      f_all << '\n';
     }
     indent(f_all) << *s_iter;
   }
 
-  f_all << ";" << endl << endl;
+  f_all << ";" << '\n' << '\n';
 
   indent_down();
 
@@ -758,71 +750,70 @@
     }
   }
 
-  f_all << "const" << endl;
+  f_all << "const" << '\n';
   indent_up();
-  indent(f_all) << "c" << tmp_unit << "_Option_AnsiStr_Binary = " << (ansistr_binary_ ? "True" : "False") << ";" << endl;
-  indent(f_all) << "c" << tmp_unit << "_Option_Register_Types = " << (register_types_ ? "True" : "False") << ";" << endl;
-  indent(f_all) << "c" << tmp_unit << "_Option_ConstPrefix    = " << (constprefix_ ? "True" : "False") << ";" << endl;
-  indent(f_all) << "c" << tmp_unit << "_Option_Events         = " << (events_ ? "True" : "False") << ";" << endl;
-  indent(f_all) << "c" << tmp_unit << "_Option_XmlDoc         = " << (xmldoc_ ? "True" : "False") << ";" << endl;
-  indent(f_all) << "c" << tmp_unit << "_Option_Async          = " << (async_ ? "True" : "False") << ";" << endl;
-  indent(f_all) << "c" << tmp_unit << "_Option_COM_types      = " << (com_types_ ? "True" : "False") << ";" << endl;
-  indent(f_all) << "c" << tmp_unit << "_Option_Old_Names      = " << (old_names_ ? "True" : "False") << ";" << endl;
-  indent(f_all) << "c" << tmp_unit << "_Option_RTTI           = " << (rtti_ ? "True" : "False") << ";" << endl;
+  indent(f_all) << "c" << tmp_unit << "_Option_Register_Types = " << (register_types_ ? "True" : "False") << ";" << '\n';
+  indent(f_all) << "c" << tmp_unit << "_Option_ConstPrefix    = " << (constprefix_ ? "True" : "False") << ";" << '\n';
+  indent(f_all) << "c" << tmp_unit << "_Option_Events         = " << (events_ ? "True" : "False") << ";" << '\n';
+  indent(f_all) << "c" << tmp_unit << "_Option_XmlDoc         = " << (xmldoc_ ? "True" : "False") << ";" << '\n';
+  indent(f_all) << "c" << tmp_unit << "_Option_Async          = " << (async_ ? "True" : "False") << ";" << '\n';
+  indent(f_all) << "c" << tmp_unit << "_Option_COM_types      = " << (com_types_ ? "True" : "False") << ";" << '\n';
+  indent(f_all) << "c" << tmp_unit << "_Option_Old_Names      = " << (old_names_ ? "True" : "False") << ";" << '\n';
+  indent(f_all) << "c" << tmp_unit << "_Option_RTTI           = " << (rtti_ ? "True" : "False") << ";" << '\n';
   indent_down();
 
-  f_all << endl;
-  f_all << "type" << endl;
+  f_all << '\n';
+  f_all << "type" << '\n';
   if (has_forward) {
-    f_all << s_forward_decr.str() << endl;
+    f_all << s_forward_decr.str() << '\n';
   }
   if (has_enum) {
-    indent(f_all) << endl;
-    indent(f_all) << "{$SCOPEDENUMS ON}" << endl << endl;
+    indent(f_all) << '\n';
+    indent(f_all) << "{$SCOPEDENUMS ON}" << '\n' << '\n';
     f_all << s_enum.str();
-    indent(f_all) << "{$SCOPEDENUMS OFF}" << endl << endl;
+    indent(f_all) << "{$SCOPEDENUMS OFF}" << '\n' << '\n';
   }
   f_all << s_struct.str();
   f_all << s_service.str();
   f_all << s_const.str();
-  f_all << "implementation" << endl << endl;
+  f_all << "implementation" << '\n' << '\n';
   f_all << s_struct_impl.str();
   f_all << s_service_impl.str();
   f_all << s_const_impl.str();
 
   if (register_types_) {
-    f_all << endl;
-    f_all << "// Type factory methods and registration" << endl;
+    f_all << '\n';
+    f_all << "// Type factory methods and registration" << '\n';
     f_all << s_type_factory_funcs.str();
-    f_all << "procedure RegisterTypeFactories;" << endl;
-    f_all << "begin" << endl;
+    f_all << "procedure RegisterTypeFactories;" << '\n';
+    f_all << "begin" << '\n';
     f_all << s_type_factory_registration.str();
-    f_all << "end;" << endl;
+    f_all << "end;" << '\n';
   }
-  f_all << endl;
+  f_all << '\n';
 
   string constants_class = make_constants_classname();
 
-  f_all << "initialization" << endl;
+  f_all << "initialization" << '\n';
   if (has_const) {
-    f_all << "{$IF CompilerVersion < 21.0}  // D2010" << endl;
-    f_all << "  " << constants_class.c_str() << "_Initialize;" << endl;
-    f_all << "{$IFEND}" << endl;
+    f_all << "{$IF CompilerVersion < 21.0}  // D2010" << '\n';
+    f_all << "  " << constants_class.c_str() << "_Initialize;" << '\n';
+    f_all << "{$IFEND}" << '\n';
   }
   if (register_types_) {
-    f_all << "  RegisterTypeFactories;" << endl;
+    f_all << "  RegisterTypeFactories;" << '\n';
   }
-  f_all << endl;
+  f_all << '\n';
 
-  f_all << "finalization" << endl;
+  f_all << "finalization" << '\n';
   if (has_const) {
-    f_all << "{$IF CompilerVersion < 21.0}  // D2010" << endl;
-    f_all << "  " << constants_class.c_str() << "_Finalize;" << endl;
-    f_all << "{$IFEND}" << endl;
+    f_all << "{$IF CompilerVersion < 21.0}  // D2010" << '\n';
+    f_all << "  " << constants_class.c_str() << "_Finalize;" << '\n';
+    f_all << "{$IFEND}" << '\n';
   }
-  f_all << endl << endl;
+  f_all << '\n' << '\n';
 
-  f_all << "end." << endl;
+  f_all << "end." << '\n';
   f_all.close();
 
   if (!typedefs_pending.empty()) {
@@ -838,8 +829,8 @@
 void t_delphi_generator::delphi_type_usings(ostream& out) {
   indent_up();
   indent(out) << "Classes, SysUtils, Generics.Collections, Thrift.Collections, Thrift.Protocol,"
-              << endl;
-  indent(out) << "Thrift.Transport;" << endl << endl;
+              << '\n';
+  indent(out) << "Thrift.Transport;" << '\n' << '\n';
   indent_down();
 }
 
@@ -852,7 +843,7 @@
 
   indent_up();
   indent(s_forward_decr) << type_name(tstruct, tstruct->is_xception(), true) << " = " << what << ";"
-                         << endl;
+                         << '\n';
   indent_down();
 
   add_defined_type(tstruct);
@@ -877,7 +868,7 @@
   // if( ! container)
   //  s_struct << "type ";  //the "type A = type B" syntax leads to E2574 with generics
 
-  s_struct << type_name(ttypedef->get_type()) << ";" << endl << endl;
+  s_struct << type_name(ttypedef->get_type()) << ";" << '\n' << '\n';
   indent_down();
 
   add_defined_type(ttypedef);
@@ -958,7 +949,7 @@
   indent_up();
   generate_delphi_doc(s_enum, tenum);
   indent(s_enum) << type_name(tenum, true, true) << " = "
-                 << "(" << endl;
+                 << "(" << '\n';
   indent_up();
   vector<t_enum_value*> constants = tenum->get_constants();
   if (constants.empty()) {
@@ -969,15 +960,16 @@
       int value = (*c_iter)->get_value();
       if (c_iter != constants.begin()) {
         s_enum << ",";
-        s_enum << endl;
+        s_enum << '\n';
       }
       generate_delphi_doc(s_enum, *c_iter);
       indent(s_enum) << normalize_name((*c_iter)->get_name()) << " = " << value;
+      s_enum << render_deprecation_attribute((*c_iter)->annotations_, " {", "}");
     }
   }
-  s_enum << endl;
+  s_enum << '\n';
   indent_down();
-  indent(s_enum) << ");" << endl << endl;
+  indent(s_enum) << ")" << render_deprecation_attribute(tenum->annotations_, " ", "") << ";" << '\n' << '\n';
   indent_down();
 }
 
@@ -991,7 +983,7 @@
   result << "'";
   for (signed char const c: value) {
     if( (c >= 0) && (c < 32)) {  // convert ctrl chars, but leave UTF-8 alone
-      result << "#" << (int)c;  
+      result << "#" << (int)c;
     } else if (c == '\'') {
       result << "''";   // duplicate any single quotes we find
     } else {
@@ -999,7 +991,7 @@
     }
   }
   result << "'";
-  
+
   return result.str();
 }
 
@@ -1047,8 +1039,8 @@
   string constants_class = make_constants_classname();
 
   indent_up();
-  indent(s_const) << constants_class.c_str() << " = class" << endl;
-  indent(s_const) << "private" << endl;
+  indent(s_const) << constants_class.c_str() << " = class" << '\n';
+  indent(s_const) << "private" << '\n';
   indent_up();
   vector<t_const*>::iterator c_iter;
   for (c_iter = consts.begin(); c_iter != consts.end(); ++c_iter) {
@@ -1060,7 +1052,7 @@
     }
   }
   indent_down();
-  indent(s_const) << "public" << endl;
+  indent(s_const) << "public" << '\n';
   indent_up();
   for (c_iter = consts.begin(); c_iter != consts.end(); ++c_iter) {
     generate_delphi_doc(s_const, *c_iter);
@@ -1069,12 +1061,12 @@
                      (*c_iter)->get_type(),
                      (*c_iter)->get_value());
   }
-  indent(s_const) << "{$IF CompilerVersion >= 21.0}" << endl;
-  indent(s_const) << "class constructor Create;" << endl;
-  indent(s_const) << "class destructor Destroy;" << endl;
-  indent(s_const) << "{$IFEND}" << endl;
+  indent(s_const) << "{$IF CompilerVersion >= 21.0}" << '\n';
+  indent(s_const) << "class constructor Create;" << '\n';
+  indent(s_const) << "class destructor Destroy;" << '\n';
+  indent(s_const) << "{$IFEND}" << '\n';
   indent_down();
-  indent(s_const) << "end;" << endl << endl;
+  indent(s_const) << "end;" << '\n' << '\n';
   indent_down();
 
   std::ostringstream vars, code;
@@ -1089,22 +1081,22 @@
   }
   indent_down_impl();
 
-  indent_impl(s_const_impl) << "{$IF CompilerVersion >= 21.0}" << endl;
+  indent_impl(s_const_impl) << "{$IF CompilerVersion >= 21.0}" << '\n';
   indent_impl(s_const_impl) << "class constructor " << constants_class.c_str() << ".Create;"
-                            << endl;
+                            << '\n';
 
   if (!vars.str().empty()) {
-    indent_impl(s_const_impl) << "var" << endl;
+    indent_impl(s_const_impl) << "var" << '\n';
     s_const_impl << vars.str();
   }
-  indent_impl(s_const_impl) << "begin" << endl;
+  indent_impl(s_const_impl) << "begin" << '\n';
   if (!code.str().empty()) {
     s_const_impl << code.str();
   }
-  indent_impl(s_const_impl) << "end;" << endl << endl;
+  indent_impl(s_const_impl) << "end;" << '\n' << '\n';
   indent_impl(s_const_impl) << "class destructor " << constants_class.c_str() << ".Destroy;"
-                            << endl;
-  indent_impl(s_const_impl) << "begin" << endl;
+                            << '\n';
+  indent_impl(s_const_impl) << "begin" << '\n';
   indent_up_impl();
   for (c_iter = consts.begin(); c_iter != consts.end(); ++c_iter) {
     if (const_needs_var((*c_iter)->get_type())) {
@@ -1114,10 +1106,10 @@
                      (*c_iter)->get_value());
     }
   }
-  indent_impl(s_const_impl) << "inherited;" << endl;
+  indent_impl(s_const_impl) << "inherited;" << '\n';
   indent_down_impl();
-  indent_impl(s_const_impl) << "end;" << endl;
-  indent_impl(s_const_impl) << "{$ELSE}" << endl;
+  indent_impl(s_const_impl) << "end;" << '\n';
+  indent_impl(s_const_impl) << "{$ELSE}" << '\n';
 
   vars.str("");
   code.str("");
@@ -1134,19 +1126,19 @@
   }
   indent_down_impl();
 
-  indent_impl(s_const_impl) << "procedure " << constants_class.c_str() << "_Initialize;" << endl;
+  indent_impl(s_const_impl) << "procedure " << constants_class.c_str() << "_Initialize;" << '\n';
   if (!vars.str().empty()) {
-    indent_impl(s_const_impl) << "var" << endl;
+    indent_impl(s_const_impl) << "var" << '\n';
     s_const_impl << vars.str();
   }
-  indent_impl(s_const_impl) << "begin" << endl;
+  indent_impl(s_const_impl) << "begin" << '\n';
   if (!code.str().empty()) {
     s_const_impl << code.str();
   }
-  indent_impl(s_const_impl) << "end;" << endl << endl;
+  indent_impl(s_const_impl) << "end;" << '\n' << '\n';
 
-  indent_impl(s_const_impl) << "procedure " << constants_class.c_str() << "_Finalize;" << endl;
-  indent_impl(s_const_impl) << "begin" << endl;
+  indent_impl(s_const_impl) << "procedure " << constants_class.c_str() << "_Finalize;" << '\n';
+  indent_impl(s_const_impl) << "begin" << '\n';
   indent_up_impl();
   for (c_iter = consts.begin(); c_iter != consts.end(); ++c_iter) {
     finalize_field(s_const_impl,
@@ -1156,8 +1148,8 @@
                    constants_class);
   }
   indent_down_impl();
-  indent_impl(s_const_impl) << "end;" << endl;
-  indent_impl(s_const_impl) << "{$IFEND}" << endl << endl;
+  indent_impl(s_const_impl) << "end;" << '\n';
+  indent_impl(s_const_impl) << "{$IFEND}" << '\n' << '\n';
 }
 
 void t_delphi_generator::print_const_def_value(std::ostream& vars,
@@ -1193,7 +1185,7 @@
       string val = render_const_value(vars, out, name, field_type, v_iter->second);
       indent_impl(out) << cls_prefix << normalize_name(name) << "."
                        << prop_name(v_iter->first->get_string(), type->is_xception())
-                       << " := " << val << ";" << endl;
+                       << " := " << val << ";" << '\n';
     }
   } else if (type->is_map()) {
     t_type* ktype = ((t_map*)type)->get_key_type();
@@ -1204,7 +1196,7 @@
       string key = render_const_value(vars, out, name, ktype, v_iter->first);
       string val = render_const_value(vars, out, name, vtype, v_iter->second);
       indent_impl(out) << cls_prefix << normalize_name(name) << "[" << key << "]"
-                       << " := " << val << ";" << endl;
+                       << " := " << val << ";" << '\n';
     }
   } else if (type->is_list() || type->is_set()) {
     t_type* etype;
@@ -1218,7 +1210,7 @@
     vector<t_const_value*>::const_iterator v_iter;
     for (v_iter = val.begin(); v_iter != val.end(); ++v_iter) {
       string val = render_const_value(vars, out, name, etype, *v_iter);
-      indent_impl(out) << cls_prefix << normalize_name(name) << ".Add(" << val << ");" << endl;
+      indent_impl(out) << cls_prefix << normalize_name(name) << ".Add(" << val << ");" << '\n';
     }
   }
 }
@@ -1228,7 +1220,7 @@
                                              t_type* type,
                                              t_const_value* value) {
   (void)value;
-  indent(out) << "class var F" << name << ": " << type_name(type) << ";" << endl;
+  indent(out) << "class var F" << name << ": " << type_name(type) << ";" << '\n';
 }
 
 bool t_delphi_generator::const_needs_var(t_type* type) {
@@ -1246,11 +1238,11 @@
   (void)value;
   if (const_needs_var(type)) {
     indent(out) << "class property " << name << ": " << type_name(type) << " read F" << name << ";"
-                << endl;
+                << '\n';
   } else {
     std::ostringstream vars; // dummy
     string v2 = render_const_value(vars, out, name, type, value);
-    indent(out) << "const " << name << " = " << v2 << ";" << endl;
+    indent(out) << "const " << name << " = " << v2 << ";" << '\n';
   }
 }
 
@@ -1267,14 +1259,14 @@
   if (truetype->is_base_type()) {
     // already done
     // string v2 = render_const_value( vars, out, name, type, value);
-    // indent_impl(out) << name << " := " << v2 << ";" << endl;
+    // indent_impl(out) << name << " := " << v2 << ";" << '\n';
   } else if (truetype->is_enum()) {
     indent_impl(out) << name << " := " << type_name(type) << "." << value->get_identifier_name()
-                     << ";" << endl;
+                     << ";" << '\n';
   } else {
     string typname;
     typname = type_name(truetype, true, false, type->is_xception(), type->is_xception());
-    indent_impl(out) << name << " := " << typname << ".Create;" << endl;
+    indent_impl(out) << name << " := " << typname << ".Create;" << '\n';
     print_const_def_value(vars, out, name, truetype, value);
   }
 }
@@ -1351,7 +1343,7 @@
     render << type_name(type, false) << "." << value->get_identifier_name();
   } else {
     string t = tmp("tmp");
-    vars << "  " << t << " : " << type_name(type) << ";" << endl;
+    vars << "  " << t << " : " << type_name(type) << ";" << '\n';
     print_const_value(vars, out, t, type, value);
     render << t;
   }
@@ -1428,26 +1420,26 @@
                        (*m_iter)->get_value());
       if ((*m_iter)->get_req() != t_field::T_REQUIRED) {
         indent_impl(code) << prop_name((*m_iter), is_exception, "F__isset_") << " := True;"
-                          << endl;
+                          << '\n';
       }
     }
   }
   indent_down_impl();
 
   indent_impl(out) << "constructor " << cls_prefix << cls_nm << "."
-                   << "Create;" << endl;
+                   << "Create;" << '\n';
 
   if (!vars.str().empty()) {
-    out << "var" << endl;
+    out << "var" << '\n';
     out << vars.str();
   }
 
-  indent_impl(out) << "begin" << endl;
+  indent_impl(out) << "begin" << '\n';
   indent_up_impl();
   if (is_exception && (!is_x_factory)) {
-    indent_impl(out) << "inherited Create('');" << endl;
+    indent_impl(out) << "inherited Create('');" << '\n';
   } else {
-    indent_impl(out) << "inherited;" << endl;
+    indent_impl(out) << "inherited;" << '\n';
   }
 
   if (!code.str().empty()) {
@@ -1455,28 +1447,28 @@
   }
 
   indent_down_impl();
-  indent_impl(out) << "end;" << endl << endl;
+  indent_impl(out) << "end;" << '\n' << '\n';
 
   if ((members.size() > 0) && is_exception && (!is_x_factory)) {
     indent_impl(out) << "constructor " << cls_prefix << cls_nm << "."
                      << "Create(" << constructor_argument_list(tstruct, indent_impl()) << ");"
-                     << endl;
-    indent_impl(out) << "begin" << endl;
+                     << '\n';
+    indent_impl(out) << "begin" << '\n';
     indent_up_impl();
-    indent_impl(out) << "Create;" << endl;
+    indent_impl(out) << "Create;" << '\n';
     for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
       string propname = prop_name((*m_iter)->get_name(), is_exception);
       string param_name = constructor_param_name((*m_iter)->get_name());
-      indent_impl(out) << propname << " := " << param_name << ";" << endl;
+      indent_impl(out) << propname << " := " << param_name << ";" << '\n';
     }
-    indent_impl(out) << "UpdateMessageProperty;" << endl;
+    indent_impl(out) << "UpdateMessageProperty;" << '\n';
     indent_down_impl();
-    indent_impl(out) << "end;" << endl << endl;
+    indent_impl(out) << "end;" << '\n' << '\n';
   }
 
   indent_impl(out) << "destructor " << cls_prefix << cls_nm << "."
-                   << "Destroy;" << endl;
-  indent_impl(out) << "begin" << endl;
+                   << "Destroy;" << '\n';
+  indent_impl(out) << "begin" << '\n';
   indent_up_impl();
 
   for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
@@ -1487,46 +1479,46 @@
     finalize_field(out, prop_name(*m_iter, is_exception), t, (*m_iter)->get_value());
   }
 
-  indent_impl(out) << "inherited;" << endl;
+  indent_impl(out) << "inherited;" << '\n';
   indent_down_impl();
-  indent_impl(out) << "end;" << endl << endl;
+  indent_impl(out) << "end;" << '\n' << '\n';
 
   if (is_exception && (!is_x_factory)) {
     indent_impl(out) << "function " << cls_prefix << cls_nm << "." << exception_factory_name
-                     << ": I" << exception_factory_name << ";" << endl;
-    indent_impl(out) << "begin" << endl;
+                     << ": I" << exception_factory_name << ";" << '\n';
+    indent_impl(out) << "begin" << '\n';
     indent_up_impl();
-    indent_impl(out) << "if F" << exception_factory_name << " = nil" << endl;
-    indent_impl(out) << "then F" << exception_factory_name << " := T" << exception_factory_name << "Impl.Create;" << endl << endl;
-    indent_impl(out) << "result := F" << exception_factory_name << ";" << endl;
+    indent_impl(out) << "if F" << exception_factory_name << " = nil" << '\n';
+    indent_impl(out) << "then F" << exception_factory_name << " := T" << exception_factory_name << "Impl.Create;" << '\n' << '\n';
+    indent_impl(out) << "result := F" << exception_factory_name << ";" << '\n';
     indent_down_impl();
-    indent_impl(out) << "end;" << endl << endl;
-    indent_impl(out) << "function " << cls_prefix << cls_nm << ".QueryInterface(const IID: TGUID; out Obj): HRESULT;" << endl;
-    indent_impl(out) << "begin" << endl;
+    indent_impl(out) << "end;" << '\n' << '\n';
+    indent_impl(out) << "function " << cls_prefix << cls_nm << ".QueryInterface(const IID: TGUID; out Obj): HRESULT;" << '\n';
+    indent_impl(out) << "begin" << '\n';
     indent_up_impl();
-    indent_impl(out) << "if GetInterface(IID, Obj)" << endl;
-    indent_impl(out) << "then result := S_OK" << endl;
-    indent_impl(out) << "else result := E_NOINTERFACE;" << endl;
+    indent_impl(out) << "if GetInterface(IID, Obj)" << '\n';
+    indent_impl(out) << "then result := S_OK" << '\n';
+    indent_impl(out) << "else result := E_NOINTERFACE;" << '\n';
     indent_down_impl();
-    indent_impl(out) << "end;" << endl << endl;
-    indent_impl(out) << "function " << cls_prefix << cls_nm << "._AddRef: Integer;" << endl;
-    indent_impl(out) << "begin" << endl;
+    indent_impl(out) << "end;" << '\n' << '\n';
+    indent_impl(out) << "function " << cls_prefix << cls_nm << "._AddRef: Integer;" << '\n';
+    indent_impl(out) << "begin" << '\n';
     indent_up_impl();
-    indent_impl(out) << "result := -1;    // not refcounted" << endl;
+    indent_impl(out) << "result := -1;    // not refcounted" << '\n';
     indent_down_impl();
-    indent_impl(out) << "end;" << endl << endl;
-    indent_impl(out) << "function " << cls_prefix << cls_nm << "._Release: Integer;" << endl;
-    indent_impl(out) << "begin" << endl;
+    indent_impl(out) << "end;" << '\n' << '\n';
+    indent_impl(out) << "function " << cls_prefix << cls_nm << "._Release: Integer;" << '\n';
+    indent_impl(out) << "begin" << '\n';
     indent_up_impl();
-    indent_impl(out) << "result := -1;    // not refcounted" << endl;
+    indent_impl(out) << "result := -1;    // not refcounted" << '\n';
     indent_down_impl();
-    indent_impl(out) << "end;" << endl << endl;
+    indent_impl(out) << "end;" << '\n' << '\n';
   }
 
   if (tstruct->is_union()) {
     indent_impl(out) << "procedure " << cls_prefix << cls_nm << "."
-                     << "ClearUnionValues;" << endl;
-    indent_impl(out) << "begin" << endl;
+                     << "ClearUnionValues;" << '\n';
+    indent_impl(out) << "begin" << '\n';
     indent_up_impl();
     for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
       t_type* t = (*m_iter)->get_type();
@@ -1546,7 +1538,7 @@
                                         exception_factory_name);
     }
     indent_down_impl();
-    indent_impl(out) << "end;" << endl << endl;
+    indent_impl(out) << "end;" << '\n' << '\n';
   }
 
   for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
@@ -1611,12 +1603,12 @@
   print_delphi_struct_type_factory_func(out, tstruct);
   out << ": ";
   out << struct_intf_name;
-  out << ";" << endl;
-  out << "begin" << endl;
+  out << ";" << '\n';
+  out << "begin" << '\n';
   indent_up();
-  indent(out) << "Result := " << cls_nm << ".Create;" << endl;
+  indent(out) << "Result := " << cls_nm << ".Create;" << '\n';
   indent_down();
-  out << "end;" << endl << endl;
+  out << "end;" << '\n' << '\n';
 }
 
 void t_delphi_generator::generate_delphi_struct_type_factory_registration(ostream& out,
@@ -1638,7 +1630,7 @@
   indent(out) << "  TypeRegistry.RegisterTypeFactory<" << struct_intf_name << ">(";
   print_delphi_struct_type_factory_func(out, tstruct);
   out << ");";
-  out << endl;
+  out << '\n';
 }
 
 void t_delphi_generator::generate_delphi_struct_definition(ostream& out,
@@ -1672,11 +1664,11 @@
 
     generate_delphi_doc(out, tstruct);
     if(rtti_) {
-      indent(out) << "{$TYPEINFO ON}" << endl;
-      indent(out) << "{$RTTI EXPLICIT METHODS([vcPublic, vcPublished]) PROPERTIES([vcPublic, vcPublished])}" << endl;
-      indent(out) << struct_intf_name << " = interface(IBaseWithTypeInfo)" << endl;
+      indent(out) << "{$TYPEINFO ON}" << '\n';
+      indent(out) << "{$RTTI EXPLICIT METHODS([vcPublic, vcPublished]) PROPERTIES([vcPublic, vcPublished])}" << '\n';
+      indent(out) << struct_intf_name << " = interface(IBaseWithTypeInfo)" << '\n';
     } else {
-      indent(out) << struct_intf_name << " = interface(IBase)" << endl;
+      indent(out) << struct_intf_name << " = interface(IBase)" << '\n';
     }
     indent_up();
 
@@ -1688,20 +1680,20 @@
     }
 
     if (is_x_factory) {
-      out << endl;
-      indent(out) << "// Create Exception Object" << endl;
-      indent(out) << "function CreateException: " << type_name(tstruct, true, true) << ";" << endl;
+      out << '\n';
+      indent(out) << "// Create Exception Object" << '\n';
+      indent(out) << "function CreateException: " << type_name(tstruct, true, true) << ";" << '\n';
     }
 
     if (members.size() > 0) {
-      out << endl;
+      out << '\n';
       for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
         generate_property(out, *m_iter, true, is_exception);
       }
     }
 
     if (members.size() > 0) {
-      out << endl;
+      out << '\n';
       for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
         if ((*m_iter)->get_req() != t_field::T_REQUIRED) {
           generate_delphi_isset_reader_writer_definition(out, *m_iter, is_exception);
@@ -1710,22 +1702,24 @@
     }
 
     if (members.size() > 0) {
-      out << endl;
+      out << '\n';
       for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
         if ((*m_iter)->get_req() != t_field::T_REQUIRED) {
           isset_name = prop_name(*m_iter, is_exception, "__isset_");
           indent(out) << "property " << isset_name << ": System.Boolean read Get" << isset_name << " write Set" << isset_name << ";"
-                      << endl;
+                      << '\n';
         }
       }
     }
 
     indent_down();
-    indent(out) << "end;" << endl;
+    indent(out) << "end;"
+                << render_deprecation_attribute(tstruct->annotations_, " {", "}")
+                << '\n';
     if(rtti_) {
-      indent(out) << "{$IFNDEF TYPEINFO_WAS_ON} {$TYPEINFO OFF} {$ENDIF}" << endl;
+      indent(out) << "{$IFNDEF TYPEINFO_WAS_ON} {$TYPEINFO OFF} {$ENDIF}" << '\n';
     }
-    indent(out) << endl;
+    indent(out) << '\n';
   }
 
   generate_delphi_doc(out, tstruct);
@@ -1739,40 +1733,40 @@
   } else {
     out << "TInterfacedObject, IBase, ISupportsToString, " << struct_intf_name;
   }
-  out << ")" << endl;
+  out << ")" << '\n';
 
   if (is_exception && (!is_x_factory)) {
-    indent(out) << "public" << endl;
+    indent(out) << "public" << '\n';
     indent_up();
-    indent(out) << "type" << endl;
+    indent(out) << "type" << '\n';
     indent_up();
     generate_delphi_struct_definition(out, tstruct, is_exception, in_class, is_result, true);
     indent_down();
     indent_down();
   }
 
-  indent(out) << "private" << endl;
+  indent(out) << "private" << '\n';
   indent_up();
 
   if (is_exception && (!is_x_factory)) {
-    indent(out) << "F" << exception_factory_name << " :" << struct_intf_name << ";" << endl << endl;
+    indent(out) << "F" << exception_factory_name << " :" << struct_intf_name << ";" << '\n' << '\n';
   }
 
   for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
-    indent(out) << declare_field(*m_iter, false, "F", is_exception) << endl;
+    indent(out) << declare_field(*m_iter, false, "F", is_exception) << '\n';
   }
 
   if (members.size() > 0) {
-    indent(out) << endl;
+    indent(out) << '\n';
     for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
       if ((*m_iter)->get_req() != t_field::T_REQUIRED) {
         isset_name = prop_name(*m_iter, is_exception, "F__isset_");
-        indent(out) << isset_name << ": System.Boolean;" << endl;
+        indent(out) << isset_name << ": System.Boolean;" << '\n';
       }
     }
   }
 
-  indent(out) << endl;
+  indent(out) << '\n';
 
   for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
     generate_delphi_property_reader_definition(out, *m_iter, is_exception);
@@ -1780,106 +1774,106 @@
   }
 
   if (tstruct->is_union()) {
-    out << endl;
-    indent(out) << "// Clear values(for union's property setter)" << endl;
-    indent(out) << "procedure ClearUnionValues;" << endl;
+    out << '\n';
+    indent(out) << "// Clear values(for union's property setter)" << '\n';
+    indent(out) << "procedure ClearUnionValues;" << '\n';
   }
 
   if (members.size() > 0) {
-    out << endl;
+    out << '\n';
     for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
       if ((*m_iter)->get_req() != t_field::T_REQUIRED) {
         isset_name = prop_name(*m_iter, is_exception, "__isset_");
-        indent(out) << "function Get" << isset_name << ": System.Boolean;" << endl;
-        indent(out) << "procedure Set" << isset_name << "( const value : System.Boolean);" << endl;
+        indent(out) << "function Get" << isset_name << ": System.Boolean;" << '\n';
+        indent(out) << "procedure Set" << isset_name << "( const value : System.Boolean);" << '\n';
       }
     }
   }
 
   if (is_exception && (!is_x_factory)) {
-    out << endl;
+    out << '\n';
     indent_down();
-    indent(out) << "strict protected" << endl;
-    indent_up();  
-    indent(out) << "function QueryInterface(const IID: TGUID; out Obj): HRESULT; stdcall;" << endl;
-    indent(out) << "function _AddRef: Integer; stdcall;" << endl;
-    indent(out) << "function _Release: Integer; stdcall;" << endl;
-    out << endl;
+    indent(out) << "strict protected" << '\n';
+    indent_up();
+    indent(out) << "function QueryInterface(const IID: TGUID; out Obj): HRESULT; stdcall;" << '\n';
+    indent(out) << "function _AddRef: Integer; stdcall;" << '\n';
+    indent(out) << "function _Release: Integer; stdcall;" << '\n';
+    out << '\n';
   }
 
   indent_down();
-  indent(out) << "public" << endl;
+  indent(out) << "public" << '\n';
   indent_up();
 
   if ((members.size() > 0) && is_exception && (!is_x_factory)) {
-    indent(out) << "constructor Create; overload;" << endl;
+    indent(out) << "constructor Create; overload;" << render_deprecation_attribute(tstruct->annotations_," ",";") << '\n';
     indent(out) << "constructor Create(" << constructor_argument_list(tstruct, indent())
-                << "); overload;" << endl;
+                << "); overload;" << render_deprecation_attribute(tstruct->annotations_," ",";") << '\n';
   } else {
-    indent(out) << "constructor Create;" << endl;
+    indent(out) << "constructor Create;" << render_deprecation_attribute(tstruct->annotations_," ",";") << '\n';
   }
 
-  indent(out) << "destructor Destroy; override;" << endl;
+  indent(out) << "destructor Destroy; override;" << '\n';
 
-  out << endl;
-  indent(out) << "function ToString: string; override;" << endl;
+  out << '\n';
+  indent(out) << "function ToString: string; override;" << '\n';
 
   if (is_exception && (!is_x_factory)) {
-    out << endl;
-    indent(out) << "// Exception Factory" << endl;
-    indent(out) << "function " << exception_factory_name << ": " << struct_intf_name << ";" << endl;
+    out << '\n';
+    indent(out) << "// Exception Factory" << '\n';
+    indent(out) << "function " << exception_factory_name << ": " << struct_intf_name << ";" << '\n';
   }
 
-  out << endl;
-  indent(out) << "// IBase" << endl;
-  indent(out) << "procedure Read( const iprot: IProtocol);" << endl;
-  indent(out) << "procedure Write( const oprot: IProtocol);" << endl;
+  out << '\n';
+  indent(out) << "// IBase" << '\n';
+  indent(out) << "procedure Read( const iprot: IProtocol);" << '\n';
+  indent(out) << "procedure Write( const oprot: IProtocol);" << '\n';
 
   if (is_exception && is_x_factory) {
-    out << endl;
-    indent(out) << "// Create Exception Object" << endl;
-    indent(out) << "function CreateException: " << type_name(tstruct, true, true) << ";" << endl;
+    out << '\n';
+    indent(out) << "// Create Exception Object" << '\n';
+    indent(out) << "function CreateException: " << type_name(tstruct, true, true) << ";" << '\n';
   }
 
   if (members.size() > 0) {
-    out << endl;
-    indent(out) << "// Properties" << endl;
+    out << '\n';
+    indent(out) << "// Properties" << '\n';
     for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
       generate_property(out, *m_iter, true, is_exception);
     }
   }
 
   if (members.size() > 0) {
-    out << endl;
-    indent(out) << "// isset" << endl;
+    out << '\n';
+    indent(out) << "// isset" << '\n';
     for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
       if ((*m_iter)->get_req() != t_field::T_REQUIRED) {
         isset_name = prop_name(*m_iter, is_exception, "__isset_");
         indent(out) << "property " << isset_name << ": System.Boolean read Get" << isset_name << " write Set" << isset_name << ";"
-                    << endl;
+                    << '\n';
       }
     }
   }
 
   indent_down();
-  indent(out) << "end;" << endl << endl;
+  indent(out) << "end;" << '\n' << '\n';
 }
 
 void t_delphi_generator::generate_service(t_service* tservice) {
   indent_up();
   generate_delphi_doc(s_service, tservice);
-  indent(s_service) << normalize_clsnm(service_name_, "T") << " = class" << endl;
-  indent(s_service) << "public" << endl;
+  indent(s_service) << normalize_clsnm(service_name_, "T") << " = class" << '\n';
+  indent(s_service) << "public" << '\n';
   indent_up();
-  indent(s_service) << "type" << endl;
+  indent(s_service) << "type" << '\n';
   generate_service_interface(tservice);
   generate_service_client(tservice);
   generate_service_server(tservice);
   generate_service_helpers(tservice);
   indent_down();
   indent_down();
-  indent(s_service) << "end;" << endl;
-  indent(s_service) << endl;
+  indent(s_service) << "end;" << '\n';
+  indent(s_service) << '\n';
   indent_down();
 }
 
@@ -1903,9 +1897,9 @@
     extends = type_name(tservice->get_extends(), true, true);
     extends_iface = extends + "." + iface_name;
     generate_delphi_doc(s_service, tservice);
-    indent(s_service) << iface_name << " = interface(" << extends_iface << ")" << endl;
+    indent(s_service) << iface_name << " = interface(" << extends_iface << ")" << '\n';
   } else {
-    indent(s_service) << iface_name << " = interface" << endl;
+    indent(s_service) << iface_name << " = interface" << '\n';
   }
 
   indent_up();
@@ -1914,10 +1908,12 @@
   vector<t_function*>::iterator f_iter;
   for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
     generate_delphi_doc(s_service, *f_iter);
-    indent(s_service) << function_signature(*f_iter, for_async) << endl;
+    indent(s_service) << function_signature(*f_iter, for_async) << '\n';
   }
   indent_down();
-  indent(s_service) << "end;" << endl << endl;
+  indent(s_service) << "end;" 
+                    << render_deprecation_attribute( tservice->annotations_, " {", "}")
+                    << '\n' << '\n';
 
   indent_down();
 }
@@ -1931,7 +1927,7 @@
       std::wstring guid_wstr(guid_chars);
       std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> convert;
       std::string guid_str = convert.to_bytes(guid_wstr);
-      indent(out) << "['" << guid_str << "']" << endl;
+      indent(out) << "['" << guid_str << "']" << '\n';
     }
   }
 #else
@@ -1965,78 +1961,78 @@
     extends = type_name(tservice->get_extends(), true, true);
     extends_client = extends + ".TClient";
   }
-  indent(s_service) << "TClient = class( " << extends_client << ", " << implements << ")" << endl;
+  indent(s_service) << "TClient = class( " << extends_client << ", " << implements << ")" << '\n';
 
-  indent(s_service) << "public" << endl;
+  indent(s_service) << "public" << '\n';
   indent_up();
 
-  indent(s_service) << "constructor Create( prot: IProtocol); overload;" << endl;
+  indent(s_service) << "constructor Create( prot: IProtocol); overload;" << '\n';
 
   indent_impl(s_service_impl) << "constructor " << normalize_clsnm(service_name_, "T")
-                              << ".TClient.Create( prot: IProtocol);" << endl;
-  indent_impl(s_service_impl) << "begin" << endl;
+                              << ".TClient.Create( prot: IProtocol);" << '\n';
+  indent_impl(s_service_impl) << "begin" << '\n';
   indent_up_impl();
-  indent_impl(s_service_impl) << "Create( prot, prot );" << endl;
+  indent_impl(s_service_impl) << "Create( prot, prot );" << '\n';
   indent_down_impl();
-  indent_impl(s_service_impl) << "end;" << endl << endl;
+  indent_impl(s_service_impl) << "end;" << '\n' << '\n';
 
   indent(s_service)
-      << "constructor Create( const iprot: IProtocol; const oprot: IProtocol); overload;" << endl;
+      << "constructor Create( const iprot: IProtocol; const oprot: IProtocol); overload;" << '\n';
 
   indent_impl(s_service_impl) << "constructor " << normalize_clsnm(service_name_, "T")
                               << ".TClient.Create( const iprot: IProtocol; const oprot: IProtocol);"
-                              << endl;
-  indent_impl(s_service_impl) << "begin" << endl;
+                              << '\n';
+  indent_impl(s_service_impl) << "begin" << '\n';
   indent_up_impl();
-  indent_impl(s_service_impl) << "inherited Create;" << endl;
-  indent_impl(s_service_impl) << "iprot_ := iprot;" << endl;
-  indent_impl(s_service_impl) << "oprot_ := oprot;" << endl;
+  indent_impl(s_service_impl) << "inherited Create;" << '\n';
+  indent_impl(s_service_impl) << "iprot_ := iprot;" << '\n';
+  indent_impl(s_service_impl) << "oprot_ := oprot;" << '\n';
   indent_down_impl();
-  indent_impl(s_service_impl) << "end;" << endl << endl;
+  indent_impl(s_service_impl) << "end;" << '\n' << '\n';
 
   indent_down();
 
   if (extends.empty()) {
-    indent(s_service) << "protected" << endl;
+    indent(s_service) << "protected" << '\n';
     indent_up();
-    indent(s_service) << "iprot_: IProtocol;" << endl;
-    indent(s_service) << "oprot_: IProtocol;" << endl;
-    indent(s_service) << "seqid_: System.Integer;" << endl;
+    indent(s_service) << "iprot_: IProtocol;" << '\n';
+    indent(s_service) << "oprot_: IProtocol;" << '\n';
+    indent(s_service) << "seqid_: System.Integer;" << '\n';
     indent_down();
 
-    indent(s_service) << "public" << endl;
+    indent(s_service) << "public" << '\n';
     indent_up();
-    indent(s_service) << "property InputProtocol: IProtocol read iprot_;" << endl;
-    indent(s_service) << "property OutputProtocol: IProtocol read oprot_;" << endl;
+    indent(s_service) << "property InputProtocol: IProtocol read iprot_;" << '\n';
+    indent(s_service) << "property OutputProtocol: IProtocol read oprot_;" << '\n';
     indent_down();
   }
 
   vector<t_function*> functions = tservice->get_functions();
   vector<t_function*>::const_iterator f_iter;
 
-  indent(s_service) << "protected" << endl;
+  indent(s_service) << "protected" << '\n';
   indent_up();
 
-  indent(s_service) << "// Iface" << endl;
+  indent(s_service) << "// Iface" << '\n';
   for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
     string funname = (*f_iter)->get_name();
     generate_delphi_doc(s_service, *f_iter);
-    indent(s_service) << function_signature(*f_iter, false) << endl;
+    indent(s_service) << function_signature(*f_iter, false) << '\n';
   }
 
   if( async_) {
-    indent(s_service) << endl;
-    indent(s_service) << "// IAsync" << endl;
+    indent(s_service) << '\n';
+    indent(s_service) << "// IAsync" << '\n';
     for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
       string funname = (*f_iter)->get_name();
       generate_delphi_doc(s_service, *f_iter);
-      indent(s_service) << function_signature(*f_iter, true) << endl;
+      indent(s_service) << function_signature(*f_iter, true) << '\n';
     }
   }
 
   indent_down();
 
-  indent(s_service) << "public" << endl;
+  indent(s_service) << "public" << '\n';
   indent_up();
 
   string full_cls = normalize_clsnm(service_name_, "T") + ".TClient";
@@ -2054,20 +2050,20 @@
       bool for_async = (mode != 0);
       mode--;
 
-      indent_impl(s_service_impl) << function_signature(*f_iter, for_async, full_cls) << endl;
-      indent_impl(s_service_impl) << "begin" << endl;
+      indent_impl(s_service_impl) << function_signature(*f_iter, for_async, full_cls) << '\n';
+      indent_impl(s_service_impl) << "begin" << '\n';
       indent_up_impl();
 
       t_type* ttype = (*f_iter)->get_returntype();
       if( for_async) {
         if (is_void(ttype)) {
            // Delphi forces us to specify a type with IFuture<T>, so we use Integer=0 for void methods
-          indent_impl(s_service_impl) << "result := TTask.Future<System.Integer>(function: System.Integer" << endl;
+          indent_impl(s_service_impl) << "result := TTask.Future<System.Integer>(function: System.Integer" << '\n';
         } else {
           string rettype = type_name(ttype, false, true, false, true);
-          indent_impl(s_service_impl) << "result := TTask.Future<" << rettype << ">(function: " << rettype << endl;
+          indent_impl(s_service_impl) << "result := TTask.Future<" << rettype << ">(function: " << rettype << '\n';
         }
-        indent_impl(s_service_impl) << "begin" << endl;
+        indent_impl(s_service_impl) << "begin" << '\n';
         indent_up_impl();
       }
 
@@ -2082,26 +2078,26 @@
         }
         s_service_impl << normalize_name((*fld_iter)->get_name());
       }
-      s_service_impl << ");" << endl;
+      s_service_impl << ");" << '\n';
 
       if (!(*f_iter)->is_oneway()) {
         s_service_impl << indent_impl();
         if (!(*f_iter)->get_returntype()->is_void()) {
           s_service_impl << "Result := ";
         }
-        s_service_impl << "recv_" << funname << "();" << endl;
+        s_service_impl << "recv_" << funname << "();" << '\n';
       }
 
       if( for_async) {
         if (is_void(ttype)) {
-          indent_impl(s_service_impl) << "Result := 0;" << endl;  // no IFuture<void> in Delphi
+          indent_impl(s_service_impl) << "Result := 0;" << '\n';  // no IFuture<void> in Delphi
         }
         indent_down_impl();
-        indent_impl(s_service_impl) << "end);" << endl;
+        indent_impl(s_service_impl) << "end);" << '\n';
       }
 
       indent_down_impl();
-      indent_impl(s_service_impl) << "end;" << endl << endl;
+      indent_impl(s_service_impl) << "end;" << '\n' << '\n';
     }
 
     t_function send_function(g_type_void,
@@ -2115,41 +2111,41 @@
     string argsvar = tmp("_args");
     string msgvar = tmp("_msg");
 
-    indent(s_service) << function_signature(&send_function, false) << endl;
-    indent_impl(s_service_impl) << function_signature(&send_function, false, full_cls) << endl;
-    indent_impl(s_service_impl) << "var" << endl;
+    indent(s_service) << function_signature(&send_function, false) << '\n';
+    indent_impl(s_service_impl) << function_signature(&send_function, false, full_cls) << '\n';
+    indent_impl(s_service_impl) << "var" << '\n';
     indent_up_impl();
-    indent_impl(s_service_impl) << argsvar << " : " << args_intfnm << ";" << endl;
-    indent_impl(s_service_impl) << msgvar << " : Thrift.Protocol.TThriftMessage;" << endl;
+    indent_impl(s_service_impl) << argsvar << " : " << args_intfnm << ";" << '\n';
+    indent_impl(s_service_impl) << msgvar << " : Thrift.Protocol.TThriftMessage;" << '\n';
     indent_down_impl();
-    indent_impl(s_service_impl) << "begin" << endl;
+    indent_impl(s_service_impl) << "begin" << '\n';
     indent_up_impl();
 
-    indent_impl(s_service_impl) << "seqid_ := seqid_ + 1;" << endl;
+    indent_impl(s_service_impl) << "seqid_ := seqid_ + 1;" << '\n';
     indent_impl(s_service_impl) << "Thrift.Protocol.Init( " << msgvar << ", '" << funname
                                 << "', " << ((*f_iter)->is_oneway() ? "TMessageType.Oneway"
                                                                     : "TMessageType.Call")
-                                << ", seqid_);" << endl;
+                                << ", seqid_);" << '\n';
 
-    indent_impl(s_service_impl) << "oprot_.WriteMessageBegin( " << msgvar << " );" << endl;
-    indent_impl(s_service_impl) << argsvar << " := " << args_clsnm << "Impl.Create();" << endl;
+    indent_impl(s_service_impl) << "oprot_.WriteMessageBegin( " << msgvar << " );" << '\n';
+    indent_impl(s_service_impl) << argsvar << " := " << args_clsnm << "Impl.Create();" << '\n';
 
     for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) {
       indent_impl(s_service_impl) << argsvar << "." << prop_name(*fld_iter)
                                   << " := " << normalize_name((*fld_iter)->get_name()) << ";"
-                                  << endl;
+                                  << '\n';
     }
-    indent_impl(s_service_impl) << argsvar << ".Write(oprot_);" << endl;
+    indent_impl(s_service_impl) << argsvar << ".Write(oprot_);" << '\n';
     for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) {
       indent_impl(s_service_impl) << argsvar << "." << prop_name(*fld_iter)
-                                  << " := " << empty_value((*fld_iter)->get_type()) << ";" << endl;
+                                  << " := " << empty_value((*fld_iter)->get_type()) << ";" << '\n';
     }
 
-    indent_impl(s_service_impl) << "oprot_.WriteMessageEnd();" << endl;
-    indent_impl(s_service_impl) << "oprot_.Transport.Flush();" << endl;
+    indent_impl(s_service_impl) << "oprot_.WriteMessageEnd();" << '\n';
+    indent_impl(s_service_impl) << "oprot_.Transport.Flush();" << '\n';
 
     indent_down_impl();
-    indent_impl(s_service_impl) << "end;" << endl << endl;
+    indent_impl(s_service_impl) << "end;" << '\n' << '\n';
 
     if (!(*f_iter)->is_oneway()) {
       string org_resultname = (*f_iter)->get_name() + "_result";
@@ -2169,72 +2165,74 @@
       string appexvar = tmp("_ax");
       string retvar = tmp("_ret");
 
-      indent(s_service) << function_signature(&recv_function, false) << endl;
-      indent_impl(s_service_impl) << function_signature(&recv_function, false, full_cls) << endl;
-      indent_impl(s_service_impl) << "var" << endl;
+      indent(s_service) << function_signature(&recv_function, false) << '\n';
+      indent_impl(s_service_impl) << function_signature(&recv_function, false, full_cls) << '\n';
+      indent_impl(s_service_impl) << "var" << '\n';
       indent_up_impl();
-      indent_impl(s_service_impl) << msgvar << " : Thrift.Protocol.TThriftMessage;" << endl;
+      indent_impl(s_service_impl) << msgvar << " : Thrift.Protocol.TThriftMessage;" << '\n';
       if (xceptions.size() > 0) {
-        indent_impl(s_service_impl) << exceptvar << " : Exception;" << endl;
+        indent_impl(s_service_impl) << exceptvar << " : Exception;" << '\n';
       }
-      indent_impl(s_service_impl) << appexvar << " : TApplicationException;" << endl;
-      indent_impl(s_service_impl) << retvar << " : " << result_intfnm << ";" << endl;
+      indent_impl(s_service_impl) << appexvar << " : TApplicationException;" << '\n';
+      indent_impl(s_service_impl) << retvar << " : " << result_intfnm << ";" << '\n';
 
       indent_down_impl();
-      indent_impl(s_service_impl) << "begin" << endl;
+      indent_impl(s_service_impl) << "begin" << '\n';
       indent_up_impl();
-      indent_impl(s_service_impl) << msgvar << " := iprot_.ReadMessageBegin();" << endl;
-      indent_impl(s_service_impl) << "if (" << msgvar << ".Type_ = TMessageType.Exception) then begin" << endl;
+      indent_impl(s_service_impl) << msgvar << " := iprot_.ReadMessageBegin();" << '\n';
+      indent_impl(s_service_impl) << "if (" << msgvar << ".Type_ = TMessageType.Exception) then begin" << '\n';
       indent_up_impl();
-      indent_impl(s_service_impl) << appexvar << " := TApplicationException.Read(iprot_);" << endl;
-      indent_impl(s_service_impl) << "iprot_.ReadMessageEnd();" << endl;
-      indent_impl(s_service_impl) << "raise " << appexvar << ";" << endl;
+      indent_impl(s_service_impl) << appexvar << " := TApplicationException.Read(iprot_);" << '\n';
+      indent_impl(s_service_impl) << "iprot_.ReadMessageEnd();" << '\n';
+      indent_impl(s_service_impl) << "raise " << appexvar << ";" << '\n';
       indent_down_impl();
-      indent_impl(s_service_impl) << "end;" << endl;
+      indent_impl(s_service_impl) << "end;" << '\n';
 
-      indent_impl(s_service_impl) << retvar << " := " << result_clsnm << "Impl.Create();" << endl;
-      indent_impl(s_service_impl) << retvar << ".Read(iprot_);" << endl;
-      indent_impl(s_service_impl) << "iprot_.ReadMessageEnd();" << endl;
+      indent_impl(s_service_impl) << retvar << " := " << result_clsnm << "Impl.Create();" << '\n';
+      indent_impl(s_service_impl) << retvar << ".Read(iprot_);" << '\n';
+      indent_impl(s_service_impl) << "iprot_.ReadMessageEnd();" << '\n';
 
       if (!(*f_iter)->get_returntype()->is_void()) {
-        indent_impl(s_service_impl) << "if (" << retvar << ".__isset_success) then begin" << endl;
+        indent_impl(s_service_impl) << "if (" << retvar << ".__isset_success) then begin" << '\n';
         indent_up_impl();
-        indent_impl(s_service_impl) << "Result := " << retvar << ".Success;" << endl;
+        indent_impl(s_service_impl) << "Result := " << retvar << ".Success;" << '\n';
         t_type* type = (*f_iter)->get_returntype();
         if (type->is_struct() || type->is_xception() || type->is_map() || type->is_list()
             || type->is_set()) {
-          indent_impl(s_service_impl) << retvar << ".Success := nil;" << endl;
+          indent_impl(s_service_impl) << retvar << ".Success := nil;" << '\n';
         }
-        indent_impl(s_service_impl) << "Exit;" << endl;
+        indent_impl(s_service_impl) << "Exit;" << '\n';
         indent_down_impl();
-        indent_impl(s_service_impl) << "end;" << endl;
+        indent_impl(s_service_impl) << "end;" << '\n';
       }
 
       vector<t_field*>::const_iterator x_iter;
       for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) {
         indent_impl(s_service_impl) << "if (" << retvar << "." << prop_name(*x_iter, false, "__isset_")
-                                    << ") then begin" << endl;
+                                    << ") then begin" << '\n';
         indent_up_impl();
         indent_impl(s_service_impl) << exceptvar << " := " << retvar << "." << prop_name(*x_iter)
-                                    << ".CreateException;" << endl;
-        indent_impl(s_service_impl) << "raise " << exceptvar << ";" << endl;
+                                    << ".CreateException;" << '\n';
+        indent_impl(s_service_impl) << "raise " << exceptvar << ";" << '\n';
         indent_down_impl();
-        indent_impl(s_service_impl) << "end;" << endl;
+        indent_impl(s_service_impl) << "end;" << '\n';
       }
 
       if (!(*f_iter)->get_returntype()->is_void()) {
         indent_impl(s_service_impl)
             << "raise TApplicationExceptionMissingResult.Create('"
-            << (*f_iter)->get_name() << " failed: unknown result');" << endl;
+            << (*f_iter)->get_name() << " failed: unknown result');" << '\n';
       }
 
       indent_down_impl();
-      indent_impl(s_service_impl) << "end;" << endl << endl;
+      indent_impl(s_service_impl) << "end;" << '\n' << '\n';
     }
   }
 
   indent_down();
-  indent(s_service) << "end;" << endl << endl;
+  indent(s_service) << "end;"
+                    << render_deprecation_attribute( tservice->annotations_, " {", "}")
+                    << '\n' << '\n';
 }
 
 void t_delphi_generator::generate_service_server(t_service* tservice) {
@@ -2249,164 +2247,164 @@
   if (tservice->get_extends() != nullptr) {
     extends = type_name(tservice->get_extends(), true, true);
     extends_processor = extends + ".TProcessorImpl";
-    indent(s_service) << "TProcessorImpl = class(" << extends_processor << ", IProcessor)" << endl;
+    indent(s_service) << "TProcessorImpl = class(" << extends_processor << ", IProcessor)" << '\n';
   } else {
-    indent(s_service) << "TProcessorImpl = class( TInterfacedObject, IProcessor)" << endl;
+    indent(s_service) << "TProcessorImpl = class( TInterfacedObject, IProcessor)" << '\n';
   }
 
-  indent(s_service) << "public" << endl;
+  indent(s_service) << "public" << '\n';
   indent_up();
-  indent(s_service) << "constructor Create( iface_: Iface );" << endl;
-  indent(s_service) << "destructor Destroy; override;" << endl;
+  indent(s_service) << "constructor Create( iface_: Iface );" << '\n';
+  indent(s_service) << "destructor Destroy; override;" << '\n';
   indent_down();
 
-  indent_impl(s_service_impl) << "constructor " << full_cls << ".Create( iface_: Iface );" << endl;
-  indent_impl(s_service_impl) << "begin" << endl;
+  indent_impl(s_service_impl) << "constructor " << full_cls << ".Create( iface_: Iface );" << '\n';
+  indent_impl(s_service_impl) << "begin" << '\n';
   indent_up_impl();
   if (tservice->get_extends() != nullptr) {
-    indent_impl(s_service_impl) << "inherited Create( iface_);" << endl;
+    indent_impl(s_service_impl) << "inherited Create( iface_);" << '\n';
   } else {
-    indent_impl(s_service_impl) << "inherited Create;" << endl;
+    indent_impl(s_service_impl) << "inherited Create;" << '\n';
   }
-  indent_impl(s_service_impl) << "Self.iface_ := iface_;" << endl;
+  indent_impl(s_service_impl) << "Self.iface_ := iface_;" << '\n';
   if (tservice->get_extends() != nullptr) {
-    indent_impl(s_service_impl) << "ASSERT( processMap_ <> nil);  // inherited" << endl;
+    indent_impl(s_service_impl) << "ASSERT( processMap_ <> nil);  // inherited" << '\n';
   } else {
     indent_impl(s_service_impl)
-        << "processMap_ := TThriftDictionaryImpl<string, TProcessFunction>.Create;" << endl;
+        << "processMap_ := TThriftDictionaryImpl<string, TProcessFunction>.Create;" << '\n';
   }
 
   for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
     indent_impl(s_service_impl) << "processMap_.AddOrSetValue( '" << (*f_iter)->get_name() << "', "
-                                << (*f_iter)->get_name() << "_Process);" << endl;
+                                << (*f_iter)->get_name() << "_Process);" << '\n';
   }
   indent_down_impl();
-  indent_impl(s_service_impl) << "end;" << endl << endl;
+  indent_impl(s_service_impl) << "end;" << '\n' << '\n';
 
-  indent_impl(s_service_impl) << "destructor " << full_cls << ".Destroy;" << endl;
-  indent_impl(s_service_impl) << "begin" << endl;
+  indent_impl(s_service_impl) << "destructor " << full_cls << ".Destroy;" << '\n';
+  indent_impl(s_service_impl) << "begin" << '\n';
   indent_up_impl();
-  indent_impl(s_service_impl) << "inherited;" << endl;
+  indent_impl(s_service_impl) << "inherited;" << '\n';
   indent_down_impl();
-  indent_impl(s_service_impl) << "end;" << endl << endl;
+  indent_impl(s_service_impl) << "end;" << '\n' << '\n';
 
-  indent(s_service) << "private" << endl;
+  indent(s_service) << "private" << '\n';
   indent_up();
-  indent(s_service) << "iface_: Iface;" << endl;
+  indent(s_service) << "iface_: Iface;" << '\n';
   indent_down();
 
   if (tservice->get_extends() == nullptr) {
-    indent(s_service) << "protected" << endl;
+    indent(s_service) << "protected" << '\n';
     indent_up();
-    indent(s_service) << "type" << endl;
+    indent(s_service) << "type" << '\n';
     indent_up();
     indent(s_service) << "TProcessFunction = reference to procedure( seqid: System.Integer; const iprot: "
                          "IProtocol; const oprot: IProtocol"
-                      << (events_ ? "; const events : IRequestEvents" : "") << ");" << endl;
+                      << (events_ ? "; const events : IRequestEvents" : "") << ");" << '\n';
     indent_down();
     indent_down();
-    indent(s_service) << "protected" << endl;
+    indent(s_service) << "protected" << '\n';
     indent_up();
-    indent(s_service) << "processMap_: IThriftDictionary<string, TProcessFunction>;" << endl;
+    indent(s_service) << "processMap_: IThriftDictionary<string, TProcessFunction>;" << '\n';
     indent_down();
   }
 
-  indent(s_service) << "public" << endl;
+  indent(s_service) << "public" << '\n';
   indent_up();
   if (extends.empty()) {
     indent(s_service) << "function Process( const iprot: IProtocol; const oprot: IProtocol; const "
-                         "events : IProcessorEvents): System.Boolean;" << endl;
+                         "events : IProcessorEvents): System.Boolean;" << '\n';
   } else {
     indent(s_service) << "function Process( const iprot: IProtocol; const oprot: IProtocol; const "
-                         "events : IProcessorEvents): System.Boolean; reintroduce;" << endl;
+                         "events : IProcessorEvents): System.Boolean; reintroduce;" << '\n';
   }
 
   indent_impl(s_service_impl) << "function " << full_cls << ".Process( const iprot: IProtocol; "
                                                             "const oprot: IProtocol; const events "
-                                                            ": IProcessorEvents): System.Boolean;" << endl;
+                                                            ": IProcessorEvents): System.Boolean;" << '\n';
   ;
-  indent_impl(s_service_impl) << "var" << endl;
+  indent_impl(s_service_impl) << "var" << '\n';
   indent_up_impl();
-  indent_impl(s_service_impl) << "msg : Thrift.Protocol.TThriftMessage;" << endl;
-  indent_impl(s_service_impl) << "fn : TProcessFunction;" << endl;
-  indent_impl(s_service_impl) << "x : TApplicationException;" << endl;
+  indent_impl(s_service_impl) << "msg : Thrift.Protocol.TThriftMessage;" << '\n';
+  indent_impl(s_service_impl) << "fn : TProcessFunction;" << '\n';
+  indent_impl(s_service_impl) << "x : TApplicationException;" << '\n';
   if (events_) {
-    indent_impl(s_service_impl) << "context : IRequestEvents;" << endl;
+    indent_impl(s_service_impl) << "context : IRequestEvents;" << '\n';
   }
   indent_down_impl();
-  indent_impl(s_service_impl) << "begin" << endl;
+  indent_impl(s_service_impl) << "begin" << '\n';
   indent_up_impl();
-  indent_impl(s_service_impl) << "try" << endl;
+  indent_impl(s_service_impl) << "try" << '\n';
   indent_up_impl();
-  indent_impl(s_service_impl) << "msg := iprot.ReadMessageBegin();" << endl;
-  indent_impl(s_service_impl) << "fn := nil;" << endl;
-  indent_impl(s_service_impl) << "if not processMap_.TryGetValue(msg.Name, fn)" << endl;
-  indent_impl(s_service_impl) << "or not Assigned(fn) then begin" << endl;
+  indent_impl(s_service_impl) << "msg := iprot.ReadMessageBegin();" << '\n';
+  indent_impl(s_service_impl) << "fn := nil;" << '\n';
+  indent_impl(s_service_impl) << "if not processMap_.TryGetValue(msg.Name, fn)" << '\n';
+  indent_impl(s_service_impl) << "or not Assigned(fn) then begin" << '\n';
   indent_up_impl();
-  indent_impl(s_service_impl) << "TProtocolUtil.Skip(iprot, TType.Struct);" << endl;
-  indent_impl(s_service_impl) << "iprot.ReadMessageEnd();" << endl;
+  indent_impl(s_service_impl) << "TProtocolUtil.Skip(iprot, TType.Struct);" << '\n';
+  indent_impl(s_service_impl) << "iprot.ReadMessageEnd();" << '\n';
   indent_impl(s_service_impl) << "x := "
                                  "TApplicationExceptionUnknownMethod.Create("
-                                 "'Invalid method name: ''' + msg.Name + '''');" << endl;
+                                 "'Invalid method name: ''' + msg.Name + '''');" << '\n';
   indent_impl(s_service_impl)
       << "Thrift.Protocol.Init( msg, msg.Name, TMessageType.Exception, msg.SeqID);"
-      << endl;
-  indent_impl(s_service_impl) << "oprot.WriteMessageBegin( msg);" << endl;
-  indent_impl(s_service_impl) << "x.Write(oprot);" << endl;
-  indent_impl(s_service_impl) << "oprot.WriteMessageEnd();" << endl;
-  indent_impl(s_service_impl) << "oprot.Transport.Flush();" << endl;
-  indent_impl(s_service_impl) << "Result := True;" << endl;
-  indent_impl(s_service_impl) << "Exit;" << endl;
+      << '\n';
+  indent_impl(s_service_impl) << "oprot.WriteMessageBegin( msg);" << '\n';
+  indent_impl(s_service_impl) << "x.Write(oprot);" << '\n';
+  indent_impl(s_service_impl) << "oprot.WriteMessageEnd();" << '\n';
+  indent_impl(s_service_impl) << "oprot.Transport.Flush();" << '\n';
+  indent_impl(s_service_impl) << "Result := True;" << '\n';
+  indent_impl(s_service_impl) << "Exit;" << '\n';
   indent_down_impl();
-  indent_impl(s_service_impl) << "end;" << endl;
+  indent_impl(s_service_impl) << "end;" << '\n';
   if (events_) {
-    indent_impl(s_service_impl) << "if events <> nil" << endl;
-    indent_impl(s_service_impl) << "then context := events.CreateRequestContext(msg.Name)" << endl;
-    indent_impl(s_service_impl) << "else context := nil;" << endl;
-    indent_impl(s_service_impl) << "try" << endl;
+    indent_impl(s_service_impl) << "if events <> nil" << '\n';
+    indent_impl(s_service_impl) << "then context := events.CreateRequestContext(msg.Name)" << '\n';
+    indent_impl(s_service_impl) << "else context := nil;" << '\n';
+    indent_impl(s_service_impl) << "try" << '\n';
     indent_up_impl();
-    indent_impl(s_service_impl) << "fn(msg.SeqID, iprot, oprot, context);" << endl;
+    indent_impl(s_service_impl) << "fn(msg.SeqID, iprot, oprot, context);" << '\n';
     indent_down_impl();
-    indent_impl(s_service_impl) << "finally" << endl;
+    indent_impl(s_service_impl) << "finally" << '\n';
     indent_up_impl();
-    indent_impl(s_service_impl) << "if context <> nil then begin" << endl;
+    indent_impl(s_service_impl) << "if context <> nil then begin" << '\n';
     indent_up_impl();
-    indent_impl(s_service_impl) << "context.CleanupContext;" << endl;
-    indent_impl(s_service_impl) << "context := nil;" << endl;
+    indent_impl(s_service_impl) << "context.CleanupContext;" << '\n';
+    indent_impl(s_service_impl) << "context := nil;" << '\n';
     indent_down_impl();
-    indent_impl(s_service_impl) << "end;" << endl;
+    indent_impl(s_service_impl) << "end;" << '\n';
     indent_down_impl();
-    indent_impl(s_service_impl) << "end;" << endl;
+    indent_impl(s_service_impl) << "end;" << '\n';
   } else {
-    indent_impl(s_service_impl) << "fn(msg.SeqID, iprot, oprot);" << endl;
+    indent_impl(s_service_impl) << "fn(msg.SeqID, iprot, oprot);" << '\n';
   }
   indent_down_impl();
-  indent_impl(s_service_impl) << "except" << endl;
+  indent_impl(s_service_impl) << "except" << '\n';
   indent_up_impl();
-  indent_impl(s_service_impl) << "on TTransportExceptionTimedOut do begin" << endl;
+  indent_impl(s_service_impl) << "on TTransportExceptionTimedOut do begin" << '\n';
   indent_up_impl();
-  indent_impl(s_service_impl) << "Result := True;" << endl;
-  indent_impl(s_service_impl) << "Exit;" << endl;
+  indent_impl(s_service_impl) << "Result := True;" << '\n';
+  indent_impl(s_service_impl) << "Exit;" << '\n';
   indent_down_impl();
-  indent_impl(s_service_impl) << "end;" << endl;
-  indent_impl(s_service_impl) << "else begin" << endl;
+  indent_impl(s_service_impl) << "end;" << '\n';
+  indent_impl(s_service_impl) << "else begin" << '\n';
   indent_up_impl();
-  indent_impl(s_service_impl) << "Result := False;" << endl;
-  indent_impl(s_service_impl) << "Exit;" << endl;
+  indent_impl(s_service_impl) << "Result := False;" << '\n';
+  indent_impl(s_service_impl) << "Exit;" << '\n';
   indent_down_impl();
-  indent_impl(s_service_impl) << "end;" << endl;
+  indent_impl(s_service_impl) << "end;" << '\n';
   indent_down_impl();
-  indent_impl(s_service_impl) << "end;" << endl;
-  indent_impl(s_service_impl) << "Result := True;" << endl;
+  indent_impl(s_service_impl) << "end;" << '\n';
+  indent_impl(s_service_impl) << "Result := True;" << '\n';
   indent_down_impl();
-  indent_impl(s_service_impl) << "end;" << endl << endl;
+  indent_impl(s_service_impl) << "end;" << '\n' << '\n';
 
   for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
     generate_process_function(tservice, *f_iter);
   }
 
   indent_down();
-  indent(s_service) << "end;" << endl << endl;
+  indent(s_service) << "end;" << '\n' << '\n';
 }
 
 void t_delphi_generator::generate_function_helpers(t_function* tfunction) {
@@ -2449,46 +2447,46 @@
 
   indent(s_service) << "procedure " << funcname
                     << "_Process( seqid: System.Integer; const iprot: IProtocol; const oprot: IProtocol"
-                    << (events_ ? "; const events : IRequestEvents" : "") << ");" << endl;
+                    << (events_ ? "; const events : IRequestEvents" : "") << ");" << '\n';
 
   if (tfunction->is_oneway()) {
-    indent_impl(s_service_impl) << "// one way processor" << endl;
+    indent_impl(s_service_impl) << "// one way processor" << '\n';
   } else {
-    indent_impl(s_service_impl) << "// both way processor" << endl;
+    indent_impl(s_service_impl) << "// both way processor" << '\n';
   }
 
   indent_impl(s_service_impl)
       << "procedure " << full_cls << "." << funcname
       << "_Process( seqid: System.Integer; const iprot: IProtocol; const oprot: IProtocol"
-      << (events_ ? "; const events : IRequestEvents" : "") << ");" << endl;
-  indent_impl(s_service_impl) << "var" << endl;
+      << (events_ ? "; const events : IRequestEvents" : "") << ");" << '\n';
+  indent_impl(s_service_impl) << "var" << '\n';
   indent_up_impl();
-  indent_impl(s_service_impl) << "args: " << args_intfnm << ";" << endl;
+  indent_impl(s_service_impl) << "args: " << args_intfnm << ";" << '\n';
   if (!tfunction->is_oneway()) {
-    indent_impl(s_service_impl) << "msg: Thrift.Protocol.TThriftMessage;" << endl;
-    indent_impl(s_service_impl) << "ret: " << result_intfnm << ";" << endl;
-    indent_impl(s_service_impl) << "appx : TApplicationException;" << endl;
+    indent_impl(s_service_impl) << "msg: Thrift.Protocol.TThriftMessage;" << '\n';
+    indent_impl(s_service_impl) << "ret: " << result_intfnm << ";" << '\n';
+    indent_impl(s_service_impl) << "appx : TApplicationException;" << '\n';
   }
 
   indent_down_impl();
-  indent_impl(s_service_impl) << "begin" << endl;
+  indent_impl(s_service_impl) << "begin" << '\n';
   indent_up_impl();
 
   if (!tfunction->is_oneway()) {
-    indent_impl(s_service_impl) << "ret := " << result_clsnm << "Impl.Create;" << endl;
+    indent_impl(s_service_impl) << "ret := " << result_clsnm << "Impl.Create;" << '\n';
   }
 
-  indent_impl(s_service_impl) << "try" << endl;
+  indent_impl(s_service_impl) << "try" << '\n';
   indent_up_impl();
 
   if (events_) {
-    indent_impl(s_service_impl) << "if events <> nil then events.PreRead;" << endl;
+    indent_impl(s_service_impl) << "if events <> nil then events.PreRead;" << '\n';
   }
-  indent_impl(s_service_impl) << "args := " << args_clsnm << "Impl.Create;" << endl;
-  indent_impl(s_service_impl) << "args.Read(iprot);" << endl;
-  indent_impl(s_service_impl) << "iprot.ReadMessageEnd();" << endl;
+  indent_impl(s_service_impl) << "args := " << args_clsnm << "Impl.Create;" << '\n';
+  indent_impl(s_service_impl) << "args.Read(iprot);" << '\n';
+  indent_impl(s_service_impl) << "iprot.ReadMessageEnd();" << '\n';
   if (events_) {
-    indent_impl(s_service_impl) << "if events <> nil then events.PostRead;" << endl;
+    indent_impl(s_service_impl) << "if events <> nil then events.PostRead;" << '\n';
   }
 
   t_struct* xs = tfunction->get_xceptions();
@@ -2513,88 +2511,88 @@
     }
     s_service_impl << "args." << prop_name(*f_iter);
   }
-  s_service_impl << ");" << endl;
+  s_service_impl << ");" << '\n';
 
   for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
     indent_impl(s_service_impl) << "args." << prop_name(*f_iter)
-                                << " := " << empty_value((*f_iter)->get_type()) << ";" << endl;
+                                << " := " << empty_value((*f_iter)->get_type()) << ";" << '\n';
   }
 
   indent_down_impl();
-  indent_impl(s_service_impl) << "except" << endl;
+  indent_impl(s_service_impl) << "except" << '\n';
   indent_up_impl();
 
   for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) {
     indent_impl(s_service_impl) << "on E: " << type_name((*x_iter)->get_type(), true, true)
-                                << " do begin" << endl;
+                                << " do begin" << '\n';
     indent_up_impl();
     if (!tfunction->is_oneway()) {
       string factory_name = normalize_clsnm((*x_iter)->get_type()->get_name(), "", true)
                             + "Factory";
       indent_impl(s_service_impl) << "ret." << prop_name(*x_iter) << " := E." << factory_name << ";"
-                                  << endl;
+                                  << '\n';
     }
     indent_down_impl();
-    indent_impl(s_service_impl) << "end;" << endl;
+    indent_impl(s_service_impl) << "end;" << '\n';
   }
 
-  indent_impl(s_service_impl) << "on E: Exception do begin" << endl;
+  indent_impl(s_service_impl) << "on E: Exception do begin" << '\n';
   indent_up_impl();
   if(events_) {
-    indent_impl(s_service_impl) << "if events <> nil then events.UnhandledError(E);" << endl;
+    indent_impl(s_service_impl) << "if events <> nil then events.UnhandledError(E);" << '\n';
   }
   if (!tfunction->is_oneway()) {
     indent_impl(s_service_impl) << "appx := TApplicationExceptionInternalError.Create(E.Message);"
-                                << endl;
-    indent_impl(s_service_impl) << "try" << endl;
+                                << '\n';
+    indent_impl(s_service_impl) << "try" << '\n';
     indent_up_impl();
     if(events_) {
-      indent_impl(s_service_impl) << "if events <> nil then events.PreWrite;" << endl;
+      indent_impl(s_service_impl) << "if events <> nil then events.PreWrite;" << '\n';
     }
     indent_impl(s_service_impl) << "Thrift.Protocol.Init( msg, '"
                                 << tfunction->get_name() << "', TMessageType.Exception, seqid);"
-                                << endl;
-    indent_impl(s_service_impl) << "oprot.WriteMessageBegin( msg);" << endl;
-    indent_impl(s_service_impl) << "appx.Write(oprot);" << endl;
-    indent_impl(s_service_impl) << "oprot.WriteMessageEnd();" << endl;
-    indent_impl(s_service_impl) << "oprot.Transport.Flush();" << endl;
+                                << '\n';
+    indent_impl(s_service_impl) << "oprot.WriteMessageBegin( msg);" << '\n';
+    indent_impl(s_service_impl) << "appx.Write(oprot);" << '\n';
+    indent_impl(s_service_impl) << "oprot.WriteMessageEnd();" << '\n';
+    indent_impl(s_service_impl) << "oprot.Transport.Flush();" << '\n';
     if(events_) {
-      indent_impl(s_service_impl) << "if events <> nil then events.PostWrite;" << endl;
+      indent_impl(s_service_impl) << "if events <> nil then events.PostWrite;" << '\n';
     }
-    indent_impl(s_service_impl) << "Exit;" << endl;
+    indent_impl(s_service_impl) << "Exit;" << '\n';
     indent_down_impl();
-    indent_impl(s_service_impl) << "finally" << endl;
+    indent_impl(s_service_impl) << "finally" << '\n';
     indent_up_impl();
-    indent_impl(s_service_impl) << "appx.Free;" << endl;
+    indent_impl(s_service_impl) << "appx.Free;" << '\n';
     indent_down_impl();
-    indent_impl(s_service_impl) << "end;" << endl;
+    indent_impl(s_service_impl) << "end;" << '\n';
   }
   indent_down_impl();
-  indent_impl(s_service_impl) << "end;" << endl;
+  indent_impl(s_service_impl) << "end;" << '\n';
 
   indent_down_impl();
-  indent_impl(s_service_impl) << "end;" << endl;
+  indent_impl(s_service_impl) << "end;" << '\n';
 
   if (!tfunction->is_oneway()) {
     if (events_) {
-      indent_impl(s_service_impl) << "if events <> nil then events.PreWrite;" << endl;
+      indent_impl(s_service_impl) << "if events <> nil then events.PreWrite;" << '\n';
     }
     indent_impl(s_service_impl) << "Thrift.Protocol.Init( msg, '"
                                 << tfunction->get_name() << "', TMessageType.Reply, seqid); "
-                                << endl;
-    indent_impl(s_service_impl) << "oprot.WriteMessageBegin( msg); " << endl;
-    indent_impl(s_service_impl) << "ret.Write(oprot);" << endl;
-    indent_impl(s_service_impl) << "oprot.WriteMessageEnd();" << endl;
-    indent_impl(s_service_impl) << "oprot.Transport.Flush();" << endl;
+                                << '\n';
+    indent_impl(s_service_impl) << "oprot.WriteMessageBegin( msg); " << '\n';
+    indent_impl(s_service_impl) << "ret.Write(oprot);" << '\n';
+    indent_impl(s_service_impl) << "oprot.WriteMessageEnd();" << '\n';
+    indent_impl(s_service_impl) << "oprot.Transport.Flush();" << '\n';
     if (events_) {
-      indent_impl(s_service_impl) << "if events <> nil then events.PostWrite;" << endl;
+      indent_impl(s_service_impl) << "if events <> nil then events.PostWrite;" << '\n';
     }
   } else if (events_) {
-    indent_impl(s_service_impl) << "if events <> nil then events.OnewayComplete;" << endl;
+    indent_impl(s_service_impl) << "if events <> nil then events.OnewayComplete;" << '\n';
   }
 
   indent_down_impl();
-  indent_impl(s_service_impl) << "end;" << endl << endl;
+  indent_impl(s_service_impl) << "end;" << '\n' << '\n';
 }
 
 void t_delphi_generator::generate_deserialize_field(ostream& out,
@@ -2634,11 +2632,7 @@
         break;
       case t_base_type::TYPE_STRING:
         if (type->is_binary()) {
-          if (ansistr_binary_) {
-            out << "ReadAnsiString();";
-          } else {
-            out << (com_types_ ? "ReadBinaryCOM();" :  "ReadBinary();");
-          }
+          out << (com_types_ ? "ReadBinaryCOM();" :  "ReadBinary();");
         } else {
           out << "ReadString();";
         }
@@ -2671,7 +2665,7 @@
       out << "ReadI32()";
       out << ");";
     }
-    out << endl;
+    out << '\n';
   } else {
     printf("DO NOT KNOW HOW TO DESERIALIZE FIELD '%s' TYPE '%s'\n",
            tfield->get_name().c_str(),
@@ -2691,8 +2685,8 @@
     typ_name = type_name(tstruct, true, false);
   }
 
-  indent_impl(out) << prefix << name << " := " << typ_name << ".Create;" << endl;
-  indent_impl(out) << prefix << name << ".Read(iprot);" << endl;
+  indent_impl(out) << prefix << name << " := " << typ_name << ".Create;" << '\n';
+  indent_impl(out) << prefix << name << ".Read(iprot);" << '\n';
 }
 
 void t_delphi_generator::generate_deserialize_container(ostream& out,
@@ -2720,22 +2714,22 @@
   } else if (ttype->is_list()) {
     local_var = obj + ": TThriftList;";
   }
-  local_vars << "  " << local_var << endl;
+  local_vars << "  " << local_var << '\n';
   counter = tmp("_i");
   local_var = counter + ": System.Integer;";
-  local_vars << "  " << local_var << endl;
+  local_vars << "  " << local_var << '\n';
 
-  indent_impl(out) << name << " := " << type_name(ttype, true) << ".Create;" << endl;
+  indent_impl(out) << name << " := " << type_name(ttype, true) << ".Create;" << '\n';
 
   if (ttype->is_map()) {
-    indent_impl(out) << obj << " := iprot.ReadMapBegin();" << endl;
+    indent_impl(out) << obj << " := iprot.ReadMapBegin();" << '\n';
   } else if (ttype->is_set()) {
-    indent_impl(out) << obj << " := iprot.ReadSetBegin();" << endl;
+    indent_impl(out) << obj << " := iprot.ReadSetBegin();" << '\n';
   } else if (ttype->is_list()) {
-    indent_impl(out) << obj << " := iprot.ReadListBegin();" << endl;
+    indent_impl(out) << obj << " := iprot.ReadListBegin();" << '\n';
   }
 
-  indent_impl(out) << "for " << counter << " := 0 to " << obj << ".Count - 1 do begin" << endl;
+  indent_impl(out) << "for " << counter << " := 0 to " << obj << ".Count - 1 do begin" << '\n';
   indent_up_impl();
   if (ttype->is_map()) {
     generate_deserialize_map_element(out, is_xception, (t_map*)ttype, name, local_vars);
@@ -2745,14 +2739,14 @@
     generate_deserialize_list_element(out, is_xception, (t_list*)ttype, name, local_vars);
   }
   indent_down_impl();
-  indent_impl(out) << "end;" << endl;
+  indent_impl(out) << "end;" << '\n';
 
   if (ttype->is_map()) {
-    indent_impl(out) << "iprot.ReadMapEnd();" << endl;
+    indent_impl(out) << "iprot.ReadMapEnd();" << '\n';
   } else if (ttype->is_set()) {
-    indent_impl(out) << "iprot.ReadSetEnd();" << endl;
+    indent_impl(out) << "iprot.ReadSetEnd();" << '\n';
   } else if (ttype->is_list()) {
-    indent_impl(out) << "iprot.ReadListEnd();" << endl;
+    indent_impl(out) << "iprot.ReadListEnd();" << '\n';
   }
 }
 
@@ -2769,13 +2763,13 @@
   t_field fkey(tmap->get_key_type(), key);
   t_field fval(tmap->get_val_type(), val);
 
-  local_vars << "  " << declare_field(&fkey) << endl;
-  local_vars << "  " << declare_field(&fval) << endl;
+  local_vars << "  " << declare_field(&fkey) << '\n';
+  local_vars << "  " << declare_field(&fval) << '\n';
 
   generate_deserialize_field(out, is_xception, &fkey, "", local_vars);
   generate_deserialize_field(out, is_xception, &fval, "", local_vars);
 
-  indent_impl(out) << prefix << ".AddOrSetValue( " << key << ", " << val << ");" << endl;
+  indent_impl(out) << prefix << ".AddOrSetValue( " << key << ", " << val << ");" << '\n';
 }
 
 void t_delphi_generator::generate_deserialize_set_element(ostream& out,
@@ -2785,9 +2779,9 @@
                                                           ostream& local_vars) {
   string elem = tmp("_elem");
   t_field felem(tset->get_elem_type(), elem);
-  local_vars << "  " << declare_field(&felem) << endl;
+  local_vars << "  " << declare_field(&felem) << '\n';
   generate_deserialize_field(out, is_xception, &felem, "", local_vars);
-  indent_impl(out) << prefix << ".Add(" << elem << ");" << endl;
+  indent_impl(out) << prefix << ".Add(" << elem << ");" << '\n';
 }
 
 void t_delphi_generator::generate_deserialize_list_element(ostream& out,
@@ -2797,9 +2791,9 @@
                                                            ostream& local_vars) {
   string elem = tmp("_elem");
   t_field felem(tlist->get_elem_type(), elem);
-  local_vars << "  " << declare_field(&felem) << endl;
+  local_vars << "  " << declare_field(&felem) << '\n';
   generate_deserialize_field(out, is_xception, &felem, "", local_vars);
-  indent_impl(out) << prefix << ".Add(" << elem << ");" << endl;
+  indent_impl(out) << prefix << ".Add(" << elem << ");" << '\n';
 }
 
 void t_delphi_generator::generate_serialize_field(ostream& out,
@@ -2837,11 +2831,7 @@
         break;
       case t_base_type::TYPE_STRING:
         if (type->is_binary()) {
-          if (ansistr_binary_) {
-            out << "WriteAnsiString(";
-          } else {
-            out << "WriteBinary(";
-          }
+          out << "WriteBinary(";
         } else {
           out << "WriteString(";
         }
@@ -2874,7 +2864,7 @@
     } else if (type->is_enum()) {
       out << "WriteI32(System.Integer(" << name << "));";
     }
-    out << endl;
+    out << '\n';
   } else {
     printf("DO NOT KNOW HOW TO SERIALIZE '%s%s' TYPE '%s'\n",
            prefix.c_str(),
@@ -2889,7 +2879,7 @@
                                                    ostream& local_vars) {
   (void)local_vars;
   (void)tstruct;
-  out << indent_impl() << prefix << ".Write(oprot);" << endl;
+  out << indent_impl() << prefix << ".Write(oprot);" << '\n';
 }
 
 void t_delphi_generator::generate_serialize_container(ostream& out,
@@ -2900,42 +2890,42 @@
   string obj;
   if (ttype->is_map()) {
     obj = tmp("map");
-    local_vars << "  " << obj << " : TThriftMap;" << endl;
+    local_vars << "  " << obj << " : TThriftMap;" << '\n';
     indent_impl(out) << "Thrift.Protocol.Init( " << obj << ", "
                      << type_to_enum(((t_map*)ttype)->get_key_type()) << ", "
                      << type_to_enum(((t_map*)ttype)->get_val_type()) << ", " << prefix
-                     << ".Count);" << endl;
-    indent_impl(out) << "oprot.WriteMapBegin( " << obj << ");" << endl;
+                     << ".Count);" << '\n';
+    indent_impl(out) << "oprot.WriteMapBegin( " << obj << ");" << '\n';
   } else if (ttype->is_set()) {
     obj = tmp("set_");
-    local_vars << "  " << obj << " : TThriftSet;" << endl;
+    local_vars << "  " << obj << " : TThriftSet;" << '\n';
     indent_impl(out) << "Thrift.Protocol.Init( " << obj << ", "
                      << type_to_enum(((t_set*)ttype)->get_elem_type()) << ", " << prefix
-                     << ".Count);" << endl;
-    indent_impl(out) << "oprot.WriteSetBegin( " << obj << ");" << endl;
+                     << ".Count);" << '\n';
+    indent_impl(out) << "oprot.WriteSetBegin( " << obj << ");" << '\n';
   } else if (ttype->is_list()) {
     obj = tmp("list_");
-    local_vars << "  " << obj << " : TThriftList;" << endl;
+    local_vars << "  " << obj << " : TThriftList;" << '\n';
     indent_impl(out) << "Thrift.Protocol.Init( " << obj << ", "
                      << type_to_enum(((t_list*)ttype)->get_elem_type()) << ", " << prefix
-                     << ".Count);" << endl;
-    indent_impl(out) << "oprot.WriteListBegin( " << obj << ");" << endl;
+                     << ".Count);" << '\n';
+    indent_impl(out) << "oprot.WriteListBegin( " << obj << ");" << '\n';
   }
 
   string iter = tmp("_iter");
   if (ttype->is_map()) {
-    local_vars << "  " << iter << ": " << type_name(((t_map*)ttype)->get_key_type()) << ";" << endl;
-    indent_impl(out) << "for " << iter << " in " << prefix << ".Keys do begin" << endl;
+    local_vars << "  " << iter << ": " << type_name(((t_map*)ttype)->get_key_type()) << ";" << '\n';
+    indent_impl(out) << "for " << iter << " in " << prefix << ".Keys do begin" << '\n';
     indent_up_impl();
   } else if (ttype->is_set()) {
     local_vars << "  " << iter << ": " << type_name(((t_set*)ttype)->get_elem_type()) << ";"
-               << endl;
-    indent_impl(out) << "for " << iter << " in " << prefix << " do begin" << endl;
+               << '\n';
+    indent_impl(out) << "for " << iter << " in " << prefix << " do begin" << '\n';
     indent_up_impl();
   } else if (ttype->is_list()) {
     local_vars << "  " << iter << ": " << type_name(((t_list*)ttype)->get_elem_type()) << ";"
-               << endl;
-    indent_impl(out) << "for " << iter << " in " << prefix << " do begin" << endl;
+               << '\n';
+    indent_impl(out) << "for " << iter << " in " << prefix << " do begin" << '\n';
     indent_up_impl();
   }
 
@@ -2948,14 +2938,14 @@
   }
 
   indent_down_impl();
-  indent_impl(out) << "end;" << endl;
+  indent_impl(out) << "end;" << '\n';
 
   if (ttype->is_map()) {
-    indent_impl(out) << "oprot.WriteMapEnd();" << endl;
+    indent_impl(out) << "oprot.WriteMapEnd();" << '\n';
   } else if (ttype->is_set()) {
-    indent_impl(out) << "oprot.WriteSetEnd();" << endl;
+    indent_impl(out) << "oprot.WriteSetEnd();" << '\n';
   } else if (ttype->is_list()) {
-    indent_impl(out) << "oprot.WriteListEnd();" << endl;
+    indent_impl(out) << "oprot.WriteListEnd();" << '\n';
   }
 }
 
@@ -3007,10 +2997,12 @@
   bool is_xception = ftype->is_xception();
   generate_delphi_doc(out, tfield);
   indent(out) << "property " << prop_name(tfield, struct_is_xception) << ": "
-              << type_name(ftype, false, true, is_xception, true) 
-              << " read " << prop_name(tfield, struct_is_xception, fieldPrefix) 
-              << " write " << prop_name(tfield, struct_is_xception, "Set") 
-              << ";" << endl;
+              << type_name(ftype, false, true, is_xception, true)
+              << " read " << prop_name(tfield, struct_is_xception, fieldPrefix)
+              << " write " << prop_name(tfield, struct_is_xception, "Set")
+              << ";"
+              << render_deprecation_attribute(tfield->annotations_, " {", "}")
+              << '\n';
 }
 
 std::string t_delphi_generator::prop_name(t_field* tfield, bool is_xception, std::string prefix) {
@@ -3180,8 +3172,6 @@
     return "";
   case t_base_type::TYPE_STRING:
     if (tbase->is_binary()) {
-      if (ansistr_binary_)
-        return "System.AnsiString";
       if( com_types_)
         return "IThriftBytes";
       if( rtti_)
@@ -3237,7 +3227,7 @@
   }
 
   string signature = "";
-  
+
   if( for_async) {
     if (is_void(ttype)) {
       signature = "function " + prefix + normalize_name(tfunction->get_name(), true, is_xception) + "Async("
@@ -3260,15 +3250,7 @@
 
   // deprecated method? only at intf decl!
   if( full_cls == "") {
-    auto iter = tfunction->annotations_.find("deprecated");
-    if( tfunction->annotations_.end() != iter && !iter->second.empty()) {
-      signature += " deprecated";
-      // empty annotation values end up with "1" somewhere, ignore these as well
-      if ((iter->second.back().length() > 0) && (iter->second.back() != "1")) {
-        signature += " " + make_pascal_string_literal(iter->second.back());
-      }
-      signature += ";";
-    }
+    signature += render_deprecation_attribute(tfunction->annotations_, " ", ";");
   }
 
   return signature;
@@ -3316,10 +3298,10 @@
 
     if (line.size() > 80) {
       if (firstline) {
-        result << endl << newline_indent;
+        result << '\n' << newline_indent;
         firstline = false;
       }
-      result << line << endl;
+      result << line << '\n';
       line = newline_indent;
     } else if (line.size() > 0) {
       line += " ";
@@ -3400,11 +3382,7 @@
       return "0";
     case t_base_type::TYPE_STRING:
       if (type->is_binary()) {
-        if (ansistr_binary_) {
-          return "''";
-        } else {
-          return "nil";
-        }
+        return "nil";
       } else {
         return "''";
       }
@@ -3443,7 +3421,8 @@
 
   indent(out) << "procedure " << prop_name(tfield, is_xception_class, "Set")
               << "( const Value: " << type_name(ftype, false, true, is_xception, true) << ");"
-              << endl;
+              << render_deprecation_attribute(tfield->annotations_, " ", ";")
+              << '\n';
 }
 
 void t_delphi_generator::generate_delphi_property_reader_definition(ostream& out,
@@ -3453,14 +3432,16 @@
   bool is_xception = ftype->is_xception();
 
   indent(out) << "function " << prop_name(tfield, is_xception_class, "Get") << ": "
-              << type_name(ftype, false, true, is_xception, true) << ";" << endl;
+              << type_name(ftype, false, true, is_xception, true) << ";" 
+              << render_deprecation_attribute(tfield->annotations_, " ", ";")
+              << '\n';
 }
 
 void t_delphi_generator::generate_delphi_isset_reader_writer_definition(ostream& out,
                                                                  t_field* tfield,
                                                                  bool is_xception) {
-  indent(out) << "function " << prop_name(tfield, is_xception,"Get__isset_") << ": System.Boolean;" << endl;
-  indent(out) << "procedure " << prop_name(tfield, is_xception, "Set__isset_") << "( const value : System.Boolean);" << endl;
+  indent(out) << "function " << prop_name(tfield, is_xception,"Get__isset_") << ": System.Boolean;" << '\n';
+  indent(out) << "procedure " << prop_name(tfield, is_xception, "Set__isset_") << "( const value : System.Boolean);" << '\n';
 }
 
 void t_delphi_generator::generate_delphi_clear_union_value(ostream& out,
@@ -3484,14 +3465,14 @@
   bool is_xception = ftype->is_xception();
 
   indent_impl(out) << "if " << prop_name(tfield, is_xception_class,"F__isset_") << " then begin"
-                   << endl;
+                   << '\n';
   indent_up_impl();
-  indent_impl(out) << prop_name(tfield, is_xception_class,"F__isset_") << " := False;" << endl;
+  indent_impl(out) << prop_name(tfield, is_xception_class,"F__isset_") << " := False;" << '\n';
   indent_impl(out) << prop_name(tfield, is_xception_class,fieldPrefix) << " := "
                    << "Default( " << type_name(ftype, false, true, is_xception, true) << ");"
-                   << endl;
+                   << '\n';
   indent_down_impl();
-  indent_impl(out) << "end;" << endl;
+  indent_impl(out) << "end;" << '\n';
 }
 
 void t_delphi_generator::generate_delphi_property_writer_impl(ostream& out,
@@ -3512,24 +3493,24 @@
   indent_impl(out) << "procedure " << cls_prefix << name << "."
                    << prop_name(tfield, is_xception_class,"Set")
                    << "( const Value: " << type_name(ftype, false, true, is_xception, true) << ");"
-                   << endl;
-  indent_impl(out) << "begin" << endl;
+                   << '\n';
+  indent_impl(out) << "begin" << '\n';
   indent_up_impl();
   if (is_union) {
-    indent_impl(out) << "ClearUnionValues;" << endl;
+    indent_impl(out) << "ClearUnionValues;" << '\n';
   }
   if (tfield->get_req() != t_field::T_REQUIRED) {
-    indent_impl(out) << prop_name(tfield, is_xception_class,"F__isset_") << " := True;" << endl;
+    indent_impl(out) << prop_name(tfield, is_xception_class,"F__isset_") << " := True;" << '\n';
   }
-  indent_impl(out) << prop_name(tfield, is_xception_class,fieldPrefix) << " := Value;" << endl;
+  indent_impl(out) << prop_name(tfield, is_xception_class,fieldPrefix) << " := Value;" << '\n';
 
   if (is_xception_class && (!is_xception_factory)) {
     indent_impl(out) << xception_factory_name << "." << prop_name(tfield, is_xception_class)
-                     << " := Value;" << endl;
+                     << " := Value;" << '\n';
   }
 
   indent_down_impl();
-  indent_impl(out) << "end;" << endl << endl;
+  indent_impl(out) << "end;" << '\n' << '\n';
 }
 
 void t_delphi_generator::generate_delphi_property_reader_impl(ostream& out,
@@ -3546,13 +3527,13 @@
 
   indent_impl(out) << "function " << cls_prefix << name << "."
                    << prop_name(tfield, is_xception_class,"Get") << ": "
-                   << type_name(ftype, false, true, is_xception, true) << ";" << endl;
-  indent_impl(out) << "begin" << endl;
+                   << type_name(ftype, false, true, is_xception, true) << ";" << '\n';
+  indent_impl(out) << "begin" << '\n';
   indent_up_impl();
   indent_impl(out) << "Result := " << prop_name(tfield, is_xception_class,fieldPrefix) << ";"
-                   << endl;
+                   << '\n';
   indent_down_impl();
-  indent_impl(out) << "end;" << endl << endl;
+  indent_impl(out) << "end;" << '\n' << '\n';
 }
 
 void t_delphi_generator::generate_delphi_isset_reader_writer_impl(ostream& out,
@@ -3565,22 +3546,22 @@
   (void)type;
 
   string isset_name = prop_name(tfield, is_xception, "__isset_");
-  
+
   indent_impl(out) << "function " << cls_prefix << name << "."
-                   << "Get" << isset_name << ": System.Boolean;" << endl;
-  indent_impl(out) << "begin" << endl;
+                   << "Get" << isset_name << ": System.Boolean;" << '\n';
+  indent_impl(out) << "begin" << '\n';
   indent_up_impl();
-  indent_impl(out) << "Result := " << fieldPrefix << isset_name << ";" << endl;
+  indent_impl(out) << "Result := " << fieldPrefix << isset_name << ";" << '\n';
   indent_down_impl();
-  indent_impl(out) << "end;" << endl << endl;
-  
+  indent_impl(out) << "end;" << '\n' << '\n';
+
   indent_impl(out) << "procedure " << cls_prefix << name << "."
-                   << "Set" << isset_name << "( const value: System.Boolean);" << endl;
-  indent_impl(out) << "begin" << endl;
+                   << "Set" << isset_name << "( const value: System.Boolean);" << '\n';
+  indent_impl(out) << "begin" << '\n';
   indent_up_impl();
-  indent_impl(out) << fieldPrefix << isset_name << " := value;" << endl;
+  indent_impl(out) << fieldPrefix << isset_name << " := value;" << '\n';
   indent_down_impl();
-  indent_impl(out) << "end;" << endl << endl;
+  indent_impl(out) << "end;" << '\n' << '\n';
 }
 
 void t_delphi_generator::generate_delphi_create_exception_impl(ostream& out,
@@ -3593,14 +3574,14 @@
   string cls_nm = type_name(tstruct, true, false, is_exception, is_exception);
 
   indent_impl(out) << "function " << cls_nm << ".CreateException: " << exception_cls_nm << ";"
-                   << endl;
+                   << '\n';
 
-  indent_impl(out) << "begin" << endl;
+  indent_impl(out) << "begin" << '\n';
   indent_up_impl();
 
-  indent_impl(out) << "Result := " << exception_cls_nm << ".Create;" << endl;
+  indent_impl(out) << "Result := " << exception_cls_nm << ".Create;" << '\n';
   string factory_name = normalize_clsnm(tstruct->get_name(), "", true) + "Factory";
-  indent_impl(out) << "Result.F" << factory_name << " := Self;" << endl;
+  indent_impl(out) << "Result.F" << factory_name << " := Self;" << '\n';
 
   const vector<t_field*>& fields = tstruct->get_members();
   vector<t_field*>::const_iterator f_iter;
@@ -3610,20 +3591,20 @@
   for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
     propname = prop_name(*f_iter, is_exception);
     if ((*f_iter)->get_req() != t_field::T_REQUIRED) {
-      indent_impl(out) << "if " << prop_name(*f_iter, is_exception,"__isset_") << " then begin" << endl;
+      indent_impl(out) << "if " << prop_name(*f_iter, is_exception,"__isset_") << " then begin" << '\n';
       indent_up_impl();
     }
-    indent_impl(out) << "Result." << propname << " := " << propname << ";" << endl;
+    indent_impl(out) << "Result." << propname << " := " << propname << ";" << '\n';
     if ((*f_iter)->get_req() != t_field::T_REQUIRED) {
       indent_down_impl();
-      indent_impl(out) << "end;" << endl;
+      indent_impl(out) << "end;" << '\n';
     }
   }
 
-  indent_impl(out) << "Result.UpdateMessageProperty;" << endl;
+  indent_impl(out) << "Result.UpdateMessageProperty;" << '\n';
 
   indent_down_impl();
-  indent_impl(out) << "end;" << endl << endl;
+  indent_impl(out) << "end;" << '\n' << '\n';
 }
 
 void t_delphi_generator::generate_delphi_struct_reader_impl(ostream& out,
@@ -3638,53 +3619,53 @@
   const vector<t_field*>& fields = tstruct->get_members();
   vector<t_field*>::const_iterator f_iter;
 
-  indent_impl(code_block) << "begin" << endl;
+  indent_impl(code_block) << "begin" << '\n';
   indent_up_impl();
 
-  indent_impl(local_vars) << "tracker : IProtocolRecursionTracker;" << endl;
-  indent_impl(code_block) << "tracker := iprot.NextRecursionLevel;" << endl;
+  indent_impl(local_vars) << "tracker : IProtocolRecursionTracker;" << '\n';
+  indent_impl(code_block) << "tracker := iprot.NextRecursionLevel;" << '\n';
 
   // local bools for required fields
   for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
     if ((*f_iter)->get_req() == t_field::T_REQUIRED) {
       indent_impl(local_vars) << prop_name(*f_iter, is_exception,"_req_isset_") << " : System.Boolean;"
-                              << endl;
+                              << '\n';
       indent_impl(code_block) << prop_name(*f_iter, is_exception,"_req_isset_") << " := FALSE;"
-                              << endl;
+                              << '\n';
     }
   }
 
-  indent_impl(code_block) << "struc := iprot.ReadStructBegin;" << endl;
+  indent_impl(code_block) << "struc := iprot.ReadStructBegin;" << '\n';
 
-  indent_impl(code_block) << "try" << endl;
+  indent_impl(code_block) << "try" << '\n';
   indent_up_impl();
 
-  indent_impl(code_block) << "while (true) do begin" << endl;
+  indent_impl(code_block) << "while (true) do begin" << '\n';
   indent_up_impl();
 
-  indent_impl(code_block) << "field_ := iprot.ReadFieldBegin();" << endl;
+  indent_impl(code_block) << "field_ := iprot.ReadFieldBegin();" << '\n';
 
-  indent_impl(code_block) << "if (field_.Type_ = TType.Stop) then Break;" << endl;
+  indent_impl(code_block) << "if (field_.Type_ = TType.Stop) then Break;" << '\n';
 
   bool first = true;
 
   for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
 
     if (first) {
-      code_block << endl;
-      indent_impl(code_block) << "case field_.ID of" << endl;
+      code_block << '\n';
+      indent_impl(code_block) << "case field_.ID of" << '\n';
       indent_up_impl();
     }
 
     first = false;
     if (f_iter != fields.begin()) {
-      code_block << endl;
+      code_block << '\n';
     }
 
-    indent_impl(code_block) << (*f_iter)->get_key() << ": begin" << endl;
+    indent_impl(code_block) << (*f_iter)->get_key() << ": begin" << '\n';
     indent_up_impl();
     indent_impl(code_block) << "if (field_.Type_ = " << type_to_enum((*f_iter)->get_type())
-                            << ") then begin" << endl;
+                            << ") then begin" << '\n';
     indent_up_impl();
 
     generate_deserialize_field(code_block, is_exception, *f_iter, "Self.", local_vars);
@@ -3692,82 +3673,82 @@
     // required field?
     if ((*f_iter)->get_req() == t_field::T_REQUIRED) {
       indent_impl(code_block) << prop_name(*f_iter, is_exception,"_req_isset_") << " := TRUE;"
-                              << endl;
+                              << '\n';
     }
 
     indent_down_impl();
 
-    indent_impl(code_block) << "end else begin" << endl;
+    indent_impl(code_block) << "end else begin" << '\n';
     indent_up_impl();
-    indent_impl(code_block) << "TProtocolUtil.Skip(iprot, field_.Type_);" << endl;
+    indent_impl(code_block) << "TProtocolUtil.Skip(iprot, field_.Type_);" << '\n';
     indent_down_impl();
-    indent_impl(code_block) << "end;" << endl;
+    indent_impl(code_block) << "end;" << '\n';
     indent_down_impl();
     indent_impl(code_block) << "end;";
   }
 
   if (!first) {
-    code_block << endl;
+    code_block << '\n';
     indent_down_impl();
-    indent_impl(code_block) << "else" << endl;
+    indent_impl(code_block) << "else" << '\n';
     indent_up_impl();
   }
 
-  indent_impl(code_block) << "TProtocolUtil.Skip(iprot, field_.Type_);" << endl;
+  indent_impl(code_block) << "TProtocolUtil.Skip(iprot, field_.Type_);" << '\n';
 
   if (!first) {
     indent_down_impl();
-    indent_impl(code_block) << "end;" << endl;
+    indent_impl(code_block) << "end;" << '\n';
   }
 
-  indent_impl(code_block) << "iprot.ReadFieldEnd;" << endl;
+  indent_impl(code_block) << "iprot.ReadFieldEnd;" << '\n';
 
   indent_down_impl();
 
-  indent_impl(code_block) << "end;" << endl;
+  indent_impl(code_block) << "end;" << '\n';
   indent_down_impl();
 
-  indent_impl(code_block) << "finally" << endl;
+  indent_impl(code_block) << "finally" << '\n';
   indent_up_impl();
-  indent_impl(code_block) << "iprot.ReadStructEnd;" << endl;
+  indent_impl(code_block) << "iprot.ReadStructEnd;" << '\n';
   indent_down_impl();
-  indent_impl(code_block) << "end;" << endl;
+  indent_impl(code_block) << "end;" << '\n';
 
   // all required fields have been read?
   first = true;
   for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
     if ((*f_iter)->get_req() == t_field::T_REQUIRED) {
       if(first) {
-        code_block << endl;
+        code_block << '\n';
         first = false;
       }
-      indent_impl(code_block) << "if not " << prop_name(*f_iter, is_exception,"_req_isset_") << endl;
+      indent_impl(code_block) << "if not " << prop_name(*f_iter, is_exception,"_req_isset_") << '\n';
       indent_impl(code_block)
           << "then raise TProtocolExceptionInvalidData.Create("
           << "'required field " << prop_name(*f_iter, is_exception) << " not set');"
-          << endl;
+          << '\n';
     }
   }
-  
+
   if( is_exception && (!is_x_factory)) {
-    code_block << endl;
-    indent_impl(code_block) << "UpdateMessageProperty;" << endl;
+    code_block << '\n';
+    indent_impl(code_block) << "UpdateMessageProperty;" << '\n';
   }
   indent_down_impl();
-  indent_impl(code_block) << "end;" << endl << endl;
+  indent_impl(code_block) << "end;" << '\n' << '\n';
 
   string cls_nm;
 
   cls_nm = type_name(tstruct, true, is_exception && (!is_x_factory), is_x_factory, is_x_factory);
 
   indent_impl(out) << "procedure " << cls_prefix << cls_nm << ".Read( const iprot: IProtocol);"
-                   << endl;
-  indent_impl(out) << "var" << endl;
+                   << '\n';
+  indent_impl(out) << "var" << '\n';
   indent_up_impl();
-  indent_impl(out) << "field_ : TThriftField;" << endl;
-  indent_impl(out) << "struc : TThriftStruct;" << endl;
+  indent_impl(out) << "field_ : TThriftField;" << '\n';
+  indent_impl(out) << "struc : TThriftStruct;" << '\n';
   indent_down_impl();
-  out << local_vars.str() << endl;
+  out << local_vars.str() << '\n';
   out << code_block.str();
 }
 
@@ -3784,51 +3765,51 @@
   const vector<t_field*>& fields = tstruct->get_sorted_members();
   vector<t_field*>::const_iterator f_iter;
 
-  indent_impl(code_block) << "begin" << endl;
+  indent_impl(code_block) << "begin" << '\n';
   indent_up_impl();
 
-  indent_impl(local_vars) << "tracker : IProtocolRecursionTracker;" << endl;
-  indent_impl(code_block) << "tracker := oprot.NextRecursionLevel;" << endl;
+  indent_impl(local_vars) << "tracker : IProtocolRecursionTracker;" << '\n';
+  indent_impl(code_block) << "tracker := oprot.NextRecursionLevel;" << '\n';
 
-  indent_impl(code_block) << "Thrift.Protocol.Init( struc, '" << name << "');" << endl;
-  indent_impl(code_block) << "oprot.WriteStructBegin(struc);" << endl;
+  indent_impl(code_block) << "Thrift.Protocol.Init( struc, '" << name << "');" << '\n';
+  indent_impl(code_block) << "oprot.WriteStructBegin(struc);" << '\n';
 
   if (fields.size() > 0) {
-    indent_impl(code_block) << "Thrift.Protocol.Init( field_);" << endl;
+    indent_impl(code_block) << "Thrift.Protocol.Init( field_);" << '\n';
     for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
       indent_impl(code_block) << "if (" << prop_name(*f_iter, is_exception,"__isset_") << ") then"
-                              << endl;
-      indent_impl(code_block) << "begin" << endl;
+                              << '\n';
+      indent_impl(code_block) << "begin" << '\n';
       indent_up_impl();
-      indent_impl(code_block) << "field_.Name := '" << (*f_iter)->get_name() << "';" << endl;
+      indent_impl(code_block) << "field_.Name := '" << (*f_iter)->get_name() << "';" << '\n';
       indent_impl(code_block) << "field_.Type_  := " << type_to_enum((*f_iter)->get_type()) << ";"
-                              << endl;
-      indent_impl(code_block) << "field_.ID := " << (*f_iter)->get_key() << ";" << endl;
-      indent_impl(code_block) << "oprot.WriteFieldBegin(field_);" << endl;
+                              << '\n';
+      indent_impl(code_block) << "field_.ID := " << (*f_iter)->get_key() << ";" << '\n';
+      indent_impl(code_block) << "oprot.WriteFieldBegin(field_);" << '\n';
       generate_serialize_field(code_block, is_exception, *f_iter, "Self.", local_vars);
-      indent_impl(code_block) << "oprot.WriteFieldEnd();" << endl;
+      indent_impl(code_block) << "oprot.WriteFieldEnd();" << '\n';
       indent_down_impl();
     }
   }
 
-  indent_impl(code_block) << "oprot.WriteFieldStop();" << endl;
-  indent_impl(code_block) << "oprot.WriteStructEnd();" << endl;
+  indent_impl(code_block) << "oprot.WriteFieldStop();" << '\n';
+  indent_impl(code_block) << "oprot.WriteStructEnd();" << '\n';
 
   indent_down_impl();
-  indent_impl(code_block) << "end;" << endl << endl;
+  indent_impl(code_block) << "end;" << '\n' << '\n';
 
   string cls_nm;
 
   cls_nm = type_name(tstruct, true, is_exception && (!is_x_factory), is_x_factory, is_x_factory);
 
   indent_impl(out) << "procedure " << cls_prefix << cls_nm << ".Write( const oprot: IProtocol);"
-                   << endl;
-  indent_impl(out) << "var" << endl;
+                   << '\n';
+  indent_impl(out) << "var" << '\n';
   indent_up_impl();
-  indent_impl(out) << "struc : TThriftStruct;" << endl;
+  indent_impl(out) << "struc : TThriftStruct;" << '\n';
 
   if (fields.size() > 0) {
-    indent_impl(out) << "field_ : TThriftField;" << endl;
+    indent_impl(out) << "field_ : TThriftField;" << '\n';
   }
 
   out << local_vars.str();
@@ -3849,17 +3830,17 @@
   const vector<t_field*>& fields = tstruct->get_sorted_members();
   vector<t_field*>::const_iterator f_iter;
 
-  indent_impl(code_block) << "begin" << endl;
+  indent_impl(code_block) << "begin" << '\n';
   indent_up_impl();
 
-  indent_impl(local_vars) << "tracker : IProtocolRecursionTracker;" << endl;
-  indent_impl(code_block) << "tracker := oprot.NextRecursionLevel;" << endl;
+  indent_impl(local_vars) << "tracker : IProtocolRecursionTracker;" << '\n';
+  indent_impl(code_block) << "tracker := oprot.NextRecursionLevel;" << '\n';
 
-  indent_impl(code_block) << "Thrift.Protocol.Init( struc, '" << name << "');" << endl;
-  indent_impl(code_block) << "oprot.WriteStructBegin(struc);" << endl;
+  indent_impl(code_block) << "Thrift.Protocol.Init( struc, '" << name << "');" << '\n';
+  indent_impl(code_block) << "oprot.WriteStructBegin(struc);" << '\n';
 
   if (fields.size() > 0) {
-    indent_impl(code_block) << "Thrift.Protocol.Init( field_);" << endl;
+    indent_impl(code_block) << "Thrift.Protocol.Init( field_);" << '\n';
   }
 
   for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
@@ -3870,54 +3851,54 @@
     bool has_isset = (!is_required);
     if (is_required && null_allowed) {
       null_allowed = false;
-      indent_impl(code_block) << "if (Self." << fieldname << " = nil)" << endl;
+      indent_impl(code_block) << "if (Self." << fieldname << " = nil)" << '\n';
       indent_impl(code_block) << "then raise TProtocolExceptionInvalidData.Create("
                               << "'required field " << fieldname << " not set');"
-                              << endl;
+                              << '\n';
     }
     if (null_allowed) {
       indent_impl(code_block) << "if (Self." << fieldname << " <> nil)";
       if (has_isset) {
         code_block << " and " << isset_name;
       }
-      code_block << " then begin" << endl;
+      code_block << " then begin" << '\n';
       indent_up_impl();
     } else {
       if (has_isset) {
-        indent_impl(code_block) << "if (" << isset_name << ") then begin" << endl;
+        indent_impl(code_block) << "if (" << isset_name << ") then begin" << '\n';
         indent_up_impl();
       }
     }
-    indent_impl(code_block) << "field_.Name := '" << (*f_iter)->get_name() << "';" << endl;
+    indent_impl(code_block) << "field_.Name := '" << (*f_iter)->get_name() << "';" << '\n';
     indent_impl(code_block) << "field_.Type_  := " << type_to_enum((*f_iter)->get_type()) << ";"
-                            << endl;
-    indent_impl(code_block) << "field_.ID := " << (*f_iter)->get_key() << ";" << endl;
-    indent_impl(code_block) << "oprot.WriteFieldBegin(field_);" << endl;
+                            << '\n';
+    indent_impl(code_block) << "field_.ID := " << (*f_iter)->get_key() << ";" << '\n';
+    indent_impl(code_block) << "oprot.WriteFieldBegin(field_);" << '\n';
     generate_serialize_field(code_block, is_exception, *f_iter, "Self.", local_vars);
-    indent_impl(code_block) << "oprot.WriteFieldEnd();" << endl;
+    indent_impl(code_block) << "oprot.WriteFieldEnd();" << '\n';
     if (null_allowed || has_isset) {
       indent_down_impl();
-      indent_impl(code_block) << "end;" << endl;
+      indent_impl(code_block) << "end;" << '\n';
     }
   }
 
-  indent_impl(code_block) << "oprot.WriteFieldStop();" << endl;
-  indent_impl(code_block) << "oprot.WriteStructEnd();" << endl;
+  indent_impl(code_block) << "oprot.WriteFieldStop();" << '\n';
+  indent_impl(code_block) << "oprot.WriteStructEnd();" << '\n';
 
   indent_down_impl();
-  indent_impl(code_block) << "end;" << endl << endl;
+  indent_impl(code_block) << "end;" << '\n' << '\n';
 
   string cls_nm;
 
   cls_nm = type_name(tstruct, true, is_exception && (!is_x_factory), is_x_factory, is_x_factory);
 
   indent_impl(out) << "procedure " << cls_prefix << cls_nm << ".Write( const oprot: IProtocol);"
-                   << endl;
-  indent_impl(out) << "var" << endl;
+                   << '\n';
+  indent_impl(out) << "var" << '\n';
   indent_up_impl();
-  indent_impl(out) << "struc : TThriftStruct;" << endl;
+  indent_impl(out) << "struc : TThriftStruct;" << '\n';
   if (fields.size() > 0) {
-    indent_impl(out) << "field_ : TThriftField;" << endl;
+    indent_impl(out) << "field_ : TThriftField;" << '\n';
   }
   out << local_vars.str();
   indent_down_impl();
@@ -3945,28 +3926,28 @@
   string tmp_first = tmp("_first");
   bool useFirstFlag = false;
 
-  indent_impl(out) << "function " << cls_prefix << cls_nm << ".ToString: string;" << endl;
-  indent_impl(out) << "var" << endl;
+  indent_impl(out) << "function " << cls_prefix << cls_nm << ".ToString: string;" << '\n';
+  indent_impl(out) << "var" << '\n';
   indent_up_impl();
-  indent_impl(out) << tmp_sb << " : TThriftStringBuilder;" << endl;
+  indent_impl(out) << tmp_sb << " : TThriftStringBuilder;" << '\n';
   for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
     bool is_optional = ((*f_iter)->get_req() != t_field::T_REQUIRED);
     if (is_optional) {
-      indent_impl(out) << tmp_first << " : System.Boolean;" << endl;
+      indent_impl(out) << tmp_first << " : System.Boolean;" << '\n';
       useFirstFlag = true;
     }
     break;
   }
   indent_down_impl();
-  indent_impl(out) << "begin" << endl;
+  indent_impl(out) << "begin" << '\n';
   indent_up_impl();
 
-  indent_impl(out) << tmp_sb << " := TThriftStringBuilder.Create('(');" << endl;
-  indent_impl(out) << "try" << endl;
+  indent_impl(out) << tmp_sb << " := TThriftStringBuilder.Create('(');" << '\n';
+  indent_impl(out) << "try" << '\n';
   indent_up_impl();
 
   if (useFirstFlag) {
-    indent_impl(out) << tmp_first << " := TRUE;" << endl;
+    indent_impl(out) << tmp_first << " := TRUE;" << '\n';
   }
 
   bool had_required = false; // set to true after first required field has been processed
@@ -3979,26 +3960,26 @@
       if (is_optional) {
         out << " and " << prop_name(*f_iter, is_exception,"__isset_");
       }
-      out << " then begin" << endl;
+      out << " then begin" << '\n';
       indent_up_impl();
     } else {
       if (is_optional) {
         indent_impl(out) << "if (" << prop_name(*f_iter, is_exception, "__isset_") << ") then begin"
-                         << endl;
+                         << '\n';
         indent_up_impl();
       }
     }
 
     if (useFirstFlag && (!had_required)) {
-      indent_impl(out) << "if not " << tmp_first << " then " << tmp_sb << ".Append(',');" << endl;
+      indent_impl(out) << "if not " << tmp_first << " then " << tmp_sb << ".Append(',');" << '\n';
       if (is_optional) {
-        indent_impl(out) << tmp_first << " := FALSE;" << endl;
+        indent_impl(out) << tmp_first << " := FALSE;" << '\n';
       }
       indent_impl(out) << tmp_sb << ".Append('" << prop_name((*f_iter), is_exception) << ": ');"
-                       << endl;
+                       << '\n';
     } else {
       indent_impl(out) << tmp_sb << ".Append(', " << prop_name((*f_iter), is_exception) << ": ');"
-                       << endl;
+                       << '\n';
     }
 
     t_type* ttype = (*f_iter)->get_type();
@@ -4009,23 +3990,23 @@
     if (ttype->is_xception() || ttype->is_struct()) {
       indent_impl(out) << "if (Self." << prop_name((*f_iter), is_exception) << " = nil) then " << tmp_sb
                        << ".Append('<null>') else " << tmp_sb << ".Append( Self."
-                       << prop_name((*f_iter), is_exception) << ".ToString());" << endl;
+                       << prop_name((*f_iter), is_exception) << ".ToString());" << '\n';
     } else if (ttype->is_enum()) {
-      indent_impl(out) << tmp_sb << ".Append(EnumUtils<" 
-                       << type_name(ttype, false, true, false, false) 
-                       << ">.ToString( System.Ord( Self." 
-                       << prop_name((*f_iter), is_exception) << ")));" << endl;
+      indent_impl(out) << tmp_sb << ".Append(EnumUtils<"
+                       << type_name(ttype, false, true, false, false)
+                       << ">.ToString( System.Ord( Self."
+                       << prop_name((*f_iter), is_exception) << ")));" << '\n';
     } else if (ttype->is_uuid()) {
       indent_impl(out) << tmp_sb << ".Append( GUIDToString(Self." << prop_name((*f_iter), is_exception) << "));"
-                       << endl;
+                       << '\n';
     } else {
       indent_impl(out) << tmp_sb << ".Append( Self." << prop_name((*f_iter), is_exception) << ");"
-                       << endl;
+                       << '\n';
     }
 
     if (null_allowed || is_optional) {
       indent_down_impl();
-      indent_impl(out) << "end;" << endl;
+      indent_impl(out) << "end;" << '\n';
     }
 
     if (!is_optional) {
@@ -4033,21 +4014,21 @@
     }
   }
 
-  indent_impl(out) << tmp_sb << ".Append(')');" << endl;
-  indent_impl(out) << "Result := " << tmp_sb << ".ToString;" << endl;
+  indent_impl(out) << tmp_sb << ".Append(')');" << '\n';
+  indent_impl(out) << "Result := " << tmp_sb << ".ToString;" << '\n';
   if (useFirstFlag) {
-    indent_impl(out) << "if " << tmp_first << " then {prevent warning};" << endl;
+    indent_impl(out) << "if " << tmp_first << " then {prevent warning};" << '\n';
   }
 
   indent_down_impl();
-  indent_impl(out) << "finally" << endl;
+  indent_impl(out) << "finally" << '\n';
   indent_up_impl();
-  indent_impl(out) << tmp_sb << ".Free;" << endl;
+  indent_impl(out) << tmp_sb << ".Free;" << '\n';
   indent_down_impl();
-  indent_impl(out) << "end;" << endl;
+  indent_impl(out) << "end;" << '\n';
 
   indent_down_impl();
-  indent_impl(out) << "end;" << endl << endl;
+  indent_impl(out) << "end;" << '\n' << '\n';
 }
 
 bool t_delphi_generator::is_void(t_type* type) {
@@ -4069,10 +4050,36 @@
 }
 
 
+bool t_delphi_generator::is_deprecated(std::map<std::string, std::vector<std::string>>& annotations)
+{
+  auto iter = annotations.find("deprecated");
+  return (annotations.end() != iter);
+}
+
+std::string t_delphi_generator::render_deprecation_attribute(std::map<std::string, std::vector<std::string>>& annotations, std::string prefix, std::string postfix)
+{
+  std::string result = "";
+  auto iter = annotations.find("deprecated");
+  if( annotations.end() != iter) {
+    result += prefix;
+    result += "deprecated";
+
+    // empty annotation values end up with "1" somewhere, ignore these as well
+    if ((iter->second.back().length() > 0) && (iter->second.back() != "1")) {
+      result += " " + make_pascal_string_literal(iter->second.back());
+    }
+
+    result += postfix;
+  }
+  return result;
+}
+
+
+
+
 THRIFT_REGISTER_GENERATOR(
     delphi,
     "Delphi",
-    "    ansistr_binary:  Use AnsiString for binary datatype (default is TBytes).\n"
     "    register_types:  Enable TypeRegistry, allows for creation of struct, union\n"
     "                     and container instances by interface or TypeInfo()\n"
     "    constprefix:     Name TConstants classes after IDL to reduce ambiguities\n"
diff --git a/compiler/cpp/src/thrift/generate/t_erl_generator.cc b/compiler/cpp/src/thrift/generate/t_erl_generator.cc
index 7293972..f28c7fd 100644
--- a/compiler/cpp/src/thrift/generate/t_erl_generator.cc
+++ b/compiler/cpp/src/thrift/generate/t_erl_generator.cc
@@ -39,8 +39,6 @@
 using std::stringstream;
 using std::vector;
 
-static const std::string endl = "\n"; // avoid ostream << std::endl flushes
-
 /**
  * Erlang code generator.
  *
@@ -268,14 +266,14 @@
 
   hrl_header(f_types_hrl_file_, program_module_name + "_types");
 
-  f_types_file_ << erl_autogen_comment() << endl
-                << "-module(" << program_module_name << "_types)." << endl
-                << erl_imports() << endl;
+  f_types_file_ << erl_autogen_comment() << '\n'
+                << "-module(" << program_module_name << "_types)." << '\n'
+                << erl_imports() << '\n';
 
-  f_types_file_ << "-include(\"" << program_module_name << "_types.hrl\")." << endl
-                  << endl;
+  f_types_file_ << "-include(\"" << program_module_name << "_types.hrl\")." << '\n'
+                  << '\n';
 
-  f_types_hrl_file_ << render_includes() << endl;
+  f_types_hrl_file_ << render_includes() << '\n';
 
   // consts files
   string f_consts_name = get_out_dir() + program_module_name + "_constants.erl";
@@ -284,28 +282,28 @@
   f_consts_file_.open(f_consts_name.c_str());
   f_consts_hrl_file_.open(f_consts_hrl_name.c_str());
 
-  f_consts_file_ << erl_autogen_comment() << endl
-                 << "-module(" << program_module_name << "_constants)." << endl
-                 << erl_imports() << endl
-                 << "-include(\"" << program_module_name << "_types.hrl\")." << endl
-                 << endl;
+  f_consts_file_ << erl_autogen_comment() << '\n'
+                 << "-module(" << program_module_name << "_constants)." << '\n'
+                 << erl_imports() << '\n'
+                 << "-include(\"" << program_module_name << "_types.hrl\")." << '\n'
+                 << '\n';
 
-  f_consts_hrl_file_ << erl_autogen_comment() << endl << erl_imports() << endl
-                     << "-include(\"" << program_module_name << "_types.hrl\")." << endl << endl;
+  f_consts_hrl_file_ << erl_autogen_comment() << '\n' << erl_imports() << '\n'
+                     << "-include(\"" << program_module_name << "_types.hrl\")." << '\n' << '\n';
 }
 
 /**
  * Boilerplate at beginning and end of header files
  */
 void t_erl_generator::hrl_header(ostream& out, string name) {
-  out << erl_autogen_comment() << endl
-      << "-ifndef(_" << name << "_included)." << endl << "-define(_" << name << "_included, yeah)."
-      << endl;
+  out << erl_autogen_comment() << '\n'
+      << "-ifndef(_" << name << "_included)." << '\n' << "-define(_" << name << "_included, yeah)."
+      << '\n';
 }
 
 void t_erl_generator::hrl_footer(ostream& out, string name) {
   (void)name;
-  out << "-endif." << endl;
+  out << "-endif." << '\n';
 }
 
 /**
@@ -365,13 +363,13 @@
   export_types_string("struct_names", 0);
   export_types_string("exception_names", 0);
 
-  f_types_file_ << "-export([" << export_types_lines_.str() << "])." << endl << endl;
+  f_types_file_ << "-export([" << export_types_lines_.str() << "])." << '\n' << '\n';
 
   f_types_file_ << f_info_.str();
-  f_types_file_ << "struct_info(_) -> erlang:error(function_clause)." << endl << endl;
+  f_types_file_ << "struct_info(_) -> erlang:error(function_clause)." << '\n' << '\n';
 
   f_types_file_ << f_info_ext_.str();
-  f_types_file_ << "struct_info_ext(_) -> erlang:error(function_clause)." << endl << endl;
+  f_types_file_ << "struct_info_ext(_) -> erlang:error(function_clause)." << '\n' << '\n';
 
   generate_const_functions();
 
@@ -527,10 +525,10 @@
     string name = (*c_iter)->get_name();
     indent(f_types_hrl_file_) << "-define(" << constify(make_safe_for_module_name(program_name_))
                               << "_" << constify(tenum->get_name()) << "_" << constify(name) << ", "
-                              << value << ")." << endl;
+                              << value << ")." << '\n';
   }
 
-  f_types_hrl_file_ << endl;
+  f_types_hrl_file_ << '\n';
 }
 
 void t_erl_generator::generate_enum_info(t_enum* tenum){
@@ -551,7 +549,7 @@
     }
     indent_down();
   }
-  f_types_file_ << "\n";
+  f_types_file_ << '\n';
   indent(f_types_file_) << "];\n\n";
   indent_down();
 }
@@ -579,7 +577,7 @@
   v_consts_.push_back(tconst);
 
   f_consts_hrl_file_ << "-define(" << constify(make_safe_for_module_name(program_name_)) << "_"
-                     << constify(name) << ", " << render_const_value(type, value) << ")." << endl << endl;
+                     << constify(name) << ", " << render_const_value(type, value) << ")." << '\n' << '\n';
 }
 
 /**
@@ -809,7 +807,7 @@
  * @param tstruct The struct definition
  */
 void t_erl_generator::generate_erl_struct_definition(ostream& out, t_struct* tstruct) {
-  indent(out) << "%% struct " << type_name(tstruct) << endl << endl;
+  indent(out) << "%% struct " << type_name(tstruct) << '\n' << '\n';
 
   std::stringstream buf;
   buf << indent() << "-record(" << type_name(tstruct) << ", {";
@@ -819,13 +817,13 @@
   for (vector<t_field*>::const_iterator m_iter = members.begin(); m_iter != members.end();) {
     generate_erl_struct_member(buf, *m_iter);
     if (++m_iter != members.end()) {
-      buf << "," << endl << field_indent;
+      buf << "," << '\n' << field_indent;
     }
   }
   buf << "}).";
 
-  out << buf.str() << endl;
-  out << "-type " + type_name(tstruct) << "() :: #" + type_name(tstruct) + "{}." << endl << endl;
+  out << buf.str() << '\n';
+  out << "-type " + type_name(tstruct) << "() :: #" + type_name(tstruct) + "{}." << '\n' << '\n';
 }
 
 /**
@@ -871,19 +869,19 @@
  * Generates the read method for a struct
  */
 void t_erl_generator::generate_erl_struct_info(ostream& out, t_struct* tstruct) {
-  indent(out) << "struct_info(" << type_name(tstruct) << ") ->" << endl;
+  indent(out) << "struct_info(" << type_name(tstruct) << ") ->" << '\n';
   indent_up();
-  out << indent() << render_type_term(tstruct, true) << ";" << endl;
+  out << indent() << render_type_term(tstruct, true) << ";" << '\n';
   indent_down();
-  out << endl;
+  out << '\n';
 }
 
 void t_erl_generator::generate_erl_extended_struct_info(ostream& out, t_struct* tstruct) {
-  indent(out) << "struct_info_ext(" << type_name(tstruct) << ") ->" << endl;
+  indent(out) << "struct_info_ext(" << type_name(tstruct) << ") ->" << '\n';
   indent_up();
-  out << indent() << render_type_term(tstruct, true, true) << ";" << endl;
+  out << indent() << render_type_term(tstruct, true, true) << ";" << '\n';
   indent_down();
-  out << endl;
+  out << '\n';
 }
 
 /**
@@ -909,11 +907,11 @@
   if (tservice->get_extends() != nullptr) {
     f_service_hrl_ << "-include(\""
                    << make_safe_for_module_name(tservice->get_extends()->get_name())
-                   << "_thrift.hrl\"). % inherit " << endl;
+                   << "_thrift.hrl\"). % inherit " << '\n';
   }
 
   f_service_hrl_ << "-include(\"" << make_safe_for_module_name(program_name_) << "_types.hrl\")."
-                 << endl << endl;
+                 << '\n' << '\n';
 
   // Generate the three main parts of the service (well, two for now in PHP)
   generate_service_helpers(tservice); // cpiro: New Erlang Order
@@ -924,13 +922,13 @@
 
   // indent_down();
 
-  f_service_file_ << erl_autogen_comment() << endl << "-module(" << service_name_ << "_thrift)."
-                  << endl << "-behaviour(thrift_service)." << endl << endl << erl_imports() << endl;
+  f_service_file_ << erl_autogen_comment() << '\n' << "-module(" << service_name_ << "_thrift)."
+                  << '\n' << "-behaviour(thrift_service)." << '\n' << '\n' << erl_imports() << '\n';
 
   f_service_file_ << "-include(\"" << make_safe_for_module_name(tservice->get_name())
-                  << "_thrift.hrl\")." << endl << endl;
+                  << "_thrift.hrl\")." << '\n' << '\n';
 
-  f_service_file_ << "-export([" << export_lines_.str() << "])." << endl << endl;
+  f_service_file_ << "-export([" << export_lines_.str() << "])." << '\n' << '\n';
 
   f_service_file_ << f_service_.str();
 
@@ -946,7 +944,7 @@
   vector<t_function*> functions = tservice->get_functions();
   size_t num_functions = functions.size();
 
-  indent(f_service_) << "function_names() -> " << endl;
+  indent(f_service_) << "function_names() -> " << '\n';
   indent_up();
   indent(f_service_) << "[";
 
@@ -972,14 +970,14 @@
   vector<t_function*>::iterator f_iter;
 
   //  indent(f_service_) <<
-  //  "% HELPER FUNCTIONS AND STRUCTURES" << endl << endl;
+  //  "% HELPER FUNCTIONS AND STRUCTURES" << '\n' << '\n';
 
   export_string("struct_info", 1);
 
   for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
     generate_erl_function_helpers(*f_iter);
   }
-  f_service_ << "struct_info(_) -> erlang:error(function_clause)." << endl;
+  f_service_ << "struct_info(_) -> erlang:error(function_clause)." << '\n';
 }
 
 /**
@@ -1002,26 +1000,26 @@
 
   vector<t_function*> functions = tservice->get_functions();
   vector<t_function*>::iterator f_iter;
-  f_service_ << "%%% interface" << endl;
+  f_service_ << "%%% interface" << '\n';
   for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
-    f_service_ << indent() << "% " << function_signature(*f_iter) << endl;
+    f_service_ << indent() << "% " << function_signature(*f_iter) << '\n';
 
     generate_function_info(tservice, *f_iter);
   }
 
   // Inheritance - pass unknown functions to base class
   if (tservice->get_extends() != nullptr) {
-    indent(f_service_) << "function_info(Function, InfoType) ->" << endl;
+    indent(f_service_) << "function_info(Function, InfoType) ->" << '\n';
     indent_up();
     indent(f_service_) << make_safe_for_module_name(tservice->get_extends()->get_name())
-                       << "_thrift:function_info(Function, InfoType)." << endl;
+                       << "_thrift:function_info(Function, InfoType)." << '\n';
     indent_down();
   } else {
     // return function_clause error for non-existent functions
-    indent(f_service_) << "function_info(_Func, _Info) -> erlang:error(function_clause)." << endl;
+    indent(f_service_) << "function_info(_Func, _Info) -> erlang:error(function_clause)." << '\n';
   }
 
-  indent(f_service_) << endl;
+  indent(f_service_) << '\n';
 }
 
 /**
@@ -1036,30 +1034,30 @@
   t_struct* arg_struct = tfunction->get_arglist();
 
   // function_info(Function, params_type):
-  indent(f_service_) << "function_info(" << name_atom << ", params_type) ->" << endl;
+  indent(f_service_) << "function_info(" << name_atom << ", params_type) ->" << '\n';
   indent_up();
 
-  indent(f_service_) << render_type_term(arg_struct, true) << ";" << endl;
+  indent(f_service_) << render_type_term(arg_struct, true) << ";" << '\n';
 
   indent_down();
 
   // function_info(Function, reply_type):
-  indent(f_service_) << "function_info(" << name_atom << ", reply_type) ->" << endl;
+  indent(f_service_) << "function_info(" << name_atom << ", reply_type) ->" << '\n';
   indent_up();
 
   if (!tfunction->get_returntype()->is_void())
-    indent(f_service_) << render_type_term(tfunction->get_returntype(), false) << ";" << endl;
+    indent(f_service_) << render_type_term(tfunction->get_returntype(), false) << ";" << '\n';
   else if (tfunction->is_oneway())
-    indent(f_service_) << "oneway_void;" << endl;
+    indent(f_service_) << "oneway_void;" << '\n';
   else
     indent(f_service_) << "{struct, []}"
-                       << ";" << endl;
+                       << ";" << '\n';
   indent_down();
 
   // function_info(Function, exceptions):
-  indent(f_service_) << "function_info(" << name_atom << ", exceptions) ->" << endl;
+  indent(f_service_) << "function_info(" << name_atom << ", exceptions) ->" << '\n';
   indent_up();
-  indent(f_service_) << render_type_term(xs, true) << ";" << endl;
+  indent(f_service_) << render_type_term(xs, true) << ";" << '\n';
   indent_down();
 }
 
@@ -1246,11 +1244,11 @@
         }
 
         if (++i != end) {
-          buf << "," << endl << field_indent;
+          buf << "," << '\n' << field_indent;
         }
       }
 
-      buf << "]}" << endl;
+      buf << "]}" << '\n';
       return buf.str();
     } else {
       return "{struct, {" + atomify(type_module(type)) + ", " + type_name(type) + "}}";
diff --git a/compiler/cpp/src/thrift/generate/t_generator.cc b/compiler/cpp/src/thrift/generate/t_generator.cc
index 970281e..6860237 100644
--- a/compiler/cpp/src/thrift/generate/t_generator.cc
+++ b/compiler/cpp/src/thrift/generate/t_generator.cc
@@ -77,8 +77,8 @@
 }
 
 std::set<std::string> t_generator::lang_keywords_for_validation() const {
-  // Nothing by default. It makes no sense to restrict the whole world to use non-PHP keywords only. 
-  // Override on a per-generator(!) basis if you cannot live without it, e.g. that particular language has no 
+  // Nothing by default. It makes no sense to restrict the whole world to use non-PHP keywords only.
+  // Override on a per-generator(!) basis if you cannot live without it, e.g. that particular language has no
   // mechanism or way to deal with it properly, so we absolutely need to fail on it as the last possible resort.
   return {};
 }
@@ -172,11 +172,11 @@
     docs.getline(line, 1024);
 
     if (strlen(line) > 0) {
-      indent(out) << line_prefix << line << std::endl;
+      indent(out) << line_prefix << line << '\n';
     } else if (line_prefix.empty()){
-      out << std::endl;
+      out << '\n';
     } else if(!docs.eof()) {
-      indent(out) << line_prefix << std::endl;
+      indent(out) << line_prefix << '\n';
     }
   }
   if (!comment_end.empty())
diff --git a/compiler/cpp/src/thrift/generate/t_go_generator.cc b/compiler/cpp/src/thrift/generate/t_go_generator.cc
index db30c8b..8ed9140 100644
--- a/compiler/cpp/src/thrift/generate/t_go_generator.cc
+++ b/compiler/cpp/src/thrift/generate/t_go_generator.cc
@@ -518,7 +518,7 @@
 
   f_consts_ << go_autogen_comment() << go_package() << render_includes(true);
 
-  f_const_values_ << endl << "func init() {" << endl;
+  f_const_values_ << '\n' << "func init() {" << '\n';
 
   // Create file for the GoUnusedProtection__ variable
   string f_unused_prot_name_ = package_dir_ + "/" + "GoUnusedProtection__.go";
@@ -744,7 +744,7 @@
  * Closes the type files
  */
 void t_go_generator::close_generator() {
-  f_const_values_ << "}" << endl << endl;
+  f_const_values_ << "}" << '\n' << '\n';
   f_consts_ << f_const_values_.str();
 
   // Close types and constants files
@@ -768,11 +768,13 @@
     return;
   }
 
-  f_types_ << "type " << new_type_name << " " << base_type << endl << endl;
+  generate_deprecation_comment(f_types_, ttypedef->annotations_);
+  f_types_ << "type " << new_type_name << " " << base_type << '\n' << '\n';
   // Generate a convenience function that converts an instance of a type
   // (which may be a constant) into a pointer to an instance of a type.
+  generate_deprecation_comment(f_types_, ttypedef->annotations_);
   f_types_ << "func " << new_type_name << "Ptr(v " << new_type_name << ") *" << new_type_name
-           << " { return &v }" << endl << endl;
+           << " { return &v }" << '\n' << '\n';
 }
 
 /**
@@ -785,87 +787,115 @@
   std::ostringstream to_string_mapping, from_string_mapping;
   std::string tenum_name(publicize(tenum->get_name()));
   generate_go_docstring(f_types_, tenum);
-  f_types_ << "type " << tenum_name << " int64" << endl << "const (" << endl;
+  generate_deprecation_comment(f_types_, tenum->annotations_);
+  f_types_ << "type " << tenum_name << " int64" << '\n' << "const (" << '\n';
 
-  to_string_mapping << indent() << "func (p " << tenum_name << ") String() string {" << endl;
-  to_string_mapping << indent() << "  switch p {" << endl;
+  to_string_mapping << indent() << "func (p " << tenum_name << ") String() string {" << '\n';
+  indent_up();
+  to_string_mapping << indent() << "switch p {" << '\n';
+  indent_down();
 
+  generate_deprecation_comment(from_string_mapping, tenum->annotations_);
   from_string_mapping << indent() << "func " << tenum_name << "FromString(s string) (" << tenum_name
-                      << ", error) {" << endl;
-  from_string_mapping << indent() << "  switch s {" << endl;
+                      << ", error) {" << '\n';
+  indent_up();
+  from_string_mapping << indent() << "switch s {" << '\n';
+  indent_down();
 
   vector<t_enum_value*> constants = tenum->get_constants();
   vector<t_enum_value*>::iterator c_iter;
   int value = -1;
 
+  indent_up();
   for (c_iter = constants.begin(); c_iter != constants.end(); ++c_iter) {
     value = (*c_iter)->get_value();
 
     string iter_std_name(escape_string((*c_iter)->get_name()));
     string iter_name((*c_iter)->get_name());
-    f_types_ << indent() << "  " << tenum_name << "_" << iter_name << ' ' << tenum_name << " = "
-             << value << endl;
+    generate_deprecation_comment(f_types_, (*c_iter)->annotations_);
+    f_types_ << indent() << tenum_name << "_" << iter_name << ' ' << tenum_name << " = "
+             << value << '\n';
     // Dictionaries to/from string names of enums
-    to_string_mapping << indent() << "  case " << tenum_name << "_" << iter_name << ": return \""
-                      << iter_std_name << "\"" << endl;
+    to_string_mapping << indent() << "case " << tenum_name << "_" << iter_name << ": return \""
+                      << iter_std_name << "\"" << '\n';
 
     if (iter_std_name != escape_string(iter_name)) {
-      from_string_mapping << indent() << "  case \"" << iter_std_name << "\", \""
+      from_string_mapping << indent() << "case \"" << iter_std_name << "\", \""
                           << escape_string(iter_name) << "\": return " << tenum_name << "_"
-                          << iter_name << ", nil " << endl;
+                          << iter_name << ", nil" << '\n';
     } else {
-      from_string_mapping << indent() << "  case \"" << iter_std_name << "\": return " << tenum_name
-                          << "_" << iter_name << ", nil " << endl;
+      from_string_mapping << indent() << "case \"" << iter_std_name << "\": return " << tenum_name
+                          << "_" << iter_name << ", nil" << '\n';
     }
   }
 
-  to_string_mapping << indent() << "  }" << endl;
-  to_string_mapping << indent() << "  return \"<UNSET>\"" << endl;
-  to_string_mapping << indent() << "}" << endl;
-  from_string_mapping << indent() << "  }" << endl;
-  from_string_mapping << indent() << "  return " << tenum_name << "(0),"
-                      << " fmt.Errorf(\"not a valid " << tenum_name << " string\")" << endl;
-  from_string_mapping << indent() << "}" << endl;
+  to_string_mapping << indent() << "}" << '\n';
+  to_string_mapping << indent() << "return \"<UNSET>\"" << '\n';
+  indent_down();
+  to_string_mapping << indent() << "}" << '\n';
+  indent_up();
+  from_string_mapping << indent() << "}" << '\n';
+  from_string_mapping << indent() << "return " << tenum_name << "(0),"
+                      << " fmt.Errorf(\"not a valid " << tenum_name << " string\")" << '\n';
+  indent_down();
+  from_string_mapping << indent() << "}" << '\n';
 
-  f_types_ << ")" << endl << endl << to_string_mapping.str() << endl << from_string_mapping.str()
-           << endl << endl;
+  f_types_ << ")" << '\n' << '\n' << to_string_mapping.str() << '\n' << from_string_mapping.str()
+           << '\n' << '\n';
 
   // Generate a convenience function that converts an instance of an enum
   // (which may be a constant) into a pointer to an instance of that enum
   // type.
+  generate_deprecation_comment(f_types_, tenum->annotations_);
   f_types_ << "func " << tenum_name << "Ptr(v " << tenum_name << ") *" << tenum_name
-           << " { return &v }" << endl << endl;
+           << " { return &v }" << '\n' << '\n';
 
   // Generate MarshalText
-  f_types_ << "func (p " << tenum_name << ") MarshalText() ([]byte, error) {" << endl;
-  f_types_ << "return []byte(p.String()), nil" << endl;
-  f_types_ << "}" << endl << endl;
+  f_types_ << "func (p " << tenum_name << ") MarshalText() ([]byte, error) {" << '\n';
+  indent_up();
+  f_types_ << indent() << "return []byte(p.String()), nil" << '\n';
+  indent_down();
+  f_types_ << "}" << '\n' << '\n';
 
   // Generate UnmarshalText
-  f_types_ << "func (p *" << tenum_name << ") UnmarshalText(text []byte) error {" << endl;
-  f_types_ << "q, err := " << tenum_name << "FromString(string(text))" << endl;
-  f_types_ << "if (err != nil) {" << endl << "return err" << endl << "}" << endl;
-  f_types_ << "*p = q" << endl;
-  f_types_ << "return nil" << endl;
-  f_types_ << "}" << endl << endl;
+  f_types_ << "func (p *" << tenum_name << ") UnmarshalText(text []byte) error {" << '\n';
+  indent_up();
+  f_types_ << indent() << "q, err := " << tenum_name << "FromString(string(text))" << '\n';
+  f_types_ << indent() << "if err != nil {" << '\n';
+  indent_up();
+  f_types_ << indent() << "return err" << '\n';
+  indent_down();
+  f_types_ << indent() << "}" << '\n';
+  f_types_ << indent() << "*p = q" << '\n';
+  f_types_ << indent() << "return nil" << '\n';
+  indent_down();
+  f_types_ << "}" << '\n' << '\n';
 
   // Generate Scan for sql.Scanner interface
-  f_types_ << "func (p *" << tenum_name << ") Scan(value interface{}) error {" <<endl;
-  f_types_ << "v, ok := value.(int64)" <<endl;
-  f_types_ << "if !ok {" <<endl;
-  f_types_ << "return errors.New(\"Scan value is not int64\")" <<endl;
-  f_types_ << "}" <<endl;
-  f_types_ << "*p = " << tenum_name << "(v)" << endl;
-  f_types_ << "return nil" << endl;
-  f_types_ << "}" << endl << endl;
+  f_types_ << "func (p *" << tenum_name << ") Scan(value interface{}) error {" << '\n';
+  indent_up();
+  f_types_ << indent() << "v, ok := value.(int64)" << '\n';
+  f_types_ << indent() << "if !ok {" << '\n';
+  indent_up();
+  f_types_ << indent() << "return errors.New(\"Scan value is not int64\")" << '\n';
+  indent_down();
+  f_types_ << indent() << "}" << '\n';
+  f_types_ << indent() << "*p = " << tenum_name << "(v)" << '\n';
+  f_types_ << indent() << "return nil" << '\n';
+  indent_down();
+  f_types_ << "}" << '\n' << '\n';
 
   // Generate Value for driver.Valuer interface
-  f_types_ << "func (p * " << tenum_name << ") Value() (driver.Value, error) {" <<endl;
-  f_types_ << "  if p == nil {" << endl;
-  f_types_ << "    return nil, nil" << endl;
-  f_types_ << "  }" << endl;
-  f_types_ << "return int64(*p), nil" << endl;
-  f_types_ << "}" << endl;
+  f_types_ << "func (p *" << tenum_name << ") Value() (driver.Value, error) {" << '\n';
+  indent_up();
+  f_types_ << indent() << "if p == nil {" << '\n';
+  indent_up();
+  f_types_ << indent() << "return nil, nil" << '\n';
+  indent_down();
+  f_types_ << indent() << "}" << '\n';
+  f_types_ << indent() << "return int64(*p), nil" << '\n';
+  indent_down();
+  f_types_ << "}" << '\n' << '\n';
 
 }
 
@@ -877,12 +907,12 @@
   string name = publicize(tconst->get_name());
   t_const_value* value = tconst->get_value();
   if (type->is_enum() || (type->is_base_type() && ((t_base_type*)type)->get_base() != t_base_type::TYPE_UUID)) {
-    indent(f_consts_) << "const " << name << " = " << render_const_value(type, value, name) << endl;
+    indent(f_consts_) << "const " << name << " = " << render_const_value(type, value, name) << '\n';
   } else {
-    f_const_values_ << indent() << name << " = " << render_const_value(type, value, name) << endl
-                    << endl;
+    f_const_values_ << indent() << name << " = " << render_const_value(type, value, name) << '\n'
+                    << '\n';
 
-    f_consts_ << indent() << "var " << name << " " << type_to_go_type(type) << endl;
+    f_consts_ << indent() << "var " << name << " " << type_to_go_type(type) << '\n';
   }
 }
 
@@ -1079,8 +1109,8 @@
       if (field_type == nullptr) {
         throw "type error: " + type->get_name() + " has no field " + v_iter->first->get_string();
       }
-      out << endl << indent() << publicize(v_iter->first->get_string()) << ": "
-          << render_const_value(field_type, v_iter->second, name, is_optional) << "," << endl;
+      out << '\n' << indent() << publicize(v_iter->first->get_string()) << ": "
+          << render_const_value(field_type, v_iter->second, name, is_optional) << "," << '\n';
     }
 
     indent_down();
@@ -1090,13 +1120,13 @@
     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();
-    out << "map[" << type_to_go_key_type(ktype) << "]" << type_to_go_type(vtype) << "{" << endl;
+    out << "map[" << type_to_go_key_type(ktype) << "]" << type_to_go_type(vtype) << "{" << '\n';
     indent_up();
     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) {
       out << indent() << render_const_value(ktype, v_iter->first, name) << ": "
-          << render_const_value(vtype, v_iter->second, name) << "," << endl;
+          << render_const_value(vtype, v_iter->second, name) << "," << '\n';
     }
 
     indent_down();
@@ -1104,7 +1134,7 @@
   } else if (type->is_list()) {
     t_type* etype = ((t_list*)type)->get_elem_type();
     const vector<t_const_value*>& val = value->get_list();
-    out << "[]" << type_to_go_type(etype) << "{" << endl;
+    out << "[]" << type_to_go_type(etype) << "{" << '\n';
     indent_up();
     vector<t_const_value*>::const_iterator v_iter;
 
@@ -1117,7 +1147,7 @@
   } else if (type->is_set()) {
     t_type* etype = ((t_set*)type)->get_elem_type();
     const vector<t_const_value*>& val = value->get_list();
-    out << "[]" << type_to_go_type(etype) << "{" << endl;
+    out << "[]" << type_to_go_type(etype) << "{" << '\n';
     indent_up();
     vector<t_const_value*>::const_iterator v_iter;
 
@@ -1158,12 +1188,12 @@
   generate_go_struct_definition(f_types_, tstruct, is_exception);
   // generate Validate function
   std::string tstruct_name(publicize(tstruct->get_name(), false));
-  f_types_ << "func (p *" << tstruct_name << ") Validate() error {" << endl;
+  f_types_ << "func (p *" << tstruct_name << ") Validate() error {" << '\n';
   indent_up();
   go_validator_generator(this).generate_struct_validator(f_types_, tstruct);
-  f_types_ << indent() << "return nil" << endl;
+  f_types_ << indent() << "return nil" << '\n';
   indent_down();
-  f_types_ << "}" << endl;
+  f_types_ << "}" << '\n' << '\n';
 }
 
 void t_go_generator::get_publicized_name_and_def_value(t_field* tfield,
@@ -1179,20 +1209,26 @@
                                                     t_struct* tstruct,
                                                     bool is_args_or_result) {
   out << publicize(type_name(tstruct), is_args_or_result) << "{";
+  indent_up();
   const vector<t_field*>& members = tstruct->get_members();
+  bool empty = true;
   for (auto member : members) {
     bool pointer_field = is_pointer_field(member);
     string publicized_name;
     t_const_value* def_value;
     get_publicized_name_and_def_value(member, &publicized_name, &def_value);
     if (!pointer_field && def_value != nullptr && !omit_initialization(member)) {
-      out << endl << indent() << publicized_name << ": "
-          << render_field_initial_value(member, member->get_name(), pointer_field) << ","
-          << endl;
+      empty = false;
+      out << '\n' << indent() << publicized_name << ": "
+          << render_field_initial_value(member, member->get_name(), pointer_field) << ",";
     }
   }
 
-  out << "}" << endl;
+  indent_down();
+  if (!empty) {
+    out << '\n' << indent();
+  }
+  out << "}" << '\n';
 }
 
 /**
@@ -1211,7 +1247,8 @@
 
   std::string tstruct_name(publicize(tstruct->get_name(), is_args || is_result));
   generate_go_docstring(out, tstruct);
-  out << indent() << "type " << tstruct_name << " struct {" << endl;
+  generate_deprecation_comment(out, tstruct->annotations_);
+  out << indent() << "type " << tstruct_name << " struct {" << '\n';
   /*
      Here we generate the structure specification for the fastbinary codec.
      These specifications have the following structure:
@@ -1253,9 +1290,9 @@
         }
         int last_unused = sorted_keys_pos - 1;
         if (first_unused < last_unused) {
-          indent(out) << "// unused fields # " << first_unused << " to " << last_unused << endl;
+          indent(out) << "// unused fields # " << first_unused << " to " << last_unused << '\n';
         } else if (first_unused == last_unused) {
-          indent(out) << "// unused field # " << first_unused << endl;
+          indent(out) << "// unused field # " << first_unused << '\n';
         }
       }
 
@@ -1290,31 +1327,34 @@
       // Trailing whitespace
       gotag.resize(gotag.size()-1);
 
+      generate_deprecation_comment(out, (*m_iter)->annotations_);
       indent(out) << publicize((*m_iter)->get_name()) << " " << goType << " `thrift:\""
                   << escape_string((*m_iter)->get_name()) << "," << sorted_keys_pos;
       if ((*m_iter)->get_req() == t_field::T_REQUIRED) {
         out << ",required";
       }
 
-      out << "\" " << gotag << "`" << endl;
+      out << "\" " << gotag << "`" << '\n';
       sorted_keys_pos++;
     }
   } else {
     for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
+      generate_deprecation_comment(out, (*m_iter)->annotations_);
       // This fills in default values, as opposed to nulls
       out << indent() << publicize((*m_iter)->get_name()) << " "
-          << type_to_go_type((*m_iter)->get_type()) << endl;
+          << type_to_go_type((*m_iter)->get_type()) << '\n';
     }
   }
 
   indent_down();
-  out << indent() << "}" << endl << endl;
-  out << indent() << "func New" << tstruct_name << "() *" << tstruct_name << " {" << endl;
+  out << indent() << "}" << '\n' << '\n';
+  generate_deprecation_comment(out, tstruct->annotations_);
+  out << indent() << "func New" << tstruct_name << "() *" << tstruct_name << " {" << '\n';
   indent_up();
   out << indent() << "return &";
   generate_go_struct_initializer(out, tstruct, is_result || is_args);
   indent_down();
-  out << indent() << "}" << endl << endl;
+  out << indent() << "}" << '\n' << '\n';
   // Default values for optional fields
   for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
     string publicized_name;
@@ -1324,12 +1364,14 @@
     string goType = type_to_go_type_with_opt(fieldType, false);
     string def_var_name = tstruct_name + "_" + publicized_name + "_DEFAULT";
     if ((*m_iter)->get_req() == t_field::T_OPTIONAL || is_pointer_field(*m_iter)) {
+      generate_deprecation_comment(out, (*m_iter)->annotations_);
       out << indent() << "var " << def_var_name << " " << goType;
       if (def_value != nullptr) {
         out << " = " << render_const_value(fieldType, def_value, (*m_iter)->get_name());
       }
-      out << endl;
+      out << '\n';
     }
+    out << '\n';
 
     // num_setable is used for deciding if Count* methods will be generated for union fields.
     // This applies to all nullable fields including slices (used for set, list and binary) and maps, not just pointers.
@@ -1341,25 +1383,27 @@
     if (is_pointer_field(*m_iter)) {
       string goOptType = type_to_go_type_with_opt(fieldType, true);
       string maybepointer = goOptType != goType ? "*" : "";
+      generate_deprecation_comment(out, (*m_iter)->annotations_);
       out << indent() << "func (p *" << tstruct_name << ") Get" << publicized_name << "() "
-          << goType << " {" << endl;
+          << goType << " {" << '\n';
       indent_up();
-      out << indent() << "if !p.IsSet" << publicized_name << "() {" << endl;
+      out << indent() << "if !p.IsSet" << publicized_name << "() {" << '\n';
       indent_up();
-      out << indent() << "return " << def_var_name << endl;
+      out << indent() << "return " << def_var_name << '\n';
       indent_down();
-      out << indent() << "}" << endl;
-      out << indent() << "return " << maybepointer << "p." << publicized_name << endl;
+      out << indent() << "}" << '\n';
+      out << indent() << "return " << maybepointer << "p." << publicized_name << '\n';
       indent_down();
-      out << indent() << "}" << endl;
+      out << indent() << "}" << '\n' << '\n';
     } else {
-      out << endl;
+      out << '\n';
+      generate_deprecation_comment(out, (*m_iter)->annotations_);
       out << indent() << "func (p *" << tstruct_name << ") Get" << publicized_name << "() "
-          << goType << " {" << endl;
+          << goType << " {" << '\n';
       indent_up();
-      out << indent() << "return p." << publicized_name << endl;
+      out << indent() << "return p." << publicized_name << '\n';
       indent_down();
-      out << indent() << "}" << endl;
+      out << indent() << "}" << '\n' << '\n';
     }
   }
 
@@ -1374,57 +1418,57 @@
     generate_go_struct_equals(out, tstruct, tstruct_name);
   }
 
-  out << indent() << "func (p *" << tstruct_name << ") String() string {" << endl;
+  out << indent() << "func (p *" << tstruct_name << ") String() string {" << '\n';
   indent_up();
-  out << indent() << "if p == nil {" << endl;
+  out << indent() << "if p == nil {" << '\n';
   indent_up();
-  out << indent() << "return \"<nil>\"" << endl;
+  out << indent() << "return \"<nil>\"" << '\n';
   indent_down();
-  out << indent() << "}" << endl;
+  out << indent() << "}" << '\n';
   out << indent() << "return fmt.Sprintf(\"" << escape_string(tstruct_name) << "(%+v)\", *p)"
-      << endl;
+      << '\n';
   indent_down();
-  out << indent() << "}" << endl << endl;
+  out << indent() << "}" << '\n' << '\n';
 
   if (is_exception) {
-    out << indent() << "func (p *" << tstruct_name << ") Error() string {" << endl;
+    out << indent() << "func (p *" << tstruct_name << ") Error() string {" << '\n';
     indent_up();
-    out << indent() << "return p.String()" << endl;
+    out << indent() << "return p.String()" << '\n';
     indent_down();
-    out << indent() << "}" << endl << endl;
+    out << indent() << "}" << '\n' << '\n';
 
-    out << indent() << "func (" << tstruct_name << ") TExceptionType() thrift.TExceptionType {" << endl;
+    out << indent() << "func (" << tstruct_name << ") TExceptionType() thrift.TExceptionType {" << '\n';
     indent_up();
-    out << indent() << "return thrift.TExceptionTypeCompiled" << endl;
+    out << indent() << "return thrift.TExceptionTypeCompiled" << '\n';
     indent_down();
-    out << indent() << "}" << endl << endl;
+    out << indent() << "}" << '\n' << '\n';
 
     out << indent() << "var _ thrift.TException = (*" << tstruct_name << ")(nil)"
-        << endl << endl;
+        << '\n' << '\n';
   }
 
   if (!read_write_private_) {
     // Generate the implementation of slog.LogValuer,
     // see: https://issues.apache.org/jira/browse/THRIFT-5745
-    out << indent() << "func (p *" << tstruct_name << ") LogValue() slog.Value {" << endl;
+    out << indent() << "func (p *" << tstruct_name << ") LogValue() slog.Value {" << '\n';
     indent_up();
-    out << indent() << "if p == nil {" << endl;
+    out << indent() << "if p == nil {" << '\n';
     indent_up();
-    out << indent() << "return slog.AnyValue(nil)" << endl;
+    out << indent() << "return slog.AnyValue(nil)" << '\n';
     indent_down();
-    out << indent() << "}" << endl;
-    out << indent() << "v := thrift.SlogTStructWrapper{" << endl;
+    out << indent() << "}" << '\n';
+    out << indent() << "v := thrift.SlogTStructWrapper{" << '\n';
     indent_up();
-    out << indent() << "Type: \"*" << package_name_ << "." << tstruct_name << "\"," << endl;
-    out << indent() << "Value: p," << endl;
+    out << indent() << "Type: \"*" << package_name_ << "." << tstruct_name << "\"," << '\n';
+    out << indent() << "Value: p," << '\n';
     indent_down();
-    out << indent() << "}" << endl;
-    out << indent() << "return slog.AnyValue(v)" << endl;
+    out << indent() << "}" << '\n';
+    out << indent() << "return slog.AnyValue(v)" << '\n';
     indent_down();
-    out << indent() << "}" << endl << endl;
+    out << indent() << "}" << '\n' << '\n';
 
     out << indent() << "var _ slog.LogValuer = (*" << tstruct_name << ")(nil)"
-        << endl << endl;
+        << '\n' << '\n';
   }
 }
 
@@ -1443,26 +1487,27 @@
   for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
     const string field_name(publicize(escape_string((*f_iter)->get_name())));
     if ((*f_iter)->get_req() == t_field::T_OPTIONAL || is_pointer_field(*f_iter)) {
+      generate_deprecation_comment(out, (*f_iter)->annotations_);
       out << indent() << "func (p *" << tstruct_name << ") IsSet" << field_name << "() bool {"
-          << endl;
+          << '\n';
       indent_up();
       t_type* ttype = (*f_iter)->get_type()->get_true_type();
       bool is_byteslice = ttype->is_binary();
       bool compare_to_nil_only = ttype->is_set() || ttype->is_list() || ttype->is_map()
                                  || (is_byteslice && !(*f_iter)->get_value());
       if (is_pointer_field(*f_iter) || compare_to_nil_only) {
-        out << indent() << "return p." << field_name << " != nil" << endl;
+        out << indent() << "return p." << field_name << " != nil" << '\n';
       } else {
         string def_var_name = tstruct_name + "_" + field_name + "_DEFAULT";
         if (is_byteslice) {
           out << indent() << "return !bytes.Equal(p." << field_name << ", " << def_var_name << ")"
-              << endl;
+              << '\n';
         } else {
-          out << indent() << "return p." << field_name << " != " << def_var_name << endl;
+          out << indent() << "return p." << field_name << " != " << def_var_name << '\n';
         }
       }
       indent_down();
-      out << indent() << "}" << endl << endl;
+      out << indent() << "}" << '\n' << '\n';
     }
   }
 }
@@ -1480,9 +1525,9 @@
   const string escaped_tstruct_name(escape_string(tstruct->get_name()));
 
   out << indent() << "func (p *" << tstruct_name << ") CountSetFields" << tstruct_name << "() int {"
-      << endl;
+      << '\n';
   indent_up();
-  out << indent() << "count := 0" << endl;
+  out << indent() << "count := 0" << '\n';
   for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
     if ((*f_iter)->get_req() == t_field::T_REQUIRED)
       continue;
@@ -1494,16 +1539,16 @@
 
     const string field_name(publicize(escape_string((*f_iter)->get_name())));
 
-    out << indent() << "if (p.IsSet" << field_name << "()) {" << endl;
+    out << indent() << "if (p.IsSet" << field_name << "()) {" << '\n';
     indent_up();
-    out << indent() << "count++" << endl;
+    out << indent() << "count++" << '\n';
     indent_down();
-    out << indent() << "}" << endl;
+    out << indent() << "}" << '\n';
   }
 
-  out << indent() << "return count" << endl << endl;
+  out << indent() << "return count" << '\n' << '\n';
   indent_down();
-  out << indent() << "}" << endl << endl;
+  out << indent() << "}" << '\n' << '\n';
 }
 
 /**
@@ -1518,33 +1563,41 @@
   vector<t_field*>::const_iterator f_iter;
   string escaped_tstruct_name(escape_string(tstruct->get_name()));
   out << indent() << "func (p *" << tstruct_name << ") " << read_method_name_ << "(ctx context.Context, iprot thrift.TProtocol) error {"
-      << endl;
+      << '\n';
   indent_up();
-  out << indent() << "if _, err := iprot.ReadStructBegin(ctx); err != nil {" << endl;
-  out << indent() << "  return thrift.PrependError(fmt.Sprintf(\"%T read error: \", p), err)"
-      << endl;
-  out << indent() << "}" << endl << endl;
+  out << indent() << "if _, err := iprot.ReadStructBegin(ctx); err != nil {" << '\n';
+  indent_up();
+  out << indent() << "return thrift.PrependError(fmt.Sprintf(\"%T read error: \", p), err)"
+      << '\n';
+  indent_down();
+  out << indent() << "}" << '\n' << '\n';
 
   // Required variables does not have IsSet functions, so we need tmp vars to check them.
   for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
     if ((*f_iter)->get_req() == t_field::T_REQUIRED) {
       const string field_name(publicize(escape_string((*f_iter)->get_name())));
-      indent(out) << "var isset" << field_name << " bool = false;" << endl;
+      indent(out) << "var isset" << field_name << " bool = false;" << '\n';
     }
   }
-  out << endl;
+  out << '\n';
 
   // Loop over reading in fields
-  indent(out) << "for {" << endl;
+  indent(out) << "for {" << '\n';
   indent_up();
   // Read beginning field marker
-  out << indent() << "_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)" << endl;
-  out << indent() << "if err != nil {" << endl;
-  out << indent() << "  return thrift.PrependError(fmt.Sprintf("
-                     "\"%T field %d read error: \", p, fieldId), err)" << endl;
-  out << indent() << "}" << endl;
+  out << indent() << "_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin(ctx)" << '\n';
+  out << indent() << "if err != nil {" << '\n';
+  indent_up();
+  out << indent() << "return thrift.PrependError(fmt.Sprintf("
+                     "\"%T field %d read error: \", p, fieldId), err)" << '\n';
+  indent_down();
+  out << indent() << "}" << '\n';
   // Check for field STOP marker and break
-  out << indent() << "if fieldTypeId == thrift.STOP { break; }" << endl;
+  out << indent() << "if fieldTypeId == thrift.STOP {" << '\n';
+  indent_up();
+  out << indent() << "break" << '\n';
+  indent_down();
+  out << indent() << "}" << '\n';
 
   string thriftFieldTypeId;
   // Generate deserialization code for known cases
@@ -1553,7 +1606,7 @@
   // Switch statement on the field we are reading, false if no fields present
   bool have_switch = !fields.empty();
   if (have_switch) {
-    indent(out) << "switch fieldId {" << endl;
+    indent(out) << "switch fieldId {" << '\n';
   }
 
   // All the fields we know
@@ -1569,7 +1622,7 @@
       field_method_suffix *= -1;
     }
 
-    out << indent() << "case " << field_id << ":" << endl;
+    out << indent() << "case " << field_id << ":" << '\n';
     indent_up();
     thriftFieldTypeId = type_to_enum((*f_iter)->get_type());
 
@@ -1577,23 +1630,31 @@
       thriftFieldTypeId = "thrift.STRING";
     }
 
-    out << indent() << "if fieldTypeId == " << thriftFieldTypeId << " {" << endl;
-    out << indent() << "  if err := p." << field_method_prefix << field_method_suffix << "(ctx, iprot); err != nil {"
-        << endl;
-    out << indent() << "    return err" << endl;
-    out << indent() << "  }" << endl;
+    out << indent() << "if fieldTypeId == " << thriftFieldTypeId << " {" << '\n';
+    indent_up();
+    out << indent() << "if err := p." << field_method_prefix << field_method_suffix << "(ctx, iprot); err != nil {"
+        << '\n';
+    indent_up();
+    out << indent() << "return err" << '\n';
+    indent_down();
+    out << indent() << "}" << '\n';
 
     // Mark required field as read
     if ((*f_iter)->get_req() == t_field::T_REQUIRED) {
       const string field_name(publicize(escape_string((*f_iter)->get_name())));
-      out << indent() << "  isset" << field_name << " = true" << endl;
+      out << indent() << "isset" << field_name << " = true" << '\n';
     }
 
-    out << indent() << "} else {" << endl;
-    out << indent() << "  if err := iprot.Skip(ctx, fieldTypeId); err != nil {" << endl;
-    out << indent() << "    return err" << endl;
-    out << indent() << "  }" << endl;
-    out << indent() << "}" << endl;
+    indent_down();
+    out << indent() << "} else {" << '\n';
+    indent_up();
+    out << indent() << "if err := iprot.Skip(ctx, fieldTypeId); err != nil {" << '\n';
+    indent_up();
+    out << indent() << "return err" << '\n';
+    indent_down();
+    out << indent() << "}" << '\n';
+    indent_down();
+    out << indent() << "}" << '\n';
 
 
     indent_down();
@@ -1601,46 +1662,54 @@
 
   // Begin switch default case
   if (have_switch) {
-    out << indent() << "default:" << endl;
+    out << indent() << "default:" << '\n';
     indent_up();
   }
 
   // Skip unknown fields in either case
-  out << indent() << "if err := iprot.Skip(ctx, fieldTypeId); err != nil {" << endl;
-  out << indent() << "  return err" << endl;
-  out << indent() << "}" << endl;
+  out << indent() << "if err := iprot.Skip(ctx, fieldTypeId); err != nil {" << '\n';
+  indent_up();
+  out << indent() << "return err" << '\n';
+  indent_down();
+  out << indent() << "}" << '\n';
 
   // End switch default case
   if (have_switch) {
     indent_down();
-    out << indent() << "}" << endl;
+    out << indent() << "}" << '\n';
   }
 
   // Read field end marker
-  out << indent() << "if err := iprot.ReadFieldEnd(ctx); err != nil {" << endl;
-  out << indent() << "  return err" << endl;
-  out << indent() << "}" << endl;
+  out << indent() << "if err := iprot.ReadFieldEnd(ctx); err != nil {" << '\n';
+  indent_up();
+  out << indent() << "return err" << '\n';
   indent_down();
-  out << indent() << "}" << endl;
-  out << indent() << "if err := iprot.ReadStructEnd(ctx); err != nil {" << endl;
-  out << indent() << "  return thrift.PrependError(fmt.Sprintf("
-                     "\"%T read struct end error: \", p), err)" << endl;
-  out << indent() << "}" << endl;
+  out << indent() << "}" << '\n';
+  indent_down();
+  out << indent() << "}" << '\n';
+  out << indent() << "if err := iprot.ReadStructEnd(ctx); err != nil {" << '\n';
+  indent_up();
+  out << indent() << "return thrift.PrependError(fmt.Sprintf("
+                     "\"%T read struct end error: \", p), err)" << '\n';
+  indent_down();
+  out << indent() << "}" << '\n';
 
   // Return error if any required fields are missing.
   for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
     if ((*f_iter)->get_req() == t_field::T_REQUIRED) {
       const string field_name(publicize(escape_string((*f_iter)->get_name())));
-      out << indent() << "if !isset" << field_name << "{" << endl;
-      out << indent() << "  return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, "
-                         "fmt.Errorf(\"Required field " << field_name << " is not set\"));" << endl;
-      out << indent() << "}" << endl;
+      out << indent() << "if !isset" << field_name << "{" << '\n';
+      indent_up();
+      out << indent() << "return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, "
+                         "fmt.Errorf(\"Required field " << field_name << " is not set\"));" << '\n';
+      indent_down();
+      out << indent() << "}" << '\n';
     }
   }
 
-  out << indent() << "return nil" << endl;
+  out << indent() << "return nil" << '\n';
   indent_down();
-  out << indent() << "}" << endl << endl;
+  out << indent() << "}" << '\n' << '\n';
 
   for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
     string field_type_name(publicize((*f_iter)->get_type()->get_name()));
@@ -1654,13 +1723,13 @@
       field_method_suffix *= -1;
     }
 
-    out << indent() << "func (p *" << tstruct_name << ")  " << field_method_prefix << field_method_suffix
-        << "(ctx context.Context, iprot thrift.TProtocol) error {" << endl;
+    out << indent() << "func (p *" << tstruct_name << ") " << field_method_prefix << field_method_suffix
+        << "(ctx context.Context, iprot thrift.TProtocol) error {" << '\n';
     indent_up();
     generate_deserialize_field(out, *f_iter, false, "p.");
+    out << indent() << "return nil" << '\n';
     indent_down();
-    out << indent() << "  return nil" << endl;
-    out << indent() << "}" << endl << endl;
+    out << indent() << "}" << '\n' << '\n';
   }
 }
 
@@ -1673,18 +1742,22 @@
   string name(tstruct->get_name());
   const vector<t_field*>& fields = tstruct->get_sorted_members();
   vector<t_field*>::const_iterator f_iter;
-  indent(out) << "func (p *" << tstruct_name << ") " << write_method_name_ << "(ctx context.Context, oprot thrift.TProtocol) error {" << endl;
+  indent(out) << "func (p *" << tstruct_name << ") " << write_method_name_ << "(ctx context.Context, oprot thrift.TProtocol) error {" << '\n';
   indent_up();
   if (tstruct->is_union() && uses_countsetfields) {
     std::string tstruct_name(publicize(tstruct->get_name()));
-    out << indent() << "if c := p.CountSetFields" << tstruct_name << "(); c != 1 {" << endl
-        << indent()
-        << "  return fmt.Errorf(\"%T write union: exactly one field must be set (%d set)\", p, c)"
-        << endl << indent() << "}" << endl;
+    out << indent() << "if c := p.CountSetFields" << tstruct_name << "(); c != 1 {" << '\n';
+    indent_up();
+    out << indent() << "return fmt.Errorf(\"%T write union: exactly one field must be set (%d set)\", p, c)" << '\n';
+    indent_down();
+    out << indent() << "}" << '\n';
   }
-  out << indent() << "if err := oprot.WriteStructBegin(ctx, \"" << name << "\"); err != nil {" << endl;
-  out << indent() << "  return thrift.PrependError(fmt.Sprintf("
-                     "\"%T write struct begin error: \", p), err) }" << endl;
+  out << indent() << "if err := oprot.WriteStructBegin(ctx, \"" << name << "\"); err != nil {" << '\n';
+  indent_up();
+  out << indent() << "return thrift.PrependError(fmt.Sprintf("
+                     "\"%T write struct begin error: \", p), err)" << '\n';
+  indent_down();
+  out << indent() << "}" << '\n';
 
   string field_name;
   string escape_field_name;
@@ -1692,7 +1765,7 @@
   t_field::e_req field_required;
   int32_t field_id = -1;
 
-  out << indent() << "if p != nil {" << endl;
+  out << indent() << "if p != nil {" << '\n';
   indent_up();
 
   for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
@@ -1708,20 +1781,26 @@
     }
 
     out << indent() << "if err := p." << field_method_prefix << field_method_suffix
-        << "(ctx, oprot); err != nil { return err }" << endl;
+        << "(ctx, oprot); err != nil { return err }" << '\n';
   }
 
   indent_down();
-  out << indent() << "}" << endl;
+  out << indent() << "}" << '\n';
 
   // Write the struct map
-  out << indent() << "if err := oprot.WriteFieldStop(ctx); err != nil {" << endl;
-  out << indent() << "  return thrift.PrependError(\"write field stop error: \", err) }" << endl;
-  out << indent() << "if err := oprot.WriteStructEnd(ctx); err != nil {" << endl;
-  out << indent() << "  return thrift.PrependError(\"write struct stop error: \", err) }" << endl;
-  out << indent() << "return nil" << endl;
+  out << indent() << "if err := oprot.WriteFieldStop(ctx); err != nil {" << '\n';
+  indent_up();
+  out << indent() << "return thrift.PrependError(\"write field stop error: \", err)" << '\n';
   indent_down();
-  out << indent() << "}" << endl << endl;
+  out << indent() << "}" << '\n';
+  out << indent() << "if err := oprot.WriteStructEnd(ctx); err != nil {" << '\n';
+  indent_up();
+  out << indent() << "return thrift.PrependError(\"write struct stop error: \", err)" << '\n';
+  indent_down();
+  out << indent() << "}" << '\n';
+  out << indent() << "return nil" << '\n';
+  indent_down();
+  out << indent() << "}" << '\n' << '\n';
 
   for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
     string field_method_prefix("writeField");
@@ -1738,35 +1817,41 @@
     }
 
     out << indent() << "func (p *" << tstruct_name << ") " << field_method_prefix << field_method_suffix
-        << "(ctx context.Context, oprot thrift.TProtocol) (err error) {" << endl;
+        << "(ctx context.Context, oprot thrift.TProtocol) (err error) {" << '\n';
     indent_up();
 
     if (field_required == t_field::T_OPTIONAL) {
-      out << indent() << "if p.IsSet" << publicize(field_name) << "() {" << endl;
+      out << indent() << "if p.IsSet" << publicize(field_name) << "() {" << '\n';
       indent_up();
     }
 
     out << indent() << "if err := oprot.WriteFieldBegin(ctx, \"" << escape_field_name << "\", "
-        << type_to_enum((*f_iter)->get_type()) << ", " << field_id << "); err != nil {" << endl;
-    out << indent() << "  return thrift.PrependError(fmt.Sprintf(\"%T write field begin error "
-        << field_id << ":" << escape_field_name << ": \", p), err) }" << endl;
+        << type_to_enum((*f_iter)->get_type()) << ", " << field_id << "); err != nil {" << '\n';
+    indent_up();
+    out << indent() << "return thrift.PrependError(fmt.Sprintf(\"%T write field begin error "
+        << field_id << ":" << escape_field_name << ": \", p), err)" << '\n';
+    indent_down();
+    out << indent() << "}" << '\n';
 
     // Write field contents
     generate_serialize_field(out, *f_iter, "p.");
 
     // Write field closer
-    out << indent() << "if err := oprot.WriteFieldEnd(ctx); err != nil {" << endl;
-    out << indent() << "  return thrift.PrependError(fmt.Sprintf(\"%T write field end error "
-        << field_id << ":" << escape_field_name << ": \", p), err) }" << endl;
+    out << indent() << "if err := oprot.WriteFieldEnd(ctx); err != nil {" << '\n';
+    indent_up();
+    out << indent() << "return thrift.PrependError(fmt.Sprintf(\"%T write field end error "
+        << field_id << ":" << escape_field_name << ": \", p), err)" << '\n';
+    indent_down();
+    out << indent() << "}" << '\n';
 
     if (field_required == t_field::T_OPTIONAL) {
       indent_down();
-      out << indent() << "}" << endl;
+      out << indent() << "}" << '\n';
     }
 
+    out << indent() << "return err" << '\n';
     indent_down();
-    out << indent() << "  return err" << endl;
-    out << indent() << "}" << endl << endl;
+    out << indent() << "}" << '\n' << '\n';
   }
 }
 
@@ -1777,20 +1862,20 @@
   const vector<t_field*>& fields = tstruct->get_sorted_members();
   vector<t_field*>::const_iterator f_iter;
   indent(out) << "func (p *" << tstruct_name << ") " << equals_method_name_ << "(other *"
-              << tstruct_name << ") bool {" << endl;
+              << tstruct_name << ") bool {" << '\n';
   indent_up();
 
   string field_name;
   string publicize_field_name;
-  out << indent() << "if p == other {" << endl;
+  out << indent() << "if p == other {" << '\n';
   indent_up();
-  out << indent() << "return true" << endl;
+  out << indent() << "return true" << '\n';
   indent_down();
-  out << indent() << "} else if p == nil || other == nil {" << endl;
+  out << indent() << "} else if p == nil || other == nil {" << '\n';
   indent_up();
-  out << indent() << "return false" << endl;
+  out << indent() << "return false" << '\n';
   indent_down();
-  out << indent() << "}" << endl;
+  out << indent() << "}" << '\n';
 
   for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
     field_name = (*f_iter)->get_name();
@@ -1806,23 +1891,23 @@
         && (ttype->is_base_type() || ttype->is_enum() || ttype->is_container())) {
       string tgtv = "(*" + tgt + ")";
       string srcv = "(*" + src + ")";
-      out << indent() << "if " << tgt << " != " << src << " {" << endl;
+      out << indent() << "if " << tgt << " != " << src << " {" << '\n';
       indent_up();
-      out << indent() << "if " << tgt << " == nil || " << src << " == nil {" << endl;
+      out << indent() << "if " << tgt << " == nil || " << src << " == nil {" << '\n';
       indent_up();
-      out << indent() << "return false" << endl;
+      out << indent() << "return false" << '\n';
       indent_down();
-      out << indent() << "}" << endl;
+      out << indent() << "}" << '\n';
       generate_go_equals(out, field_type, tgtv, srcv);
       indent_down();
-      out << indent() << "}" << endl;
+      out << indent() << "}" << '\n';
     } else {
       generate_go_equals(out, field_type, tgt, src);
     }
   }
-  out << indent() << "return true" << endl;
+  out << indent() << "return true" << '\n';
   indent_down();
-  out << indent() << "}" << endl << endl;
+  out << indent() << "}" << '\n' << '\n';
 }
 
 /**
@@ -1842,7 +1927,7 @@
   if(!skip_remote_) {
     generate_service_remote(tservice);
   }
-  f_types_ << endl;
+  f_types_ << '\n';
 }
 
 /**
@@ -1853,7 +1938,7 @@
 void t_go_generator::generate_service_helpers(t_service* tservice) {
   vector<t_function*> functions = tservice->get_functions();
   vector<t_function*>::iterator f_iter;
-  f_types_ << "// HELPER FUNCTIONS AND STRUCTURES" << endl << endl;
+  f_types_ << "// HELPER FUNCTIONS AND STRUCTURES" << '\n' << '\n';
 
   for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
     t_struct* ts = (*f_iter)->get_arglist();
@@ -1906,31 +1991,35 @@
     extends = type_name(tservice->get_extends());
     size_t index = extends.rfind(".");
 
+    indent_up();
     if (index != string::npos) {
-      extends_if = "\n" + indent() + "  " + extends.substr(0, index + 1)
+      extends_if = "\n" + indent() + extends.substr(0, index + 1)
                    + publicize(extends.substr(index + 1)) + "\n";
     } else {
       extends_if = "\n" + indent() + publicize(extends) + "\n";
     }
+    indent_down();
   }
 
+  generate_deprecation_comment(f_types_, tservice->annotations_);
   f_types_ << indent() << "type " << interfaceName << " interface {" << extends_if;
   indent_up();
   generate_go_docstring(f_types_, tservice);
   vector<t_function*> functions = tservice->get_functions();
 
   if (!functions.empty()) {
-    f_types_ << endl;
+    f_types_ << '\n';
     vector<t_function*>::iterator f_iter;
 
     for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
       generate_go_docstring(f_types_, (*f_iter));
-      f_types_ << indent() << function_signature_if(*f_iter, "", true) << endl;
+      generate_deprecation_comment(f_types_, (*f_iter)->annotations_);
+      f_types_ << indent() << function_signature_if(*f_iter, "", true) << '\n';
     }
   }
 
   indent_down();
-  f_types_ << indent() << "}" << endl << endl;
+  f_types_ << indent() << "}" << '\n' << '\n';
 }
 
 /**
@@ -1963,23 +2052,25 @@
   extends_field = extends_client.substr(extends_client.find(".") + 1);
 
   generate_go_docstring(f_types_, tservice);
-  f_types_ << indent() << "type " << serviceName << "Client struct {" << endl;
+  generate_deprecation_comment(f_types_, tservice->annotations_);
+  f_types_ << indent() << "type " << serviceName << "Client struct {" << '\n';
   indent_up();
 
   if (!extends_client.empty()) {
-    f_types_ << indent() << "*" << extends_client << endl;
+    f_types_ << indent() << "*" << extends_client << '\n';
   } else {
-    f_types_ << indent() << "c thrift.TClient" << endl;
-    f_types_ << indent() << "meta thrift.ResponseMeta" << endl;
+    f_types_ << indent() << "c thrift.TClient" << '\n';
+    f_types_ << indent() << "meta thrift.ResponseMeta" << '\n';
   }
 
   indent_down();
-  f_types_ << indent() << "}" << endl << endl;
+  f_types_ << indent() << "}" << '\n' << '\n';
 
   // Legacy constructor function
+  generate_deprecation_comment(f_types_, tservice->annotations_);
   f_types_ << indent() << "func New" << serviceName
              << "ClientFactory(t thrift.TTransport, f thrift.TProtocolFactory) *" << serviceName
-             << "Client {" << endl;
+             << "Client {" << '\n';
   indent_up();
   f_types_ << indent() << "return &" << serviceName << "Client";
 
@@ -1987,72 +2078,74 @@
     f_types_ << "{" << extends_field << ": " << extends_client_new << "Factory(t, f)}";
   } else {
     indent_up();
-    f_types_ << "{" << endl;
-    f_types_ << indent() << "c: thrift.NewTStandardClient(f.GetProtocol(t), f.GetProtocol(t))," << endl;
+    f_types_ << "{" << '\n';
+    f_types_ << indent() << "c: thrift.NewTStandardClient(f.GetProtocol(t), f.GetProtocol(t))," << '\n';
     indent_down();
-    f_types_ << indent() << "}" << endl;
+    f_types_ << indent() << "}" << '\n';
   }
 
   indent_down();
-  f_types_ << indent() << "}" << endl << endl;
+  f_types_ << indent() << "}" << '\n' << '\n';
   // Legacy constructor function with custom input & output protocols
+  generate_deprecation_comment(f_types_, tservice->annotations_);
   f_types_
       << indent() << "func New" << serviceName
       << "ClientProtocol(t thrift.TTransport, iprot thrift.TProtocol, oprot thrift.TProtocol) *"
-      << serviceName << "Client {" << endl;
+      << serviceName << "Client {" << '\n';
   indent_up();
   f_types_ << indent() << "return &" << serviceName << "Client";
 
   if (!extends.empty()) {
     f_types_ << "{" << extends_field << ": " << extends_client_new << "Protocol(t, iprot, oprot)}"
-               << endl;
+               << '\n';
   } else {
     indent_up();
-    f_types_ << "{" << endl;
-    f_types_ << indent() << "c: thrift.NewTStandardClient(iprot, oprot)," << endl;
+    f_types_ << "{" << '\n';
+    f_types_ << indent() << "c: thrift.NewTStandardClient(iprot, oprot)," << '\n';
     indent_down();
-    f_types_ << indent() << "}" << endl;
+    f_types_ << indent() << "}" << '\n';
   }
 
   indent_down();
-  f_types_ << indent() << "}" << endl << endl;
+  f_types_ << indent() << "}" << '\n' << '\n';
 
   // Constructor function
+  generate_deprecation_comment(f_types_, tservice->annotations_);
   f_types_ << indent() << "func New" << serviceName
-    << "Client(c thrift.TClient) *" << serviceName << "Client {" << endl;
+    << "Client(c thrift.TClient) *" << serviceName << "Client {" << '\n';
   indent_up();
-  f_types_ << indent() << "return &" << serviceName << "Client{" << endl;
+  f_types_ << indent() << "return &" << serviceName << "Client{" << '\n';
 
   indent_up();
   if (!extends.empty()) {
-    f_types_ << indent() << extends_field << ": " << extends_client_new << "(c)," << endl;
+    f_types_ << indent() << extends_field << ": " << extends_client_new << "(c)," << '\n';
   } else {
-    f_types_ << indent() << "c: c," << endl;
+    f_types_ << indent() << "c: c," << '\n';
   }
   indent_down();
-  f_types_ << indent() << "}" << endl;
+  f_types_ << indent() << "}" << '\n';
 
   indent_down();
-  f_types_ << indent() << "}" << endl << endl;
+  f_types_ << indent() << "}" << '\n' << '\n';
 
   if (extends.empty()) {
-    f_types_ << indent() << "func (p *" << serviceName << "Client) Client_() thrift.TClient {" << endl;
+    f_types_ << indent() << "func (p *" << serviceName << "Client) Client_() thrift.TClient {" << '\n';
     indent_up();
-    f_types_ << indent() << "return p.c" << endl;
+    f_types_ << indent() << "return p.c" << '\n';
     indent_down();
-    f_types_ << indent() << "}" << endl << endl;
+    f_types_ << indent() << "}" << '\n' << '\n';
 
-    f_types_ << indent() << "func (p *" << serviceName << "Client) LastResponseMeta_() thrift.ResponseMeta {" << endl;
+    f_types_ << indent() << "func (p *" << serviceName << "Client) LastResponseMeta_() thrift.ResponseMeta {" << '\n';
     indent_up();
-    f_types_ << indent() << "return p.meta" << endl;
+    f_types_ << indent() << "return p.meta" << '\n';
     indent_down();
-    f_types_ << indent() << "}" << endl << endl;
+    f_types_ << indent() << "}" << '\n' << '\n';
 
-    f_types_ << indent() << "func (p *" << serviceName << "Client) SetLastResponseMeta_(meta thrift.ResponseMeta) {" << endl;
+    f_types_ << indent() << "func (p *" << serviceName << "Client) SetLastResponseMeta_(meta thrift.ResponseMeta) {" << '\n';
     indent_up();
-    f_types_ << indent() << "p.meta = meta" << endl;
+    f_types_ << indent() << "p.meta = meta" << '\n';
     indent_down();
-    f_types_ << indent() << "}" << endl << endl;
+    f_types_ << indent() << "}" << '\n' << '\n';
   }
 
   // Generate client method implementations
@@ -2066,60 +2159,61 @@
     string funname = publicize((*f_iter)->get_name());
     // Open function
     generate_go_docstring(f_types_, (*f_iter));
+    generate_deprecation_comment(f_types_, (*f_iter)->annotations_);
     f_types_ << indent() << "func (p *" << serviceName << "Client) "
-               << function_signature_if(*f_iter, "", true) << " {" << endl;
+               << function_signature_if(*f_iter, "", true) << " {" << '\n';
     indent_up();
 
     std::string method = (*f_iter)->get_name();
     std::string argsType = publicize(method + "_args", true);
     std::string argsName = tmp("_args");
-    f_types_ << indent() << "var " << argsName << " " << argsType << endl;
+    f_types_ << indent() << "var " << argsName << " " << argsType << '\n';
 
     for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) {
       f_types_ << indent() << argsName << "." << publicize((*fld_iter)->get_name())
-               << " = " << variable_name_to_go_name((*fld_iter)->get_name()) << endl;
+               << " = " << variable_name_to_go_name((*fld_iter)->get_name()) << '\n';
     }
 
     if (!(*f_iter)->is_oneway()) {
       std::string metaName = tmp("_meta");
       std::string resultName = tmp("_result");
       std::string resultType = publicize(method + "_result", true);
-      f_types_ << indent() << "var " << resultName << " " << resultType << endl;
-      f_types_ << indent() << "var " << metaName << " thrift.ResponseMeta" << endl;
+      f_types_ << indent() << "var " << resultName << " " << resultType << '\n';
+      f_types_ << indent() << "var " << metaName << " thrift.ResponseMeta" << '\n';
       f_types_ << indent() << metaName << ", _err = p.Client_().Call(ctx, \""
-        << method << "\", &" << argsName << ", &" << resultName << ")" << endl;
-      f_types_ << indent() << "p.SetLastResponseMeta_(" << metaName << ")" << endl;
-      f_types_ << indent() << "if _err != nil {" << endl;
+        << method << "\", &" << argsName << ", &" << resultName << ")" << '\n';
+      f_types_ << indent() << "p.SetLastResponseMeta_(" << metaName << ")" << '\n';
+      f_types_ << indent() << "if _err != nil {" << '\n';
 
       indent_up();
-      f_types_ << indent() << "return" << endl;
+      f_types_ << indent() << "return" << '\n';
       indent_down();
-      f_types_ << indent() << "}" << endl;
+      f_types_ << indent() << "}" << '\n';
 
       t_struct* xs = (*f_iter)->get_xceptions();
       const std::vector<t_field*>& xceptions = xs->get_members();
       vector<t_field*>::const_iterator x_iter;
 
       if (!xceptions.empty()) {
-        f_types_ << indent() << "switch {" << endl;
+        f_types_ << indent() << "switch {" << '\n';
 
         for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) {
           const std::string pubname = publicize((*x_iter)->get_name());
           const std::string field = resultName + "." + pubname;
 
-          f_types_ << indent() << "case " << field << "!= nil:" << endl;
+          f_types_ << indent() << "case " << field << "!= nil:" << '\n';
           indent_up();
 
           if (!(*f_iter)->get_returntype()->is_void()) {
-            f_types_ << indent() << "return _r, " << field << endl;
+            f_types_ << indent() << "return _r, " << field << '\n';
           } else {
-            f_types_ << indent() << "return "<< field << endl;
+            f_types_ << indent() << "return "<< field << '\n';
           }
 
           indent_down();
         }
 
-        f_types_ << indent() << "}" << endl << endl;
+        f_types_ << indent() << "}" << '\n' << '\n';
       }
 
       if ((*f_iter)->get_returntype()->is_struct()) {
@@ -2130,37 +2224,37 @@
         // struct in go.
         std::string retName = tmp("_ret");
         f_types_ << indent() << "if " << retName << " := " << resultName
-                 << ".GetSuccess(); " << retName << " != nil {" << endl;
+                 << ".GetSuccess(); " << retName << " != nil {" << '\n';
         indent_up();
-        f_types_ << indent() << "return " << retName << ", nil" << endl;
+        f_types_ << indent() << "return " << retName << ", nil" << '\n';
         indent_down();
-        f_types_ << indent() << "}" << endl;
+        f_types_ << indent() << "}" << '\n';
         f_types_ << indent() << "return nil, "
                  << "thrift.NewTApplicationException(thrift.MISSING_RESULT, \""
-                 << method << " failed: unknown result\")" << endl;
+                 << method << " failed: unknown result\")" << '\n';
       } else if (!(*f_iter)->get_returntype()->is_void()) {
-        f_types_ << indent() << "return " << resultName << ".GetSuccess(), nil" << endl;
+        f_types_ << indent() << "return " << resultName << ".GetSuccess(), nil" << '\n';
       } else {
-        f_types_ << indent() << "return nil" << endl;
+        f_types_ << indent() << "return nil" << '\n';
       }
     } else {
       // Since we don't have response meta for oneway calls, overwrite it with
       // an empty one to avoid users getting the meta from last call and
       // mistaken it as from the oneway call.
-      f_types_ << indent() << "p.SetLastResponseMeta_(thrift.ResponseMeta{})" << endl;
+      f_types_ << indent() << "p.SetLastResponseMeta_(thrift.ResponseMeta{})" << '\n';
       // TODO: would be nice to not to duplicate the call generation
       f_types_ << indent() << "if _, err := p.Client_().Call(ctx, \""
-        << method << "\", &" << argsName << ", nil); err != nil {" << endl;
+        << method << "\", &" << argsName << ", nil); err != nil {" << '\n';
 
       indent_up();
-      f_types_ << indent() << "return err" << endl;
+      f_types_ << indent() << "return err" << '\n';
       indent_down();
-      f_types_ << indent() << "}" << endl;
-      f_types_ << indent() << "return nil" << endl;
+      f_types_ << indent() << "}" << '\n';
+      f_types_ << indent() << "return nil" << '\n';
     }
 
     indent_down();
-    f_types_ << "}" << endl << endl;
+    f_types_ << "}" << '\n' << '\n';
   }
 }
 
@@ -2223,26 +2317,27 @@
   system_packages.push_back("thrift \"" + gen_thrift_import_ + "\"");
 
   f_remote << go_autogen_comment();
-  f_remote << indent() << "package main" << endl << endl;
-  f_remote << indent() << "import (" << endl;
+  f_remote << indent() << "package main" << '\n' << '\n';
+  f_remote << indent() << "import (" << '\n';
   f_remote << render_system_packages(system_packages);
   f_remote << indent() << render_included_programs(unused_protection);
   f_remote << render_program_import(program_, unused_protection);
-  f_remote << indent() << ")" << endl;
-  f_remote << indent() << endl;
+  f_remote << indent() << ")" << '\n';
+  f_remote << indent() << '\n';
   f_remote << indent() << unused_protection; // filled in render_included_programs()
-  f_remote << indent() << endl;
-  f_remote << indent() << "func Usage() {" << endl;
-  f_remote << indent() << "  fmt.Fprintln(os.Stderr, \"Usage of \", os.Args[0], \" "
+  f_remote << indent() << '\n';
+  f_remote << indent() << "func Usage() {" << '\n';
+  indent_up();
+  f_remote << indent() << "fmt.Fprintln(os.Stderr, \"Usage of \", os.Args[0], \" "
                           "[-h host:port] [-u url] [-f[ramed]] function [arg1 [arg2...]]:\")"
-           << endl;
-  f_remote << indent() << "  flag.PrintDefaults()" << endl;
-  f_remote << indent() << "  fmt.Fprintln(os.Stderr, \"\\nFunctions:\")" << endl;
+           << '\n';
+  f_remote << indent() << "flag.PrintDefaults()" << '\n';
+  f_remote << indent() << "fmt.Fprintln(os.Stderr, \"\\nFunctions:\")" << '\n';
 
   string package_name_aliased = package_identifiers_[get_real_go_module(program_)];
 
   for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
-    f_remote << "  fmt.Fprintln(os.Stderr, \"  " << (*f_iter)->get_returntype()->get_name() << " "
+    f_remote << indent() << "fmt.Fprintln(os.Stderr, \"  " << (*f_iter)->get_returntype()->get_name() << " "
              << (*f_iter)->get_name() << "(";
     t_struct* arg_struct = (*f_iter)->get_arglist();
     const std::vector<t_field*>& args = arg_struct->get_members();
@@ -2259,143 +2354,184 @@
       f_remote << args[i]->get_type()->get_name() << " " << args[i]->get_name();
     }
 
-    f_remote << ")\")" << endl;
+    f_remote << ")\")" << '\n';
   }
 
-  f_remote << indent() << "  fmt.Fprintln(os.Stderr)" << endl;
-  f_remote << indent() << "  os.Exit(0)" << endl;
-  f_remote << indent() << "}" << endl;
-  f_remote << indent() << endl;
+  f_remote << indent() << "fmt.Fprintln(os.Stderr)" << '\n';
+  f_remote << indent() << "os.Exit(0)" << '\n';
+  indent_down();
+  f_remote << indent() << "}" << '\n';
+  f_remote << indent() << '\n';
 
-  f_remote << indent() << "type httpHeaders map[string]string" << endl;
-  f_remote << indent() << endl;
-  f_remote << indent() << "func (h httpHeaders) String() string {" << endl;
-  f_remote << indent() << "  var m map[string]string = h" << endl;
-  f_remote << indent() << "  return fmt.Sprintf(\"%s\", m)" << endl;
-  f_remote << indent() << "}" << endl;
-  f_remote << indent() << endl;
-  f_remote << indent() << "func (h httpHeaders) Set(value string) error {" << endl;
-  f_remote << indent() << "  parts := strings.Split(value, \": \")" << endl;
-  f_remote << indent() << "  if len(parts) != 2 {" << endl;
-  f_remote << indent() << "    return fmt.Errorf(\"header should be of format 'Key: Value'\")" << endl;
-  f_remote << indent() << "  }" << endl;
-  f_remote << indent() << "  h[parts[0]] = parts[1]" << endl;
-  f_remote << indent() << "  return nil" << endl;
-  f_remote << indent() << "}" << endl;
-  f_remote << indent() << endl;
-
-  f_remote << indent() << "func main() {" << endl;
+  f_remote << indent() << "type httpHeaders map[string]string" << '\n';
+  f_remote << indent() << '\n';
+  f_remote << indent() << "func (h httpHeaders) String() string {" << '\n';
   indent_up();
-  f_remote << indent() << "flag.Usage = Usage" << endl;
-  f_remote << indent() << "var host string" << endl;
-  f_remote << indent() << "var port int" << endl;
-  f_remote << indent() << "var protocol string" << endl;
-  f_remote << indent() << "var urlString string" << endl;
-  f_remote << indent() << "var framed bool" << endl;
-  f_remote << indent() << "var useHttp bool" << endl;
-  f_remote << indent() << "headers := make(httpHeaders)" << endl;
-  f_remote << indent() << "var parsedUrl *url.URL" << endl;
-  f_remote << indent() << "var trans thrift.TTransport" << endl;
-  f_remote << indent() << "_ = strconv.Atoi" << endl;
-  f_remote << indent() << "_ = math.Abs" << endl;
-  f_remote << indent() << "flag.Usage = Usage" << endl;
+  f_remote << indent() << "var m map[string]string = h" << '\n';
+  f_remote << indent() << "return fmt.Sprintf(\"%s\", m)" << '\n';
+  indent_down();
+  f_remote << indent() << "}" << '\n';
+  f_remote << indent() << '\n';
+  f_remote << indent() << "func (h httpHeaders) Set(value string) error {" << '\n';
+  indent_up();
+  f_remote << indent() << "parts := strings.Split(value, \": \")" << '\n';
+  f_remote << indent() << "if len(parts) != 2 {" << '\n';
+  indent_up();
+  f_remote << indent() << "return fmt.Errorf(\"header should be of format 'Key: Value'\")" << '\n';
+  indent_down();
+  f_remote << indent() << "}" << '\n';
+  f_remote << indent() << "h[parts[0]] = parts[1]" << '\n';
+  f_remote << indent() << "return nil" << '\n';
+  indent_down();
+  f_remote << indent() << "}" << '\n';
+  f_remote << indent() << '\n';
+
+  f_remote << indent() << "func main() {" << '\n';
+  indent_up();
+  f_remote << indent() << "flag.Usage = Usage" << '\n';
+  f_remote << indent() << "var host string" << '\n';
+  f_remote << indent() << "var port int" << '\n';
+  f_remote << indent() << "var protocol string" << '\n';
+  f_remote << indent() << "var urlString string" << '\n';
+  f_remote << indent() << "var framed bool" << '\n';
+  f_remote << indent() << "var useHttp bool" << '\n';
+  f_remote << indent() << "headers := make(httpHeaders)" << '\n';
+  f_remote << indent() << "var parsedUrl *url.URL" << '\n';
+  f_remote << indent() << "var trans thrift.TTransport" << '\n';
+  f_remote << indent() << "_ = strconv.Atoi" << '\n';
+  f_remote << indent() << "_ = math.Abs" << '\n';
+  f_remote << indent() << "flag.Usage = Usage" << '\n';
   f_remote << indent() << "flag.StringVar(&host, \"h\", \"localhost\", \"Specify host and port\")"
-           << endl;
-  f_remote << indent() << "flag.IntVar(&port, \"p\", 9090, \"Specify port\")" << endl;
+           << '\n';
+  f_remote << indent() << "flag.IntVar(&port, \"p\", 9090, \"Specify port\")" << '\n';
   f_remote << indent() << "flag.StringVar(&protocol, \"P\", \"binary\", \""
-                          "Specify the protocol (binary, compact, simplejson, json)\")" << endl;
-  f_remote << indent() << "flag.StringVar(&urlString, \"u\", \"\", \"Specify the url\")" << endl;
+                          "Specify the protocol (binary, compact, simplejson, json)\")" << '\n';
+  f_remote << indent() << "flag.StringVar(&urlString, \"u\", \"\", \"Specify the url\")" << '\n';
   f_remote << indent() << "flag.BoolVar(&framed, \"framed\", false, \"Use framed transport\")"
-           << endl;
-  f_remote << indent() << "flag.BoolVar(&useHttp, \"http\", false, \"Use http\")" << endl;
-  f_remote << indent() << "flag.Var(headers, \"H\", \"Headers to set on the http(s) request (e.g. -H \\\"Key: Value\\\")\")" << endl;
-  f_remote << indent() << "flag.Parse()" << endl;
-  f_remote << indent() << endl;
-  f_remote << indent() << "if len(urlString) > 0 {" << endl;
-  f_remote << indent() << "  var err error" << endl;
-  f_remote << indent() << "  parsedUrl, err = url.Parse(urlString)" << endl;
-  f_remote << indent() << "  if err != nil {" << endl;
-  f_remote << indent() << "    fmt.Fprintln(os.Stderr, \"Error parsing URL: \", err)" << endl;
-  f_remote << indent() << "    flag.Usage()" << endl;
-  f_remote << indent() << "  }" << endl;
-  f_remote << indent() << "  host = parsedUrl.Host" << endl;
-  f_remote << indent() << "  useHttp = len(parsedUrl.Scheme) <= 0 || parsedUrl.Scheme == \"http\" || parsedUrl.Scheme == \"https\""
-           << endl;
-  f_remote << indent() << "} else if useHttp {" << endl;
-  f_remote << indent() << "  _, err := url.Parse(fmt.Sprint(\"http://\", host, \":\", port))"
-           << endl;
-  f_remote << indent() << "  if err != nil {" << endl;
-  f_remote << indent() << "    fmt.Fprintln(os.Stderr, \"Error parsing URL: \", err)" << endl;
-  f_remote << indent() << "    flag.Usage()" << endl;
-  f_remote << indent() << "  }" << endl;
-  f_remote << indent() << "}" << endl;
-  f_remote << indent() << endl;
-  f_remote << indent() << "cmd := flag.Arg(0)" << endl;
-  f_remote << indent() << "var err error" << endl;
-  f_remote << indent() << "var cfg *thrift.TConfiguration = nil" << endl;
-  f_remote << indent() << "if useHttp {" << endl;
-  f_remote << indent() << "  trans, err = thrift.NewTHttpClient(parsedUrl.String())" << endl;
-  f_remote << indent() << "  if len(headers) > 0 {" << endl;
-  f_remote << indent() << "    httptrans := trans.(*thrift.THttpClient)" << endl;
-  f_remote << indent() << "    for key, value := range headers {" << endl;
-  f_remote << indent() << "      httptrans.SetHeader(key, value)" << endl;
-  f_remote << indent() << "    }" << endl;
-  f_remote << indent() << "  }" << endl;
-  f_remote << indent() << "} else {" << endl;
-  f_remote << indent() << "  portStr := fmt.Sprint(port)" << endl;
-  f_remote << indent() << "  if strings.Contains(host, \":\") {" << endl;
-  f_remote << indent() << "         host, portStr, err = net.SplitHostPort(host)" << endl;
-  f_remote << indent() << "         if err != nil {" << endl;
-  f_remote << indent() << "                 fmt.Fprintln(os.Stderr, \"error with host:\", err)"
-           << endl;
-  f_remote << indent() << "                 os.Exit(1)" << endl;
-  f_remote << indent() << "         }" << endl;
-  f_remote << indent() << "  }" << endl;
-  f_remote << indent() << "  trans = thrift.NewTSocketConf(net.JoinHostPort(host, portStr), cfg)" << endl;
-  f_remote << indent() << "  if err != nil {" << endl;
-  f_remote << indent() << "    fmt.Fprintln(os.Stderr, \"error resolving address:\", err)" << endl;
-  f_remote << indent() << "    os.Exit(1)" << endl;
-  f_remote << indent() << "  }" << endl;
-  f_remote << indent() << "  if framed {" << endl;
-  f_remote << indent() << "    trans = thrift.NewTFramedTransportConf(trans, cfg)" << endl;
-  f_remote << indent() << "  }" << endl;
-  f_remote << indent() << "}" << endl;
-  f_remote << indent() << "if err != nil {" << endl;
-  f_remote << indent() << "  fmt.Fprintln(os.Stderr, \"Error creating transport\", err)" << endl;
-  f_remote << indent() << "  os.Exit(1)" << endl;
-  f_remote << indent() << "}" << endl;
-  f_remote << indent() << "defer trans.Close()" << endl;
-  f_remote << indent() << "var protocolFactory thrift.TProtocolFactory" << endl;
-  f_remote << indent() << "switch protocol {" << endl;
-  f_remote << indent() << "case \"compact\":" << endl;
-  f_remote << indent() << "  protocolFactory = thrift.NewTCompactProtocolFactoryConf(cfg)" << endl;
-  f_remote << indent() << "  break" << endl;
-  f_remote << indent() << "case \"simplejson\":" << endl;
-  f_remote << indent() << "  protocolFactory = thrift.NewTSimpleJSONProtocolFactoryConf(cfg)" << endl;
-  f_remote << indent() << "  break" << endl;
-  f_remote << indent() << "case \"json\":" << endl;
-  f_remote << indent() << "  protocolFactory = thrift.NewTJSONProtocolFactory()" << endl;
-  f_remote << indent() << "  break" << endl;
-  f_remote << indent() << "case \"binary\", \"\":" << endl;
-  f_remote << indent() << "  protocolFactory = thrift.NewTBinaryProtocolFactoryConf(cfg)" << endl;
-  f_remote << indent() << "  break" << endl;
-  f_remote << indent() << "default:" << endl;
-  f_remote << indent() << "  fmt.Fprintln(os.Stderr, \"Invalid protocol specified: \", protocol)"
-           << endl;
-  f_remote << indent() << "  Usage()" << endl;
-  f_remote << indent() << "  os.Exit(1)" << endl;
-  f_remote << indent() << "}" << endl;
-  f_remote << indent() << "iprot := protocolFactory.GetProtocol(trans)" << endl;
-  f_remote << indent() << "oprot := protocolFactory.GetProtocol(trans)" << endl;
+           << '\n';
+  f_remote << indent() << "flag.BoolVar(&useHttp, \"http\", false, \"Use http\")" << '\n';
+  f_remote << indent() << "flag.Var(headers, \"H\", \"Headers to set on the http(s) request (e.g. -H \\\"Key: Value\\\")\")" << '\n';
+  f_remote << indent() << "flag.Parse()" << '\n';
+  f_remote << indent() << '\n';
+  f_remote << indent() << "if len(urlString) > 0 {" << '\n';
+  indent_up();
+  f_remote << indent() << "var err error" << '\n';
+  f_remote << indent() << "parsedUrl, err = url.Parse(urlString)" << '\n';
+  f_remote << indent() << "if err != nil {" << '\n';
+  indent_up();
+  f_remote << indent() << "fmt.Fprintln(os.Stderr, \"Error parsing URL: \", err)" << '\n';
+  f_remote << indent() << "flag.Usage()" << '\n';
+  indent_down();
+  f_remote << indent() << "}" << '\n';
+  f_remote << indent() << "host = parsedUrl.Host" << '\n';
+  f_remote << indent() << "useHttp = len(parsedUrl.Scheme) <= 0 || parsedUrl.Scheme == \"http\" || parsedUrl.Scheme == \"https\""
+           << '\n';
+  indent_down();
+  f_remote << indent() << "} else if useHttp {" << '\n';
+  indent_up();
+  f_remote << indent() << "_, err := url.Parse(fmt.Sprint(\"http://\", host, \":\", port))"
+           << '\n';
+  f_remote << indent() << "if err != nil {" << '\n';
+  indent_up();
+  f_remote << indent() << "fmt.Fprintln(os.Stderr, \"Error parsing URL: \", err)" << '\n';
+  f_remote << indent() << "flag.Usage()" << '\n';
+  indent_down();
+  f_remote << indent() << "}" << '\n';
+  indent_down();
+  f_remote << indent() << "}" << '\n';
+  f_remote << indent() << '\n';
+  f_remote << indent() << "cmd := flag.Arg(0)" << '\n';
+  f_remote << indent() << "var err error" << '\n';
+  f_remote << indent() << "var cfg *thrift.TConfiguration = nil" << '\n';
+  f_remote << indent() << "if useHttp {" << '\n';
+  indent_up();
+  f_remote << indent() << "trans, err = thrift.NewTHttpClient(parsedUrl.String())" << '\n';
+  f_remote << indent() << "if len(headers) > 0 {" << '\n';
+  indent_up();
+  f_remote << indent() << "httptrans := trans.(*thrift.THttpClient)" << '\n';
+  f_remote << indent() << "for key, value := range headers {" << '\n';
+  indent_up();
+  f_remote << indent() << "httptrans.SetHeader(key, value)" << '\n';
+  indent_down();
+  f_remote << indent() << "}" << '\n';
+  indent_down();
+  f_remote << indent() << "}" << '\n';
+  indent_down();
+  f_remote << indent() << "} else {" << '\n';
+  indent_up();
+  f_remote << indent() << "portStr := fmt.Sprint(port)" << '\n';
+  f_remote << indent() << "if strings.Contains(host, \":\") {" << '\n';
+  indent_up();
+  f_remote << indent() << "host, portStr, err = net.SplitHostPort(host)" << '\n';
+  f_remote << indent() << "if err != nil {" << '\n';
+  indent_up();
+  f_remote << indent() << "fmt.Fprintln(os.Stderr, \"error with host:\", err)"
+           << '\n';
+  f_remote << indent() << "os.Exit(1)" << '\n';
+  indent_down();
+  f_remote << indent() << "}" << '\n';
+  indent_down();
+  f_remote << indent() << "}" << '\n';
+  f_remote << indent() << "trans = thrift.NewTSocketConf(net.JoinHostPort(host, portStr), cfg)" << '\n';
+  f_remote << indent() << "if err != nil {" << '\n';
+  indent_up();
+  f_remote << indent() << "fmt.Fprintln(os.Stderr, \"error resolving address:\", err)" << '\n';
+  f_remote << indent() << "os.Exit(1)" << '\n';
+  indent_down();
+  f_remote << indent() << "}" << '\n';
+  f_remote << indent() << "if framed {" << '\n';
+  indent_up();
+  f_remote << indent() << "trans = thrift.NewTFramedTransportConf(trans, cfg)" << '\n';
+  indent_down();
+  f_remote << indent() << "}" << '\n';
+  indent_down();
+  f_remote << indent() << "}" << '\n';
+  f_remote << indent() << "if err != nil {" << '\n';
+  indent_up();
+  f_remote << indent() << "fmt.Fprintln(os.Stderr, \"Error creating transport\", err)" << '\n';
+  f_remote << indent() << "os.Exit(1)" << '\n';
+  indent_down();
+  f_remote << indent() << "}" << '\n';
+  f_remote << indent() << "defer trans.Close()" << '\n';
+  f_remote << indent() << "var protocolFactory thrift.TProtocolFactory" << '\n';
+  f_remote << indent() << "switch protocol {" << '\n';
+  f_remote << indent() << "case \"compact\":" << '\n';
+  indent_up();
+  f_remote << indent() << "protocolFactory = thrift.NewTCompactProtocolFactoryConf(cfg)" << '\n';
+  indent_down();
+  f_remote << indent() << "case \"simplejson\":" << '\n';
+  indent_up();
+  f_remote << indent() << "protocolFactory = thrift.NewTSimpleJSONProtocolFactoryConf(cfg)" << '\n';
+  indent_down();
+  f_remote << indent() << "case \"json\":" << '\n';
+  indent_up();
+  f_remote << indent() << "protocolFactory = thrift.NewTJSONProtocolFactory()" << '\n';
+  indent_down();
+  f_remote << indent() << "case \"binary\", \"\":" << '\n';
+  indent_up();
+  f_remote << indent() << "protocolFactory = thrift.NewTBinaryProtocolFactoryConf(cfg)" << '\n';
+  indent_down();
+  f_remote << indent() << "default:" << '\n';
+  indent_up();
+  f_remote << indent() << "fmt.Fprintln(os.Stderr, \"Invalid protocol specified: \", protocol)"
+           << '\n';
+  f_remote << indent() << "Usage()" << '\n';
+  f_remote << indent() << "os.Exit(1)" << '\n';
+  indent_down();
+  f_remote << indent() << "}" << '\n';
+  f_remote << indent() << "iprot := protocolFactory.GetProtocol(trans)" << '\n';
+  f_remote << indent() << "oprot := protocolFactory.GetProtocol(trans)" << '\n';
   f_remote << indent() << "client := " << package_name_aliased << ".New" << publicize(service_name_)
-           << "Client(thrift.NewTStandardClient(iprot, oprot))" << endl;
-  f_remote << indent() << "if err := trans.Open(); err != nil {" << endl;
-  f_remote << indent() << "  fmt.Fprintln(os.Stderr, \"Error opening socket to \", "
-                          "host, \":\", port, \" \", err)" << endl;
-  f_remote << indent() << "  os.Exit(1)" << endl;
-  f_remote << indent() << "}" << endl;
-  f_remote << indent() << endl;
-  f_remote << indent() << "switch cmd {" << endl;
+           << "Client(thrift.NewTStandardClient(iprot, oprot))" << '\n';
+  f_remote << indent() << "if err := trans.Open(); err != nil {" << '\n';
+  indent_up();
+  f_remote << indent() << "fmt.Fprintln(os.Stderr, \"Error opening socket to \", "
+                          "host, \":\", port, \" \", err)" << '\n';
+  f_remote << indent() << "os.Exit(1)" << '\n';
+  indent_down();
+  f_remote << indent() << "}" << '\n';
+  f_remote << indent() << '\n';
+  f_remote << indent() << "switch cmd {" << '\n';
 
   for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
     t_struct* arg_struct = (*f_iter)->get_arglist();
@@ -2404,13 +2540,15 @@
     string funcName((*f_iter)->get_name());
     string pubName(publicize(funcName));
     string argumentsName(publicize(funcName + "_args", true, func_to_service[funcName]));
-    f_remote << indent() << "case \"" << escape_string(funcName) << "\":" << endl;
+    f_remote << indent() << "case \"" << escape_string(funcName) << "\":" << '\n';
     indent_up();
-    f_remote << indent() << "if flag.NArg() - 1 != " << num_args << " {" << endl;
-    f_remote << indent() << "  fmt.Fprintln(os.Stderr, \"" << escape_string(pubName) << " requires "
-             << num_args << " args\")" << endl;
-    f_remote << indent() << "  flag.Usage()" << endl;
-    f_remote << indent() << "}" << endl;
+    f_remote << indent() << "if flag.NArg() - 1 != " << num_args << " {" << '\n';
+    indent_up();
+    f_remote << indent() << "fmt.Fprintln(os.Stderr, \"" << escape_string(pubName) << " requires "
+             << num_args << " args\")" << '\n';
+    f_remote << indent() << "flag.Usage()" << '\n';
+    indent_down();
+    f_remote << indent() << "}" << '\n';
 
     for (std::vector<t_field*>::size_type i = 0; i < num_args; ++i) {
       std::vector<t_field*>::size_type flagArg = i + 1;
@@ -2419,13 +2557,15 @@
 
       if (the_type2->is_enum()) {
         f_remote << indent() << "tmp" << i << ", err := (strconv.Atoi(flag.Arg(" << flagArg << ")))"
-                 << endl;
-        f_remote << indent() << "if err != nil {" << endl;
-        f_remote << indent() << "  Usage()" << endl;
-        f_remote << indent() << " return" << endl;
-        f_remote << indent() << "}" << endl;
+                 << '\n';
+        f_remote << indent() << "if err != nil {" << '\n';
+        indent_up();
+        f_remote << indent() << "Usage()" << '\n';
+        f_remote << indent() << "return" << '\n';
+        indent_down();
+        f_remote << indent() << "}" << '\n';
         f_remote << indent() << "argvalue" << i << " := " << package_name_aliased << "."
-                 << publicize(the_type->get_name()) << "(tmp" << i << ")" << endl;
+                 << publicize(the_type->get_name()) << "(tmp" << i << ")" << '\n';
       } else if (the_type2->is_base_type()) {
         t_base_type::t_base e = ((t_base_type*)the_type2)->get_base();
         string err(tmp("err"));
@@ -2437,72 +2577,84 @@
         case t_base_type::TYPE_STRING:
           if (the_type2->is_binary()) {
             f_remote << indent() << "argvalue" << i << " := []byte(flag.Arg(" << flagArg << "))"
-                     << endl;
+                     << '\n';
           } else {
-            f_remote << indent() << "argvalue" << i << " := flag.Arg(" << flagArg << ")" << endl;
+            f_remote << indent() << "argvalue" << i << " := flag.Arg(" << flagArg << ")" << '\n';
           }
           break;
 
         case t_base_type::TYPE_BOOL:
           f_remote << indent() << "argvalue" << i << " := flag.Arg(" << flagArg << ") == \"true\""
-                   << endl;
+                   << '\n';
           break;
 
         case t_base_type::TYPE_I8:
           f_remote << indent() << "tmp" << i << ", " << err << " := (strconv.Atoi(flag.Arg("
-                   << flagArg << ")))" << endl;
-          f_remote << indent() << "if " << err << " != nil {" << endl;
-          f_remote << indent() << "  Usage()" << endl;
-          f_remote << indent() << "  return" << endl;
-          f_remote << indent() << "}" << endl;
-          f_remote << indent() << "argvalue" << i << " := int8(tmp" << i << ")" << endl;
+                   << flagArg << ")))" << '\n';
+          f_remote << indent() << "if " << err << " != nil {" << '\n';
+          indent_up();
+          f_remote << indent() << "Usage()" << '\n';
+          f_remote << indent() << "return" << '\n';
+          indent_down();
+          f_remote << indent() << "}" << '\n';
+          f_remote << indent() << "argvalue" << i << " := int8(tmp" << i << ")" << '\n';
           break;
 
         case t_base_type::TYPE_I16:
           f_remote << indent() << "tmp" << i << ", " << err << " := (strconv.Atoi(flag.Arg("
-                   << flagArg << ")))" << endl;
-          f_remote << indent() << "if " << err << " != nil {" << endl;
-          f_remote << indent() << "  Usage()" << endl;
-          f_remote << indent() << "  return" << endl;
-          f_remote << indent() << "}" << endl;
-          f_remote << indent() << "argvalue" << i << " := int16(tmp" << i << ")" << endl;
+                   << flagArg << ")))" << '\n';
+          f_remote << indent() << "if " << err << " != nil {" << '\n';
+          indent_up();
+          f_remote << indent() << "Usage()" << '\n';
+          f_remote << indent() << "return" << '\n';
+          indent_down();
+          f_remote << indent() << "}" << '\n';
+          f_remote << indent() << "argvalue" << i << " := int16(tmp" << i << ")" << '\n';
           break;
 
         case t_base_type::TYPE_I32:
           f_remote << indent() << "tmp" << i << ", " << err << " := (strconv.Atoi(flag.Arg("
-                   << flagArg << ")))" << endl;
-          f_remote << indent() << "if " << err << " != nil {" << endl;
-          f_remote << indent() << "  Usage()" << endl;
-          f_remote << indent() << "  return" << endl;
-          f_remote << indent() << "}" << endl;
-          f_remote << indent() << "argvalue" << i << " := int32(tmp" << i << ")" << endl;
+                   << flagArg << ")))" << '\n';
+          f_remote << indent() << "if " << err << " != nil {" << '\n';
+          indent_up();
+          f_remote << indent() << "Usage()" << '\n';
+          f_remote << indent() << "return" << '\n';
+          indent_down();
+          f_remote << indent() << "}" << '\n';
+          f_remote << indent() << "argvalue" << i << " := int32(tmp" << i << ")" << '\n';
           break;
 
         case t_base_type::TYPE_I64:
           f_remote << indent() << "argvalue" << i << ", " << err
-                   << " := (strconv.ParseInt(flag.Arg(" << flagArg << "), 10, 64))" << endl;
-          f_remote << indent() << "if " << err << " != nil {" << endl;
-          f_remote << indent() << "  Usage()" << endl;
-          f_remote << indent() << "  return" << endl;
-          f_remote << indent() << "}" << endl;
+                   << " := (strconv.ParseInt(flag.Arg(" << flagArg << "), 10, 64))" << '\n';
+          f_remote << indent() << "if " << err << " != nil {" << '\n';
+          indent_up();
+          f_remote << indent() << "Usage()" << '\n';
+          f_remote << indent() << "return" << '\n';
+          indent_down();
+          f_remote << indent() << "}" << '\n';
           break;
 
         case t_base_type::TYPE_DOUBLE:
           f_remote << indent() << "argvalue" << i << ", " << err
-                   << " := (strconv.ParseFloat(flag.Arg(" << flagArg << "), 64))" << endl;
-          f_remote << indent() << "if " << err << " != nil {" << endl;
-          f_remote << indent() << "  Usage()" << endl;
-          f_remote << indent() << "  return" << endl;
-          f_remote << indent() << "}" << endl;
+                   << " := (strconv.ParseFloat(flag.Arg(" << flagArg << "), 64))" << '\n';
+          f_remote << indent() << "if " << err << " != nil {" << '\n';
+          indent_up();
+          f_remote << indent() << "Usage()" << '\n';
+          f_remote << indent() << "return" << '\n';
+          indent_down();
+          f_remote << indent() << "}" << '\n';
           break;
 
         case t_base_type::TYPE_UUID:
           f_remote << indent() << "argvalue" << i << ", " << err
-                   << " := (thrift.ParseTuuid(flag.Arg(" << flagArg << ")))" << endl;
-          f_remote << indent() << "if " << err << " != nil {" << endl;
-          f_remote << indent() << "  Usage()" << endl;
-          f_remote << indent() << "  return" << endl;
-          f_remote << indent() << "}" << endl;
+                   << " := (thrift.ParseTuuid(flag.Arg(" << flagArg << ")))" << '\n';
+          f_remote << indent() << "if " << err << " != nil {" << '\n';
+          indent_up();
+          f_remote << indent() << "Usage()" << '\n';
+          f_remote << indent() << "return" << '\n';
+          indent_down();
+          f_remote << indent() << "}" << '\n';
           break;
 
         default:
@@ -2524,26 +2676,30 @@
           tstruct_module = package_name_aliased;
         }
 
-        f_remote << indent() << arg << " := flag.Arg(" << flagArg << ")" << endl;
+        f_remote << indent() << arg << " := flag.Arg(" << flagArg << ")" << '\n';
         f_remote << indent() << mbTrans << " := thrift.NewTMemoryBufferLen(len(" << arg << "))"
-                 << endl;
-        f_remote << indent() << "defer " << mbTrans << ".Close()" << endl;
+                 << '\n';
+        f_remote << indent() << "defer " << mbTrans << ".Close()" << '\n';
         f_remote << indent() << "_, " << err1 << " := " << mbTrans << ".WriteString(" << arg << ")"
-                 << endl;
-        f_remote << indent() << "if " << err1 << " != nil {" << endl;
-        f_remote << indent() << "  Usage()" << endl;
-        f_remote << indent() << "  return" << endl;
-        f_remote << indent() << "}" << endl;
-        f_remote << indent() << factory << " := thrift.NewTJSONProtocolFactory()" << endl;
+                 << '\n';
+        f_remote << indent() << "if " << err1 << " != nil {" << '\n';
+        indent_up();
+        f_remote << indent() << "Usage()" << '\n';
+        f_remote << indent() << "return" << '\n';
+        indent_down();
+        f_remote << indent() << "}" << '\n';
+        f_remote << indent() << factory << " := thrift.NewTJSONProtocolFactory()" << '\n';
         f_remote << indent() << jsProt << " := " << factory << ".GetProtocol(" << mbTrans << ")"
-                 << endl;
+                 << '\n';
         f_remote << indent() << "argvalue" << i << " := " << tstruct_module << ".New" << tstruct_name
-                 << "()" << endl;
-        f_remote << indent() << err2 << " := argvalue" << i << "." << read_method_name_ <<  "(context.Background(), " << jsProt << ")" << endl;
-        f_remote << indent() << "if " << err2 << " != nil {" << endl;
-        f_remote << indent() << "  Usage()" << endl;
-        f_remote << indent() << "  return" << endl;
-        f_remote << indent() << "}" << endl;
+                 << "()" << '\n';
+        f_remote << indent() << err2 << " := argvalue" << i << "." << read_method_name_ << "(context.Background(), " << jsProt << ")" << '\n';
+        f_remote << indent() << "if " << err2 << " != nil {" << '\n';
+        indent_up();
+        f_remote << indent() << "Usage()" << '\n';
+        f_remote << indent() << "return" << '\n';
+        indent_down();
+        f_remote << indent() << "}" << '\n';
       } else if (the_type2->is_container() || the_type2->is_xception()) {
         string arg(tmp("arg"));
         string mbTrans(tmp("mbTrans"));
@@ -2552,29 +2708,33 @@
         string jsProt(tmp("jsProt"));
         string err2(tmp("err"));
         std::string argName(publicize(args[i]->get_name()));
-        f_remote << indent() << arg << " := flag.Arg(" << flagArg << ")" << endl;
+        f_remote << indent() << arg << " := flag.Arg(" << flagArg << ")" << '\n';
         f_remote << indent() << mbTrans << " := thrift.NewTMemoryBufferLen(len(" << arg << "))"
-                 << endl;
-        f_remote << indent() << "defer " << mbTrans << ".Close()" << endl;
+                 << '\n';
+        f_remote << indent() << "defer " << mbTrans << ".Close()" << '\n';
         f_remote << indent() << "_, " << err1 << " := " << mbTrans << ".WriteString(" << arg << ")"
-                 << endl;
-        f_remote << indent() << "if " << err1 << " != nil { " << endl;
-        f_remote << indent() << "  Usage()" << endl;
-        f_remote << indent() << "  return" << endl;
-        f_remote << indent() << "}" << endl;
-        f_remote << indent() << factory << " := thrift.NewTJSONProtocolFactory()" << endl;
+                 << '\n';
+        f_remote << indent() << "if " << err1 << " != nil {" << '\n';
+        indent_up();
+        f_remote << indent() << "Usage()" << '\n';
+        f_remote << indent() << "return" << '\n';
+        indent_down();
+        f_remote << indent() << "}" << '\n';
+        f_remote << indent() << factory << " := thrift.NewTJSONProtocolFactory()" << '\n';
         f_remote << indent() << jsProt << " := " << factory << ".GetProtocol(" << mbTrans << ")"
-                 << endl;
+                 << '\n';
         f_remote << indent() << "containerStruct" << i << " := " << package_name_aliased << ".New"
-                 << argumentsName << "()" << endl;
+                 << argumentsName << "()" << '\n';
         f_remote << indent() << err2 << " := containerStruct" << i << ".ReadField" << (i + 1) << "(context.Background(), "
-                 << jsProt << ")" << endl;
-        f_remote << indent() << "if " << err2 << " != nil {" << endl;
-        f_remote << indent() << "  Usage()" << endl;
-        f_remote << indent() << "  return" << endl;
-        f_remote << indent() << "}" << endl;
+                 << jsProt << ")" << '\n';
+        f_remote << indent() << "if " << err2 << " != nil {" << '\n';
+        indent_up();
+        f_remote << indent() << "Usage()" << '\n';
+        f_remote << indent() << "return" << '\n';
+        indent_down();
+        f_remote << indent() << "}" << '\n';
         f_remote << indent() << "argvalue" << i << " := containerStruct" << i << "." << argName
-                 << endl;
+                 << '\n';
       } else {
         throw("Invalid argument type in generate_service_remote");
       }
@@ -2585,9 +2745,9 @@
           typedef_module = package_name_aliased;
         }
         f_remote << indent() << "value" << i << " := " << typedef_module << "."
-                 << publicize(the_type->get_name()) << "(argvalue" << i << ")" << endl;
+                 << publicize(the_type->get_name()) << "(argvalue" << i << ")" << '\n';
       } else {
-        f_remote << indent() << "value" << i << " := argvalue" << i << endl;
+        f_remote << indent() << "value" << i << " := argvalue" << i << '\n';
       }
     }
 
@@ -2634,20 +2794,23 @@
       }
     }
 
-    f_remote << "))" << endl;
-    f_remote << indent() << "fmt.Print(\"\\n\")" << endl;
-    f_remote << indent() << "break" << endl;
+    f_remote << "))" << '\n';
+    f_remote << indent() << "fmt.Print(\"\\n\")" << '\n';
+    f_remote << indent() << "break" << '\n';
     indent_down();
   }
 
-  f_remote << indent() << "case \"\":" << endl;
-  f_remote << indent() << "  Usage()" << endl;
-  f_remote << indent() << "  break" << endl;
-  f_remote << indent() << "default:" << endl;
-  f_remote << indent() << "  fmt.Fprintln(os.Stderr, \"Invalid function \", cmd)" << endl;
-  f_remote << indent() << "}" << endl;
+  f_remote << indent() << "case \"\":" << '\n';
+  indent_up();
+  f_remote << indent() << "Usage()" << '\n';
   indent_down();
-  f_remote << indent() << "}" << endl;
+  f_remote << indent() << "default:" << '\n';
+  indent_up();
+  f_remote << indent() << "fmt.Fprintln(os.Stderr, \"Invalid function \", cmd)" << '\n';
+  indent_down();
+  f_remote << indent() << "}" << '\n';
+  indent_down();
+  f_remote << indent() << "}" << '\n';
   // Close service file
   f_remote.close();
   format_go_output(f_remote_name);
@@ -2696,80 +2859,99 @@
   string self(tmp("self"));
 
   if (extends_processor.empty()) {
-    f_types_ << indent() << "type " << serviceName << "Processor struct {" << endl;
-    f_types_ << indent() << "  processorMap map[string]thrift.TProcessorFunction" << endl;
-    f_types_ << indent() << "  handler " << serviceName << endl;
-    f_types_ << indent() << "}" << endl << endl;
+    generate_deprecation_comment(f_types_, tservice->annotations_);
+    f_types_ << indent() << "type " << serviceName << "Processor struct {" << '\n';
+    indent_up();
+    f_types_ << indent() << "processorMap map[string]thrift.TProcessorFunction" << '\n';
+    f_types_ << indent() << "handler " << serviceName << '\n';
+    indent_down();
+    f_types_ << indent() << "}" << '\n' << '\n';
     f_types_ << indent() << "func (p *" << serviceName
                << "Processor) AddToProcessorMap(key string, processor thrift.TProcessorFunction) {"
-               << endl;
-    f_types_ << indent() << "  p.processorMap[key] = processor" << endl;
-    f_types_ << indent() << "}" << endl << endl;
+               << '\n';
+    indent_up();
+    f_types_ << indent() << "p.processorMap[key] = processor" << '\n';
+    indent_down();
+    f_types_ << indent() << "}" << '\n' << '\n';
     f_types_ << indent() << "func (p *" << serviceName
                << "Processor) GetProcessorFunction(key string) "
-                  "(processor thrift.TProcessorFunction, ok bool) {" << endl;
-    f_types_ << indent() << "  processor, ok = p.processorMap[key]" << endl;
-    f_types_ << indent() << "  return processor, ok" << endl;
-    f_types_ << indent() << "}" << endl << endl;
+                  "(processor thrift.TProcessorFunction, ok bool) {" << '\n';
+    indent_up();
+    f_types_ << indent() << "processor, ok = p.processorMap[key]" << '\n';
+    f_types_ << indent() << "return processor, ok" << '\n';
+    indent_down();
+    f_types_ << indent() << "}" << '\n' << '\n';
     f_types_ << indent() << "func (p *" << serviceName
-               << "Processor) ProcessorMap() map[string]thrift.TProcessorFunction {" << endl;
-    f_types_ << indent() << "  return p.processorMap" << endl;
-    f_types_ << indent() << "}" << endl << endl;
+               << "Processor) ProcessorMap() map[string]thrift.TProcessorFunction {" << '\n';
+    indent_up();
+    f_types_ << indent() << "return p.processorMap" << '\n';
+    indent_down();
+    f_types_ << indent() << "}" << '\n' << '\n';
+    generate_deprecation_comment(f_types_, tservice->annotations_);
     f_types_ << indent() << "func New" << serviceName << "Processor(handler " << serviceName
-               << ") *" << serviceName << "Processor {" << endl << endl;
+               << ") *" << serviceName << "Processor {" << '\n' << '\n';
+    indent_up();
     f_types_
-        << indent() << "  " << self << " := &" << serviceName
+        << indent() << self << " := &" << serviceName
         << "Processor{handler:handler, processorMap:make(map[string]thrift.TProcessorFunction)}"
-        << endl;
+        << '\n';
 
     for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
       string escapedFuncName(escape_string((*f_iter)->get_name()));
-      f_types_ << indent() << "  " << self << ".processorMap[\"" << escapedFuncName << "\"] = &"
+      f_types_ << indent() << self << ".processorMap[\"" << escapedFuncName << "\"] = &"
                  << pServiceName << "Processor" << publicize((*f_iter)->get_name())
-                 << "{handler:handler}" << endl;
+                 << "{handler:handler}" << '\n';
     }
 
     string x(tmp("x"));
-    f_types_ << indent() << "return " << self << endl;
-    f_types_ << indent() << "}" << endl << endl;
+    f_types_ << indent() << "return " << self << '\n';
+    indent_down();
+    f_types_ << indent() << "}" << '\n' << '\n';
     f_types_ << indent() << "func (p *" << serviceName
                << "Processor) Process(ctx context.Context, iprot, oprot thrift.TProtocol) (success bool, err "
-                  "thrift.TException) {" << endl;
-    f_types_ << indent() << "  name, _, seqId, err2 := iprot.ReadMessageBegin(ctx)" << endl;
-    f_types_ << indent() << "  if err2 != nil { return false, thrift.WrapTException(err2) }" << endl;
-    f_types_ << indent() << "  if processor, ok := p.GetProcessorFunction(name); ok {" << endl;
-    f_types_ << indent() << "    return processor.Process(ctx, seqId, iprot, oprot)" << endl;
-    f_types_ << indent() << "  }" << endl;
-    f_types_ << indent() << "  iprot.Skip(ctx, thrift.STRUCT)" << endl;
-    f_types_ << indent() << "  iprot.ReadMessageEnd(ctx)" << endl;
-    f_types_ << indent() << "  " << x
+                  "thrift.TException) {" << '\n';
+    indent_up();
+    f_types_ << indent() << "name, _, seqId, err2 := iprot.ReadMessageBegin(ctx)" << '\n';
+    f_types_ << indent() << "if err2 != nil { return false, thrift.WrapTException(err2) }" << '\n';
+    f_types_ << indent() << "if processor, ok := p.GetProcessorFunction(name); ok {" << '\n';
+    indent_up();
+    f_types_ << indent() << "return processor.Process(ctx, seqId, iprot, oprot)" << '\n';
+    indent_down();
+    f_types_ << indent() << "}" << '\n';
+    f_types_ << indent() << "iprot.Skip(ctx, thrift.STRUCT)" << '\n';
+    f_types_ << indent() << "iprot.ReadMessageEnd(ctx)" << '\n';
+    f_types_ << indent() << "" << x
                << " := thrift.NewTApplicationException(thrift.UNKNOWN_METHOD, \"Unknown function "
-                  "\" + name)" << endl;
-    f_types_ << indent() << "  oprot.WriteMessageBegin(ctx, name, thrift.EXCEPTION, seqId)" << endl;
-    f_types_ << indent() << "  " << x << ".Write(ctx, oprot)" << endl;
-    f_types_ << indent() << "  oprot.WriteMessageEnd(ctx)" << endl;
-    f_types_ << indent() << "  oprot.Flush(ctx)" << endl;
-    f_types_ << indent() << "  return false, " << x << endl;
-    f_types_ << indent() << "" << endl;
-    f_types_ << indent() << "}" << endl << endl;
+                  "\" + name)" << '\n';
+    f_types_ << indent() << "oprot.WriteMessageBegin(ctx, name, thrift.EXCEPTION, seqId)" << '\n';
+    f_types_ << indent() << "" << x << ".Write(ctx, oprot)" << '\n';
+    f_types_ << indent() << "oprot.WriteMessageEnd(ctx)" << '\n';
+    f_types_ << indent() << "oprot.Flush(ctx)" << '\n';
+    f_types_ << indent() << "return false, " << x << '\n';
+    indent_down();
+    f_types_ << indent() << "}" << '\n' << '\n';
   } else {
-    f_types_ << indent() << "type " << serviceName << "Processor struct {" << endl;
-    f_types_ << indent() << "  *" << extends_processor << endl;
-    f_types_ << indent() << "}" << endl << endl;
+    f_types_ << indent() << "type " << serviceName << "Processor struct {" << '\n';
+    indent_up();
+    f_types_ << indent() << "*" << extends_processor << '\n';
+    indent_down();
+    f_types_ << indent() << "}" << '\n' << '\n';
     f_types_ << indent() << "func New" << serviceName << "Processor(handler " << serviceName
-               << ") *" << serviceName << "Processor {" << endl;
-    f_types_ << indent() << "  " << self << " := &" << serviceName << "Processor{"
-               << extends_processor_new << "(handler)}" << endl;
+               << ") *" << serviceName << "Processor {" << '\n';
+    indent_up();
+    f_types_ << indent() << self << " := &" << serviceName << "Processor{"
+               << extends_processor_new << "(handler)}" << '\n';
 
     for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
       string escapedFuncName(escape_string((*f_iter)->get_name()));
-      f_types_ << indent() << "  " << self << ".AddToProcessorMap(\"" << escapedFuncName
+      f_types_ << indent() << self << ".AddToProcessorMap(\"" << escapedFuncName
                  << "\", &" << pServiceName << "Processor" << publicize((*f_iter)->get_name())
-                 << "{handler:handler})" << endl;
+                 << "{handler:handler})" << '\n';
     }
 
-    f_types_ << indent() << "  return " << self << endl;
-    f_types_ << indent() << "}" << endl << endl;
+    f_types_ << indent() << "return " << self << '\n';
+    indent_down();
+    f_types_ << indent() << "}" << '\n' << '\n';
   }
 
   // Generate the process subfunctions
@@ -2777,7 +2959,7 @@
     generate_process_function(tservice, *f_iter);
   }
 
-  f_types_ << endl;
+  f_types_ << '\n';
 }
 
 /**
@@ -2794,90 +2976,92 @@
 
   // t_struct* xs = tfunction->get_xceptions();
   // const std::vector<t_field*>& xceptions = xs->get_members();
-  f_types_ << indent() << "type " << processorName << " struct {" << endl;
-  f_types_ << indent() << "  handler " << publicize(tservice->get_name()) << endl;
-  f_types_ << indent() << "}" << endl << endl;
+  f_types_ << indent() << "type " << processorName << " struct {" << '\n';
+  indent_up();
+  f_types_ << indent() << "handler " << publicize(tservice->get_name()) << '\n';
+  indent_down();
+  f_types_ << indent() << "}" << '\n' << '\n';
   f_types_ << indent() << "func (p *" << processorName
              << ") Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err "
-                "thrift.TException) {" << endl;
+                "thrift.TException) {" << '\n';
   indent_up();
   string write_err;
   if (!tfunction->is_oneway()) {
     write_err = tmp("_write_err");
-    f_types_ << indent() << "var " << write_err << " error" << endl;
+    f_types_ << indent() << "var " << write_err << " error" << '\n';
   }
-  f_types_ << indent() << "args := " << argsname << "{}" << endl;
-  f_types_ << indent() << "if err2 := args." << read_method_name_ <<  "(ctx, iprot); err2 != nil {" << endl;
+  f_types_ << indent() << "args := " << argsname << "{}" << '\n';
+  f_types_ << indent() << "if err2 := args." << read_method_name_ << "(ctx, iprot); err2 != nil {" << '\n';
   indent_up();
-  f_types_ << indent() << "iprot.ReadMessageEnd(ctx)" << endl;
+  f_types_ << indent() << "iprot.ReadMessageEnd(ctx)" << '\n';
   if (!tfunction->is_oneway()) {
     f_types_ << indent()
                << "x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err2.Error())"
-               << endl;
+               << '\n';
     f_types_ << indent() << "oprot.WriteMessageBegin(ctx, \"" << escape_string(tfunction->get_name())
-               << "\", thrift.EXCEPTION, seqId)" << endl;
-    f_types_ << indent() << "x.Write(ctx, oprot)" << endl;
-    f_types_ << indent() << "oprot.WriteMessageEnd(ctx)" << endl;
-    f_types_ << indent() << "oprot.Flush(ctx)" << endl;
+               << "\", thrift.EXCEPTION, seqId)" << '\n';
+    f_types_ << indent() << "x.Write(ctx, oprot)" << '\n';
+    f_types_ << indent() << "oprot.WriteMessageEnd(ctx)" << '\n';
+    f_types_ << indent() << "oprot.Flush(ctx)" << '\n';
   }
-  f_types_ << indent() << "return false, thrift.WrapTException(err2)" << endl;
+  f_types_ << indent() << "return false, thrift.WrapTException(err2)" << '\n';
   indent_down();
-  f_types_ << indent() << "}" << endl;
-  f_types_ << indent() << "iprot.ReadMessageEnd(ctx)" << endl << endl;
+  f_types_ << indent() << "}" << '\n';
+  f_types_ << indent() << "iprot.ReadMessageEnd(ctx)" << '\n' << '\n';
 
   // Even though we never create the goroutine in oneway handlers,
   // always have (nop) tickerCancel defined makes the writing part of code
   // generating easier and less error-prone.
-  f_types_ << indent() << "tickerCancel := func() {}" << endl;
+  f_types_ << indent() << "tickerCancel := func() {}" << '\n';
   // Only create the goroutine for non-oneways.
   if (!tfunction->is_oneway()) {
-    f_types_ << indent() << "// Start a goroutine to do server side connectivity check." << endl;
-    f_types_ << indent() << "if thrift.ServerConnectivityCheckInterval > 0 {" << endl;
+    f_types_ << indent() << "// Start a goroutine to do server side connectivity check." << '\n';
+    f_types_ << indent() << "if thrift.ServerConnectivityCheckInterval > 0 {" << '\n';
 
     indent_up();
-    f_types_ << indent() << "var cancel context.CancelCauseFunc" << endl;
-    f_types_ << indent() << "ctx, cancel = context.WithCancelCause(ctx)" << endl;
-    f_types_ << indent() << "defer cancel(nil)" << endl;
-    f_types_ << indent() << "var tickerCtx context.Context" << endl;
-    f_types_ << indent() << "tickerCtx, tickerCancel = context.WithCancel(context.Background())" << endl;
-    f_types_ << indent() << "defer tickerCancel()" << endl;
-    f_types_ << indent() << "go func(ctx context.Context, cancel context.CancelCauseFunc) {" << endl;
+    f_types_ << indent() << "var cancel context.CancelCauseFunc" << '\n';
+    f_types_ << indent() << "ctx, cancel = context.WithCancelCause(ctx)" << '\n';
+    f_types_ << indent() << "defer cancel(nil)" << '\n';
+    f_types_ << indent() << "var tickerCtx context.Context" << '\n';
+    f_types_ << indent() << "tickerCtx, tickerCancel = context.WithCancel(context.Background())" << '\n';
+    f_types_ << indent() << "defer tickerCancel()" << '\n';
+    f_types_ << indent() << "go func(ctx context.Context, cancel context.CancelCauseFunc) {" << '\n';
 
     indent_up();
-    f_types_ << indent() << "ticker := time.NewTicker(thrift.ServerConnectivityCheckInterval)" << endl;
-    f_types_ << indent() << "defer ticker.Stop()" << endl;
-    f_types_ << indent() << "for {" << endl;
+    f_types_ << indent() << "ticker := time.NewTicker(thrift.ServerConnectivityCheckInterval)" << '\n';
+    f_types_ << indent() << "defer ticker.Stop()" << '\n';
+    f_types_ << indent() << "for {" << '\n';
 
     indent_up();
-    f_types_ << indent() << "select {" << endl;
-    f_types_ << indent() << "case <-ctx.Done():" << endl;
+    f_types_ << indent() << "select {" << '\n';
+    f_types_ << indent() << "case <-ctx.Done():" << '\n';
     indent_up();
-    f_types_ << indent() << "return" << endl;
+    f_types_ << indent() << "return" << '\n';
     indent_down();
-    f_types_ << indent() << "case <-ticker.C:" << endl;
+    f_types_ << indent() << "case <-ticker.C:" << '\n';
 
     indent_up();
-    f_types_ << indent() << "if !iprot.Transport().IsOpen() {" << endl;
+    f_types_ << indent() << "if !iprot.Transport().IsOpen() {" << '\n';
     indent_up();
-    f_types_ << indent() << "cancel(thrift.ErrAbandonRequest)" << endl;
-    f_types_ << indent() << "return" << endl;
+    f_types_ << indent() << "cancel(thrift.ErrAbandonRequest)" << '\n';
+    f_types_ << indent() << "return" << '\n';
     indent_down();
-    f_types_ << indent() << "}" << endl;
+    f_types_ << indent() << "}" << '\n';
     indent_down();
-    f_types_ << indent() << "}" << endl;
+    f_types_ << indent() << "}" << '\n';
     indent_down();
-    f_types_ << indent() << "}" << endl;
+    f_types_ << indent() << "}" << '\n';
     indent_down();
-    f_types_ << indent() << "}(tickerCtx, cancel)" << endl;
+    f_types_ << indent() << "}(tickerCtx, cancel)" << '\n';
     indent_down();
-    f_types_ << indent() << "}" << endl << endl;
+    f_types_ << indent() << "}" << '\n' << '\n';
   } else {
     // Make sure we don't get the defined but unused compiling error.
-    f_types_ << indent() << "_ = tickerCancel" << endl << endl;
+    f_types_ << indent() << "_ = tickerCancel" << '\n' << '\n';
   }
 
   if (!tfunction->is_oneway()) {
-    f_types_ << indent() << "result := " << resultname << "{}" << endl;
+    f_types_ << indent() << "result := " << resultname << "{}" << '\n';
   }
   bool need_reference = type_need_reference(tfunction->get_returntype());
 
@@ -2908,93 +3092,93 @@
     f_types_ << "args." << publicize((*f_iter)->get_name());
   }
 
-  f_types_ << "); err2 != nil {" << endl;
+  f_types_ << "); err2 != nil {" << '\n';
   indent_up();
-  f_types_ << indent() << "tickerCancel()" << endl;
-  f_types_ << indent() << "err = thrift.WrapTException(err2)" << endl;
+  f_types_ << indent() << "tickerCancel()" << '\n';
+  f_types_ << indent() << "err = thrift.WrapTException(err2)" << '\n';
 
   t_struct* exceptions = tfunction->get_xceptions();
   const vector<t_field*>& x_fields = exceptions->get_members();
   if (!x_fields.empty()) {
-    f_types_ << indent() << "switch v := err2.(type) {" << endl;
+    f_types_ << indent() << "switch v := err2.(type) {" << '\n';
 
     vector<t_field*>::const_iterator xf_iter;
 
     for (xf_iter = x_fields.begin(); xf_iter != x_fields.end(); ++xf_iter) {
       f_types_ << indent() << "case " << type_to_go_type(((*xf_iter)->get_type())) << ":"
-                 << endl;
+                 << '\n';
       indent_up();
-      f_types_ << indent() << "result." << publicize((*xf_iter)->get_name()) << " = v" << endl;
+      f_types_ << indent() << "result." << publicize((*xf_iter)->get_name()) << " = v" << '\n';
       indent_down();
     }
 
-    f_types_ << indent() << "default:" << endl;
+    f_types_ << indent() << "default:" << '\n';
     indent_up();
   }
 
   if (!tfunction->is_oneway()) {
     // Avoid writing the error to the wire if it's ErrAbandonRequest
-    f_types_ << indent() << "if errors.Is(err2, thrift.ErrAbandonRequest) {" << endl;
+    f_types_ << indent() << "if errors.Is(err2, thrift.ErrAbandonRequest) {" << '\n';
     indent_up();
-    f_types_ << indent() << "return false, thrift.WrapTException(err2)" << endl;
+    f_types_ << indent() << "return false, thrift.WrapTException(err2)" << '\n';
     indent_down();
-    f_types_ << indent() << "}" << endl;
-    f_types_ << indent() << "if errors.Is(err2, context.Canceled) {" << endl;
+    f_types_ << indent() << "}" << '\n';
+    f_types_ << indent() << "if errors.Is(err2, context.Canceled) {" << '\n';
     indent_up();
-    f_types_ << indent() << "if err := context.Cause(ctx); errors.Is(err, thrift.ErrAbandonRequest) {" << endl;
+    f_types_ << indent() << "if err := context.Cause(ctx); errors.Is(err, thrift.ErrAbandonRequest) {" << '\n';
     indent_up();
-    f_types_ << indent() << "return false, thrift.WrapTException(err)" << endl;
+    f_types_ << indent() << "return false, thrift.WrapTException(err)" << '\n';
     indent_down();
-    f_types_ << indent() << "}" << endl;
+    f_types_ << indent() << "}" << '\n';
     indent_down();
-    f_types_ << indent() << "}" << endl;
+    f_types_ << indent() << "}" << '\n';
 
     string exc(tmp("_exc"));
     f_types_ << indent() << exc << " := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "
                               "\"Internal error processing " << escape_string(tfunction->get_name())
-               << ": \" + err2.Error())" << endl;
+               << ": \" + err2.Error())" << '\n';
 
     f_types_ << indent() << "if err2 := oprot.WriteMessageBegin(ctx, \"" << escape_string(tfunction->get_name())
-               << "\", thrift.EXCEPTION, seqId); err2 != nil {" << endl;
+               << "\", thrift.EXCEPTION, seqId); err2 != nil {" << '\n';
     indent_up();
-    f_types_ << indent() << write_err << " = thrift.WrapTException(err2)" << endl;
+    f_types_ << indent() << write_err << " = thrift.WrapTException(err2)" << '\n';
     indent_down();
-    f_types_ << indent() << "}" << endl;
+    f_types_ << indent() << "}" << '\n';
 
     f_types_ << indent() << "if err2 := " << exc << ".Write(ctx, oprot); "
-               << write_err << " == nil && err2 != nil {" << endl;
+               << write_err << " == nil && err2 != nil {" << '\n';
     indent_up();
-    f_types_ << indent() << write_err << " = thrift.WrapTException(err2)" << endl;
+    f_types_ << indent() << write_err << " = thrift.WrapTException(err2)" << '\n';
     indent_down();
-    f_types_ << indent() << "}" << endl;
+    f_types_ << indent() << "}" << '\n';
 
     f_types_ << indent() << "if err2 := oprot.WriteMessageEnd(ctx); "
-               << write_err << " == nil && err2 != nil {" << endl;
+               << write_err << " == nil && err2 != nil {" << '\n';
     indent_up();
-    f_types_ << indent() << write_err << " = thrift.WrapTException(err2)" << endl;
+    f_types_ << indent() << write_err << " = thrift.WrapTException(err2)" << '\n';
     indent_down();
-    f_types_ << indent() << "}" << endl;
+    f_types_ << indent() << "}" << '\n';
 
     f_types_ << indent() << "if err2 := oprot.Flush(ctx); "
-               << write_err << " == nil && err2 != nil {" << endl;
+               << write_err << " == nil && err2 != nil {" << '\n';
     indent_up();
-    f_types_ << indent() << write_err << " = thrift.WrapTException(err2)" << endl;
+    f_types_ << indent() << write_err << " = thrift.WrapTException(err2)" << '\n';
     indent_down();
-    f_types_ << indent() << "}" << endl;
+    f_types_ << indent() << "}" << '\n';
 
-    f_types_ << indent() << "if " << write_err << " != nil {" << endl;
+    f_types_ << indent() << "if " << write_err << " != nil {" << '\n';
     indent_up();
-    f_types_ << indent() << "return false, thrift.WrapTException(" << write_err << ")" << endl;
+    f_types_ << indent() << "return false, thrift.WrapTException(" << write_err << ")" << '\n';
     indent_down();
-    f_types_ << indent() << "}" << endl;
+    f_types_ << indent() << "}" << '\n';
 
     // return success=true as long as writing to the wire was successful.
-    f_types_ << indent() << "return true, err" << endl;
+    f_types_ << indent() << "return true, err" << '\n';
   }
 
   if (!x_fields.empty()) {
     indent_down();
-    f_types_ << indent() << "}" << endl; // closes switch
+    f_types_ << indent() << "}" << '\n'; // closes switch
   }
 
   indent_down();
@@ -3002,63 +3186,63 @@
 
   if (!tfunction->is_oneway()) {
     if (!tfunction->get_returntype()->is_void()) {
-      f_types_ << " else {" << endl; // make sure we set Success retval only on success
+      f_types_ << " else {" << '\n'; // make sure we set Success retval only on success
       indent_up();
       f_types_ << indent() << "result.Success = ";
       if (need_reference) {
         f_types_ << "&";
       }
-      f_types_ << "retval" << endl;
+      f_types_ << "retval" << '\n';
       indent_down();
-      f_types_ << indent() << "}" << endl;
+      f_types_ << indent() << "}" << '\n';
     } else {
-      f_types_ << endl;
+      f_types_ << '\n';
     }
-    f_types_ << indent() << "tickerCancel()" << endl;
+    f_types_ << indent() << "tickerCancel()" << '\n';
 
     f_types_ << indent() << "if err2 := oprot.WriteMessageBegin(ctx, \""
                << escape_string(tfunction->get_name()) << "\", thrift.REPLY, seqId); err2 != nil {"
-               << endl;
+               << '\n';
     indent_up();
-    f_types_ << indent() << write_err << " = thrift.WrapTException(err2)" << endl;
+    f_types_ << indent() << write_err << " = thrift.WrapTException(err2)" << '\n';
     indent_down();
-    f_types_ << indent() << "}" << endl;
+    f_types_ << indent() << "}" << '\n';
 
     f_types_ << indent() << "if err2 := result." << write_method_name_ << "(ctx, oprot); "
-               << write_err << " == nil && err2 != nil {" << endl;
+               << write_err << " == nil && err2 != nil {" << '\n';
     indent_up();
-    f_types_ << indent() << write_err << " = thrift.WrapTException(err2)" << endl;
+    f_types_ << indent() << write_err << " = thrift.WrapTException(err2)" << '\n';
     indent_down();
-    f_types_ << indent() << "}" << endl;
+    f_types_ << indent() << "}" << '\n';
 
     f_types_ << indent() << "if err2 := oprot.WriteMessageEnd(ctx); "
-               << write_err << " == nil && err2 != nil {" << endl;
+               << write_err << " == nil && err2 != nil {" << '\n';
     indent_up();
-    f_types_ << indent() << write_err << " = thrift.WrapTException(err2)" << endl;
+    f_types_ << indent() << write_err << " = thrift.WrapTException(err2)" << '\n';
     indent_down();
-    f_types_ << indent() << "}" << endl;
+    f_types_ << indent() << "}" << '\n';
 
-    f_types_ << indent() << "if err2 := oprot.Flush(ctx); " << write_err << " == nil && err2 != nil {" << endl;
+    f_types_ << indent() << "if err2 := oprot.Flush(ctx); " << write_err << " == nil && err2 != nil {" << '\n';
     indent_up();
-    f_types_ << indent() << write_err << " = thrift.WrapTException(err2)" << endl;
+    f_types_ << indent() << write_err << " = thrift.WrapTException(err2)" << '\n';
     indent_down();
-    f_types_ << indent() << "}" << endl;
+    f_types_ << indent() << "}" << '\n';
 
-    f_types_ << indent() << "if " << write_err << " != nil {" << endl;
+    f_types_ << indent() << "if " << write_err << " != nil {" << '\n';
     indent_up();
-    f_types_ << indent() << "return false, thrift.WrapTException(" << write_err << ")" << endl;
+    f_types_ << indent() << "return false, thrift.WrapTException(" << write_err << ")" << '\n';
     indent_down();
-    f_types_ << indent() << "}" << endl;
+    f_types_ << indent() << "}" << '\n';
 
     // return success=true as long as writing to the wire was successful.
-    f_types_ << indent() << "return true, err" << endl;
+    f_types_ << indent() << "return true, err" << '\n';
   } else {
-    f_types_ << endl;
-    f_types_ << indent() << "tickerCancel()" << endl;
-    f_types_ << indent() << "return true, err" << endl;
+    f_types_ << '\n';
+    f_types_ << indent() << "tickerCancel()" << '\n';
+    f_types_ << indent() << "return true, err" << '\n';
   }
   indent_down();
-  f_types_ << indent() << "}" << endl << endl;
+  f_types_ << indent() << "}" << '\n' << '\n';
 }
 
 /**
@@ -3096,7 +3280,7 @@
       string type_name = inkey ? type_to_go_key_type(tfield->get_type())
                                : type_to_go_type(tfield->get_type());
 
-      out << "var " << tfield->get_name() << " " << type_name << endl;
+      out << indent() << "var " << tfield->get_name() << " " << type_name << '\n';
     }
 
     indent(out) << "if v, err := iprot.";
@@ -3153,11 +3337,14 @@
       out << "ReadI32(ctx)";
     }
 
-    out << "; err != nil {" << endl;
+    out << "; err != nil {" << '\n';
+    indent_up();
     out << indent() << "return thrift.PrependError(\"error reading field " << tfield->get_key()
-        << ": \", err)" << endl;
+        << ": \", err)" << '\n';
 
-    out << "} else {" << endl;
+    indent_down();
+    out << indent() << "} else {" << '\n';
+    indent_up();
     string wrap;
 
     if (type->is_enum() || orig_type->is_typedef()) {
@@ -3168,13 +3355,14 @@
 
     string maybe_address = (is_pointer_field(tfield) ? "&" : "");
     if (wrap == "") {
-      indent(out) << name << " = " << maybe_address << "v" << endl;
+      indent(out) << name << " = " << maybe_address << "v" << '\n';
     } else {
-      indent(out) << "temp := " << wrap << "(v)" << endl;
-      indent(out) << name << " = " << maybe_address << "temp" << endl;
+      indent(out) << "temp := " << wrap << "(v)" << '\n';
+      indent(out) << name << " = " << maybe_address << "temp" << '\n';
     }
 
-    out << "}" << endl;
+    indent_down();
+    out << indent() << "}" << '\n';
   } else {
     throw "INVALID TYPE IN generate_deserialize_field '" + type->get_name() + "' for field '"
         + tfield->get_name() + "'";
@@ -3193,10 +3381,12 @@
 
   out << indent() << prefix << eq << (pointer_field ? "&" : "");
   generate_go_struct_initializer(out, tstruct);
-  out << indent() << "if err := " << prefix << "." << read_method_name_ <<  "(ctx, iprot); err != nil {" << endl;
-  out << indent() << "  return thrift.PrependError(fmt.Sprintf(\"%T error reading struct: \", "
-      << prefix << "), err)" << endl;
-  out << indent() << "}" << endl;
+  out << indent() << "if err := " << prefix << "." << read_method_name_ << "(ctx, iprot); err != nil {" << '\n';
+  indent_up();
+  out << indent() << "return thrift.PrependError(fmt.Sprintf(\"%T error reading struct: \", "
+      << prefix << "), err)" << '\n';
+  indent_down();
+  out << indent() << "}" << '\n';
 }
 
 /**
@@ -3217,33 +3407,39 @@
 
   // Declare variables, read header
   if (ttype->is_map()) {
-    out << indent() << "_, _, size, err := iprot.ReadMapBegin(ctx)" << endl;
-    out << indent() << "if err != nil {" << endl;
-    out << indent() << "  return thrift.PrependError(\"error reading map begin: \", err)" << endl;
-    out << indent() << "}" << endl;
-    out << indent() << "tMap := make(" << type_to_go_type(orig_type) << ", size)" << endl;
-    out << indent() << prefix << eq << " " << (pointer_field ? "&" : "") << "tMap" << endl;
+    out << indent() << "_, _, size, err := iprot.ReadMapBegin(ctx)" << '\n';
+    out << indent() << "if err != nil {" << '\n';
+    indent_up();
+    out << indent() << "return thrift.PrependError(\"error reading map begin: \", err)" << '\n';
+    indent_down();
+    out << indent() << "}" << '\n';
+    out << indent() << "tMap := make(" << type_to_go_type(orig_type) << ", size)" << '\n';
+    out << indent() << prefix << eq << (pointer_field ? "&" : "") << "tMap" << '\n';
   } else if (ttype->is_set()) {
-    out << indent() << "_, size, err := iprot.ReadSetBegin(ctx)" << endl;
-    out << indent() << "if err != nil {" << endl;
-    out << indent() << "  return thrift.PrependError(\"error reading set begin: \", err)" << endl;
-    out << indent() << "}" << endl;
-    out << indent() << "tSet := make(" << type_to_go_type(orig_type) << ", 0, size)" << endl;
-    out << indent() << prefix << eq << " " << (pointer_field ? "&" : "") << "tSet" << endl;
+    out << indent() << "_, size, err := iprot.ReadSetBegin(ctx)" << '\n';
+    out << indent() << "if err != nil {" << '\n';
+    indent_up();
+    out << indent() << "return thrift.PrependError(\"error reading set begin: \", err)" << '\n';
+    indent_down();
+    out << indent() << "}" << '\n';
+    out << indent() << "tSet := make(" << type_to_go_type(orig_type) << ", 0, size)" << '\n';
+    out << indent() << prefix << eq << (pointer_field ? "&" : "") << "tSet" << '\n';
   } else if (ttype->is_list()) {
-    out << indent() << "_, size, err := iprot.ReadListBegin(ctx)" << endl;
-    out << indent() << "if err != nil {" << endl;
-    out << indent() << "  return thrift.PrependError(\"error reading list begin: \", err)" << endl;
-    out << indent() << "}" << endl;
-    out << indent() << "tSlice := make(" << type_to_go_type(orig_type) << ", 0, size)" << endl;
-    out << indent() << prefix << eq << " " << (pointer_field ? "&" : "") << "tSlice" << endl;
+    out << indent() << "_, size, err := iprot.ReadListBegin(ctx)" << '\n';
+    out << indent() << "if err != nil {" << '\n';
+    indent_up();
+    out << indent() << "return thrift.PrependError(\"error reading list begin: \", err)" << '\n';
+    indent_down();
+    out << indent() << "}" << '\n';
+    out << indent() << "tSlice := make(" << type_to_go_type(orig_type) << ", 0, size)" << '\n';
+    out << indent() << prefix << eq << (pointer_field ? "&" : "") << "tSlice" << '\n';
   } else {
     throw "INVALID TYPE IN generate_deserialize_container '" + ttype->get_name() + "' for prefix '"
         + prefix + "'";
   }
 
   // For loop iterates over elements
-  out << indent() << "for i := 0; i < size; i ++ {" << endl;
+  out << indent() << "for i := 0; i < size; i++ {" << '\n';
   indent_up();
 
   if (pointer_field) {
@@ -3258,21 +3454,27 @@
   }
 
   indent_down();
-  out << indent() << "}" << endl;
+  out << indent() << "}" << '\n';
 
   // Read container end
   if (ttype->is_map()) {
-    out << indent() << "if err := iprot.ReadMapEnd(ctx); err != nil {" << endl;
-    out << indent() << "  return thrift.PrependError(\"error reading map end: \", err)" << endl;
-    out << indent() << "}" << endl;
+    out << indent() << "if err := iprot.ReadMapEnd(ctx); err != nil {" << '\n';
+    indent_up();
+    out << indent() << "return thrift.PrependError(\"error reading map end: \", err)" << '\n';
+    indent_down();
+    out << indent() << "}" << '\n';
   } else if (ttype->is_set()) {
-    out << indent() << "if err := iprot.ReadSetEnd(ctx); err != nil {" << endl;
-    out << indent() << "  return thrift.PrependError(\"error reading set end: \", err)" << endl;
-    out << indent() << "}" << endl;
+    out << indent() << "if err := iprot.ReadSetEnd(ctx); err != nil {" << '\n';
+    indent_up();
+    out << indent() << "return thrift.PrependError(\"error reading set end: \", err)" << '\n';
+    indent_down();
+    out << indent() << "}" << '\n';
   } else if (ttype->is_list()) {
-    out << indent() << "if err := iprot.ReadListEnd(ctx); err != nil {" << endl;
-    out << indent() << "  return thrift.PrependError(\"error reading list end: \", err)" << endl;
-    out << indent() << "}" << endl;
+    out << indent() << "if err := iprot.ReadListEnd(ctx); err != nil {" << '\n';
+    indent_up();
+    out << indent() << "return thrift.PrependError(\"error reading list end: \", err)" << '\n';
+    indent_down();
+    out << indent() << "}" << '\n';
   }
 }
 
@@ -3292,7 +3494,7 @@
   fval.set_req(t_field::T_OPT_IN_REQ_OUT);
   generate_deserialize_field(out, &fkey, true, "", false, false, true);
   generate_deserialize_field(out, &fval, true, "", false, false, false, true);
-  indent(out) << prefix << "[" << key << "] = " << val << endl;
+  indent(out) << prefix << "[" << key << "] = " << val << '\n';
 }
 
 /**
@@ -3307,7 +3509,7 @@
   t_field felem(tset->get_elem_type(), elem);
   felem.set_req(t_field::T_OPT_IN_REQ_OUT);
   generate_deserialize_field(out, &felem, true, "", false, false, false, true);
-  indent(out) << prefix << " = append(" << prefix << ", " << elem << ")" << endl;
+  indent(out) << prefix << " = append(" << prefix << ", " << elem << ")" << '\n';
 }
 
 /**
@@ -3322,7 +3524,7 @@
   t_field felem(((t_list*)tlist)->get_elem_type(), elem);
   felem.set_req(t_field::T_OPT_IN_REQ_OUT);
   generate_deserialize_field(out, &felem, true, "", false, false, false, true);
-  indent(out) << prefix << " = append(" << prefix << ", " << elem << ")" << endl;
+  indent(out) << prefix << " = append(" << prefix << ", " << elem << ")" << '\n';
 }
 
 /**
@@ -3406,10 +3608,13 @@
       out << "WriteI32(ctx, int32(" << name << "))";
     }
 
-    out << "; err != nil {" << endl;
+    out << "; err != nil {" << '\n';
+    indent_up();
     out << indent() << "return thrift.PrependError(fmt.Sprintf(\"%T."
         << escape_string(tfield->get_name()) << " (" << tfield->get_key()
-        << ") field write error: \", p), err) }" << endl;
+        << ") field write error: \", p), err)" << '\n';
+    indent_down();
+    out << indent() << "}" << '\n';
   } else {
     throw "compiler error: Invalid type in generate_serialize_field '" + type->get_name()
         + "' for field '" + name + "'";
@@ -3424,10 +3629,12 @@
  */
 void t_go_generator::generate_serialize_struct(ostream& out, t_struct* tstruct, string prefix) {
   (void)tstruct;
-  out << indent() << "if err := " << prefix << "." << write_method_name_ << "(ctx, oprot); err != nil {" << endl;
-  out << indent() << "  return thrift.PrependError(fmt.Sprintf(\"%T error writing struct: \", "
-      << prefix << "), err)" << endl;
-  out << indent() << "}" << endl;
+  out << indent() << "if err := " << prefix << "." << write_method_name_ << "(ctx, oprot); err != nil {" << '\n';
+  indent_up();
+  out << indent() << "return thrift.PrependError(fmt.Sprintf(\"%T error writing struct: \", "
+      << prefix << "), err)" << '\n';
+  indent_down();
+  out << indent() << "}" << '\n';
 }
 
 void t_go_generator::generate_serialize_container(ostream& out,
@@ -3441,21 +3648,27 @@
     out << indent() << "if err := oprot.WriteMapBegin(ctx, "
         << type_to_enum(((t_map*)ttype)->get_key_type()) << ", "
         << type_to_enum(((t_map*)ttype)->get_val_type()) << ", "
-        << "len(" << prefix << ")); err != nil {" << endl;
-    out << indent() << "  return thrift.PrependError(\"error writing map begin: \", err)" << endl;
-    out << indent() << "}" << endl;
+        << "len(" << prefix << ")); err != nil {" << '\n';
+    indent_up();
+    out << indent() << "return thrift.PrependError(\"error writing map begin: \", err)" << '\n';
+    indent_down();
+    out << indent() << "}" << '\n';
   } else if (ttype->is_set()) {
     out << indent() << "if err := oprot.WriteSetBegin(ctx, "
         << type_to_enum(((t_set*)ttype)->get_elem_type()) << ", "
-        << "len(" << prefix << ")); err != nil {" << endl;
-    out << indent() << "  return thrift.PrependError(\"error writing set begin: \", err)" << endl;
-    out << indent() << "}" << endl;
+        << "len(" << prefix << ")); err != nil {" << '\n';
+    indent_up();
+    out << indent() << "return thrift.PrependError(\"error writing set begin: \", err)" << '\n';
+    indent_down();
+    out << indent() << "}" << '\n';
   } else if (ttype->is_list()) {
     out << indent() << "if err := oprot.WriteListBegin(ctx, "
         << type_to_enum(((t_list*)ttype)->get_elem_type()) << ", "
-        << "len(" << prefix << ")); err != nil {" << endl;
-    out << indent() << "  return thrift.PrependError(\"error writing list begin: \", err)" << endl;
-    out << indent() << "}" << endl;
+        << "len(" << prefix << ")); err != nil {" << '\n';
+    indent_up();
+    out << indent() << "return thrift.PrependError(\"error writing list begin: \", err)" << '\n';
+    indent_down();
+    out << indent() << "}" << '\n';
   } else {
     throw "compiler error: Invalid type in generate_serialize_container '" + ttype->get_name()
         + "' for prefix '" + prefix + "'";
@@ -3463,66 +3676,72 @@
 
   if (ttype->is_map()) {
     t_map* tmap = (t_map*)ttype;
-    out << indent() << "for k, v := range " << prefix << " {" << endl;
+    out << indent() << "for k, v := range " << prefix << " {" << '\n';
     indent_up();
     generate_serialize_map_element(out, tmap, "k", "v");
     indent_down();
-    indent(out) << "}" << endl;
+    indent(out) << "}" << '\n';
   } else if (ttype->is_set()) {
     t_set* tset = (t_set*)ttype;
-    out << indent() << "for i := 0; i<len(" << prefix << "); i++ {" << endl;
+    out << indent() << "for i := 0; i<len(" << prefix << "); i++ {" << '\n';
     indent_up();
-    out << indent() << "for j := i+1; j<len(" << prefix << "); j++ {" << endl;
+    out << indent() << "for j := i+1; j<len(" << prefix << "); j++ {" << '\n';
     indent_up();
     string wrapped_prefix = prefix;
     if (pointer_field) {
       wrapped_prefix = "(" + prefix + ")";
     }
     string goType = type_to_go_type(tset->get_elem_type());
-    out << indent() << "if func(tgt, src " << goType << ") bool {" << endl;
+    out << indent() << "if func(tgt, src " << goType << ") bool {" << '\n';
     indent_up();
     generate_go_equals(out, tset->get_elem_type(), "tgt", "src");
-    out << indent() << "return true" << endl;
+    out << indent() << "return true" << '\n';
     indent_down();
-    out << indent() << "}(" << wrapped_prefix << "[i], " << wrapped_prefix << "[j]) {" << endl;
+    out << indent() << "}(" << wrapped_prefix << "[i], " << wrapped_prefix << "[j]) {" << '\n';
     indent_up();
     out << indent()
         << "return thrift.PrependError(\"\", fmt.Errorf(\"%T error writing set field: slice is not "
            "unique\", "
-        << wrapped_prefix << "))" << endl;
+        << wrapped_prefix << "))" << '\n';
     indent_down();
-    out << indent() << "}" << endl;
+    out << indent() << "}" << '\n';
     indent_down();
-    out << indent() << "}" << endl;
+    out << indent() << "}" << '\n';
     indent_down();
-    out << indent() << "}" << endl;
-    out << indent() << "for _, v := range " << prefix << " {" << endl;
+    out << indent() << "}" << '\n';
+    out << indent() << "for _, v := range " << prefix << " {" << '\n';
     indent_up();
     generate_serialize_set_element(out, tset, "v");
     indent_down();
-    indent(out) << "}" << endl;
+    indent(out) << "}" << '\n';
   } else if (ttype->is_list()) {
     t_list* tlist = (t_list*)ttype;
-    out << indent() << "for _, v := range " << prefix << " {" << endl;
+    out << indent() << "for _, v := range " << prefix << " {" << '\n';
 
     indent_up();
     generate_serialize_list_element(out, tlist, "v");
     indent_down();
-    indent(out) << "}" << endl;
+    indent(out) << "}" << '\n';
   }
 
   if (ttype->is_map()) {
-    out << indent() << "if err := oprot.WriteMapEnd(ctx); err != nil {" << endl;
-    out << indent() << "  return thrift.PrependError(\"error writing map end: \", err)" << endl;
-    out << indent() << "}" << endl;
+    out << indent() << "if err := oprot.WriteMapEnd(ctx); err != nil {" << '\n';
+    indent_up();
+    out << indent() << "return thrift.PrependError(\"error writing map end: \", err)" << '\n';
+    indent_down();
+    out << indent() << "}" << '\n';
   } else if (ttype->is_set()) {
-    out << indent() << "if err := oprot.WriteSetEnd(ctx); err != nil {" << endl;
-    out << indent() << "  return thrift.PrependError(\"error writing set end: \", err)" << endl;
-    out << indent() << "}" << endl;
+    out << indent() << "if err := oprot.WriteSetEnd(ctx); err != nil {" << '\n';
+    indent_up();
+    out << indent() << "return thrift.PrependError(\"error writing set end: \", err)" << '\n';
+    indent_down();
+    out << indent() << "}" << '\n';
   } else if (ttype->is_list()) {
-    out << indent() << "if err := oprot.WriteListEnd(ctx); err != nil {" << endl;
-    out << indent() << "  return thrift.PrependError(\"error writing list end: \", err)" << endl;
-    out << indent() << "}" << endl;
+    out << indent() << "if err := oprot.WriteListEnd(ctx); err != nil {" << '\n';
+    indent_up();
+    out << indent() << "return thrift.PrependError(\"error writing list end: \", err)" << '\n';
+    indent_down();
+    out << indent() << "}" << '\n';
   }
 }
 
@@ -3609,7 +3828,7 @@
       out << tgt << " != " << src;
     }
 
-    out << " { return false }" << endl;
+    out << " { return false }" << '\n';
   } else {
     throw "compiler error: Invalid type in generate_go_equals '" + ttype->get_name() + "' for '"
         + tgt + "'";
@@ -3625,7 +3844,7 @@
                                                string src) {
   (void)ttype;
   out << indent() << "if !" << tgt << "." << equals_method_name_ << "(" << src
-      << ") { return false }" << endl;
+      << ") { return false }" << '\n';
 }
 
 /**
@@ -3635,16 +3854,16 @@
                                                   t_type* ttype,
                                                   string tgt,
                                                   string src) {
-  out << indent() << "if len(" << tgt << ") != len(" << src << ") { return false }" << endl;
+  out << indent() << "if len(" << tgt << ") != len(" << src << ") { return false }" << '\n';
   if (ttype->is_map()) {
     t_map* tmap = (t_map*)ttype;
-    out << indent() << "for k, _tgt := range " << tgt << " {" << endl;
+    out << indent() << "for k, _tgt := range " << tgt << " {" << '\n';
     indent_up();
     string element_source = tmp("_src");
-    out << indent() << element_source << " := " << src << "[k]" << endl;
+    out << indent() << element_source << " := " << src << "[k]" << '\n';
     generate_go_equals(out, tmap->get_val_type(), "_tgt", element_source);
     indent_down();
-    indent(out) << "}" << endl;
+    indent(out) << "}" << '\n';
   } else if (ttype->is_list() || ttype->is_set()) {
     t_type* elem;
     if (ttype->is_list()) {
@@ -3654,13 +3873,13 @@
       t_set* temp = (t_set*)ttype;
       elem = temp->get_elem_type();
     }
-    out << indent() << "for i, _tgt := range " << tgt << " {" << endl;
+    out << indent() << "for i, _tgt := range " << tgt << " {" << '\n';
     indent_up();
     string element_source = tmp("_src");
-    out << indent() << element_source << " := " << src << "[i]" << endl;
+    out << indent() << element_source << " := " << src << "[i]" << '\n';
     generate_go_equals(out, elem, "_tgt", element_source);
     indent_down();
-    indent(out) << "}" << endl;
+    indent(out) << "}" << '\n';
   } else {
     throw "INVALID TYPE IN generate_go_equals_container '" + ttype->get_name();
   }
@@ -3699,7 +3918,7 @@
 
   if (fields.size() > 0) {
     if (has_doc) {
-      ss << endl;
+      ss << '\n';
     }
 
     has_doc = true;
@@ -3713,9 +3932,10 @@
       if (p->has_doc()) {
         ss << ": " << p->get_doc();
       } else {
-        ss << endl;
+        ss << '\n';
       }
     }
+    ss << '\n';
   }
 
   if (has_doc) {
@@ -4097,6 +4317,32 @@
   }
 }
 
+void t_go_generator::generate_deprecation_comment(ostream& out, const map<string, vector<string>>& annotations) {
+  auto iter = annotations.find("deprecated");
+  if (annotations.end() != iter) {
+    out << indent() << "// Deprecated: ";
+
+    bool first = true;
+    for (auto str_iter = iter->second.begin(); str_iter != iter->second.end(); ++str_iter) {
+      if (*str_iter == "1") {
+        // Empty annotations will generate "1", skip those.
+        continue;
+      }
+      if (first) {
+        first = false;
+      } else {
+        out << "; ";
+      }
+      out << *str_iter;
+    }
+    if (first) {
+      // All deprecation annotations are empty, put a generic reason here
+      out << "(no reason given)";
+    }
+    out << '\n';
+  }
+}
+
 bool format_go_output(const string& file_path) {
 
   // formatting via gofmt deactivated due to THRIFT-3893
diff --git a/compiler/cpp/src/thrift/generate/t_go_generator.h b/compiler/cpp/src/thrift/generate/t_go_generator.h
index a67485c..d84b186 100644
--- a/compiler/cpp/src/thrift/generate/t_go_generator.h
+++ b/compiler/cpp/src/thrift/generate/t_go_generator.h
@@ -44,8 +44,6 @@
 using std::stringstream;
 using std::vector;
 
-static const string endl = "\n"; // avoid ostream << std::endl flushes
-
 const string DEFAULT_THRIFT_IMPORT = "github.com/apache/thrift/lib/go/thrift";
 static std::string package_flag;
 
@@ -268,6 +266,8 @@
   std::string type_to_go_key_type(t_type* ttype);
   std::string type_to_spec_args(t_type* ttype);
 
+  void generate_deprecation_comment(std::ostream& os, const std::map<std::string, std::vector<std::string>>& annotations);
+
   void indent_up() { t_generator::indent_up(); }
   void indent_down() { t_generator::indent_down(); }
   std::string indent() { return t_generator::indent(); }
@@ -288,6 +288,10 @@
 
   static bool is_pointer_field(t_field* tfield, bool in_container = false);
 
+  std::string indent_str() const {
+    return "\t";
+  }
+
 private:
   std::string gen_package_prefix_;
   std::string gen_thrift_import_;
diff --git a/compiler/cpp/src/thrift/generate/t_gv_generator.cc b/compiler/cpp/src/thrift/generate/t_gv_generator.cc
index f8616ff..c91200b 100644
--- a/compiler/cpp/src/thrift/generate/t_gv_generator.cc
+++ b/compiler/cpp/src/thrift/generate/t_gv_generator.cc
@@ -38,8 +38,6 @@
 using std::stringstream;
 using std::vector;
 
-static const string endl = "\n"; // avoid ostream << std::endl flushes
-
 /**
  * Graphviz code generator
  */
@@ -110,10 +108,10 @@
   MKDIR(get_out_dir().c_str());
   string fname = get_out_dir() + program_->get_name() + ".gv";
   f_out_.open(fname.c_str());
-  f_out_ << "digraph \"" << escape_string(program_name_) << "\" {" << endl;
-  f_out_ << "node [style=filled, shape=record];" << endl;
-  f_out_ << "edge [arrowsize=0.5];" << endl;
-  f_out_ << "rankdir=LR" << endl;
+  f_out_ << "digraph \"" << escape_string(program_name_) << "\" {" << '\n';
+  f_out_ << "node [style=filled, shape=record];" << '\n';
+  f_out_ << "edge [arrowsize=0.5];" << '\n';
+  f_out_ << "rankdir=LR" << '\n';
 }
 
 /**
@@ -126,29 +124,29 @@
   // Print edges
   std::list<string>::iterator iter = edges.begin();
   for (; iter != edges.end(); iter++) {
-    f_out_ << (*iter) << endl;
+    f_out_ << (*iter) << '\n';
   }
 
   // Print graph end } and close file
-  f_out_ << "}" << endl;
+  f_out_ << "}" << '\n';
   f_out_.close();
 }
 
 void t_gv_generator::generate_typedef(t_typedef* ttypedef) {
   string name = ttypedef->get_name();
-  f_out_ << "node [fillcolor=azure];" << endl;
+  f_out_ << "node [fillcolor=azure];" << '\n';
   f_out_ << name << " [label=\"";
 
   f_out_ << escape_string(name);
   f_out_ << " :: ";
   print_type(ttypedef->get_type(), name);
 
-  f_out_ << "\"];" << endl;
+  f_out_ << "\"];" << '\n';
 }
 
 void t_gv_generator::generate_enum(t_enum* tenum) {
   string name = tenum->get_name();
-  f_out_ << "node [fillcolor=white];" << endl;
+  f_out_ << "node [fillcolor=white];" << '\n';
   f_out_ << name << " [label=\"enum " << escape_string(name);
 
   vector<t_enum_value*> values = tenum->get_constants();
@@ -159,13 +157,13 @@
     f_out_ << (*val_iter)->get_value();
   }
 
-  f_out_ << "\"];" << endl;
+  f_out_ << "\"];" << '\n';
 }
 
 void t_gv_generator::generate_const(t_const* tconst) {
   string name = tconst->get_name();
 
-  f_out_ << "node [fillcolor=aliceblue];" << endl;
+  f_out_ << "node [fillcolor=aliceblue];" << '\n';
   f_out_ << "const_" << name << " [label=\"";
 
   f_out_ << escape_string(name);
@@ -174,22 +172,22 @@
   f_out_ << " :: ";
   print_type(tconst->get_type(), "const_" + name);
 
-  f_out_ << "\"];" << endl;
+  f_out_ << "\"];" << '\n';
 }
 
 void t_gv_generator::generate_struct(t_struct* tstruct) {
   string name = tstruct->get_name();
 
   if (tstruct->is_xception()) {
-    f_out_ << "node [fillcolor=lightpink];" << endl;
+    f_out_ << "node [fillcolor=lightpink];" << '\n';
     f_out_ << name << " [label=\"";
     f_out_ << "exception " << escape_string(name);
   } else if (tstruct->is_union()) {
-    f_out_ << "node [fillcolor=lightcyan];" << endl;
+    f_out_ << "node [fillcolor=lightcyan];" << '\n';
     f_out_ << name << " [label=\"";
     f_out_ << "union " << escape_string(name);
   } else {
-    f_out_ << "node [fillcolor=beige];" << endl;
+    f_out_ << "node [fillcolor=beige];" << '\n';
     f_out_ << name << " [label=\"";
     f_out_ << "struct " << escape_string(name);
   }
@@ -208,7 +206,7 @@
     print_type((*mem_iter)->get_type(), name + ":field_" + field_name);
   }
 
-  f_out_ << "\"];" << endl;
+  f_out_ << "\"];" << '\n';
 }
 
 void t_gv_generator::print_type(t_type* ttype, string struct_field_ref) {
@@ -296,10 +294,10 @@
 
 void t_gv_generator::generate_service(t_service* tservice) {
   string service_name = get_service_name(tservice);
-  f_out_ << "subgraph cluster_" << service_name << " {" << endl;
-  f_out_ << "node [fillcolor=bisque];" << endl;
-  f_out_ << "style=dashed;" << endl;
-  f_out_ << "label = \"" << escape_string(service_name) << " service\";" << endl;
+  f_out_ << "subgraph cluster_" << service_name << " {" << '\n';
+  f_out_ << "node [fillcolor=bisque];" << '\n';
+  f_out_ << "style=dashed;" << '\n';
+  f_out_ << "label = \"" << escape_string(service_name) << " service\";" << '\n';
 
   // TODO: service extends
 
@@ -327,7 +325,7 @@
                  "function_" + service_name + fn_name + ":param_" + (*arg_iter)->get_name());
     }
     // end of node
-    f_out_ << "\"];" << endl;
+    f_out_ << "\"];" << '\n';
 
     // Exception edges
     if (exception_arrows) {
@@ -340,7 +338,7 @@
     }
   }
 
-  f_out_ << " }" << endl;	
+  f_out_ << " }" << '\n';
 }
 
 std::string t_gv_generator::display_name() const {
diff --git a/compiler/cpp/src/thrift/generate/t_haxe_generator.cc b/compiler/cpp/src/thrift/generate/t_haxe_generator.cc
index b236e0b..40d4ce2 100644
--- a/compiler/cpp/src/thrift/generate/t_haxe_generator.cc
+++ b/compiler/cpp/src/thrift/generate/t_haxe_generator.cc
@@ -37,8 +37,6 @@
 using std::stringstream;
 using std::vector;
 
-static const string endl = "\n"; // avoid ostream << std::endl flushes
-
 /**
  * Haxe code generator.
  *
@@ -424,10 +422,10 @@
   f_enum.open(f_enum_name.c_str());
 
   // Comment and package it
-  f_enum << autogen_comment() << haxe_package() << ";" << endl << endl;
+  f_enum << autogen_comment() << haxe_package() << ";" << '\n' << '\n';
 
   // Add haxe imports
-  f_enum << string() + "import org.apache.thrift.helper.*;" << endl << endl;
+  f_enum << string() + "import org.apache.thrift.helper.*;" << '\n' << '\n';
 
   generate_rtti_decoration(f_enum);
   generate_macro_decoration(f_enum);
@@ -439,11 +437,11 @@
   for (c_iter = constants.begin(); c_iter != constants.end(); ++c_iter) {
     int value = (*c_iter)->get_value();
     indent(f_enum) << "public static inline var " << (*c_iter)->get_name() << " : Int = " << value
-                   << ";" << endl;
+                   << ";" << '\n';
   }
 
   // Create a static Set with all valid values for this enum
-  f_enum << endl;
+  f_enum << '\n';
 
   indent(f_enum) << "public static var VALID_VALUES = { new IntSet( [";
   indent_up();
@@ -454,19 +452,19 @@
     firstValue = false;
   }
   indent_down();
-  f_enum << "]); };" << endl;
+  f_enum << "]); };" << '\n';
 
   indent(f_enum) << "public static var VALUES_TO_NAMES = { [";
   indent_up();
   firstValue = true;
   for (c_iter = constants.begin(); c_iter != constants.end(); ++c_iter) {
-    f_enum << (firstValue ? "" : ",") << endl;
+    f_enum << (firstValue ? "" : ",") << '\n';
     indent(f_enum) << (*c_iter)->get_name() << " => \"" << (*c_iter)->get_name() << "\"";
     firstValue = false;
   }
-  f_enum << endl;
+  f_enum << '\n';
   indent_down();
-  indent(f_enum) << "]; };" << endl;
+  indent(f_enum) << "]; };" << '\n';
 
   scope_down(f_enum); // end class
 
@@ -486,15 +484,15 @@
   f_consts.open(f_consts_name.c_str());
 
   // Print header
-  f_consts << autogen_comment() << haxe_package() << ";" << endl << endl;
+  f_consts << autogen_comment() << haxe_package() << ";" << '\n' << '\n';
 
-  f_consts << endl;
+  f_consts << '\n';
 
   f_consts << haxe_type_imports();
 
   generate_rtti_decoration(f_consts);
   generate_macro_decoration(f_consts);
-  indent(f_consts) << "class " << get_cap_name(program_name_) << "Constants {" << endl << endl;
+  indent(f_consts) << "class " << get_cap_name(program_name_) << "Constants {" << '\n' << '\n';
   indent_up();
   vector<t_const*>::iterator c_iter;
   for (c_iter = consts.begin(); c_iter != consts.end(); ++c_iter) {
@@ -504,7 +502,7 @@
                       (*c_iter)->get_value());
   }
   indent_down();
-  indent(f_consts) << "}" << endl;
+  indent(f_consts) << "}" << '\n';
   f_consts.close();
 }
 
@@ -527,7 +525,7 @@
   }
   out << " : " << get_cap_name(type_name(type)) << " = ";
   render_const_value(out, type, value);
-  out << ";" << endl << endl;
+  out << ";" << '\n' << '\n';
 }
 
 std::string t_haxe_generator::render_const_value_str( t_type* type, t_const_value* value) {
@@ -594,9 +592,9 @@
 void t_haxe_generator::render_struct_initializer(std::ostream& out,
                                                  t_struct* type,
                                                  t_const_value* value) {
-  out << "(function() : " << get_cap_name(type_name(type)) << " {" << endl;
+  out << "(function() : " << get_cap_name(type_name(type)) << " {" << '\n';
   indent_up();
-  indent(out) << "var tmp = new " << get_cap_name(type_name(type)) <<  "();" << endl; 
+  indent(out) << "var tmp = new " << get_cap_name(type_name(type)) <<  "();" << '\n';
 
   const vector<t_field*>& fields = ((t_struct*)type)->get_members();
   vector<t_field*>::const_iterator f_iter;
@@ -615,24 +613,24 @@
     }
     indent(out) << "tmp." << v_iter->first->get_string() << " = ";
     render_const_value(out, field_type, v_iter->second);
-    out << ";" << endl;
+    out << ";" << '\n';
   }
 
-  indent(out) << "return tmp;" << endl; 
+  indent(out) << "return tmp;" << '\n';
   indent_down();
-  indent(out) << "})()";  // no endl
+  indent(out) << "})()";  // no line break
 }
 
 void t_haxe_generator::render_map_initializer(std::ostream& out,
                                               t_map* type,
                                               t_const_value* value) {
-  out << "(function() : " << get_cap_name(type_name(type)) << " {" << endl;
+  out << "(function() : " << get_cap_name(type_name(type)) << " {" << '\n';
   indent_up();
-  indent(out) << "var tmp = new " << get_cap_name(type_name(type)) <<  "();" << endl; 
+  indent(out) << "var tmp = new " << get_cap_name(type_name(type)) <<  "();" << '\n';
 
   t_type* key_type = ((t_map*)type)->get_key_type();
   t_type* val_type = ((t_map*)type)->get_val_type();
-  
+
   const map<t_const_value*, t_const_value*, t_const_value::value_compare>& values = value->get_map();
   map<t_const_value*, t_const_value*, t_const_value::value_compare>::const_iterator v_iter;
   for (v_iter = values.begin(); v_iter != values.end(); ++v_iter) {
@@ -640,56 +638,56 @@
     render_const_value(out, key_type, v_iter->first);
     out << ", ";
     render_const_value(out, val_type, v_iter->second);
-    out << ");" << endl;
+    out << ");" << '\n';
   }
- 
-  indent(out) << "return tmp;" << endl; 
+
+  indent(out) << "return tmp;" << '\n';
   indent_down();
-  indent(out) << "})()";  // no endl
+  indent(out) << "})()";  // no line break
 }
 
 void t_haxe_generator::render_list_initializer(std::ostream& out,
                                                t_list* type,
                                                t_const_value* value) {
-  out << "(function() : " << get_cap_name(type_name(type)) << " {" << endl;
+  out << "(function() : " << get_cap_name(type_name(type)) << " {" << '\n';
   indent_up();
-  indent(out) << "var tmp = new " << get_cap_name(type_name(type)) <<  "();" << endl; 
+  indent(out) << "var tmp = new " << get_cap_name(type_name(type)) <<  "();" << '\n';
 
   t_type* elm_type = type->get_elem_type();
-  
+
   const vector<t_const_value*>& values = value->get_list();
   vector<t_const_value*>::const_iterator v_iter;
   for (v_iter = values.begin(); v_iter != values.end(); ++v_iter) {
     indent(out) << "tmp.add(";
     render_const_value(out, elm_type, *v_iter);
-    out << ");" << endl;
+    out << ");" << '\n';
   }
- 
-  indent(out) << "return tmp;" << endl; 
+
+  indent(out) << "return tmp;" << '\n';
   indent_down();
-  indent(out) << "})()";  // no endl
+  indent(out) << "})()";  // no line break
 }
 
 void t_haxe_generator::render_set_initializer(std::ostream& out,
                                               t_set* type,
                                               t_const_value* value) {
-  out << "(function() : " << get_cap_name(type_name(type)) << " {" << endl;
+  out << "(function() : " << get_cap_name(type_name(type)) << " {" << '\n';
   indent_up();
-  indent(out) << "var tmp = new " << get_cap_name(type_name(type)) <<  "();" << endl; 
+  indent(out) << "var tmp = new " << get_cap_name(type_name(type)) <<  "();" << '\n';
 
   t_type* elm_type = type->get_elem_type();
-  
+
   const vector<t_const_value*>& values = value->get_list();
   vector<t_const_value*>::const_iterator v_iter;
   for (v_iter = values.begin(); v_iter != values.end(); ++v_iter) {
     indent(out) << "tmp.add(";
     render_const_value(out, elm_type, *v_iter);
-    out << ");" << endl;
+    out << ");" << '\n';
   }
-  
-  indent(out) << "return tmp;" << endl; 
+
+  indent(out) << "return tmp;" << '\n';
   indent_down();
-  indent(out) << "})()";  // no endl
+  indent(out) << "})()";  // no line break
 }
 
 
@@ -723,14 +721,14 @@
   ofstream_with_content_based_conditional_update f_struct;
   f_struct.open(f_struct_name.c_str());
 
-  f_struct << autogen_comment() << haxe_package() << ";" << endl;
+  f_struct << autogen_comment() << haxe_package() << ";" << '\n';
 
-  f_struct << endl;
+  f_struct << '\n';
 
   string imports;
 
   f_struct << haxe_type_imports() << haxe_thrift_imports()
-           << haxe_thrift_gen_imports(tstruct, imports) << endl;
+           << haxe_thrift_gen_imports(tstruct, imports) << '\n';
 
   generate_haxe_struct_definition(f_struct, tstruct, is_exception, is_result);
 
@@ -762,11 +760,11 @@
   if (is_exception) {
     out << "extends TException ";
   }
-  out << "implements TBase {" << endl << endl;
+  out << "implements TBase {" << '\n' << '\n';
   indent_up();
 
   indent(out) << "static var STRUCT_DESC = { new TStruct(\"" << tstruct->get_name() << "\"); };"
-              << endl;
+              << '\n';
 
   const vector<t_field*>& members = tstruct->get_members();
   vector<t_field*>::const_iterator m_iter;
@@ -775,69 +773,69 @@
     indent(out) << "static var " << constant_name((*m_iter)->get_name())
                 << "_FIELD_DESC = { new TField(\"" << (*m_iter)->get_name() << "\", "
                 << type_to_enum((*m_iter)->get_type()) << ", " << (*m_iter)->get_key() << "); };"
-                << endl;
+                << '\n';
   }
-  out << endl;
+  out << '\n';
 
   for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
     generate_haxe_doc(out, *m_iter);
     // indent(out) << "private var _" << (*m_iter)->get_name() + " : " +
-    // type_name((*m_iter)->get_type()) << ";" << endl;
-    indent(out) << "@:isVar" << endl;
+    // type_name((*m_iter)->get_type()) << ";" << '\n';
+    indent(out) << "@:isVar" << '\n';
     indent(out) << "public var "
                 << (*m_iter)->get_name() + "(get,set) : "
-                   + get_cap_name(type_name((*m_iter)->get_type())) << ";" << endl;
+                   + get_cap_name(type_name((*m_iter)->get_type())) << ";" << '\n';
   }
 
-  out << endl;
+  out << '\n';
 
   for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
     indent(out) << "inline static var " << upcase_string((*m_iter)->get_name())
-                << "_FIELD_ID : Int = " << (*m_iter)->get_key() << ";" << endl;
+                << "_FIELD_ID : Int = " << (*m_iter)->get_key() << ";" << '\n';
   }
 
-  out << endl;
+  out << '\n';
 
   // Inner Isset class
   if (members.size() > 0) {
     for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
       if (!type_can_be_null((*m_iter)->get_type())) {
         indent(out) << "private var __isset_" << (*m_iter)->get_name() << " : Bool = false;"
-                    << endl;
+                    << '\n';
       }
     }
   }
 
-  out << endl;
+  out << '\n';
 
   // Static initializer to populate global class to struct metadata map
   if (false) {
     // TODO: reactivate when needed
     generate_haxe_meta_data_map(out, tstruct);
-    indent(out) << "{" << endl;
+    indent(out) << "{" << '\n';
     indent_up();
     indent(out) << "FieldMetaData.addStructMetaDataMap(" << type_name(tstruct) << ", metaDataMap);"
-                << endl;
+                << '\n';
     indent_down();
-    indent(out) << "}" << endl;
-    indent(out) << "}" << endl;
+    indent(out) << "}" << '\n';
+    indent(out) << "}" << '\n';
   }
 
   // Default constructor
-  indent(out) << "public function new() {" << endl;
+  indent(out) << "public function new() {" << '\n';
   indent_up();
   if (is_exception) {
-    indent(out) << "super();" << endl;
+    indent(out) << "super();" << '\n';
   }
   for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
     if ((*m_iter)->get_value() != nullptr) {
       indent(out) << "this." << (*m_iter)->get_name() << " = ";
       render_const_value( out, (*m_iter)->get_type(), (*m_iter)->get_value());
-      out << ";" << endl;
+      out << ";" << '\n';
     }
   }
   indent_down();
-  indent(out) << "}" << endl << endl;
+  indent(out) << "}" << '\n' << '\n';
 
   generate_property_getters_setters(out, tstruct);
   generate_generic_field_getters_setters(out, tstruct);
@@ -852,7 +850,7 @@
   generate_haxe_struct_tostring(out, tstruct, is_exception);
   generate_haxe_validator(out, tstruct);
   scope_down(out);
-  out << endl;
+  out << '\n';
 }
 
 /**
@@ -861,123 +859,123 @@
  * @param tstruct The struct definition
  */
 void t_haxe_generator::generate_haxe_struct_reader(ostream& out, t_struct* tstruct) {
-  out << indent() << "public function read( iprot : TProtocol) : Void {" << endl;
+  out << indent() << "public function read( iprot : TProtocol) : Void {" << '\n';
   indent_up();
 
   const vector<t_field*>& fields = tstruct->get_members();
   vector<t_field*>::const_iterator f_iter;
 
-  indent(out) << "iprot.IncrementRecursionDepth();" << endl;
-  indent(out) << "try" << endl;
+  indent(out) << "iprot.IncrementRecursionDepth();" << '\n';
+  indent(out) << "try" << '\n';
   scope_up(out);
 
   // Declare stack tmp variables and read struct header
-  out << indent() << "var field : TField;" << endl << indent() << "iprot.readStructBegin();"
-      << endl;
+  out << indent() << "var field : TField;" << '\n' << indent() << "iprot.readStructBegin();"
+      << '\n';
 
   // Loop over reading in fields
-  indent(out) << "while (true)" << endl;
+  indent(out) << "while (true)" << '\n';
   scope_up(out);
 
   // Read beginning field marker
-  indent(out) << "field = iprot.readFieldBegin();" << endl;
+  indent(out) << "field = iprot.readFieldBegin();" << '\n';
 
   // Check for field STOP marker and break
-  indent(out) << "if (field.type == TType.STOP) { " << endl;
+  indent(out) << "if (field.type == TType.STOP) { " << '\n';
   indent_up();
-  indent(out) << "break;" << endl;
+  indent(out) << "break;" << '\n';
   indent_down();
-  indent(out) << "}" << endl;
+  indent(out) << "}" << '\n';
 
   // Switch statement on the field we are reading
-  indent(out) << "switch (field.id)" << endl;
+  indent(out) << "switch (field.id)" << '\n';
 
   scope_up(out);
 
   // Generate deserialization code for known cases
   for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
-    indent(out) << "case " << upcase_string((*f_iter)->get_name()) << "_FIELD_ID:" << endl;
+    indent(out) << "case " << upcase_string((*f_iter)->get_name()) << "_FIELD_ID:" << '\n';
     indent_up();
-    indent(out) << "if (field.type == " << type_to_enum((*f_iter)->get_type()) << ") {" << endl;
+    indent(out) << "if (field.type == " << type_to_enum((*f_iter)->get_type()) << ") {" << '\n';
     indent_up();
 
     generate_deserialize_field(out, *f_iter, "this.");
     generate_isset_set(out, *f_iter);
     indent_down();
-    out << indent() << "} else { " << endl << indent() << "  TProtocolUtil.skip(iprot, field.type);"
-        << endl << indent() << "}" << endl;
+    out << indent() << "} else { " << '\n' << indent() << "  TProtocolUtil.skip(iprot, field.type);"
+        << '\n' << indent() << "}" << '\n';
     indent_down();
   }
 
   // In the default case we skip the field
-  out << indent() << "default:" << endl << indent() << "  TProtocolUtil.skip(iprot, field.type);"
-      << endl;
+  out << indent() << "default:" << '\n' << indent() << "  TProtocolUtil.skip(iprot, field.type);"
+      << '\n';
 
   scope_down(out);
 
   // Read field end marker
-  indent(out) << "iprot.readFieldEnd();" << endl;
+  indent(out) << "iprot.readFieldEnd();" << '\n';
 
   scope_down(out);
 
-  out << indent() << "iprot.readStructEnd();" << endl << endl;
+  out << indent() << "iprot.readStructEnd();" << '\n' << '\n';
 
-  indent(out) << "iprot.DecrementRecursionDepth();" << endl;
+  indent(out) << "iprot.DecrementRecursionDepth();" << '\n';
   scope_down(out);
-  indent(out) << "catch(e:Dynamic)" << endl;
+  indent(out) << "catch(e:Dynamic)" << '\n';
   scope_up(out);
-  indent(out) << "iprot.DecrementRecursionDepth();" << endl;
-  indent(out) << "throw e;" << endl;
+  indent(out) << "iprot.DecrementRecursionDepth();" << '\n';
+  indent(out) << "throw e;" << '\n';
   scope_down(out);
 
   // check for required fields of primitive type
   // (which can be checked here but not in the general validate method)
-  out << endl << indent() << "// check for required fields of primitive type, which can't be "
-                             "checked in the validate method" << endl;
+  out << '\n' << indent() << "// check for required fields of primitive type, which can't be "
+                             "checked in the validate method" << '\n';
   for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
     if ((*f_iter)->get_req() == t_field::T_REQUIRED && !type_can_be_null((*f_iter)->get_type())) {
-      out << indent() << "if (!__isset_" << (*f_iter)->get_name() << ") {" << endl << indent()
+      out << indent() << "if (!__isset_" << (*f_iter)->get_name() << ") {" << '\n' << indent()
           << "  throw new TProtocolException(TProtocolException.UNKNOWN, \"Required field '"
           << (*f_iter)->get_name()
-          << "' was not found in serialized data! Struct: \" + toString());" << endl << indent()
-          << "}" << endl;
+          << "' was not found in serialized data! Struct: \" + toString());" << '\n' << indent()
+          << "}" << '\n';
     }
   }
 
   // performs various checks (e.g. check that all required fields are set)
-  indent(out) << "validate();" << endl;
+  indent(out) << "validate();" << '\n';
 
   indent_down();
-  out << indent() << "}" << endl << endl;
+  out << indent() << "}" << '\n' << '\n';
 }
 
 // generates haxe method to perform various checks
 // (e.g. check that all required fields are set)
 void t_haxe_generator::generate_haxe_validator(ostream& out, t_struct* tstruct) {
-  indent(out) << "public function validate() : Void {" << endl;
+  indent(out) << "public function validate() : Void {" << '\n';
   indent_up();
 
   const vector<t_field*>& fields = tstruct->get_members();
   vector<t_field*>::const_iterator f_iter;
 
-  out << indent() << "// check for required fields" << endl;
+  out << indent() << "// check for required fields" << '\n';
   for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
     if ((*f_iter)->get_req() == t_field::T_REQUIRED) {
       if (type_can_be_null((*f_iter)->get_type())) {
-        indent(out) << "if (" << (*f_iter)->get_name() << " == null) {" << endl;
+        indent(out) << "if (" << (*f_iter)->get_name() << " == null) {" << '\n';
         indent(out)
             << "  throw new TProtocolException(TProtocolException.UNKNOWN, \"Required field '"
-            << (*f_iter)->get_name() << "' was not present! Struct: \" + toString());" << endl;
-        indent(out) << "}" << endl;
+            << (*f_iter)->get_name() << "' was not present! Struct: \" + toString());" << '\n';
+        indent(out) << "}" << '\n';
       } else {
         indent(out) << "// alas, we cannot check '" << (*f_iter)->get_name()
-                    << "' because it's a primitive." << endl;
+                    << "' because it's a primitive." << '\n';
       }
     }
   }
 
   // check that fields of type enum have valid values
-  out << indent() << "// check that fields of type enum have valid values" << endl;
+  out << indent() << "// check that fields of type enum have valid values" << '\n';
   for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
     t_field* field = (*f_iter);
     t_type* type = field->get_type();
@@ -985,18 +983,18 @@
     if (type->is_enum()) {
       indent(out) << "if (" << generate_isset_check(field) << " && !"
                   << get_cap_name(get_enum_class_name(type)) << ".VALID_VALUES.contains("
-                  << field->get_name() << ")){" << endl;
+                  << field->get_name() << ")){" << '\n';
       indent_up();
       indent(out) << "throw new TProtocolException(TProtocolException.UNKNOWN, \"The field '"
                   << field->get_name() << "' has been assigned the invalid value \" + "
-                  << field->get_name() << ");" << endl;
+                  << field->get_name() << ");" << '\n';
       indent_down();
-      indent(out) << "}" << endl;
+      indent(out) << "}" << '\n';
     }
   }
 
   indent_down();
-  indent(out) << "}" << endl << endl;
+  indent(out) << "}" << '\n' << '\n';
 }
 
 /**
@@ -1005,7 +1003,7 @@
  * @param tstruct The struct definition
  */
 void t_haxe_generator::generate_haxe_struct_writer(ostream& out, t_struct* tstruct) {
-  out << indent() << "public function write(oprot:TProtocol) : Void {" << endl;
+  out << indent() << "public function write(oprot:TProtocol) : Void {" << '\n';
   indent_up();
 
   string name = tstruct->get_name();
@@ -1013,57 +1011,57 @@
   vector<t_field*>::const_iterator f_iter;
 
   // performs various checks (e.g. check that all required fields are set)
-  indent(out) << "validate();" << endl;
-  indent(out) << "oprot.IncrementRecursionDepth();" << endl;
-  indent(out) << "try" << endl;
+  indent(out) << "validate();" << '\n';
+  indent(out) << "oprot.IncrementRecursionDepth();" << '\n';
+  indent(out) << "try" << '\n';
   scope_up(out);
 
-  indent(out) << "oprot.writeStructBegin(STRUCT_DESC);" << endl;
+  indent(out) << "oprot.writeStructBegin(STRUCT_DESC);" << '\n';
 
   for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
     bool could_be_unset = (*f_iter)->get_req() == t_field::T_OPTIONAL;
     if (could_be_unset) {
-      indent(out) << "if (" << generate_isset_check(*f_iter) << ") {" << endl;
+      indent(out) << "if (" << generate_isset_check(*f_iter) << ") {" << '\n';
       indent_up();
     }
     bool null_allowed = type_can_be_null((*f_iter)->get_type());
     if (null_allowed) {
-      out << indent() << "if (this." << (*f_iter)->get_name() << " != null) {" << endl;
+      out << indent() << "if (this." << (*f_iter)->get_name() << " != null) {" << '\n';
       indent_up();
     }
 
     indent(out) << "oprot.writeFieldBegin(" << constant_name((*f_iter)->get_name())
-                << "_FIELD_DESC);" << endl;
+                << "_FIELD_DESC);" << '\n';
 
     // Write field contents
     generate_serialize_field(out, *f_iter, "this.");
 
     // Write field closer
-    indent(out) << "oprot.writeFieldEnd();" << endl;
+    indent(out) << "oprot.writeFieldEnd();" << '\n';
 
     if (null_allowed) {
       indent_down();
-      indent(out) << "}" << endl;
+      indent(out) << "}" << '\n';
     }
     if (could_be_unset) {
       indent_down();
-      indent(out) << "}" << endl;
+      indent(out) << "}" << '\n';
     }
   }
 
-  indent(out) << "oprot.writeFieldStop();" << endl;
-  indent(out) << "oprot.writeStructEnd();" << endl;
+  indent(out) << "oprot.writeFieldStop();" << '\n';
+  indent(out) << "oprot.writeStructEnd();" << '\n';
 
-  indent(out) << "oprot.DecrementRecursionDepth();" << endl;
+  indent(out) << "oprot.DecrementRecursionDepth();" << '\n';
   scope_down(out);
-  indent(out) << "catch(e:Dynamic)" << endl;
+  indent(out) << "catch(e:Dynamic)" << '\n';
   scope_up(out);
-  indent(out) << "oprot.DecrementRecursionDepth();" << endl;
-  indent(out) << "throw e;" << endl;
+  indent(out) << "oprot.DecrementRecursionDepth();" << '\n';
+  indent(out) << "throw e;" << '\n';
   scope_down(out);
 
   indent_down();
-  out << indent() << "}" << endl << endl;
+  out << indent() << "}" << '\n' << '\n';
 }
 
 /**
@@ -1075,59 +1073,59 @@
  * @param tstruct The struct definition
  */
 void t_haxe_generator::generate_haxe_struct_result_writer(ostream& out, t_struct* tstruct) {
-  out << indent() << "public function write(oprot:TProtocol) : Void {" << endl;
+  out << indent() << "public function write(oprot:TProtocol) : Void {" << '\n';
   indent_up();
 
   string name = tstruct->get_name();
   const vector<t_field*>& fields = tstruct->get_sorted_members();
   vector<t_field*>::const_iterator f_iter;
 
-  indent(out) << "oprot.IncrementRecursionDepth();" << endl;
-  indent(out) << "try" << endl;
+  indent(out) << "oprot.IncrementRecursionDepth();" << '\n';
+  indent(out) << "try" << '\n';
   scope_up(out);
 
-  indent(out) << "oprot.writeStructBegin(STRUCT_DESC);" << endl;
+  indent(out) << "oprot.writeStructBegin(STRUCT_DESC);" << '\n';
 
   bool first = true;
   for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
     if (first) {
       first = false;
-      out << endl << indent() << "if ";
+      out << '\n' << indent() << "if ";
     } else {
       out << " else if ";
     }
 
-    out << "(this." << generate_isset_check(*f_iter) << ") {" << endl;
+    out << "(this." << generate_isset_check(*f_iter) << ") {" << '\n';
 
     indent_up();
 
     indent(out) << "oprot.writeFieldBegin(" << constant_name((*f_iter)->get_name())
-                << "_FIELD_DESC);" << endl;
+                << "_FIELD_DESC);" << '\n';
 
     // Write field contents
     generate_serialize_field(out, *f_iter, "this.");
 
     // Write field closer
-    indent(out) << "oprot.writeFieldEnd();" << endl;
+    indent(out) << "oprot.writeFieldEnd();" << '\n';
 
     indent_down();
     indent(out) << "}";
   }
 
-  indent(out) << endl;
-  indent(out) << "oprot.writeFieldStop();" << endl;
-  indent(out) << "oprot.writeStructEnd();" << endl;
+  indent(out) << '\n';
+  indent(out) << "oprot.writeFieldStop();" << '\n';
+  indent(out) << "oprot.writeStructEnd();" << '\n';
 
-  indent(out) << "oprot.DecrementRecursionDepth();" << endl;
+  indent(out) << "oprot.DecrementRecursionDepth();" << '\n';
   scope_down(out);
-  indent(out) << "catch(e:Dynamic)" << endl;
+  indent(out) << "catch(e:Dynamic)" << '\n';
   scope_up(out);
-  indent(out) << "oprot.DecrementRecursionDepth();" << endl;
-  indent(out) << "throw e;" << endl;
+  indent(out) << "oprot.DecrementRecursionDepth();" << '\n';
+  indent(out) << "throw e;" << '\n';
   scope_down(out);
 
   indent_down();
-  out << indent() << "}" << endl << endl;
+  out << indent() << "}" << '\n' << '\n';
 }
 
 void t_haxe_generator::generate_reflection_getters(ostringstream& out,
@@ -1136,9 +1134,9 @@
                                                    string cap_name) {
   (void)type;
   (void)cap_name;
-  indent(out) << "case " << upcase_string(field_name) << "_FIELD_ID:" << endl;
+  indent(out) << "case " << upcase_string(field_name) << "_FIELD_ID:" << '\n';
   indent_up();
-  indent(out) << "return this." << field_name << ";" << endl;
+  indent(out) << "return this." << field_name << ";" << '\n';
   indent_down();
 }
 
@@ -1148,13 +1146,13 @@
                                                    string cap_name) {
   (void)type;
   (void)cap_name;
-  indent(out) << "case " << upcase_string(field_name) << "_FIELD_ID:" << endl;
+  indent(out) << "case " << upcase_string(field_name) << "_FIELD_ID:" << '\n';
   indent_up();
-  indent(out) << "if (value == null) {" << endl;
-  indent(out) << "  unset" << get_cap_name(field_name) << "();" << endl;
-  indent(out) << "} else {" << endl;
-  indent(out) << "  this." << field_name << " = value;" << endl;
-  indent(out) << "}" << endl << endl;
+  indent(out) << "if (value == null) {" << '\n';
+  indent(out) << "  unset" << get_cap_name(field_name) << "();" << '\n';
+  indent(out) << "} else {" << '\n';
+  indent(out) << "  this." << field_name << " = value;" << '\n';
+  indent(out) << "}" << '\n' << '\n';
 
   indent_down();
 }
@@ -1181,39 +1179,39 @@
   }
 
   // create the setter
-  indent(out) << "public function setFieldValue(fieldID : Int, value : Dynamic) : Void {" << endl;
+  indent(out) << "public function setFieldValue(fieldID : Int, value : Dynamic) : Void {" << '\n';
   indent_up();
 
   if (fields.size() > 0) {
-    indent(out) << "switch (fieldID) {" << endl;
+    indent(out) << "switch (fieldID) {" << '\n';
     out << setter_stream.str();
-    indent(out) << "default:" << endl;
-    indent(out) << "  throw new ArgumentError(\"Field \" + fieldID + \" doesn't exist!\");" << endl;
-    indent(out) << "}" << endl;
+    indent(out) << "default:" << '\n';
+    indent(out) << "  throw new ArgumentError(\"Field \" + fieldID + \" doesn't exist!\");" << '\n';
+    indent(out) << "}" << '\n';
   } else {
-    indent(out) << "throw new ArgumentError(\"Field \" + fieldID + \" doesn't exist!\");" << endl;
+    indent(out) << "throw new ArgumentError(\"Field \" + fieldID + \" doesn't exist!\");" << '\n';
   }
 
   indent_down();
-  indent(out) << "}" << endl << endl;
+  indent(out) << "}" << '\n' << '\n';
 
   // create the getter
-  indent(out) << "public function getFieldValue(fieldID : Int) : Dynamic {" << endl;
+  indent(out) << "public function getFieldValue(fieldID : Int) : Dynamic {" << '\n';
   indent_up();
 
   if (fields.size() > 0) {
-    indent(out) << "switch (fieldID) {" << endl;
+    indent(out) << "switch (fieldID) {" << '\n';
     out << getter_stream.str();
-    indent(out) << "default:" << endl;
-    indent(out) << "  throw new ArgumentError(\"Field \" + fieldID + \" doesn't exist!\");" << endl;
-    indent(out) << "}" << endl;
+    indent(out) << "default:" << '\n';
+    indent(out) << "  throw new ArgumentError(\"Field \" + fieldID + \" doesn't exist!\");" << '\n';
+    indent(out) << "}" << '\n';
   } else {
-    indent(out) << "throw new ArgumentError(\"Field \" + fieldID + \" doesn't exist!\");" << endl;
+    indent(out) << "throw new ArgumentError(\"Field \" + fieldID + \" doesn't exist!\");" << '\n';
   }
 
   indent_down();
 
-  indent(out) << "}" << endl << endl;
+  indent(out) << "}" << '\n' << '\n';
 }
 
 // Creates a generic isSet method that takes the field number as argument
@@ -1223,29 +1221,29 @@
 
   // create the isSet method
   indent(out) << "// Returns true if field corresponding to fieldID is set (has been assigned a "
-                 "value) and false otherwise" << endl;
-  indent(out) << "public function isSet(fieldID : Int) : Bool {" << endl;
+                 "value) and false otherwise" << '\n';
+  indent(out) << "public function isSet(fieldID : Int) : Bool {" << '\n';
   indent_up();
   if (fields.size() > 0) {
-    indent(out) << "switch (fieldID) {" << endl;
+    indent(out) << "switch (fieldID) {" << '\n';
 
     for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
       t_field* field = *f_iter;
-      indent(out) << "case " << upcase_string(field->get_name()) << "_FIELD_ID:" << endl;
+      indent(out) << "case " << upcase_string(field->get_name()) << "_FIELD_ID:" << '\n';
       indent_up();
-      indent(out) << "return " << generate_isset_check(field) << ";" << endl;
+      indent(out) << "return " << generate_isset_check(field) << ";" << '\n';
       indent_down();
     }
 
-    indent(out) << "default:" << endl;
-    indent(out) << "  throw new ArgumentError(\"Field \" + fieldID + \" doesn't exist!\");" << endl;
-    indent(out) << "}" << endl;
+    indent(out) << "default:" << '\n';
+    indent(out) << "  throw new ArgumentError(\"Field \" + fieldID + \" doesn't exist!\");" << '\n';
+    indent(out) << "}" << '\n';
   } else {
-    indent(out) << "throw new ArgumentError(\"Field \" + fieldID + \" doesn't exist!\");" << endl;
+    indent(out) << "throw new ArgumentError(\"Field \" + fieldID + \" doesn't exist!\");" << '\n';
   }
 
   indent_down();
-  indent(out) << "}" << endl << endl;
+  indent(out) << "}" << '\n' << '\n';
 }
 
 /**
@@ -1265,48 +1263,48 @@
     // Simple getter
     generate_haxe_doc(out, field);
     indent(out) << "public function get_" << field_name << "() : " << get_cap_name(type_name(type))
-                << " {" << endl;
+                << " {" << '\n';
     indent_up();
-    indent(out) << "return this." << field_name << ";" << endl;
+    indent(out) << "return this." << field_name << ";" << '\n';
     indent_down();
-    indent(out) << "}" << endl << endl;
+    indent(out) << "}" << '\n' << '\n';
 
     // Simple setter
     generate_haxe_doc(out, field);
     indent(out) << "public function set_" << field_name << "(" << field_name << ":"
                 << get_cap_name(type_name(type)) << ") : " << get_cap_name(type_name(type)) << " {"
-                << endl;
+                << '\n';
     indent_up();
-    indent(out) << "this." << field_name << " = " << field_name << ";" << endl;
+    indent(out) << "this." << field_name << " = " << field_name << ";" << '\n';
     generate_isset_set(out, field);
-    indent(out) << "return this." << field_name << ";" << endl;
+    indent(out) << "return this." << field_name << ";" << '\n';
 
     indent_down();
-    indent(out) << "}" << endl << endl;
+    indent(out) << "}" << '\n' << '\n';
 
     // Unsetter
-    indent(out) << "public function unset" << cap_name << "() : Void {" << endl;
+    indent(out) << "public function unset" << cap_name << "() : Void {" << '\n';
     indent_up();
     if (type_can_be_null(type)) {
-      indent(out) << "this." << field_name << " = null;" << endl;
+      indent(out) << "this." << field_name << " = null;" << '\n';
     } else {
-      indent(out) << "this.__isset_" << field_name << " = false;" << endl;
+      indent(out) << "this.__isset_" << field_name << " = false;" << '\n';
     }
     indent_down();
-    indent(out) << "}" << endl << endl;
+    indent(out) << "}" << '\n' << '\n';
 
     // isSet method
     indent(out) << "// Returns true if field " << field_name
-                << " is set (has been assigned a value) and false otherwise" << endl;
-    indent(out) << "public function is" << get_cap_name("set") << cap_name << "() : Bool {" << endl;
+                << " is set (has been assigned a value) and false otherwise" << '\n';
+    indent(out) << "public function is" << get_cap_name("set") << cap_name << "() : Bool {" << '\n';
     indent_up();
     if (type_can_be_null(type)) {
-      indent(out) << "return this." << field_name << " != null;" << endl;
+      indent(out) << "return this." << field_name << " != null;" << '\n';
     } else {
-      indent(out) << "return this.__isset_" << field_name << ";" << endl;
+      indent(out) << "return this.__isset_" << field_name << ";" << '\n';
     }
     indent_down();
-    indent(out) << "}" << endl << endl;
+    indent(out) << "}" << '\n' << '\n';
   }
 }
 
@@ -1320,11 +1318,11 @@
   if( is_override) {
     out << "override ";
   }
-  out << "function toString() : String {" << endl;
+  out << "function toString() : String {" << '\n';
   indent_up();
 
-  out << indent() << "var ret : String = \"" << tstruct->get_name() << "(\";" << endl;
-  out << indent() << "var first : Bool = true;" << endl << endl;
+  out << indent() << "var ret : String = \"" << tstruct->get_name() << "(\";" << '\n';
+  out << indent() << "var first : Bool = true;" << '\n' << '\n';
 
   const vector<t_field*>& fields = tstruct->get_members();
   vector<t_field*>::const_iterator f_iter;
@@ -1332,58 +1330,58 @@
   for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
     bool could_be_unset = (*f_iter)->get_req() == t_field::T_OPTIONAL;
     if (could_be_unset) {
-      indent(out) << "if (" << generate_isset_check(*f_iter) << ") {" << endl;
+      indent(out) << "if (" << generate_isset_check(*f_iter) << ") {" << '\n';
       indent_up();
     }
 
     t_field* field = (*f_iter);
 
     if (!first) {
-      indent(out) << "if (!first) ret +=  \", \";" << endl;
+      indent(out) << "if (!first) ret +=  \", \";" << '\n';
     }
-    indent(out) << "ret += \"" << (*f_iter)->get_name() << ":\";" << endl;
+    indent(out) << "ret += \"" << (*f_iter)->get_name() << ":\";" << '\n';
     bool can_be_null = type_can_be_null(field->get_type());
     if (can_be_null) {
-      indent(out) << "if (this." << (*f_iter)->get_name() << " == null) {" << endl;
-      indent(out) << "  ret += \"null\";" << endl;
-      indent(out) << "} else {" << endl;
+      indent(out) << "if (this." << (*f_iter)->get_name() << " == null) {" << '\n';
+      indent(out) << "  ret += \"null\";" << '\n';
+      indent(out) << "} else {" << '\n';
       indent_up();
     }
 
     if (field->get_type()->is_binary()) {
-      indent(out) << "  ret += \"BINARY\";" << endl;
+      indent(out) << "  ret += \"BINARY\";" << '\n';
     } else if (field->get_type()->is_enum()) {
       indent(out) << "var " << field->get_name()
                   << "_name : String = " << get_cap_name(get_enum_class_name(field->get_type()))
-                  << ".VALUES_TO_NAMES[this." << (*f_iter)->get_name() << "];" << endl;
-      indent(out) << "if (" << field->get_name() << "_name != null) {" << endl;
-      indent(out) << "  ret += " << field->get_name() << "_name;" << endl;
-      indent(out) << "  ret += \" (\";" << endl;
-      indent(out) << "}" << endl;
-      indent(out) << "ret += this." << field->get_name() << ";" << endl;
-      indent(out) << "if (" << field->get_name() << "_name != null) {" << endl;
-      indent(out) << "  ret += \")\";" << endl;
-      indent(out) << "}" << endl;
+                  << ".VALUES_TO_NAMES[this." << (*f_iter)->get_name() << "];" << '\n';
+      indent(out) << "if (" << field->get_name() << "_name != null) {" << '\n';
+      indent(out) << "  ret += " << field->get_name() << "_name;" << '\n';
+      indent(out) << "  ret += \" (\";" << '\n';
+      indent(out) << "}" << '\n';
+      indent(out) << "ret += this." << field->get_name() << ";" << '\n';
+      indent(out) << "if (" << field->get_name() << "_name != null) {" << '\n';
+      indent(out) << "  ret += \")\";" << '\n';
+      indent(out) << "}" << '\n';
     } else {
-      indent(out) << "ret += this." << (*f_iter)->get_name() << ";" << endl;
+      indent(out) << "ret += this." << (*f_iter)->get_name() << ";" << '\n';
     }
 
     if (can_be_null) {
       indent_down();
-      indent(out) << "}" << endl;
+      indent(out) << "}" << '\n';
     }
-    indent(out) << "first = false;" << endl;
+    indent(out) << "first = false;" << '\n';
 
     if (could_be_unset) {
       indent_down();
-      indent(out) << "}" << endl;
+      indent(out) << "}" << '\n';
     }
     first = false;
   }
-  out << indent() << "ret += \")\";" << endl << indent() << "return ret;" << endl;
+  out << indent() << "ret += \")\";" << '\n' << indent() << "return ret;" << '\n';
 
   indent_down();
-  indent(out) << "}" << endl << endl;
+  indent(out) << "}" << '\n' << '\n';
 }
 
 /**
@@ -1397,7 +1395,7 @@
   vector<t_field*>::const_iterator f_iter;
 
   // Static Map with fieldID -> FieldMetaData mappings
-  indent(out) << "inline static var metaDataMap : IntMap = new IntMap();" << endl;
+  indent(out) << "inline static var metaDataMap : IntMap = new IntMap();" << '\n';
 
   if (fields.size() > 0) {
     // Populate map
@@ -1419,7 +1417,7 @@
 
       // Create value meta data
       generate_field_value_meta_data(out, field->get_type());
-      out << ");" << endl;
+      out << ");" << '\n';
     }
     scope_down(out);
   }
@@ -1484,7 +1482,7 @@
 }
 
 void t_haxe_generator::generate_field_value_meta_data(std::ostream& out, t_type* type) {
-  out << endl;
+  out << '\n';
   indent_up();
   indent_up();
   if (type->is_struct()) {
@@ -1527,20 +1525,20 @@
   string f_service_name = package_dir_ + "/" + get_cap_name(service_name_) + "_service.hx";
   f_service_.open(f_service_name.c_str());
 
-  f_service_ << autogen_comment() << haxe_package() << ";" << endl;
+  f_service_ << autogen_comment() << haxe_package() << ";" << '\n';
 
-  f_service_ << endl << haxe_type_imports() << haxe_thrift_imports()
+  f_service_ << '\n' << haxe_type_imports() << haxe_thrift_imports()
              << haxe_thrift_gen_imports(tservice);
 
   if (tservice->get_extends() != nullptr) {
     t_type* parent = tservice->get_extends();
     string parent_namespace = make_package_name( parent->get_program()->get_namespace("haxe"));
     if (!parent_namespace.empty() && parent_namespace != package_name_) {
-      f_service_ << "import " << get_cap_name(type_name(parent)) << "_service;" << endl;
+      f_service_ << "import " << get_cap_name(type_name(parent)) << "_service;" << '\n';
     }
   }
 
-  f_service_ << endl;
+  f_service_ << '\n';
 
   generate_service_interface(tservice,false);
   f_service_.close();
@@ -1549,20 +1547,20 @@
   f_service_name = package_dir_ + "/" + get_cap_name(service_name_) + ".hx";
   f_service_.open(f_service_name.c_str());
 
-  f_service_ << autogen_comment() << haxe_package() << ";" << endl;
+  f_service_ << autogen_comment() << haxe_package() << ";" << '\n';
 
-  f_service_ << endl << haxe_type_imports() << haxe_thrift_imports()
+  f_service_ << '\n' << haxe_type_imports() << haxe_thrift_imports()
              << haxe_thrift_gen_imports(tservice);
 
   if (tservice->get_extends() != nullptr) {
     t_type* parent = tservice->get_extends();
     string parent_namespace = make_package_name( parent->get_program()->get_namespace("haxe"));
     if (!parent_namespace.empty() && parent_namespace != package_name_) {
-      f_service_ << "import " << get_cap_name(type_name(parent)) << ";" << endl;
+      f_service_ << "import " << get_cap_name(type_name(parent)) << ";" << '\n';
     }
   }
 
-  f_service_ << endl;
+  f_service_ << '\n';
 
   generate_service_interface(tservice,true);
   f_service_.close();
@@ -1571,18 +1569,18 @@
   f_service_name = package_dir_ + "/" + get_cap_name(service_name_) + "Impl.hx";
   f_service_.open(f_service_name.c_str());
 
-  f_service_ << autogen_comment() << haxe_package() << ";" << endl << endl << haxe_type_imports()
-             << haxe_thrift_imports() << haxe_thrift_gen_imports(tservice) << endl;
+  f_service_ << autogen_comment() << haxe_package() << ";" << '\n' << '\n' << haxe_type_imports()
+             << haxe_thrift_imports() << haxe_thrift_gen_imports(tservice) << '\n';
 
   if (tservice->get_extends() != nullptr) {
     t_type* parent = tservice->get_extends();
     string parent_namespace = make_package_name( parent->get_program()->get_namespace("haxe"));
     if (!parent_namespace.empty() && parent_namespace != package_name_) {
-      f_service_ << "import " << get_cap_name(type_name(parent)) << "Impl;" << endl;
+      f_service_ << "import " << get_cap_name(type_name(parent)) << "Impl;" << '\n';
     }
   }
 
-  f_service_ << endl;
+  f_service_ << '\n';
 
   generate_service_client(tservice);
   f_service_.close();
@@ -1594,17 +1592,17 @@
   f_service_name = package_dir_ + "/" + get_cap_name(service_name_) + "Processor.hx";
   f_service_.open(f_service_name.c_str());
 
-  f_service_ << autogen_comment() << haxe_package() << ";" << endl 
-             << endl 
+  f_service_ << autogen_comment() << haxe_package() << ";" << '\n'
+             << '\n'
              << haxe_type_imports()
-             << haxe_thrift_imports() 
-             << haxe_thrift_gen_imports(tservice) 
-             << endl;
+             << haxe_thrift_imports()
+             << haxe_thrift_gen_imports(tservice)
+             << '\n';
 
   if (!package_name_.empty()) {
-    f_service_ << "import " << package_name_ << ".*;" << endl;
-    f_service_ << "import " << package_name_ << "." << get_cap_name(service_name_).c_str() << "Impl;" << endl;
-    f_service_ << endl;
+    f_service_ << "import " << package_name_ << ".*;" << '\n';
+    f_service_ << "import " << package_name_ << "." << get_cap_name(service_name_).c_str() << "Impl;" << '\n';
+    f_service_ << '\n';
   }
 
   generate_service_server(tservice);
@@ -1668,9 +1666,9 @@
                                                                 bool is_interface) {
   if (is_interface) {
     generate_deprecation_attribute(f_service_, tfunction, true);
-    indent(f_service_) << function_signature_normal(tfunction) << ";" << endl << endl;
+    indent(f_service_) << function_signature_normal(tfunction) << ";" << '\n' << '\n';
   } else {
-    indent(f_service_) << "public " << function_signature_normal(tfunction) << " {" << endl;
+    indent(f_service_) << "public " << function_signature_normal(tfunction) << " {" << '\n';
   }
 }
 
@@ -1683,15 +1681,15 @@
                                                                   bool is_interface) {
   if (!tfunction->is_oneway()) {
     std::string on_success_impl = generate_service_method_onsuccess(tfunction, false, false);
-    indent(f_service_) << "// function onError(Dynamic) : Void;" << endl;
-    indent(f_service_) << "// function " << on_success_impl.c_str() << ";" << endl;
+    indent(f_service_) << "// function onError(Dynamic) : Void;" << '\n';
+    indent(f_service_) << "// function " << on_success_impl.c_str() << ";" << '\n';
   }
 
   if (is_interface) {
     generate_deprecation_attribute(f_service_, tfunction, false);
-    indent(f_service_) << function_signature_combined(tfunction) << ";" << endl << endl;
+    indent(f_service_) << function_signature_combined(tfunction) << ";" << '\n' << '\n';
   } else {
-    indent(f_service_) << "public " << function_signature_combined(tfunction) << " {" << endl;
+    indent(f_service_) << "public " << function_signature_combined(tfunction) << " {" << '\n';
   }
 }
 
@@ -1738,7 +1736,7 @@
       }
     }
 
-    out << endl;
+    out << '\n';
   }
 }
 
@@ -1762,14 +1760,14 @@
   generate_rtti_decoration(f_service_);
   generate_macro_decoration(f_service_);
   f_service_ << indent() << "interface " << get_cap_name(service_name_) << cbk_postfix << extends_iface << " {"
-             << endl << endl;
+             << '\n' << '\n';
   indent_up();
   for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
     generate_haxe_doc(f_service_, *f_iter);
     generate_service_method_signature(*f_iter, true, combined);
   }
   indent_down();
-  f_service_ << indent() << "}" << endl << endl;
+  f_service_ << indent() << "}" << '\n' << '\n';
 }
 
 /**
@@ -1778,7 +1776,7 @@
  * @param tservice The service
  */
 void t_haxe_generator::generate_service_helpers(t_service* tservice) {
-  f_service_ << endl << endl;
+  f_service_ << '\n' << '\n';
   vector<t_function*> functions = tservice->get_functions();
   vector<t_function*>::iterator f_iter;
   for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
@@ -1804,44 +1802,44 @@
   generate_rtti_decoration(f_service_);
   // build macro is inherited from interface
   indent(f_service_) << "class " << get_cap_name(service_name_) << "Impl" << extends_client
-                     << " implements " << get_cap_name(service_name_) << " {" << endl << endl;
+                     << " implements " << get_cap_name(service_name_) << " {" << '\n' << '\n';
   indent_up();
 
-  indent(f_service_) << "public function new( iprot : TProtocol, oprot : TProtocol = null)" << endl;
+  indent(f_service_) << "public function new( iprot : TProtocol, oprot : TProtocol = null)" << '\n';
   scope_up(f_service_);
   if (extends.empty()) {
-    f_service_ << indent() << "iprot_ = iprot;" << endl;
-    f_service_ << indent() << "if (oprot == null) {" << endl;
+    f_service_ << indent() << "iprot_ = iprot;" << '\n';
+    f_service_ << indent() << "if (oprot == null) {" << '\n';
     indent_up();
-    f_service_ << indent() << "oprot_ = iprot;" << endl;
+    f_service_ << indent() << "oprot_ = iprot;" << '\n';
     indent_down();
-    f_service_ << indent() << "} else {" << endl;
+    f_service_ << indent() << "} else {" << '\n';
     indent_up();
-    f_service_ << indent() << "oprot_ = oprot;" << endl;
+    f_service_ << indent() << "oprot_ = oprot;" << '\n';
     indent_down();
-    f_service_ << indent() << "}" << endl;
+    f_service_ << indent() << "}" << '\n';
   } else {
-    f_service_ << indent() << "super(iprot, oprot);" << endl;
+    f_service_ << indent() << "super(iprot, oprot);" << '\n';
   }
   scope_down(f_service_);
-  f_service_ << endl;
+  f_service_ << '\n';
 
   if (extends.empty()) {
-    f_service_ << indent() << "private var iprot_ : TProtocol;" << endl << indent()
-               << "private var oprot_ : TProtocol;" << endl << indent()
-               << "private var seqid_ : Int;" << endl << endl;
+    f_service_ << indent() << "private var iprot_ : TProtocol;" << '\n' << indent()
+               << "private var oprot_ : TProtocol;" << '\n' << indent()
+               << "private var seqid_ : Int;" << '\n' << '\n';
 
-    indent(f_service_) << "public function getInputProtocol() : TProtocol" << endl;
+    indent(f_service_) << "public function getInputProtocol() : TProtocol" << '\n';
     scope_up(f_service_);
-    indent(f_service_) << "return this.iprot_;" << endl;
+    indent(f_service_) << "return this.iprot_;" << '\n';
     scope_down(f_service_);
-    f_service_ << endl;
+    f_service_ << '\n';
 
-    indent(f_service_) << "public function getOutputProtocol() : TProtocol" << endl;
+    indent(f_service_) << "public function getOutputProtocol() : TProtocol" << '\n';
     scope_up(f_service_);
-    indent(f_service_) << "return this.oprot_;" << endl;
+    indent(f_service_) << "return this.oprot_;" << '\n';
     scope_down(f_service_);
-    f_service_ << endl;
+    f_service_ << '\n';
   }
 
   // Generate client method implementations
@@ -1866,140 +1864,140 @@
     string args = tmp("args");
     string calltype = (*f_iter)->is_oneway() ? "ONEWAY" : "CALL";
     f_service_ << indent() << "oprot_.writeMessageBegin(new TMessage(\"" << funname
-               << "\", TMessageType." << calltype << ", seqid_));" << endl << indent()
-               << "var " << args << " : " << argsname << " = new " << argsname << "();" << endl;
+               << "\", TMessageType." << calltype << ", seqid_));" << '\n' << indent()
+               << "var " << args << " : " << argsname << " = new " << argsname << "();" << '\n';
 
     for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) {
       f_service_ << indent() << args << "." << (*fld_iter)->get_name() << " = "
-                 << (*fld_iter)->get_name() << ";" << endl;
+                 << (*fld_iter)->get_name() << ";" << '\n';
     }
 
-    f_service_ << indent() << args << ".write(oprot_);" << endl << indent()
-               << "oprot_.writeMessageEnd();" << endl;
+    f_service_ << indent() << args << ".write(oprot_);" << '\n' << indent()
+               << "oprot_.writeMessageEnd();" << '\n';
 
     string retval = tmp("retval");
     if (!((*f_iter)->is_oneway() || (*f_iter)->get_returntype()->is_void())) {
       f_service_ << indent() << "var " << retval << " : " << type_name((*f_iter)->get_returntype())
-                 << " = " << render_default_value_for_type((*f_iter)->get_returntype(),true) 
-                 << ";" << endl;
+                 << " = " << render_default_value_for_type((*f_iter)->get_returntype(),true)
+                 << ";" << '\n';
     }
 
     if ((*f_iter)->is_oneway()) {
-      f_service_ << indent() << "oprot_.getTransport().flush();" << endl;
+      f_service_ << indent() << "oprot_.getTransport().flush();" << '\n';
     } else {
-      indent(f_service_) << "oprot_.getTransport().flush(function(error:Dynamic) : Void {" << endl;
+      indent(f_service_) << "oprot_.getTransport().flush(function(error:Dynamic) : Void {" << '\n';
       indent_up();
-      indent(f_service_) << "try {" << endl;
+      indent(f_service_) << "try {" << '\n';
       indent_up();
       string appex = tmp("appex");
-      indent(f_service_) << "var " << appex << " : TApplicationException;" << endl;
+      indent(f_service_) << "var " << appex << " : TApplicationException;" << '\n';
       string resultname = get_cap_name((*f_iter)->get_name() + "_result");
-      indent(f_service_) << "if (error != null) {" << endl;
+      indent(f_service_) << "if (error != null) {" << '\n';
       indent_up();
-      indent(f_service_) << "if (onError == null)" << endl;
+      indent(f_service_) << "if (onError == null)" << '\n';
       indent_up();
-      indent(f_service_) << "throw error;" << endl;
+      indent(f_service_) << "throw error;" << '\n';
       indent_down();
-      indent(f_service_) << "onError(error);" << endl;
-      indent(f_service_) << "return;" << endl;
+      indent(f_service_) << "onError(error);" << '\n';
+      indent(f_service_) << "return;" << '\n';
       indent_down();
-      indent(f_service_) << "}" << endl << endl;
+      indent(f_service_) << "}" << '\n' << '\n';
       string msg = tmp("msg");
-      indent(f_service_) << "var " << msg << " : TMessage = iprot_.readMessageBegin();" << endl;
-      indent(f_service_) << "if (" << msg << ".type == TMessageType.EXCEPTION) {" << endl;
+      indent(f_service_) << "var " << msg << " : TMessage = iprot_.readMessageBegin();" << '\n';
+      indent(f_service_) << "if (" << msg << ".type == TMessageType.EXCEPTION) {" << '\n';
       indent_up();
-      indent(f_service_) << appex << " = TApplicationException.read(iprot_);" << endl;
-      indent(f_service_) << "iprot_.readMessageEnd();" << endl;
-      indent(f_service_) << "if (onError == null)" << endl;
+      indent(f_service_) << appex << " = TApplicationException.read(iprot_);" << '\n';
+      indent(f_service_) << "iprot_.readMessageEnd();" << '\n';
+      indent(f_service_) << "if (onError == null)" << '\n';
       indent_up();
-      indent(f_service_) << "throw " << appex << ";" << endl;
+      indent(f_service_) << "throw " << appex << ";" << '\n';
       indent_down();
-      indent(f_service_) << "onError(" << appex << ");" << endl;
-      indent(f_service_) << "return;" << endl;
+      indent(f_service_) << "onError(" << appex << ");" << '\n';
+      indent(f_service_) << "return;" << '\n';
       indent_down();
-      indent(f_service_) << "}" << endl << endl;
+      indent(f_service_) << "}" << '\n' << '\n';
       string result = tmp("result");
-      indent(f_service_) << "var " << result << " : " << resultname << " = new " << resultname << "();" << endl;
-      indent(f_service_) << "" << result << ".read(iprot_);" << endl;
-      indent(f_service_) << "iprot_.readMessageEnd();" << endl;
+      indent(f_service_) << "var " << result << " : " << resultname << " = new " << resultname << "();" << '\n';
+      indent(f_service_) << "" << result << ".read(iprot_);" << '\n';
+      indent(f_service_) << "iprot_.readMessageEnd();" << '\n';
 
       // Careful, only return _result if not a void function
       if (!(*f_iter)->get_returntype()->is_void()) {
-        indent(f_service_) << "if (" << result << "." << generate_isset_check("success") << ") {" << endl;
+        indent(f_service_) << "if (" << result << "." << generate_isset_check("success") << ") {" << '\n';
         indent_up();
-        indent(f_service_) << "if (onSuccess != null)" << endl;
+        indent(f_service_) << "if (onSuccess != null)" << '\n';
         indent_up();
-        indent(f_service_) << "onSuccess(" << result << ".success);" << endl;
+        indent(f_service_) << "onSuccess(" << result << ".success);" << '\n';
         indent_down();
-        indent(f_service_) << retval << " = " << result << ".success;" << endl;
-        indent(f_service_) << "return;" << endl;
+        indent(f_service_) << retval << " = " << result << ".success;" << '\n';
+        indent(f_service_) << "return;" << '\n';
         indent_down();
-        indent(f_service_) << "}" << endl << endl;
+        indent(f_service_) << "}" << '\n' << '\n';
       }
 
       t_struct* xs = (*f_iter)->get_xceptions();
       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) {
-        indent(f_service_) << "if (" << result << "." << (*x_iter)->get_name() << " != null) {" << endl;
+        indent(f_service_) << "if (" << result << "." << (*x_iter)->get_name() << " != null) {" << '\n';
         indent_up();
-        indent(f_service_) << "if (onError == null)" << endl;
+        indent(f_service_) << "if (onError == null)" << '\n';
         indent_up();
-        indent(f_service_) << "throw " << result << "." << (*x_iter)->get_name() << ";" << endl;
+        indent(f_service_) << "throw " << result << "." << (*x_iter)->get_name() << ";" << '\n';
         indent_down();
-        indent(f_service_) << "onError(" << result << "." << (*x_iter)->get_name() << ");" << endl;
-        indent(f_service_) << "return;" << endl;
+        indent(f_service_) << "onError(" << result << "." << (*x_iter)->get_name() << ");" << '\n';
+        indent(f_service_) << "return;" << '\n';
         indent_down();
-        indent(f_service_) << "}" << endl << endl;
+        indent(f_service_) << "}" << '\n' << '\n';
       }
 
       // If you get here it's an exception, unless a void function
       if ((*f_iter)->get_returntype()->is_void()) {
-        indent(f_service_) << "if (onSuccess != null)" << endl;
+        indent(f_service_) << "if (onSuccess != null)" << '\n';
         indent_up();
-        indent(f_service_) << "onSuccess();" << endl;
+        indent(f_service_) << "onSuccess();" << '\n';
         indent_down();
-        indent(f_service_) << "return;" << endl;
+        indent(f_service_) << "return;" << '\n';
       } else {
         indent(f_service_) << appex << " = new TApplicationException("
                            << "TApplicationException.MISSING_RESULT,"
-                           << "\"" << (*f_iter)->get_name() << " failed: unknown result\");" << endl;
-        indent(f_service_) << "if (onError == null)" << endl;
+                           << "\"" << (*f_iter)->get_name() << " failed: unknown result\");" << '\n';
+        indent(f_service_) << "if (onError == null)" << '\n';
         indent_up();
-        indent(f_service_) << "throw " << appex << ";" << endl;
+        indent(f_service_) << "throw " << appex << ";" << '\n';
         indent_down();
-        indent(f_service_) << "onError(" << appex << ");" << endl;
-        indent(f_service_) << "return;" << endl;
+        indent(f_service_) << "onError(" << appex << ");" << '\n';
+        indent(f_service_) << "return;" << '\n';
       }
 
       indent_down();
-      indent(f_service_) << endl;
-      indent(f_service_) << "} catch( e : TException) {" << endl;
+      indent(f_service_) << '\n';
+      indent(f_service_) << "} catch( e : TException) {" << '\n';
       indent_up();
-      indent(f_service_) << "if (onError == null)" << endl;
+      indent(f_service_) << "if (onError == null)" << '\n';
       indent_up();
-      indent(f_service_) << "throw e;" << endl;
+      indent(f_service_) << "throw e;" << '\n';
       indent_down();
-      indent(f_service_) << "onError(e);" << endl;
-      indent(f_service_) << "return;" << endl;
+      indent(f_service_) << "onError(e);" << '\n';
+      indent(f_service_) << "return;" << '\n';
       indent_down();
-      indent(f_service_) << "}" << endl;
+      indent(f_service_) << "}" << '\n';
 
       indent_down();
-      indent(f_service_) << "});" << endl << endl;
+      indent(f_service_) << "});" << '\n' << '\n';
     }
 
     if (!((*f_iter)->is_oneway() || (*f_iter)->get_returntype()->is_void())) {
-      f_service_ << indent() << "return " << retval << ";" << endl;
+      f_service_ << indent() << "return " << retval << ";" << '\n';
     }
 
     // Close function
     scope_down(f_service_);
-    f_service_ << endl;
+    f_service_ << '\n';
   }
 
   indent_down();
-  indent(f_service_) << "}" << endl;
+  indent(f_service_) << "}" << '\n';
 }
 
 /**
@@ -2024,35 +2022,35 @@
   generate_rtti_decoration(f_service_);
   generate_macro_decoration(f_service_);
   indent(f_service_) << "class " << get_cap_name(service_name_) << "Processor" << extends_processor
-                     << " implements TProcessor {" << endl << endl;
+                     << " implements TProcessor {" << '\n' << '\n';
   indent_up();
 
   f_service_ << indent() << "private var " << get_cap_name(service_name_)
-             << "_iface_ : " << get_cap_name(service_name_) << "_service;" << endl;
+             << "_iface_ : " << get_cap_name(service_name_) << "_service;" << '\n';
 
   if (extends.empty()) {
     f_service_ << indent()
                << "private var PROCESS_MAP = new StringMap< Int->TProtocol->TProtocol->Void >();"
-               << endl;
+               << '\n';
   }
 
-  f_service_ << endl;
+  f_service_ << '\n';
 
   indent(f_service_) << "public function new( iface : " << get_cap_name(service_name_) << "_service)"
-                     << endl;
+                     << '\n';
   scope_up(f_service_);
   if (!extends.empty()) {
-    f_service_ << indent() << "super(iface);" << endl;
+    f_service_ << indent() << "super(iface);" << '\n';
   }
-  f_service_ << indent() << get_cap_name(service_name_) << "_iface_ = iface;" << endl;
+  f_service_ << indent() << get_cap_name(service_name_) << "_iface_ = iface;" << '\n';
 
   for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
     f_service_ << indent() << "PROCESS_MAP.set(\"" << (*f_iter)->get_name() << "\", "
-               << (*f_iter)->get_name() << "());" << endl;
+               << (*f_iter)->get_name() << "());" << '\n';
   }
 
   scope_down(f_service_);
-  f_service_ << endl;
+  f_service_ << '\n';
 
   // Generate the server implementation
   string override = "";
@@ -2061,31 +2059,31 @@
   }
   indent(f_service_) << override
                      << "public function process( iprot : TProtocol, oprot : TProtocol) : Bool"
-                     << endl;
+                     << '\n';
   scope_up(f_service_);
 
-  f_service_ << indent() << "var msg : TMessage = iprot.readMessageBegin();" << endl;
+  f_service_ << indent() << "var msg : TMessage = iprot.readMessageBegin();" << '\n';
 
   // TODO(mcslee): validate message, was the seqid etc. legit?
 
   f_service_
-      << indent() << "var fn  = PROCESS_MAP.get(msg.name);" << endl
-      << indent() << "if (fn == null) {" << endl
-      << indent() << "  TProtocolUtil.skip(iprot, TType.STRUCT);" << endl
-      << indent() << "  iprot.readMessageEnd();" << endl
+      << indent() << "var fn  = PROCESS_MAP.get(msg.name);" << '\n'
+      << indent() << "if (fn == null) {" << '\n'
+      << indent() << "  TProtocolUtil.skip(iprot, TType.STRUCT);" << '\n'
+      << indent() << "  iprot.readMessageEnd();" << '\n'
       << indent() << "  var appex = new TApplicationException(TApplicationException.UNKNOWN_METHOD, "
-                  << "\"Invalid method name: '\"+msg.name+\"'\");" << endl
-      << indent() << "  oprot.writeMessageBegin(new TMessage(msg.name, TMessageType.EXCEPTION, msg.seqid));" << endl
-      << indent() << "  appex.write(oprot);" << endl << indent() << "  oprot.writeMessageEnd();" << endl
-      << indent() << "  oprot.getTransport().flush();" << endl
-      << indent() << "  return true;" << endl << indent() << "}" << endl
-      << indent() << "fn( msg.seqid, iprot, oprot);" << endl
+                  << "\"Invalid method name: '\"+msg.name+\"'\");" << '\n'
+      << indent() << "  oprot.writeMessageBegin(new TMessage(msg.name, TMessageType.EXCEPTION, msg.seqid));" << '\n'
+      << indent() << "  appex.write(oprot);" << '\n' << indent() << "  oprot.writeMessageEnd();" << '\n'
+      << indent() << "  oprot.getTransport().flush();" << '\n'
+      << indent() << "  return true;" << '\n' << indent() << "}" << '\n'
+      << indent() << "fn( msg.seqid, iprot, oprot);" << '\n'
       ;
 
-  f_service_ << indent() << "return true;" << endl;
+  f_service_ << indent() << "return true;" << '\n';
 
   scope_down(f_service_);
-  f_service_ << endl;
+  f_service_ << '\n';
 
   // Generate the process subfunctions
   for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
@@ -2093,7 +2091,7 @@
   }
 
   indent_down();
-  indent(f_service_) << "}" << endl << endl;
+  indent(f_service_) << "}" << '\n' << '\n';
 }
 
 /**
@@ -2132,20 +2130,20 @@
   (void)tservice;
   // Open class
   indent(f_service_) << "private function " << tfunction->get_name()
-                     << "() : Int->TProtocol->TProtocol->Void {" << endl;
+                     << "() : Int->TProtocol->TProtocol->Void {" << '\n';
   indent_up();
 
   // Open function
   indent(f_service_) << "return function( seqid : Int, iprot : TProtocol, oprot : TProtocol) : Void"
-                     << endl;
+                     << '\n';
   scope_up(f_service_);
 
   string argsname = get_cap_name(tfunction->get_name() + "_args");
   string resultname = get_cap_name(tfunction->get_name() + "_result");
 
-  f_service_ << indent() << "var args : " << argsname << " = new " << argsname << "();" << endl
-             << indent() << "args.read(iprot);" << endl << indent() << "iprot.readMessageEnd();"
-             << endl;
+  f_service_ << indent() << "var args : " << argsname << " = new " << argsname << "();" << '\n'
+             << indent() << "args.read(iprot);" << '\n' << indent() << "iprot.readMessageEnd();"
+             << '\n';
 
   t_struct* xs = tfunction->get_xceptions();
   const std::vector<t_field*>& xceptions = xs->get_members();
@@ -2153,11 +2151,11 @@
 
   // Declare result for non oneway function
   if (!tfunction->is_oneway()) {
-    f_service_ << indent() << "var result : " << resultname << " = new " << resultname << "();" << endl;
+    f_service_ << indent() << "var result : " << resultname << " = new " << resultname << "();" << '\n';
   }
 
   // Try block for any  function to catch (defined or undefined) exceptions
-  f_service_ << indent() << "try {" << endl;
+  f_service_ << indent() << "try {" << '\n';
   indent_up();
 
 
@@ -2182,7 +2180,7 @@
     }
     f_service_ << "args." << (*f_iter)->get_name();
   }
-  f_service_ << ");" << endl;
+  f_service_ << ");" << '\n';
 
   indent_down();
   f_service_ << indent() << "}";
@@ -2190,11 +2188,11 @@
     // catch exceptions defined in the IDL
     for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) {
       f_service_ << " catch (" << (*x_iter)->get_name() << ":"
-                 << get_cap_name(type_name((*x_iter)->get_type(), false, false)) << ") {" << endl;
+                 << get_cap_name(type_name((*x_iter)->get_type(), false, false)) << ") {" << '\n';
       if (!tfunction->is_oneway()) {
         indent_up();
         f_service_ << indent() << "result." << (*x_iter)->get_name() << " = "
-                   << (*x_iter)->get_name() << ";" << endl;
+                   << (*x_iter)->get_name() << ";" << '\n';
         indent_down();
         f_service_ << indent() << "}";
       } else {
@@ -2205,45 +2203,45 @@
 
   // always catch all exceptions to prevent from service denial
   string appex = tmp("appex");
-  f_service_ << " catch (th : Dynamic) {" << endl;
+  f_service_ << " catch (th : Dynamic) {" << '\n';
   indent_up();
-  indent(f_service_) << "trace(\"Internal error processing " << tfunction->get_name() << "\", th);" << endl;
+  indent(f_service_) << "trace(\"Internal error processing " << tfunction->get_name() << "\", th);" << '\n';
   if (!tfunction->is_oneway()) {
     indent(f_service_) << "var appex = new TApplicationException(TApplicationException.INTERNAL_ERROR, "
-                          "\"Internal error processing " << tfunction->get_name() << "\");" << endl;
+                          "\"Internal error processing " << tfunction->get_name() << "\");" << '\n';
     indent(f_service_) << "oprot.writeMessageBegin(new TMessage(\"" << tfunction->get_name()
-                       << "\", TMessageType.EXCEPTION, seqid));" << endl;
-    indent(f_service_) << "appex.write(oprot);" << endl;
-    indent(f_service_) << "oprot.writeMessageEnd();" << endl;
-    indent(f_service_) << "oprot.getTransport().flush();" << endl;
+                       << "\", TMessageType.EXCEPTION, seqid));" << '\n';
+    indent(f_service_) << "appex.write(oprot);" << '\n';
+    indent(f_service_) << "oprot.writeMessageEnd();" << '\n';
+    indent(f_service_) << "oprot.getTransport().flush();" << '\n';
   }
-  indent(f_service_) << "return;" << endl;
+  indent(f_service_) << "return;" << '\n';
   indent_down();
-  f_service_ << indent() << "}" << endl;
+  f_service_ << indent() << "}" << '\n';
 
   // Shortcut out here for oneway functions
   if (tfunction->is_oneway()) {
-    f_service_ << indent() << "return;" << endl;
+    f_service_ << indent() << "return;" << '\n';
     scope_down(f_service_);
 
     // Close class
     indent_down();
-    f_service_ << indent() << "}" << endl << endl;
+    f_service_ << indent() << "}" << '\n' << '\n';
     return;
   }
 
   f_service_ << indent() << "oprot.writeMessageBegin(new TMessage(\"" << tfunction->get_name()
-             << "\", TMessageType.REPLY, seqid));" << endl << indent() << "result.write(oprot);"
-             << endl << indent() << "oprot.writeMessageEnd();" << endl << indent()
-             << "oprot.getTransport().flush();" << endl;
+             << "\", TMessageType.REPLY, seqid));" << '\n' << indent() << "result.write(oprot);"
+             << '\n' << indent() << "oprot.writeMessageEnd();" << '\n' << indent()
+             << "oprot.getTransport().flush();" << '\n';
 
   // Close function
   scope_down(f_service_);
-  f_service_ << endl;
+  f_service_ << '\n';
 
   // Close class
   indent_down();
-  f_service_ << indent() << "}" << endl << endl;
+  f_service_ << indent() << "}" << '\n' << '\n';
 }
 
 /**
@@ -2309,7 +2307,7 @@
     } else if (type->is_enum()) {
       out << "readI32();";
     }
-    out << endl;
+    out << '\n';
   } else {
     printf("DO NOT KNOW HOW TO DESERIALIZE FIELD '%s' TYPE '%s'\n",
            tfield->get_name().c_str(),
@@ -2323,8 +2321,8 @@
 void t_haxe_generator::generate_deserialize_struct(ostream& out,
                                                    t_struct* tstruct,
                                                    string prefix) {
-  out << indent() << prefix << " = new " << get_cap_name(type_name(tstruct)) << "();" << endl
-      << indent() << prefix << ".read(iprot);" << endl;
+  out << indent() << prefix << " = new " << get_cap_name(type_name(tstruct)) << "();" << '\n'
+      << indent() << prefix << ".read(iprot);" << '\n';
 }
 
 /**
@@ -2345,21 +2343,21 @@
 
   // Declare variables, read header
   if (ttype->is_map()) {
-    indent(out) << "var " << obj << " = iprot.readMapBegin();" << endl;
+    indent(out) << "var " << obj << " = iprot.readMapBegin();" << '\n';
   } else if (ttype->is_set()) {
-    indent(out) << "var " << obj << " = iprot.readSetBegin();" << endl;
+    indent(out) << "var " << obj << " = iprot.readSetBegin();" << '\n';
   } else if (ttype->is_list()) {
-    indent(out) << "var " << obj << " = iprot.readListBegin();" << endl;
+    indent(out) << "var " << obj << " = iprot.readListBegin();" << '\n';
   }
 
   indent(out) << prefix << " = new " << type_name(ttype, false, true)
               // size the collection correctly
               << "("
-              << ");" << endl;
+              << ");" << '\n';
 
   // For loop iterates over elements
   string i = tmp("_i");
-  indent(out) << "for( " << i << " in 0 ... " << obj << ".size)" << endl;
+  indent(out) << "for( " << i << " in 0 ... " << obj << ".size)" << '\n';
 
   scope_up(out);
 
@@ -2375,11 +2373,11 @@
 
   // Read container end
   if (ttype->is_map()) {
-    indent(out) << "iprot.readMapEnd();" << endl;
+    indent(out) << "iprot.readMapEnd();" << '\n';
   } else if (ttype->is_set()) {
-    indent(out) << "iprot.readSetEnd();" << endl;
+    indent(out) << "iprot.readSetEnd();" << '\n';
   } else if (ttype->is_list()) {
-    indent(out) << "iprot.readListEnd();" << endl;
+    indent(out) << "iprot.readListEnd();" << '\n';
   }
 
   scope_down(out);
@@ -2394,13 +2392,13 @@
   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;
+  indent(out) << declare_field(&fkey) << '\n';
+  indent(out) << declare_field(&fval) << '\n';
 
   generate_deserialize_field(out, &fkey);
   generate_deserialize_field(out, &fval);
 
-  indent(out) << prefix << ".set( " << key << ", " << val << ");" << endl;
+  indent(out) << prefix << ".set( " << key << ", " << val << ");" << '\n';
 }
 
 /**
@@ -2410,11 +2408,11 @@
   string elem = tmp("_elem");
   t_field felem(tset->get_elem_type(), elem);
 
-  indent(out) << declare_field(&felem) << endl;
+  indent(out) << declare_field(&felem) << '\n';
 
   generate_deserialize_field(out, &felem);
 
-  indent(out) << prefix << ".add(" << elem << ");" << endl;
+  indent(out) << prefix << ".add(" << elem << ");" << '\n';
 }
 
 /**
@@ -2426,11 +2424,11 @@
   string elem = tmp("_elem");
   t_field felem(tlist->get_elem_type(), elem);
 
-  indent(out) << declare_field(&felem) << endl;
+  indent(out) << declare_field(&felem) << '\n';
 
   generate_deserialize_field(out, &felem);
 
-  indent(out) << prefix << ".add(" << elem << ");" << endl;
+  indent(out) << prefix << ".add(" << elem << ");" << '\n';
 }
 
 /**
@@ -2496,7 +2494,7 @@
     } else if (type->is_enum()) {
       out << "writeI32(" << name << ");";
     }
-    out << endl;
+    out << '\n';
   } else {
     printf("DO NOT KNOW HOW TO SERIALIZE FIELD '%s%s' TYPE '%s'\n",
            prefix.c_str(),
@@ -2513,7 +2511,7 @@
  */
 void t_haxe_generator::generate_serialize_struct(ostream& out, t_struct* tstruct, string prefix) {
   (void)tstruct;
-  out << indent() << prefix << ".write(oprot);" << endl;
+  out << indent() << prefix << ".write(oprot);" << '\n';
 }
 
 /**
@@ -2527,30 +2525,30 @@
   if (ttype->is_map()) {
     string iter = tmp("_key");
     string counter = tmp("_sizeCounter");
-    indent(out) << "var " << counter << " : Int = 0;" << endl;
-    indent(out) << "for( " << iter << " in " << prefix << ") {" << endl;
-    indent(out) << "  " << counter << +"++;" << endl;
-    indent(out) << "}" << endl;
+    indent(out) << "var " << counter << " : Int = 0;" << '\n';
+    indent(out) << "for( " << iter << " in " << prefix << ") {" << '\n';
+    indent(out) << "  " << counter << +"++;" << '\n';
+    indent(out) << "}" << '\n';
 
     indent(out) << "oprot.writeMapBegin(new TMap(" << type_to_enum(((t_map*)ttype)->get_key_type())
                 << ", " << type_to_enum(((t_map*)ttype)->get_val_type()) << ", " << counter << "));"
-                << endl;
+                << '\n';
   } else if (ttype->is_set()) {
     indent(out) << "oprot.writeSetBegin(new TSet(" << type_to_enum(((t_set*)ttype)->get_elem_type())
-                << ", " << prefix << ".size));" << endl;
+                << ", " << prefix << ".size));" << '\n';
   } else if (ttype->is_list()) {
     indent(out) << "oprot.writeListBegin(new TList("
                 << type_to_enum(((t_list*)ttype)->get_elem_type()) << ", " << prefix << ".length));"
-                << endl;
+                << '\n';
   }
 
   string iter = tmp("elem");
   if (ttype->is_map()) {
-    indent(out) << "for( " << iter << " in " << prefix << ".keys())" << endl;
+    indent(out) << "for( " << iter << " in " << prefix << ".keys())" << '\n';
   } else if (ttype->is_set()) {
-    indent(out) << "for( " << iter << " in " << prefix << ".toArray())" << endl;
+    indent(out) << "for( " << iter << " in " << prefix << ".toArray())" << '\n';
   } else if (ttype->is_list()) {
-    indent(out) << "for( " << iter << " in " << prefix << ")" << endl;
+    indent(out) << "for( " << iter << " in " << prefix << ")" << '\n';
   }
 
   scope_up(out);
@@ -2566,11 +2564,11 @@
   scope_down(out);
 
   if (ttype->is_map()) {
-    indent(out) << "oprot.writeMapEnd();" << endl;
+    indent(out) << "oprot.writeMapEnd();" << '\n';
   } else if (ttype->is_set()) {
-    indent(out) << "oprot.writeSetEnd();" << endl;
+    indent(out) << "oprot.writeSetEnd();" << '\n';
   } else if (ttype->is_list()) {
-    indent(out) << "oprot.writeListEnd();" << endl;
+    indent(out) << "oprot.writeListEnd();" << '\n';
   }
 
 }
@@ -3006,7 +3004,7 @@
  */
 void t_haxe_generator::generate_rtti_decoration(ostream& out) {
   if (rtti_) {
-    out << "@:rtti" << endl;
+    out << "@:rtti" << '\n';
   }
 }
 
@@ -3015,10 +3013,10 @@
  */
 void t_haxe_generator::generate_macro_decoration(ostream& out) {
   if (!buildmacro_.empty()) {
-    out << "#if ! macro" << endl;
-    out << "@:build( " << buildmacro_ << ")" << endl;     // current class/interface
-    out << "@:autoBuild( " << buildmacro_ << ")" << endl; // inherited classes/interfaces
-    out << "#end" << endl;
+    out << "#if ! macro" << '\n';
+    out << "@:build( " << buildmacro_ << ")" << '\n';     // current class/interface
+    out << "@:autoBuild( " << buildmacro_ << ")" << '\n'; // inherited classes/interfaces
+    out << "#end" << '\n';
   }
 }
 
@@ -3061,7 +3059,7 @@
 
 void t_haxe_generator::generate_isset_set(ostream& out, t_field* field) {
   if (!type_can_be_null(field->get_type())) {
-    indent(out) << "this.__isset_" << field->get_name() << " = true;" << endl;
+    indent(out) << "this.__isset_" << field->get_name() << " = true;" << '\n';
   }
 }
 
diff --git a/compiler/cpp/src/thrift/generate/t_html_generator.cc b/compiler/cpp/src/thrift/generate/t_html_generator.cc
index 15a0401..637cd88 100644
--- a/compiler/cpp/src/thrift/generate/t_html_generator.cc
+++ b/compiler/cpp/src/thrift/generate/t_html_generator.cc
@@ -38,8 +38,6 @@
 using std::stringstream;
 using std::vector;
 
-static const string endl = "\n"; // avoid ostream << std::endl flushes
-
 enum input_type { INPUT_UNKNOWN, INPUT_UTF8, INPUT_PLAIN };
 
 /**
@@ -129,9 +127,9 @@
 void t_html_generator::generate_program_toc() {
   f_out_ << "<table class=\"table-bordered table-striped "
             "table-condensed\"><thead><tr><th>Module</th><th>Services</th>"
-         << "<th>Data types</th><th>Constants</th></tr></thead><tbody>" << endl;
+         << "<th>Data types</th><th>Constants</th></tr></thead><tbody>" << '\n';
   generate_program_toc_row(program_);
-  f_out_ << "</tbody></table>" << endl;
+  f_out_ << "</tbody></table>" << '\n';
 }
 
 /**
@@ -159,15 +157,15 @@
  */
 void t_html_generator::generate_program_toc_row(t_program* tprog) {
   string fname = tprog->get_name() + ".html";
-  f_out_ << "<tr>" << endl << "<td>" << tprog->get_name() << "</td><td>";
+  f_out_ << "<tr>" << '\n' << "<td>" << tprog->get_name() << "</td><td>";
   if (!tprog->get_services().empty()) {
     vector<t_service*> services = tprog->get_services();
     vector<t_service*>::iterator sv_iter;
     for (sv_iter = services.begin(); sv_iter != services.end(); ++sv_iter) {
       string name = get_service_name(*sv_iter);
       f_out_ << "<a href=\"" << make_file_link(fname) << "#Svc_" << name << "\">" << name
-             << "</a><br/>" << endl;
-      f_out_ << "<ul>" << endl;
+             << "</a><br/>" << '\n';
+      f_out_ << "<ul>" << '\n';
       map<string, string> fn_html;
       vector<t_function*> functions = (*sv_iter)->get_functions();
       vector<t_function*>::iterator fn_iter;
@@ -178,12 +176,12 @@
         fn_html.insert(pair<string, string>(fn_name, html));
       }
       for (auto & html_iter : fn_html) {
-        f_out_ << html_iter.second << endl;
+        f_out_ << html_iter.second << '\n';
       }
-      f_out_ << "</ul>" << endl;
+      f_out_ << "</ul>" << '\n';
     }
   }
-  f_out_ << "</td>" << endl << "<td>";
+  f_out_ << "</td>" << '\n' << "<td>";
   map<string, string> data_types;
   if (!tprog->get_enums().empty()) {
     vector<t_enum*> enums = tprog->get_enums();
@@ -191,7 +189,7 @@
     for (en_iter = enums.begin(); en_iter != enums.end(); ++en_iter) {
       string name = (*en_iter)->get_name();
       // f_out_ << "<a href=\"" << make_file_link(fname) << "#Enum_" << name << "\">" << name
-      // <<  "</a><br/>" << endl;
+      // <<  "</a><br/>" << '\n';
       string html = "<a href=\"" + make_file_link(fname) + "#Enum_" + name + "\">" + name + "</a>";
       data_types.insert(pair<string, string>(name, html));
     }
@@ -202,7 +200,7 @@
     for (td_iter = typedefs.begin(); td_iter != typedefs.end(); ++td_iter) {
       string name = (*td_iter)->get_symbolic();
       // f_out_ << "<a href=\"" << make_file_link(fname) << "#Typedef_" << name << "\">" << name
-      // << "</a><br/>" << endl;
+      // << "</a><br/>" << '\n';
       string html = "<a href=\"" + make_file_link(fname) + "#Typedef_" + name + "\">" + name
                     + "</a>";
       data_types.insert(pair<string, string>(name, html));
@@ -214,16 +212,16 @@
     for (o_iter = objects.begin(); o_iter != objects.end(); ++o_iter) {
       string name = (*o_iter)->get_name();
       // f_out_ << "<a href=\"" << make_file_link(fname) << "#Struct_" << name << "\">" << name
-      //<< "</a><br/>" << endl;
+      //<< "</a><br/>" << '\n';
       string html = "<a href=\"" + make_file_link(fname) + "#Struct_" + name + "\">" + name
                     + "</a>";
       data_types.insert(pair<string, string>(name, html));
     }
   }
   for (auto & data_type : data_types) {
-    f_out_ << data_type.second << "<br/>" << endl;
+    f_out_ << data_type.second << "<br/>" << '\n';
   }
-  f_out_ << "</td>" << endl << "<td>";
+  f_out_ << "</td>" << '\n' << "<td>";
   if (!tprog->get_consts().empty()) {
     map<string, string> const_html;
     vector<t_const*> consts = tprog->get_consts();
@@ -235,10 +233,10 @@
       const_html.insert(pair<string, string>(name, html));
     }
     for (auto & con_iter : const_html) {
-      f_out_ << con_iter.second << "<br/>" << endl;
+      f_out_ << con_iter.second << "<br/>" << '\n';
     }
   }
-  f_out_ << "</td>" << endl << "</tr>";
+  f_out_ << "</td>" << '\n' << "</tr>";
 }
 
 /**
@@ -251,30 +249,30 @@
   current_file_ = program_->get_name() + ".html";
   string fname = get_out_dir() + current_file_;
   f_out_.open(fname.c_str());
-  f_out_ << "<!DOCTYPE html>" << endl;
-  f_out_ << "<html lang=\"en\">" << endl;
-  f_out_ << "<head>" << endl;
-  f_out_ << "<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />" << endl;
+  f_out_ << "<!DOCTYPE html>" << '\n';
+  f_out_ << "<html lang=\"en\">" << '\n';
+  f_out_ << "<head>" << '\n';
+  f_out_ << "<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />" << '\n';
   generate_style_tag();
-  f_out_ << "<title>Thrift module: " << program_->get_name() << "</title></head><body>" << endl
-         << "<div class=\"container-fluid\">" << endl
-         << "<h1>Thrift module: " << program_->get_name() << "</h1>" << endl;
+  f_out_ << "<title>Thrift module: " << program_->get_name() << "</title></head><body>" << '\n'
+         << "<div class=\"container-fluid\">" << '\n'
+         << "<h1>Thrift module: " << program_->get_name() << "</h1>" << '\n';
 
   print_doc(program_);
 
   generate_program_toc();
 
   if (!program_->get_consts().empty()) {
-    f_out_ << "<hr/><h2 id=\"Constants\">Constants</h2>" << endl;
+    f_out_ << "<hr/><h2 id=\"Constants\">Constants</h2>" << '\n';
     vector<t_const*> consts = program_->get_consts();
     f_out_ << "<table class=\"table-bordered table-striped table-condensed\">";
-    f_out_ << "<thead><tr><th>Constant</th><th>Type</th><th>Value</th></tr></thead><tbody>" << endl;
+    f_out_ << "<thead><tr><th>Constant</th><th>Type</th><th>Value</th></tr></thead><tbody>" << '\n';
     generate_consts(consts);
     f_out_ << "</tbody></table>";
   }
 
   if (!program_->get_enums().empty()) {
-    f_out_ << "<hr/><h2 id=\"Enumerations\">Enumerations</h2>" << endl;
+    f_out_ << "<hr/><h2 id=\"Enumerations\">Enumerations</h2>" << '\n';
     // Generate enums
     vector<t_enum*> enums = program_->get_enums();
     vector<t_enum*>::iterator en_iter;
@@ -284,7 +282,7 @@
   }
 
   if (!program_->get_typedefs().empty()) {
-    f_out_ << "<hr/><h2 id=\"Typedefs\">Type declarations</h2>" << endl;
+    f_out_ << "<hr/><h2 id=\"Typedefs\">Type declarations</h2>" << '\n';
     // Generate typedefs
     vector<t_typedef*> typedefs = program_->get_typedefs();
     vector<t_typedef*>::iterator td_iter;
@@ -294,7 +292,7 @@
   }
 
   if (!program_->get_objects().empty()) {
-    f_out_ << "<hr/><h2 id=\"Structs\">Data structures</h2>" << endl;
+    f_out_ << "<hr/><h2 id=\"Structs\">Data structures</h2>" << '\n';
     // Generate structs and exceptions in declared order
     vector<t_struct*> objects = program_->get_objects();
     vector<t_struct*>::iterator o_iter;
@@ -308,7 +306,7 @@
   }
 
   if (!program_->get_services().empty()) {
-    f_out_ << "<hr/><h2 id=\"Services\">Services</h2>" << endl;
+    f_out_ << "<hr/><h2 id=\"Services\">Services</h2>" << '\n';
     // Generate services
     vector<t_service*> services = program_->get_services();
     vector<t_service*>::iterator sv_iter;
@@ -318,7 +316,7 @@
     }
   }
 
-  f_out_ << "</div></body></html>" << endl;
+  f_out_ << "</div></body></html>" << '\n';
   f_out_.close();
 
   generate_index();
@@ -332,17 +330,17 @@
   current_file_ = "index.html";
   string index_fname = get_out_dir() + current_file_;
   f_out_.open(index_fname.c_str());
-  f_out_ << "<!DOCTYPE html>" << endl << "<html lang=\"en\"><head>" << endl;
+  f_out_ << "<!DOCTYPE html>" << '\n' << "<html lang=\"en\"><head>" << '\n';
   generate_style_tag();
-  f_out_ << "<title>All Thrift declarations</title></head><body>" << endl
-         << "<div class=\"container-fluid\">" << endl << "<h1>All Thrift declarations</h1>" << endl;
+  f_out_ << "<title>All Thrift declarations</title></head><body>" << '\n'
+         << "<div class=\"container-fluid\">" << '\n' << "<h1>All Thrift declarations</h1>" << '\n';
   f_out_ << "<table class=\"table-bordered table-striped "
             "table-condensed\"><thead><tr><th>Module</th><th>Services</th><th>Data types</th>"
-         << "<th>Constants</th></tr></thead><tbody>" << endl;
+         << "<th>Constants</th></tr></thead><tbody>" << '\n';
   vector<t_program*> programs;
   generate_program_toc_rows(program_, programs);
-  f_out_ << "</tbody></table>" << endl;
-  f_out_ << "</div></body></html>" << endl;
+  f_out_ << "</tbody></table>" << '\n';
+  f_out_ << "</div></body></html>" << '\n';
   f_out_.close();
 }
 
@@ -357,17 +355,17 @@
 }
 
 void t_html_generator::generate_css_content(std::ostream& f_target) {
-  f_target << BOOTSTRAP_CSS() << endl;
-  f_target << "/* Auto-generated CSS for generated Thrift docs */" << endl;
-  f_target << "h3, h4 { margin-bottom: 6px; }" << endl;
+  f_target << BOOTSTRAP_CSS() << '\n';
+  f_target << "/* Auto-generated CSS for generated Thrift docs */" << '\n';
+  f_target << "h3, h4 { margin-bottom: 6px; }" << '\n';
   f_target << "div.definition { border: 1px solid #CCC; margin-bottom: 10px; padding: 10px; }"
-           << endl;
-  f_target << "div.extends { margin: -0.5em 0 1em 5em }" << endl;
-  f_target << "td { vertical-align: top; }" << endl;
-  f_target << "table { empty-cells: show; }" << endl;
-  f_target << "code { line-height: 20px; }" << endl;
+           << '\n';
+  f_target << "div.extends { margin: -0.5em 0 1em 5em }" << '\n';
+  f_target << "td { vertical-align: top; }" << '\n';
+  f_target << "table { empty-cells: show; }" << '\n';
+  f_target << "code { line-height: 20px; }" << '\n';
   f_target << ".table-bordered th, .table-bordered td { border-bottom: 1px solid #DDDDDD; }"
-           << endl;
+           << '\n';
 }
 
 /**
@@ -377,11 +375,11 @@
  */
 void t_html_generator::generate_style_tag() {
   if (!standalone_) {
-    f_out_ << "<link href=\"style.css\" rel=\"stylesheet\" type=\"text/css\"/>" << endl;
+    f_out_ << "<link href=\"style.css\" rel=\"stylesheet\" type=\"text/css\"/>" << '\n';
   } else {
-    f_out_ << "<style type=\"text/css\"/><!--" << endl;
+    f_out_ << "<style type=\"text/css\"/><!--" << '\n';
     generate_css_content(f_out_);
-    f_out_ << "--></style>" << endl;
+    f_out_ << "--></style>" << '\n';
   }
 }
 
@@ -856,14 +854,14 @@
     if (has_docs) {
       arg_iter = args.begin();
       f_out_ << "<br/><h4 id=\"Parameters_" << service_name_ << "_" << tfunction->get_name()
-             << "\">Parameters</h4>" << endl;
+             << "\">Parameters</h4>" << '\n';
       f_out_ << "<table class=\"table-bordered table-striped table-condensed\">";
       f_out_ << "<thead><tr><th>Name</th><th>Description</th></tr></thead><tbody>";
       for (; arg_iter != args.end(); arg_iter++) {
         f_out_ << "<tr><td>" << (*arg_iter)->get_name();
         f_out_ << "</td><td>";
         f_out_ << escape_html((*arg_iter)->get_doc());
-        f_out_ << "</td></tr>" << endl;
+        f_out_ << "</td></tr>" << '\n';
       }
       f_out_ << "</tbody></table>";
     }
@@ -880,14 +878,14 @@
     if (has_docs) {
       ex_iter = excepts.begin();
       f_out_ << "<br/><h4 id=\"Exceptions_" << service_name_ << "_" << tfunction->get_name()
-             << "\">Exceptions</h4>" << endl;
+             << "\">Exceptions</h4>" << '\n';
       f_out_ << "<table class=\"table-bordered table-striped table-condensed\">";
       f_out_ << "<thead><tr><th>Type</th><th>Description</th></tr></thead><tbody>";
       for (; ex_iter != excepts.end(); ex_iter++) {
         f_out_ << "<tr><td>" << (*ex_iter)->get_type()->get_name();
         f_out_ << "</td><td>";
         f_out_ << escape_html((*ex_iter)->get_doc());
-        f_out_ << "</td></tr>" << endl;
+        f_out_ << "</td></tr>" << '\n';
       }
       f_out_ << "</tbody></table>";
     }
@@ -902,12 +900,12 @@
 void t_html_generator::generate_typedef(t_typedef* ttypedef) {
   string name = ttypedef->get_name();
   f_out_ << "<div class=\"definition\">";
-  f_out_ << "<h3 id=\"Typedef_" << name << "\">Typedef: " << name << "</h3>" << endl;
+  f_out_ << "<h3 id=\"Typedef_" << name << "\">Typedef: " << name << "</h3>" << '\n';
   f_out_ << "<p><strong>Base type:</strong>&nbsp;";
   print_type(ttypedef->get_type());
-  f_out_ << "</p>" << endl;
+  f_out_ << "</p>" << '\n';
   print_doc(ttypedef);
-  f_out_ << "</div>" << endl;
+  f_out_ << "</div>" << '\n';
 }
 
 /**
@@ -918,21 +916,21 @@
 void t_html_generator::generate_enum(t_enum* tenum) {
   string name = tenum->get_name();
   f_out_ << "<div class=\"definition\">";
-  f_out_ << "<h3 id=\"Enum_" << name << "\">Enumeration: " << name << "</h3>" << endl;
+  f_out_ << "<h3 id=\"Enum_" << name << "\">Enumeration: " << name << "</h3>" << '\n';
   print_doc(tenum);
   vector<t_enum_value*> values = tenum->get_constants();
   vector<t_enum_value*>::iterator val_iter;
-  f_out_ << "<br/><table class=\"table-bordered table-striped table-condensed\">" << endl;
+  f_out_ << "<br/><table class=\"table-bordered table-striped table-condensed\">" << '\n';
   for (val_iter = values.begin(); val_iter != values.end(); ++val_iter) {
     f_out_ << "<tr><td><code>";
     f_out_ << (*val_iter)->get_name();
     f_out_ << "</code></td><td><code>";
     f_out_ << (*val_iter)->get_value();
-    f_out_ << "</code></td><td>" << endl;
+    f_out_ << "</code></td><td>" << '\n';
     print_doc((*val_iter));
-    f_out_ << "</td></tr>" << endl;
+    f_out_ << "</td></tr>" << '\n';
   }
-  f_out_ << "</table></div>" << endl;
+  f_out_ << "</table></div>" << '\n';
 }
 
 /**
@@ -968,12 +966,12 @@
   } else {
     f_out_ << "Struct: ";
   }
-  f_out_ << name << "</h3>" << endl;
+  f_out_ << name << "</h3>" << '\n';
   vector<t_field*> members = tstruct->get_members();
   vector<t_field*>::iterator mem_iter = members.begin();
   f_out_ << "<table class=\"table-bordered table-striped table-condensed\">";
   f_out_ << "<thead><tr><th>Key</th><th>Field</th><th>Type</th><th>Description</th><th>Requiredness</"
-            "th><th>Default value</th></tr></thead><tbody>" << endl;
+            "th><th>Default value</th></tr></thead><tbody>" << '\n';
   for (; mem_iter != members.end(); mem_iter++) {
     f_out_ << "<tr><td>" << (*mem_iter)->get_key() << "</td><td>";
     f_out_ << (*mem_iter)->get_name();
@@ -996,7 +994,7 @@
       print_const_value((*mem_iter)->get_type(), default_val);
       f_out_ << "</code>";
     }
-    f_out_ << "</td></tr>" << endl;
+    f_out_ << "</td></tr>" << '\n';
   }
   f_out_ << "</tbody></table><br/>";
   print_doc(tstruct);
@@ -1018,7 +1016,7 @@
  * @param tservice The service definition
  */
 void t_html_generator::generate_service(t_service* tservice) {
-  f_out_ << "<h3 id=\"Svc_" << service_name_ << "\">Service: " << service_name_ << "</h3>" << endl;
+  f_out_ << "<h3 id=\"Svc_" << service_name_ << "\">Service: " << service_name_ << "</h3>" << '\n';
 
   if (tservice->get_extends()) {
     f_out_ << "<div class=\"extends\"><em>extends</em> ";
@@ -1032,7 +1030,7 @@
     string fn_name = (*fn_iter)->get_name();
     f_out_ << "<div class=\"definition\">";
     f_out_ << "<h4 id=\"Fn_" << service_name_ << "_" << fn_name << "\">Function: " << service_name_
-           << "." << fn_name << "</h4>" << endl;
+           << "." << fn_name << "</h4>" << '\n';
     f_out_ << "<pre>";
     std::string::size_type offset = print_type((*fn_iter)->get_returntype());
     bool first = true;
@@ -1042,7 +1040,7 @@
     vector<t_field*>::iterator arg_iter = args.begin();
     for (; arg_iter != args.end(); arg_iter++) {
       if (!first) {
-        f_out_ << "," << endl;
+        f_out_ << "," << '\n';
         for (std::string::size_type i = 0; i < offset; ++i) {
           f_out_ << " ";
         }
@@ -1055,7 +1053,7 @@
         print_const_value((*arg_iter)->get_type(), (*arg_iter)->get_value());
       }
     }
-    f_out_ << ")" << endl;
+    f_out_ << ")" << '\n';
     first = true;
     vector<t_field*> excepts = (*fn_iter)->get_xceptions()->get_members();
     vector<t_field*>::iterator ex_iter = excepts.begin();
@@ -1068,7 +1066,7 @@
         first = false;
         print_type((*ex_iter)->get_type());
       }
-      f_out_ << endl;
+      f_out_ << '\n';
     }
     f_out_ << "</pre>";
     print_doc(*fn_iter);
diff --git a/compiler/cpp/src/thrift/generate/t_java_generator.cc b/compiler/cpp/src/thrift/generate/t_java_generator.cc
index d7e0b65..e81744e 100644
--- a/compiler/cpp/src/thrift/generate/t_java_generator.cc
+++ b/compiler/cpp/src/thrift/generate/t_java_generator.cc
@@ -45,8 +45,6 @@
 using std::stringstream;
 using std::vector;
 
-static const string endl = "\n"; // avoid ostream << std::endl flushes
-
 static const string thrift_option_class = "org.apache.thrift.Option";
 static const string jdk_option_class = "java.util.Optional";
 
@@ -511,8 +509,7 @@
 }
 
 string t_java_generator::java_suppressions() {
-  return "@SuppressWarnings({\"cast\", \"rawtypes\", \"serial\", \"unchecked\", \"unused\"})"
-         + endl;
+  return "@SuppressWarnings({\"cast\", \"rawtypes\", \"serial\", \"unchecked\", \"unused\"})\n";
 }
 
 string t_java_generator::java_nullable_annotation() {
@@ -567,7 +564,7 @@
   f_enum.open(f_enum_name.c_str());
 
   // Comment and package it
-  f_enum << autogen_comment() << java_package() << endl;
+  f_enum << autogen_comment() << java_package() << '\n';
 
   generate_java_doc(f_enum, tenum);
 
@@ -576,7 +573,7 @@
   }
 
   if (is_deprecated) {
-    indent(f_enum) << "@Deprecated" << endl;
+    indent(f_enum) << "@Deprecated" << '\n';
   }
   indent(f_enum) << "public enum " << tenum->get_name() << " implements org.apache.thrift.TEnum ";
   scope_up(f_enum);
@@ -590,62 +587,62 @@
     if (first) {
       first = false;
     } else {
-      f_enum << "," << endl;
+      f_enum << "," << '\n';
     }
 
     generate_java_doc(f_enum, *c_iter);
     if (this->is_deprecated((*c_iter)->annotations_)) {
-      indent(f_enum) << "@Deprecated" << endl;
+      indent(f_enum) << "@Deprecated" << '\n';
     }
     indent(f_enum) << (*c_iter)->get_name() << "(" << value << ")";
   }
-  f_enum << ";" << endl << endl;
+  f_enum << ";" << '\n' << '\n';
 
   // Field for thriftCode
-  indent(f_enum) << "private final int value;" << endl << endl;
+  indent(f_enum) << "private final int value;" << '\n' << '\n';
 
-  indent(f_enum) << "private " << tenum->get_name() << "(int value) {" << endl;
-  indent(f_enum) << "  this.value = value;" << endl;
-  indent(f_enum) << "}" << endl << endl;
+  indent(f_enum) << "private " << tenum->get_name() << "(int value) {" << '\n';
+  indent(f_enum) << "  this.value = value;" << '\n';
+  indent(f_enum) << "}" << '\n' << '\n';
 
-  indent(f_enum) << "/**" << endl;
+  indent(f_enum) << "/**" << '\n';
   indent(f_enum) << " * Get the integer value of this enum value, as defined in the Thrift IDL."
-                 << endl;
-  indent(f_enum) << " */" << endl;
-  indent(f_enum) << java_override_annotation() << endl;
-  indent(f_enum) << "public int getValue() {" << endl;
-  indent(f_enum) << "  return value;" << endl;
-  indent(f_enum) << "}" << endl << endl;
+                 << '\n';
+  indent(f_enum) << " */" << '\n';
+  indent(f_enum) << java_override_annotation() << '\n';
+  indent(f_enum) << "public int getValue() {" << '\n';
+  indent(f_enum) << "  return value;" << '\n';
+  indent(f_enum) << "}" << '\n' << '\n';
 
-  indent(f_enum) << "/**" << endl;
+  indent(f_enum) << "/**" << '\n';
   indent(f_enum) << " * Find a the enum type by its integer value, as defined in the Thrift IDL."
-                 << endl;
-  indent(f_enum) << " * @return null if the value is not found." << endl;
-  indent(f_enum) << " */" << endl;
-  indent(f_enum) << java_nullable_annotation() << endl;
-  indent(f_enum) << "public static " + tenum->get_name() + " findByValue(int value) { " << endl;
+                 << '\n';
+  indent(f_enum) << " * @return null if the value is not found." << '\n';
+  indent(f_enum) << " */" << '\n';
+  indent(f_enum) << java_nullable_annotation() << '\n';
+  indent(f_enum) << "public static " + tenum->get_name() + " findByValue(int value) { " << '\n';
 
   indent_up();
 
-  indent(f_enum) << "switch (value) {" << endl;
+  indent(f_enum) << "switch (value) {" << '\n';
   indent_up();
 
   for (c_iter = constants.begin(); c_iter != constants.end(); ++c_iter) {
     int value = (*c_iter)->get_value();
-    indent(f_enum) << "case " << value << ":" << endl;
-    indent(f_enum) << "  return " << (*c_iter)->get_name() << ";" << endl;
+    indent(f_enum) << "case " << value << ":" << '\n';
+    indent(f_enum) << "  return " << (*c_iter)->get_name() << ";" << '\n';
   }
 
-  indent(f_enum) << "default:" << endl;
-  indent(f_enum) << "  return null;" << endl;
+  indent(f_enum) << "default:" << '\n';
+  indent(f_enum) << "  return null;" << '\n';
 
   indent_down();
 
-  indent(f_enum) << "}" << endl;
+  indent(f_enum) << "}" << '\n';
 
   indent_down();
 
-  indent(f_enum) << "}" << endl;
+  indent(f_enum) << "}" << '\n';
 
   scope_down(f_enum);
 
@@ -667,8 +664,8 @@
 
   // Print header
   f_consts << autogen_comment() << java_package() << java_suppressions();
-  f_consts << "public class " << make_valid_java_identifier(program_name_) << "Constants {" << endl
-           << endl;
+  f_consts << "public class " << make_valid_java_identifier(program_name_) << "Constants {" << '\n'
+           << '\n';
   indent_up();
   vector<t_const*>::iterator c_iter;
   for (c_iter = consts.begin(); c_iter != consts.end(); ++c_iter) {
@@ -677,7 +674,7 @@
                       (*c_iter)->get_value(), false);
   }
   indent_down();
-  indent(f_consts) << "}" << endl;
+  indent(f_consts) << "}" << '\n';
   f_consts.close();
 }
 
@@ -700,9 +697,9 @@
   }
   if (type->is_base_type()) {
     string v2 = render_const_value(out, type, value);
-    out << name << " = " << v2 << ";" << endl << endl;
+    out << name << " = " << v2 << ";" << '\n' << '\n';
   } else if (type->is_enum()) {
-    out << name << " = " << render_const_value(out, type, value) << ";" << endl << endl;
+    out << name << " = " << render_const_value(out, type, value) << ";" << '\n' << '\n';
   } else if (type->is_struct() || type->is_xception()) {
     const vector<t_field*>& unsorted_fields = ((t_struct*)type)->get_members();
     vector<t_field*> fields = unsorted_fields;
@@ -710,9 +707,9 @@
     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;
-    out << name << " = new " << type_name(type, false, true) << "();" << endl;
+    out << name << " = new " << type_name(type, false, true) << "();" << '\n';
     if (!in_static) {
-      indent(out) << "static {" << endl;
+      indent(out) << "static {" << '\n';
       indent_up();
     }
     for (v_iter = val.begin(); v_iter != val.end(); ++v_iter) {
@@ -728,22 +725,22 @@
       string val = render_const_value(out, field_type, v_iter->second);
       indent(out) << name << ".";
       std::string cap_name = get_cap_name(v_iter->first->get_string());
-      out << "set" << cap_name << "(" << val << ");" << endl;
+      out << "set" << cap_name << "(" << val << ");" << '\n';
     }
     if (!in_static) {
       indent_down();
-      indent(out) << "}" << endl;
+      indent(out) << "}" << '\n';
     }
-    out << endl;
+    out << '\n';
   } else if (type->is_map()) {
     std::string constructor_args;
     if (is_enum_map(type)) {
       constructor_args = inner_enum_type_name(type);
     }
     out << name << " = new " << type_name(type, false, true) << "(" << constructor_args << ");"
-        << endl;
+        << '\n';
     if (!in_static) {
-      indent(out) << "static {" << endl;
+      indent(out) << "static {" << '\n';
       indent_up();
     }
     t_type* ktype = ((t_map*)type)->get_key_type();
@@ -753,22 +750,22 @@
     for (v_iter = val.begin(); v_iter != val.end(); ++v_iter) {
       string key = render_const_value(out, ktype, v_iter->first);
       string val = render_const_value(out, vtype, v_iter->second);
-      indent(out) << name << ".put(" << key << ", " << val << ");" << endl;
+      indent(out) << name << ".put(" << key << ", " << val << ");" << '\n';
     }
     if (!in_static) {
       indent_down();
-      indent(out) << "}" << endl;
+      indent(out) << "}" << '\n';
     }
-    out << endl;
+    out << '\n';
   } else if (type->is_list() || type->is_set()) {
     if (is_enum_set(type)) {
       out << name << " = " << type_name(type, false, true, true) << ".noneOf("
-          << inner_enum_type_name(type) << ");" << endl;
+          << inner_enum_type_name(type) << ");" << '\n';
     } else {
-      out << name << " = new " << type_name(type, false, true) << "();" << endl;
+      out << name << " = new " << type_name(type, false, true) << "();" << '\n';
     }
     if (!in_static) {
-      indent(out) << "static {" << endl;
+      indent(out) << "static {" << '\n';
       indent_up();
     }
     t_type* etype;
@@ -781,13 +778,13 @@
     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, etype, *v_iter);
-      indent(out) << name << ".add(" << val << ");" << endl;
+      indent(out) << name << ".add(" << val << ");" << '\n';
     }
     if (!in_static) {
       indent_down();
-      indent(out) << "}" << endl;
+      indent(out) << "}" << '\n';
     }
-    out << endl;
+    out << '\n';
   } else {
     throw "compiler error: no const of type " + type->get_name();
   }
@@ -916,7 +913,7 @@
   }
 
   if (is_deprecated) {
-    indent(f_struct) << "@Deprecated" << endl;
+    indent(f_struct) << "@Deprecated" << '\n';
   }
   indent(f_struct) << "public " << (is_final ? "final " : "") << "class " << make_valid_java_identifier(tstruct->get_name())
                    << " extends org.apache.thrift.TUnion<" << make_valid_java_identifier(tstruct->get_name()) << ", "
@@ -927,49 +924,49 @@
   generate_struct_desc(f_struct, tstruct);
   generate_field_descs(f_struct, tstruct);
 
-  f_struct << endl;
+  f_struct << '\n';
 
   generate_field_name_constants(f_struct, tstruct);
 
-  f_struct << endl;
+  f_struct << '\n';
 
   generate_java_meta_data_map(f_struct, tstruct);
 
   generate_union_constructor(f_struct, tstruct);
 
-  f_struct << endl;
+  f_struct << '\n';
 
   generate_union_abstract_methods(f_struct, tstruct);
 
-  f_struct << endl;
+  f_struct << '\n';
 
   generate_java_struct_field_by_id(f_struct, tstruct);
 
-  f_struct << endl;
+  f_struct << '\n';
 
   generate_union_getters_and_setters(f_struct, tstruct);
 
-  f_struct << endl;
+  f_struct << '\n';
 
   generate_union_is_set_methods(f_struct, tstruct);
 
-  f_struct << endl;
+  f_struct << '\n';
 
   generate_union_comparisons(f_struct, tstruct);
 
-  f_struct << endl;
+  f_struct << '\n';
 
   generate_union_hashcode(f_struct, tstruct);
 
-  f_struct << endl;
+  f_struct << '\n';
 
   generate_java_struct_write_object(f_struct, tstruct);
 
-  f_struct << endl;
+  f_struct << '\n';
 
   generate_java_struct_read_object(f_struct, tstruct);
 
-  f_struct << endl;
+  f_struct << '\n';
 
   scope_down(f_struct);
 
@@ -980,63 +977,63 @@
   const vector<t_field*>& members = tstruct->get_members();
   vector<t_field*>::const_iterator m_iter;
 
-  indent(out) << "public " << type_name(tstruct) << "() {" << endl;
+  indent(out) << "public " << type_name(tstruct) << "() {" << '\n';
   indent_up();
   bool default_value = false;
   for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
     t_type* type = get_true_type((*m_iter)->get_type());
     if ((*m_iter)->get_value() != nullptr) {
       indent(out) << "super(_Fields." << constant_name((*m_iter)->get_name()) << ", "
-                  << render_const_value(out, type, (*m_iter)->get_value()) << ");" << endl;
+                  << render_const_value(out, type, (*m_iter)->get_value()) << ");" << '\n';
       default_value = true;
       break;
     }
   }
   if (default_value == false) {
-    indent(out) << "super();" << endl;
+    indent(out) << "super();" << '\n';
   }
   indent_down();
-  indent(out) << "}" << endl << endl;
+  indent(out) << "}" << '\n' << '\n';
 
   indent(out) << "public " << type_name(tstruct) << "(_Fields setField, java.lang.Object value) {"
-              << endl;
-  indent(out) << "  super(setField, value);" << endl;
-  indent(out) << "}" << endl << endl;
+              << '\n';
+  indent(out) << "  super(setField, value);" << '\n';
+  indent(out) << "}" << '\n' << '\n';
 
   indent(out) << "public " << type_name(tstruct)
               << "(" << type_name(tstruct) << " other) {"
-              << endl;
-  indent(out) << "  super(other);" << endl;
-  indent(out) << "}" << endl;
+              << '\n';
+  indent(out) << "  super(other);" << '\n';
+  indent(out) << "}" << '\n';
 
-  indent(out) << java_override_annotation() << endl;
-  indent(out) << "public " << make_valid_java_identifier(tstruct->get_name()) << " deepCopy() {" << endl;
-  indent(out) << "  return new " << tstruct->get_name() << "(this);" << endl;
-  indent(out) << "}" << endl << endl;
+  indent(out) << java_override_annotation() << '\n';
+  indent(out) << "public " << make_valid_java_identifier(tstruct->get_name()) << " deepCopy() {" << '\n';
+  indent(out) << "  return new " << tstruct->get_name() << "(this);" << '\n';
+  indent(out) << "}" << '\n' << '\n';
 
   // generate "constructors" for each field
   for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
     t_type* type = (*m_iter)->get_type();
     indent(out) << "public static " << type_name(tstruct) << " " << (*m_iter)->get_name() << "("
-                << type_name(type) << " value) {" << endl;
-    indent(out) << "  " << type_name(tstruct) << " x = new " << type_name(tstruct) << "();" << endl;
-    indent(out) << "  x.set" << get_cap_name((*m_iter)->get_name()) << "(value);" << endl;
-    indent(out) << "  return x;" << endl;
-    indent(out) << "}" << endl << endl;
+                << type_name(type) << " value) {" << '\n';
+    indent(out) << "  " << type_name(tstruct) << " x = new " << type_name(tstruct) << "();" << '\n';
+    indent(out) << "  x.set" << get_cap_name((*m_iter)->get_name()) << "(value);" << '\n';
+    indent(out) << "  return x;" << '\n';
+    indent(out) << "}" << '\n' << '\n';
 
     if (type->is_binary()) {
       indent(out) << "public static " << type_name(tstruct) << " " << (*m_iter)->get_name()
-                  << "(byte[] value) {" << endl;
+                  << "(byte[] value) {" << '\n';
       indent(out) << "  " << type_name(tstruct) << " x = new " << type_name(tstruct) << "();"
-                  << endl;
+                  << '\n';
       indent(out) << "  x.set" << get_cap_name((*m_iter)->get_name());
       if (unsafe_binaries_) {
-        indent(out) << "(java.nio.ByteBuffer.wrap(value));" << endl;
+        indent(out) << "(java.nio.ByteBuffer.wrap(value));" << '\n';
       } else {
-        indent(out) << "(java.nio.ByteBuffer.wrap(value.clone()));" << endl;
+        indent(out) << "(java.nio.ByteBuffer.wrap(value.clone()));" << '\n';
       }
-      indent(out) << "  return x;" << endl;
-      indent(out) << "}" << endl << endl;
+      indent(out) << "  return x;" << '\n';
+      indent(out) << "}" << '\n' << '\n';
     }
   }
 }
@@ -1050,7 +1047,7 @@
     if (first) {
       first = false;
     } else {
-      out << endl;
+      out << '\n';
     }
 
     t_field* field = (*m_iter);
@@ -1061,95 +1058,95 @@
     generate_java_doc(out, field);
     if (type->is_binary()) {
       if (is_deprecated) {
-        indent(out) << "@Deprecated" << endl;
+        indent(out) << "@Deprecated" << '\n';
       }
-      indent(out) << "public byte[] get" << cap_name << "() {" << endl;
+      indent(out) << "public byte[] get" << cap_name << "() {" << '\n';
       indent(out) << "  set" << cap_name << "(org.apache.thrift.TBaseHelper.rightSize(buffer"
-                  << get_cap_name("for") << cap_name << "()));" << endl;
+                  << get_cap_name("for") << cap_name << "()));" << '\n';
       indent(out) << "  java.nio.ByteBuffer b = buffer" << get_cap_name("for") << cap_name << "();"
-                  << endl;
-      indent(out) << "  return b == null ? null : b.array();" << endl;
-      indent(out) << "}" << endl;
+                  << '\n';
+      indent(out) << "  return b == null ? null : b.array();" << '\n';
+      indent(out) << "}" << '\n';
 
-      out << endl;
+      out << '\n';
 
       indent(out) << "public java.nio.ByteBuffer buffer" << get_cap_name("for")
-                  << get_cap_name(field->get_name()) << "() {" << endl;
+                  << get_cap_name(field->get_name()) << "() {" << '\n';
       indent(out) << "  if (getSetField() == _Fields." << constant_name(field->get_name()) << ") {"
-                  << endl;
+                  << '\n';
 
       if (unsafe_binaries_) {
-        indent(out) << "    return (java.nio.ByteBuffer)getFieldValue();" << endl;
+        indent(out) << "    return (java.nio.ByteBuffer)getFieldValue();" << '\n';
       } else {
         indent(out)
             << "    return "
                "org.apache.thrift.TBaseHelper.copyBinary((java.nio.ByteBuffer)getFieldValue());"
-            << endl;
+            << '\n';
       }
 
-      indent(out) << "  } else {" << endl;
+      indent(out) << "  } else {" << '\n';
       indent(out) << "    throw new java.lang.RuntimeException(\"Cannot get field '"
                   << field->get_name()
                   << "' because union is currently set to \" + getFieldDesc(getSetField()).name);"
-                  << endl;
-      indent(out) << "  }" << endl;
-      indent(out) << "}" << endl;
+                  << '\n';
+      indent(out) << "  }" << '\n';
+      indent(out) << "}" << '\n';
     } else {
       if (is_deprecated) {
-        indent(out) << "@Deprecated" << endl;
+        indent(out) << "@Deprecated" << '\n';
       }
       indent(out) << "public " << type_name(field->get_type()) << " get"
-                  << get_cap_name(field->get_name()) << "() {" << endl;
+                  << get_cap_name(field->get_name()) << "() {" << '\n';
       indent(out) << "  if (getSetField() == _Fields." << constant_name(field->get_name()) << ") {"
-                  << endl;
+                  << '\n';
       indent(out) << "    return (" << type_name(field->get_type(), true) << ")getFieldValue();"
-                  << endl;
-      indent(out) << "  } else {" << endl;
+                  << '\n';
+      indent(out) << "  } else {" << '\n';
       indent(out) << "    throw new java.lang.RuntimeException(\"Cannot get field '"
                   << field->get_name()
                   << "' because union is currently set to \" + getFieldDesc(getSetField()).name);"
-                  << endl;
-      indent(out) << "  }" << endl;
-      indent(out) << "}" << endl;
+                  << '\n';
+      indent(out) << "  }" << '\n';
+      indent(out) << "}" << '\n';
     }
 
-    out << endl;
+    out << '\n';
 
     generate_java_doc(out, field);
     if (type->is_binary()) {
       if (is_deprecated) {
-        indent(out) << "@Deprecated" << endl;
+        indent(out) << "@Deprecated" << '\n';
       }
       indent(out) << "public void set" << get_cap_name(field->get_name()) << "(byte[] value) {"
-                  << endl;
+                  << '\n';
       indent(out) << "  set" << get_cap_name(field->get_name());
 
       if (unsafe_binaries_) {
-        indent(out) << "(java.nio.ByteBuffer.wrap(value));" << endl;
+        indent(out) << "(java.nio.ByteBuffer.wrap(value));" << '\n';
       } else {
-        indent(out) << "(java.nio.ByteBuffer.wrap(value.clone()));" << endl;
+        indent(out) << "(java.nio.ByteBuffer.wrap(value.clone()));" << '\n';
       }
 
-      indent(out) << "}" << endl;
+      indent(out) << "}" << '\n';
 
-      out << endl;
+      out << '\n';
     }
     if (is_deprecated) {
-      indent(out) << "@Deprecated" << endl;
+      indent(out) << "@Deprecated" << '\n';
     }
     indent(out) << "public void set" << get_cap_name(field->get_name()) << "("
-                << type_name(field->get_type()) << " value) {" << endl;
+                << type_name(field->get_type()) << " value) {" << '\n';
 
-    indent(out) << "  setField_ = _Fields." << constant_name(field->get_name()) << ";" << endl;
+    indent(out) << "  setField_ = _Fields." << constant_name(field->get_name()) << ";" << '\n';
 
     if (type_can_be_null(field->get_type())) {
       indent(out) << "  value_ = java.util.Objects.requireNonNull(value,\""
-                  << "_Fields." << constant_name(field->get_name()) << "\");" << endl;
+                  << "_Fields." << constant_name(field->get_name()) << "\");" << '\n';
     } else {
-      indent(out) << "  value_ = value;" << endl;
+      indent(out) << "  value_ = value;" << '\n';
     }
 
-    indent(out) << "}" << endl;
+    indent(out) << "}" << '\n';
   }
 }
 
@@ -1162,49 +1159,49 @@
     if (first) {
       first = false;
     } else {
-      out << endl;
+      out << '\n';
     }
 
     std::string field_name = (*m_iter)->get_name();
 
     indent(out) << "public boolean is" << get_cap_name("set") << get_cap_name(field_name) << "() {"
-                << endl;
+                << '\n';
     indent_up();
-    indent(out) << "return setField_ == _Fields." << constant_name(field_name) << ";" << endl;
+    indent(out) << "return setField_ == _Fields." << constant_name(field_name) << ";" << '\n';
     indent_down();
-    indent(out) << "}" << endl << endl;
+    indent(out) << "}" << '\n' << '\n';
   }
 }
 
 void t_java_generator::generate_union_abstract_methods(ostream& out, t_struct* tstruct) {
   generate_check_type(out, tstruct);
-  out << endl;
+  out << '\n';
   generate_standard_scheme_read_value(out, tstruct);
-  out << endl;
+  out << '\n';
   generate_standard_scheme_write_value(out, tstruct);
-  out << endl;
+  out << '\n';
   generate_tuple_scheme_read_value(out, tstruct);
-  out << endl;
+  out << '\n';
   generate_tuple_scheme_write_value(out, tstruct);
-  out << endl;
+  out << '\n';
   generate_get_field_desc(out, tstruct);
-  out << endl;
+  out << '\n';
   generate_get_struct_desc(out, tstruct);
-  out << endl;
-  indent(out) << java_override_annotation() << endl;
-  indent(out) << "protected _Fields enumForId(short id) {" << endl;
-  indent(out) << "  return _Fields.findByThriftIdOrThrow(id);" << endl;
-  indent(out) << "}" << endl;
+  out << '\n';
+  indent(out) << java_override_annotation() << '\n';
+  indent(out) << "protected _Fields enumForId(short id) {" << '\n';
+  indent(out) << "  return _Fields.findByThriftIdOrThrow(id);" << '\n';
+  indent(out) << "}" << '\n';
 }
 
 void t_java_generator::generate_check_type(ostream& out, t_struct* tstruct) {
-  indent(out) << java_override_annotation() << endl;
+  indent(out) << java_override_annotation() << '\n';
   indent(out) << "protected void checkType(_Fields setField, java.lang.Object value) throws "
                  "java.lang.ClassCastException {"
-              << endl;
+              << '\n';
   indent_up();
 
-  indent(out) << "switch (setField) {" << endl;
+  indent(out) << "switch (setField) {" << '\n';
   indent_up();
 
   const vector<t_field*>& members = tstruct->get_members();
@@ -1213,42 +1210,42 @@
   for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
     t_field* field = (*m_iter);
 
-    indent(out) << "case " << constant_name(field->get_name()) << ":" << endl;
+    indent(out) << "case " << constant_name(field->get_name()) << ":" << '\n';
     indent(out) << "  if (value instanceof " << type_name(field->get_type(), true, false, true)
-                << ") {" << endl;
-    indent(out) << "    break;" << endl;
-    indent(out) << "  }" << endl;
+                << ") {" << '\n';
+    indent(out) << "    break;" << '\n';
+    indent(out) << "  }" << '\n';
     indent(out) << "  throw new java.lang.ClassCastException(\"Was expecting value of type "
                 << type_name(field->get_type(), true, false) << " for field '" << field->get_name()
-                << "', but got \" + value.getClass().getSimpleName());" << endl;
+                << "', but got \" + value.getClass().getSimpleName());" << '\n';
     // do the real check here
   }
 
-  indent(out) << "default:" << endl;
+  indent(out) << "default:" << '\n';
   indent(out) << "  throw new java.lang.IllegalArgumentException(\"Unknown field id \" + setField);"
-              << endl;
+              << '\n';
 
   indent_down();
-  indent(out) << "}" << endl;
+  indent(out) << "}" << '\n';
 
   indent_down();
-  indent(out) << "}" << endl;
+  indent(out) << "}" << '\n';
 }
 
 void t_java_generator::generate_standard_scheme_read_value(ostream& out, t_struct* tstruct) {
-  indent(out) << java_override_annotation() << endl;
+  indent(out) << java_override_annotation() << '\n';
   indent(out)
       << "protected java.lang.Object standardSchemeReadValue(org.apache.thrift.protocol.TProtocol "
          "iprot, org.apache.thrift.protocol.TField field) throws "
          "org.apache.thrift.TException {"
-      << endl;
+      << '\n';
 
   indent_up();
 
-  indent(out) << "_Fields setField = _Fields.findByThriftId(field.id);" << endl;
-  indent(out) << "if (setField != null) {" << endl;
+  indent(out) << "_Fields setField = _Fields.findByThriftId(field.id);" << '\n';
+  indent(out) << "if (setField != null) {" << '\n';
   indent_up();
-  indent(out) << "switch (setField) {" << endl;
+  indent(out) << "switch (setField) {" << '\n';
   indent_up();
 
   const vector<t_field*>& members = tstruct->get_members();
@@ -1257,53 +1254,53 @@
   for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
     t_field* field = (*m_iter);
 
-    indent(out) << "case " << constant_name(field->get_name()) << ":" << endl;
+    indent(out) << "case " << constant_name(field->get_name()) << ":" << '\n';
     indent_up();
     indent(out) << "if (field.type == " << constant_name(field->get_name()) << "_FIELD_DESC.type) {"
-                << endl;
+                << '\n';
     indent_up();
     indent(out) << type_name(field->get_type(), true, false) << " " << field->get_name() << ";"
-                << endl;
+                << '\n';
     generate_deserialize_field(out, field, "");
-    indent(out) << "return " << field->get_name() << ";" << endl;
+    indent(out) << "return " << field->get_name() << ";" << '\n';
     indent_down();
-    indent(out) << "} else {" << endl;
-    indent(out) << "  org.apache.thrift.protocol.TProtocolUtil.skip(iprot, field.type);" << endl;
-    indent(out) << "  return null;" << endl;
-    indent(out) << "}" << endl;
+    indent(out) << "} else {" << '\n';
+    indent(out) << "  org.apache.thrift.protocol.TProtocolUtil.skip(iprot, field.type);" << '\n';
+    indent(out) << "  return null;" << '\n';
+    indent(out) << "}" << '\n';
     indent_down();
   }
 
-  indent(out) << "default:" << endl;
+  indent(out) << "default:" << '\n';
   indent(out)
       << "  throw new java.lang.IllegalStateException(\"setField wasn't null, but didn't match any "
          "of the case statements!\");"
-      << endl;
+      << '\n';
 
   indent_down();
-  indent(out) << "}" << endl;
+  indent(out) << "}" << '\n';
 
   indent_down();
-  indent(out) << "} else {" << endl;
+  indent(out) << "} else {" << '\n';
   indent_up();
-  indent(out) << "org.apache.thrift.protocol.TProtocolUtil.skip(iprot, field.type);" << endl;
-  indent(out) << "return null;" << endl;
+  indent(out) << "org.apache.thrift.protocol.TProtocolUtil.skip(iprot, field.type);" << '\n';
+  indent(out) << "return null;" << '\n';
   indent_down();
-  indent(out) << "}" << endl;
+  indent(out) << "}" << '\n';
 
   indent_down();
-  indent(out) << "}" << endl;
+  indent(out) << "}" << '\n';
 }
 
 void t_java_generator::generate_standard_scheme_write_value(ostream& out, t_struct* tstruct) {
-  indent(out) << java_override_annotation() << endl;
+  indent(out) << java_override_annotation() << '\n';
   indent(out) << "protected void standardSchemeWriteValue(org.apache.thrift.protocol.TProtocol "
                  "oprot) throws org.apache.thrift.TException {"
-              << endl;
+              << '\n';
 
   indent_up();
 
-  indent(out) << "switch (setField_) {" << endl;
+  indent(out) << "switch (setField_) {" << '\n';
   indent_up();
 
   const vector<t_field*>& members = tstruct->get_members();
@@ -1312,42 +1309,42 @@
   for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
     t_field* field = (*m_iter);
 
-    indent(out) << "case " << constant_name(field->get_name()) << ":" << endl;
+    indent(out) << "case " << constant_name(field->get_name()) << ":" << '\n';
     indent_up();
     indent(out) << type_name(field->get_type(), true, false) << " " << field->get_name() << " = ("
-                << type_name(field->get_type(), true, false) << ")value_;" << endl;
+                << type_name(field->get_type(), true, false) << ")value_;" << '\n';
     generate_serialize_field(out, field);
-    indent(out) << "return;" << endl;
+    indent(out) << "return;" << '\n';
     indent_down();
   }
 
-  indent(out) << "default:" << endl;
+  indent(out) << "default:" << '\n';
   indent(out)
       << "  throw new java.lang.IllegalStateException(\"Cannot write union with unknown field \" + "
          "setField_);"
-      << endl;
+      << '\n';
 
   indent_down();
-  indent(out) << "}" << endl;
+  indent(out) << "}" << '\n';
 
   indent_down();
 
-  indent(out) << "}" << endl;
+  indent(out) << "}" << '\n';
 }
 
 void t_java_generator::generate_tuple_scheme_read_value(ostream& out, t_struct* tstruct) {
-  indent(out) << java_override_annotation() << endl;
+  indent(out) << java_override_annotation() << '\n';
   indent(out)
       << "protected java.lang.Object tupleSchemeReadValue(org.apache.thrift.protocol.TProtocol "
          "iprot, short fieldID) throws org.apache.thrift.TException {"
-      << endl;
+      << '\n';
 
   indent_up();
 
-  indent(out) << "_Fields setField = _Fields.findByThriftId(fieldID);" << endl;
-  indent(out) << "if (setField != null) {" << endl;
+  indent(out) << "_Fields setField = _Fields.findByThriftId(fieldID);" << '\n';
+  indent(out) << "if (setField != null) {" << '\n';
   indent_up();
-  indent(out) << "switch (setField) {" << endl;
+  indent(out) << "switch (setField) {" << '\n';
   indent_up();
 
   const vector<t_field*>& members = tstruct->get_members();
@@ -1356,45 +1353,45 @@
   for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
     t_field* field = (*m_iter);
 
-    indent(out) << "case " << constant_name(field->get_name()) << ":" << endl;
+    indent(out) << "case " << constant_name(field->get_name()) << ":" << '\n';
     indent_up();
     indent(out) << type_name(field->get_type(), true, false) << " " << field->get_name() << ";"
-                << endl;
+                << '\n';
     generate_deserialize_field(out, field, "");
-    indent(out) << "return " << field->get_name() << ";" << endl;
+    indent(out) << "return " << field->get_name() << ";" << '\n';
     indent_down();
   }
 
-  indent(out) << "default:" << endl;
+  indent(out) << "default:" << '\n';
   indent(out)
       << "  throw new java.lang.IllegalStateException(\"setField wasn't null, but didn't match any "
          "of the case statements!\");"
-      << endl;
+      << '\n';
 
   indent_down();
-  indent(out) << "}" << endl;
+  indent(out) << "}" << '\n';
 
   indent_down();
-  indent(out) << "} else {" << endl;
+  indent(out) << "} else {" << '\n';
   indent_up();
   indent(out) << "throw new org.apache.thrift.protocol.TProtocolException(\"Couldn't find a field "
                  "with field id \" + fieldID);"
-              << endl;
+              << '\n';
   indent_down();
-  indent(out) << "}" << endl;
+  indent(out) << "}" << '\n';
   indent_down();
-  indent(out) << "}" << endl;
+  indent(out) << "}" << '\n';
 }
 
 void t_java_generator::generate_tuple_scheme_write_value(ostream& out, t_struct* tstruct) {
-  indent(out) << java_override_annotation() << endl;
+  indent(out) << java_override_annotation() << '\n';
   indent(out) << "protected void tupleSchemeWriteValue(org.apache.thrift.protocol.TProtocol oprot) "
                  "throws org.apache.thrift.TException {"
-              << endl;
+              << '\n';
 
   indent_up();
 
-  indent(out) << "switch (setField_) {" << endl;
+  indent(out) << "switch (setField_) {" << '\n';
   indent_up();
 
   const vector<t_field*>& members = tstruct->get_members();
@@ -1403,119 +1400,119 @@
   for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
     t_field* field = (*m_iter);
 
-    indent(out) << "case " << constant_name(field->get_name()) << ":" << endl;
+    indent(out) << "case " << constant_name(field->get_name()) << ":" << '\n';
     indent_up();
     indent(out) << type_name(field->get_type(), true, false) << " " << field->get_name() << " = ("
-                << type_name(field->get_type(), true, false) << ")value_;" << endl;
+                << type_name(field->get_type(), true, false) << ")value_;" << '\n';
     generate_serialize_field(out, field);
-    indent(out) << "return;" << endl;
+    indent(out) << "return;" << '\n';
     indent_down();
   }
 
-  indent(out) << "default:" << endl;
+  indent(out) << "default:" << '\n';
   indent(out)
       << "  throw new java.lang.IllegalStateException(\"Cannot write union with unknown field \" + "
          "setField_);"
-      << endl;
+      << '\n';
 
   indent_down();
-  indent(out) << "}" << endl;
+  indent(out) << "}" << '\n';
 
   indent_down();
 
-  indent(out) << "}" << endl;
+  indent(out) << "}" << '\n';
 }
 
 void t_java_generator::generate_get_field_desc(ostream& out, t_struct* tstruct) {
-  indent(out) << java_override_annotation() << endl;
+  indent(out) << java_override_annotation() << '\n';
   indent(out) << "protected org.apache.thrift.protocol.TField getFieldDesc(_Fields setField) {"
-              << endl;
+              << '\n';
   indent_up();
 
   const vector<t_field*>& members = tstruct->get_members();
   vector<t_field*>::const_iterator m_iter;
 
-  indent(out) << "switch (setField) {" << endl;
+  indent(out) << "switch (setField) {" << '\n';
   indent_up();
 
   for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
     t_field* field = (*m_iter);
-    indent(out) << "case " << constant_name(field->get_name()) << ":" << endl;
-    indent(out) << "  return " << constant_name(field->get_name()) << "_FIELD_DESC;" << endl;
+    indent(out) << "case " << constant_name(field->get_name()) << ":" << '\n';
+    indent(out) << "  return " << constant_name(field->get_name()) << "_FIELD_DESC;" << '\n';
   }
 
-  indent(out) << "default:" << endl;
+  indent(out) << "default:" << '\n';
   indent(out) << "  throw new java.lang.IllegalArgumentException(\"Unknown field id \" + setField);"
-              << endl;
+              << '\n';
 
   indent_down();
-  indent(out) << "}" << endl;
+  indent(out) << "}" << '\n';
 
   indent_down();
-  indent(out) << "}" << endl;
+  indent(out) << "}" << '\n';
 }
 
 void t_java_generator::generate_get_struct_desc(ostream& out, t_struct* tstruct) {
   (void)tstruct;
-  indent(out) << java_override_annotation() << endl;
-  indent(out) << "protected org.apache.thrift.protocol.TStruct getStructDesc() {" << endl;
-  indent(out) << "  return STRUCT_DESC;" << endl;
-  indent(out) << "}" << endl;
+  indent(out) << java_override_annotation() << '\n';
+  indent(out) << "protected org.apache.thrift.protocol.TStruct getStructDesc() {" << '\n';
+  indent(out) << "  return STRUCT_DESC;" << '\n';
+  indent(out) << "}" << '\n';
 }
 
 void t_java_generator::generate_union_comparisons(ostream& out, t_struct* tstruct) {
   // equality
-  indent(out) << "public boolean equals(java.lang.Object other) {" << endl;
-  indent(out) << "  if (other instanceof " << make_valid_java_identifier(tstruct->get_name()) << ") {" << endl;
-  indent(out) << "    return equals((" << make_valid_java_identifier(tstruct->get_name()) << ")other);" << endl;
-  indent(out) << "  } else {" << endl;
-  indent(out) << "    return false;" << endl;
-  indent(out) << "  }" << endl;
-  indent(out) << "}" << endl;
+  indent(out) << "public boolean equals(java.lang.Object other) {" << '\n';
+  indent(out) << "  if (other instanceof " << make_valid_java_identifier(tstruct->get_name()) << ") {" << '\n';
+  indent(out) << "    return equals((" << make_valid_java_identifier(tstruct->get_name()) << ")other);" << '\n';
+  indent(out) << "  } else {" << '\n';
+  indent(out) << "    return false;" << '\n';
+  indent(out) << "  }" << '\n';
+  indent(out) << "}" << '\n';
 
-  out << endl;
+  out << '\n';
 
-  indent(out) << "public boolean equals(" << make_valid_java_identifier(tstruct->get_name()) << " other) {" << endl;
+  indent(out) << "public boolean equals(" << make_valid_java_identifier(tstruct->get_name()) << " other) {" << '\n';
   indent(out) << "  return other != null && getSetField() == other.getSetField() && "
                  "getFieldValue().equals(other.getFieldValue());"
-              << endl;
-  indent(out) << "}" << endl;
-  out << endl;
+              << '\n';
+  indent(out) << "}" << '\n';
+  out << '\n';
 
-  indent(out) << java_override_annotation() << endl;
-  indent(out) << "public int compareTo(" << type_name(tstruct) << " other) {" << endl;
+  indent(out) << java_override_annotation() << '\n';
+  indent(out) << "public int compareTo(" << type_name(tstruct) << " other) {" << '\n';
   indent(out) << "  int lastComparison = org.apache.thrift.TBaseHelper.compareTo(getSetField(), "
                  "other.getSetField());"
-              << endl;
-  indent(out) << "  if (lastComparison == 0) {" << endl;
+              << '\n';
+  indent(out) << "  if (lastComparison == 0) {" << '\n';
   indent(out) << "    return org.apache.thrift.TBaseHelper.compareTo(getFieldValue(), "
                  "other.getFieldValue());"
-              << endl;
-  indent(out) << "  }" << endl;
-  indent(out) << "  return lastComparison;" << endl;
-  indent(out) << "}" << endl;
-  out << endl;
+              << '\n';
+  indent(out) << "  }" << '\n';
+  indent(out) << "  return lastComparison;" << '\n';
+  indent(out) << "}" << '\n';
+  out << '\n';
 }
 
 void t_java_generator::generate_union_hashcode(ostream& out, t_struct* tstruct) {
   (void)tstruct;
-  indent(out) << java_override_annotation() << endl;
-  indent(out) << "public int hashCode() {" << endl;
+  indent(out) << java_override_annotation() << '\n';
+  indent(out) << "public int hashCode() {" << '\n';
   indent(out)
       << "  java.util.List<java.lang.Object> list = new java.util.ArrayList<java.lang.Object>();"
-      << endl;
-  indent(out) << "  list.add(this.getClass().getName());" << endl;
-  indent(out) << "  org.apache.thrift.TFieldIdEnum setField = getSetField();" << endl;
-  indent(out) << "  if (setField != null) {" << endl;
-  indent(out) << "    list.add(setField.getThriftFieldId());" << endl;
-  indent(out) << "    java.lang.Object value = getFieldValue();" << endl;
-  indent(out) << "    if (value instanceof org.apache.thrift.TEnum) {" << endl;
-  indent(out) << "      list.add(((org.apache.thrift.TEnum)getFieldValue()).getValue());" << endl;
-  indent(out) << "    } else {" << endl;
-  indent(out) << "      list.add(value);" << endl;
-  indent(out) << "    }" << endl;
-  indent(out) << "  }" << endl;
-  indent(out) << "  return list.hashCode();" << endl;
+      << '\n';
+  indent(out) << "  list.add(this.getClass().getName());" << '\n';
+  indent(out) << "  org.apache.thrift.TFieldIdEnum setField = getSetField();" << '\n';
+  indent(out) << "  if (setField != null) {" << '\n';
+  indent(out) << "    list.add(setField.getThriftFieldId());" << '\n';
+  indent(out) << "    java.lang.Object value = getFieldValue();" << '\n';
+  indent(out) << "    if (value instanceof org.apache.thrift.TEnum) {" << '\n';
+  indent(out) << "      list.add(((org.apache.thrift.TEnum)getFieldValue()).getValue());" << '\n';
+  indent(out) << "    } else {" << '\n';
+  indent(out) << "      list.add(value);" << '\n';
+  indent(out) << "    }" << '\n';
+  indent(out) << "  }" << '\n';
+  indent(out) << "  return list.hashCode();" << '\n';
   indent(out) << "}";
 }
 
@@ -1545,7 +1542,7 @@
   }
 
   if (is_deprecated) {
-    indent(out) << "@Deprecated" << endl;
+    indent(out) << "@Deprecated" << '\n';
   }
   indent(out) << "public " << (is_final ? "final " : "") << (in_class ? "static " : "") << "class "
               << make_valid_java_identifier(tstruct->get_name()) << " ";
@@ -1571,15 +1568,15 @@
   const vector<t_field*>& members = tstruct->get_members();
   vector<t_field*>::const_iterator m_iter;
 
-  out << endl;
+  out << '\n';
 
   generate_field_descs(out, tstruct);
 
-  out << endl;
+  out << '\n';
 
   generate_scheme_map(out, tstruct);
 
-  out << endl;
+  out << '\n';
 
   for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
     if (bean_style_ || private_members_) {
@@ -1588,10 +1585,10 @@
       generate_java_doc(out, *m_iter);
       indent(out) << "public ";
     }
-    out << declare_field(*m_iter, false, true) << endl;
+    out << declare_field(*m_iter, false, true) << '\n';
   }
 
-  out << endl;
+  out << '\n';
 
   if (android_style_) {
     generate_java_struct_parcelable(out, tstruct);
@@ -1601,9 +1598,9 @@
 
   // isset data
   if (members.size() > 0) {
-    out << endl;
+    out << '\n';
 
-    indent(out) << "// isset id assignments" << endl;
+    indent(out) << "// isset id assignments" << '\n';
 
     int i = 0;
     int optionals = 0;
@@ -1613,7 +1610,7 @@
       }
       if (!type_can_be_null((*m_iter)->get_type())) {
         indent(out) << "private static final int " << isset_field_id(*m_iter) << " = " << i << ";"
-                    << endl;
+                    << '\n';
         i++;
       }
     }
@@ -1623,11 +1620,11 @@
     case ISSET_NONE:
       break;
     case ISSET_PRIMITIVE:
-      indent(out) << "private " << primitiveType << " __isset_bitfield = 0;" << endl;
+      indent(out) << "private " << primitiveType << " __isset_bitfield = 0;" << '\n';
       break;
     case ISSET_BITSET:
       indent(out) << "private java.util.BitSet __isset_bit_vector = new java.util.BitSet(" << i
-                  << ");" << endl;
+                  << ");" << '\n';
       break;
     }
 
@@ -1638,7 +1635,7 @@
           output_string = output_string + "_Fields." + constant_name((*m_iter)->get_name()) + ",";
         }
       }
-      indent(out) << output_string.substr(0, output_string.length() - 1) << "};" << endl;
+      indent(out) << output_string.substr(0, output_string.length() - 1) << "};" << '\n';
     }
   }
 
@@ -1647,7 +1644,7 @@
   bool all_optional_members = true;
 
   // Default constructor
-  indent(out) << "public " << make_valid_java_identifier(tstruct->get_name()) << "() {" << endl;
+  indent(out) << "public " << make_valid_java_identifier(tstruct->get_name()) << "() {" << '\n';
   indent_up();
   for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
     t_type* t = get_true_type((*m_iter)->get_type());
@@ -1660,27 +1657,27 @@
     }
   }
   indent_down();
-  indent(out) << "}" << endl << endl;
+  indent(out) << "}" << '\n' << '\n';
 
   if (!members.empty() && !all_optional_members) {
     // Full constructor for all fields
-    indent(out) << "public " << make_valid_java_identifier(tstruct->get_name()) << "(" << endl;
+    indent(out) << "public " << make_valid_java_identifier(tstruct->get_name()) << "(" << '\n';
     indent_up();
     bool first = true;
     for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
       if ((*m_iter)->get_req() != t_field::T_OPTIONAL) {
         if (!first) {
-          out << "," << endl;
+          out << "," << '\n';
         }
         first = false;
         indent(out) << type_name((*m_iter)->get_type()) << " " << make_valid_java_identifier((*m_iter)->get_name());
       }
     }
-    out << ")" << endl;
+    out << ")" << '\n';
     indent_down();
-    indent(out) << "{" << endl;
+    indent(out) << "{" << '\n';
     indent_up();
-    indent(out) << "this();" << endl;
+    indent(out) << "this();" << '\n';
     for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
       if ((*m_iter)->get_req() != t_field::T_OPTIONAL) {
         t_type* type = get_true_type((*m_iter)->get_type());
@@ -1688,44 +1685,44 @@
           if (unsafe_binaries_) {
             indent(out) << "this." << make_valid_java_identifier((*m_iter)->get_name())
                         << " = " << make_valid_java_identifier((*m_iter)->get_name()) << ";"
-                        << endl;
+                        << '\n';
           } else {
             indent(out) << "this." << make_valid_java_identifier((*m_iter)->get_name())
                         << " = org.apache.thrift.TBaseHelper.copyBinary("
                         << make_valid_java_identifier((*m_iter)->get_name())
-                        << ");" << endl;
+                        << ");" << '\n';
           }
         } else {
           indent(out) << "this." << make_valid_java_identifier((*m_iter)->get_name()) << " = "
                       << make_valid_java_identifier((*m_iter)->get_name()) << ";"
-                      << endl;
+                      << '\n';
         }
         generate_isset_set(out, (*m_iter), "");
       }
     }
 
     indent_down();
-    indent(out) << "}" << endl << endl;
+    indent(out) << "}" << '\n' << '\n';
   }
 
   // copy constructor
-  indent(out) << "/**" << endl;
-  indent(out) << " * Performs a deep copy on <i>other</i>." << endl;
-  indent(out) << " */" << endl;
+  indent(out) << "/**" << '\n';
+  indent(out) << " * Performs a deep copy on <i>other</i>." << '\n';
+  indent(out) << " */" << '\n';
   indent(out) << "public " << make_valid_java_identifier(tstruct->get_name())
               << "(" << make_valid_java_identifier(tstruct->get_name()) << " other) {"
-              << endl;
+              << '\n';
   indent_up();
 
   switch (needs_isset(tstruct)) {
   case ISSET_NONE:
     break;
   case ISSET_PRIMITIVE:
-    indent(out) << "__isset_bitfield = other.__isset_bitfield;" << endl;
+    indent(out) << "__isset_bitfield = other.__isset_bitfield;" << '\n';
     break;
   case ISSET_BITSET:
-    indent(out) << "__isset_bit_vector.clear();" << endl;
-    indent(out) << "__isset_bit_vector.or(other.__isset_bit_vector);" << endl;
+    indent(out) << "__isset_bit_vector.clear();" << '\n';
+    indent(out) << "__isset_bit_vector.or(other.__isset_bit_vector);" << '\n';
     break;
   }
 
@@ -1736,33 +1733,33 @@
     bool can_be_null = type_can_be_null(type);
 
     if (can_be_null) {
-      indent(out) << "if (other." << generate_isset_check(field) << ") {" << endl;
+      indent(out) << "if (other." << generate_isset_check(field) << ") {" << '\n';
       indent_up();
     }
 
     if (type->is_container()) {
       generate_deep_copy_container(out, "other", field_name, "__this__" + field_name, type);
-      indent(out) << "this." << make_valid_java_identifier(field_name) << " = __this__" << field_name << ";" << endl;
+      indent(out) << "this." << make_valid_java_identifier(field_name) << " = __this__" << field_name << ";" << '\n';
     } else {
       indent(out) << "this." << make_valid_java_identifier(field_name) << " = ";
       generate_deep_copy_non_container(out, "other." + make_valid_java_identifier(field_name), field_name, type);
-      out << ";" << endl;
+      out << ";" << '\n';
     }
 
     if (can_be_null) {
       indent_down();
-      indent(out) << "}" << endl;
+      indent(out) << "}" << '\n';
     }
   }
 
   indent_down();
-  indent(out) << "}" << endl << endl;
+  indent(out) << "}" << '\n' << '\n';
 
   // clone method, so that you can deep copy an object when you don't know its class.
-  indent(out) << java_override_annotation() << endl;
-  indent(out) << "public " << make_valid_java_identifier(tstruct->get_name()) << " deepCopy() {" << endl;
-  indent(out) << "  return new " << make_valid_java_identifier(tstruct->get_name()) << "(this);" << endl;
-  indent(out) << "}" << endl << endl;
+  indent(out) << java_override_annotation() << '\n';
+  indent(out) << "public " << make_valid_java_identifier(tstruct->get_name()) << " deepCopy() {" << '\n';
+  indent(out) << "  return new " << make_valid_java_identifier(tstruct->get_name()) << "(this);" << '\n';
+  indent(out) << "}" << '\n' << '\n';
 
   generate_java_struct_clear(out, tstruct);
 
@@ -1791,7 +1788,7 @@
   generate_java_scheme_lookup(out);
 
   scope_down(out);
-  out << endl;
+  out << '\n';
 }
 
 /**
@@ -1803,30 +1800,30 @@
   const vector<t_field*>& members = tstruct->get_members();
   vector<t_field*>::const_iterator m_iter;
 
-  out << indent() << java_override_annotation() << endl
-      << indent() << "public void writeToParcel(android.os.Parcel out, int flags) {" << endl;
+  out << indent() << java_override_annotation() << '\n'
+      << indent() << "public void writeToParcel(android.os.Parcel out, int flags) {" << '\n';
   indent_up();
   string bitsetPrimitiveType = "";
   switch (needs_isset(tstruct, &bitsetPrimitiveType)) {
   case ISSET_NONE:
     break;
   case ISSET_PRIMITIVE:
-    indent(out) << "//primitive bitfield of type: " << bitsetPrimitiveType << endl;
+    indent(out) << "//primitive bitfield of type: " << bitsetPrimitiveType << '\n';
     if (bitsetPrimitiveType == "byte") {
-      indent(out) << "out.writeByte(__isset_bitfield);" << endl;
+      indent(out) << "out.writeByte(__isset_bitfield);" << '\n';
     } else if (bitsetPrimitiveType == "short") {
-      indent(out) << "out.writeInt(new Short(__isset_bitfield).intValue());" << endl;
+      indent(out) << "out.writeInt(new Short(__isset_bitfield).intValue());" << '\n';
     } else if (bitsetPrimitiveType == "int") {
-      indent(out) << "out.writeInt(__isset_bitfield);" << endl;
+      indent(out) << "out.writeInt(__isset_bitfield);" << '\n';
     } else if (bitsetPrimitiveType == "long") {
-      indent(out) << "out.writeLong(__isset_bitfield);" << endl;
+      indent(out) << "out.writeLong(__isset_bitfield);" << '\n';
     }
-    out << endl;
+    out << '\n';
     break;
   case ISSET_BITSET:
-    indent(out) << "//BitSet" << endl;
-    indent(out) << "out.writeSerializable(__isset_bit_vector);" << endl;
-    out << endl;
+    indent(out) << "//BitSet" << '\n';
+    indent(out) << "out.writeSerializable(__isset_bit_vector);" << '\n';
+    out << '\n';
     break;
   }
   for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
@@ -1834,54 +1831,54 @@
     string name = (*m_iter)->get_name();
 
     if (t->is_struct()) {
-      indent(out) << "out.writeParcelable(" << name << ", flags);" << endl;
+      indent(out) << "out.writeParcelable(" << name << ", flags);" << '\n';
     } else if (type_name(t) == "float") {
-      indent(out) << "out.writeFloat(" << name << ");" << endl;
+      indent(out) << "out.writeFloat(" << name << ");" << '\n';
     } else if (t->is_enum()) {
       indent(out) << "out.writeInt(" << name << " != null ? " << name << ".getValue() : -1);"
-                  << endl;
+                  << '\n';
     } else if (t->is_list()) {
       if (((t_list*)t)->get_elem_type()->get_true_type()->is_struct()) {
-        indent(out) << "out.writeTypedList(" << name << ");" << endl;
+        indent(out) << "out.writeTypedList(" << name << ");" << '\n';
       } else {
-        indent(out) << "out.writeList(" << name << ");" << endl;
+        indent(out) << "out.writeList(" << name << ");" << '\n';
       }
     } else if (t->is_map()) {
-      indent(out) << "out.writeMap(" << name << ");" << endl;
+      indent(out) << "out.writeMap(" << name << ");" << '\n';
     } else if (t->is_base_type()) {
       if (t->is_binary()) {
-        indent(out) << "out.writeInt(" << name << "!=null ? 1 : 0);" << endl;
-        indent(out) << "if(" << name << " != null) { " << endl;
+        indent(out) << "out.writeInt(" << name << "!=null ? 1 : 0);" << '\n';
+        indent(out) << "if(" << name << " != null) { " << '\n';
         indent_up();
         indent(out) << "out.writeByteArray(" << name << ".array(), " << name << ".position() + "
                     << name << ".arrayOffset(), " << name << ".limit() - " << name
-                    << ".position() );" << endl;
+                    << ".position() );" << '\n';
         scope_down(out);
       } else {
         switch (((t_base_type*)t)->get_base()) {
         case t_base_type::TYPE_I16:
-          indent(out) << "out.writeInt(new Short(" << name << ").intValue());" << endl;
+          indent(out) << "out.writeInt(new Short(" << name << ").intValue());" << '\n';
           break;
         case t_base_type::TYPE_UUID:
-          indent(out) << "out.writeUuid(" << name << ");" << endl;
+          indent(out) << "out.writeUuid(" << name << ");" << '\n';
           break;
         case t_base_type::TYPE_I32:
-          indent(out) << "out.writeInt(" << name << ");" << endl;
+          indent(out) << "out.writeInt(" << name << ");" << '\n';
           break;
         case t_base_type::TYPE_I64:
-          indent(out) << "out.writeLong(" << name << ");" << endl;
+          indent(out) << "out.writeLong(" << name << ");" << '\n';
           break;
         case t_base_type::TYPE_BOOL:
-          indent(out) << "out.writeInt(" << name << " ? 1 : 0);" << endl;
+          indent(out) << "out.writeInt(" << name << " ? 1 : 0);" << '\n';
           break;
         case t_base_type::TYPE_I8:
-          indent(out) << "out.writeByte(" << name << ");" << endl;
+          indent(out) << "out.writeByte(" << name << ");" << '\n';
           break;
         case t_base_type::TYPE_DOUBLE:
-          indent(out) << "out.writeDouble(" << name << ");" << endl;
+          indent(out) << "out.writeDouble(" << name << ");" << '\n';
           break;
         case t_base_type::TYPE_STRING:
-          indent(out) << "out.writeString(" << name << ");" << endl;
+          indent(out) << "out.writeString(" << name << ");" << '\n';
           break;
         case t_base_type::TYPE_VOID:
           break;
@@ -1892,38 +1889,38 @@
     }
   }
   scope_down(out);
-  out << endl;
+  out << '\n';
 
-  out << indent() << java_override_annotation() << endl
-      << indent() << "public int describeContents() {" << endl;
+  out << indent() << java_override_annotation() << '\n'
+      << indent() << "public int describeContents() {" << '\n';
   indent_up();
-  out << indent() << "return 0;" << endl;
+  out << indent() << "return 0;" << '\n';
   scope_down(out);
-  out << endl;
+  out << '\n';
 
-  indent(out) << "public " << tname << "(android.os.Parcel in) {" << endl;
+  indent(out) << "public " << tname << "(android.os.Parcel in) {" << '\n';
   indent_up();
   // read in the required bitfield
   switch (needs_isset(tstruct, &bitsetPrimitiveType)) {
   case ISSET_NONE:
     break;
   case ISSET_PRIMITIVE:
-    indent(out) << "//primitive bitfield of type: " << bitsetPrimitiveType << endl;
+    indent(out) << "//primitive bitfield of type: " << bitsetPrimitiveType << '\n';
     if (bitsetPrimitiveType == "byte") {
-      indent(out) << "__isset_bitfield = in.readByte();" << endl;
+      indent(out) << "__isset_bitfield = in.readByte();" << '\n';
     } else if (bitsetPrimitiveType == "short") {
-      indent(out) << "__isset_bitfield = (short) in.readInt();" << endl;
+      indent(out) << "__isset_bitfield = (short) in.readInt();" << '\n';
     } else if (bitsetPrimitiveType == "int") {
-      indent(out) << "__isset_bitfield = in.readInt();" << endl;
+      indent(out) << "__isset_bitfield = in.readInt();" << '\n';
     } else if (bitsetPrimitiveType == "long") {
-      indent(out) << "__isset_bitfield = in.readLong();" << endl;
+      indent(out) << "__isset_bitfield = in.readLong();" << '\n';
     }
-    out << endl;
+    out << '\n';
     break;
   case ISSET_BITSET:
-    indent(out) << "//BitSet" << endl;
-    indent(out) << "__isset_bit_vector = (java.util.BitSet) in.readSerializable();" << endl;
-    out << endl;
+    indent(out) << "//BitSet" << '\n';
+    indent(out) << "__isset_bit_vector = (java.util.BitSet) in.readSerializable();" << '\n';
+    out << '\n';
     break;
   }
   // read all the fields
@@ -1934,57 +1931,57 @@
 
     if (t->is_struct()) {
       indent(out) << prefix << "= in.readParcelable(" << tname << ".class.getClassLoader());"
-                  << endl;
+                  << '\n';
     } else if (t->is_enum()) {
-      indent(out) << prefix << " = " << type_name(t) << ".findByValue(in.readInt());" << endl;
+      indent(out) << prefix << " = " << type_name(t) << ".findByValue(in.readInt());" << '\n';
     } else if (t->is_list()) {
       t_list* list = (t_list*)t;
-      indent(out) << prefix << " = new " << type_name(t, false, true) << "();" << endl;
+      indent(out) << prefix << " = new " << type_name(t, false, true) << "();" << '\n';
       if (list->get_elem_type()->get_true_type()->is_struct()) {
         indent(out) << "in.readTypedList(" << prefix << ", " << type_name(list->get_elem_type())
-                    << ".CREATOR);" << endl;
+                    << ".CREATOR);" << '\n';
       } else {
         indent(out) << "in.readList(" << prefix << ", " << tname << ".class.getClassLoader());"
-                    << endl;
+                    << '\n';
       }
     } else if (t->is_map()) {
-      indent(out) << prefix << " = new " << type_name(t, false, true) << "();" << endl;
+      indent(out) << prefix << " = new " << type_name(t, false, true) << "();" << '\n';
       indent(out) << " in.readMap(" << prefix << ", " << tname << ".class.getClassLoader());"
-                  << endl;
+                  << '\n';
     } else if (type_name(t) == "float") {
-      indent(out) << prefix << " = in.readFloat();" << endl;
+      indent(out) << prefix << " = in.readFloat();" << '\n';
     } else if (t->is_base_type()) {
       t_base_type* bt = (t_base_type*)t;
       if (bt->is_binary()) {
-        indent(out) << "if(in.readInt()==1) {" << endl;
+        indent(out) << "if(in.readInt()==1) {" << '\n';
         indent_up();
-        indent(out) << prefix << " = java.nio.ByteBuffer.wrap(in.createByteArray());" << endl;
+        indent(out) << prefix << " = java.nio.ByteBuffer.wrap(in.createByteArray());" << '\n';
         scope_down(out);
       } else {
         switch (bt->get_base()) {
         case t_base_type::TYPE_I8:
-          indent(out) << prefix << " = in.readByte();" << endl;
+          indent(out) << prefix << " = in.readByte();" << '\n';
           break;
         case t_base_type::TYPE_I16:
-          indent(out) << prefix << " = (short) in.readInt();" << endl;
+          indent(out) << prefix << " = (short) in.readInt();" << '\n';
           break;
         case t_base_type::TYPE_I32:
-          indent(out) << prefix << " = in.readInt();" << endl;
+          indent(out) << prefix << " = in.readInt();" << '\n';
           break;
         case t_base_type::TYPE_I64:
-          indent(out) << prefix << " = in.readLong();" << endl;
+          indent(out) << prefix << " = in.readLong();" << '\n';
           break;
         case t_base_type::TYPE_UUID:
-          indent(out) << prefix << " = in.readUuid();" << endl;
+          indent(out) << prefix << " = in.readUuid();" << '\n';
           break;
         case t_base_type::TYPE_BOOL:
-          indent(out) << prefix << " = (in.readInt()==1);" << endl;
+          indent(out) << prefix << " = (in.readInt()==1);" << '\n';
           break;
         case t_base_type::TYPE_DOUBLE:
-          indent(out) << prefix << " = in.readDouble();" << endl;
+          indent(out) << prefix << " = in.readDouble();" << '\n';
           break;
         case t_base_type::TYPE_STRING:
-          indent(out) << prefix << "= in.readString();" << endl;
+          indent(out) << prefix << "= in.readString();" << '\n';
           break;
         case t_base_type::TYPE_VOID:
           break;
@@ -1996,29 +1993,29 @@
   }
 
   scope_down(out);
-  out << endl;
+  out << '\n';
 
   indent(out) << "public static final android.os.Parcelable.Creator<" << tname
-              << "> CREATOR = new android.os.Parcelable.Creator<" << tname << ">() {" << endl;
+              << "> CREATOR = new android.os.Parcelable.Creator<" << tname << ">() {" << '\n';
   indent_up();
 
-  indent(out) << java_override_annotation() << endl
-              << indent() << "public " << tname << "[] newArray(int size) {" << endl;
+  indent(out) << java_override_annotation() << '\n'
+              << indent() << "public " << tname << "[] newArray(int size) {" << '\n';
   indent_up();
-  indent(out) << "return new " << tname << "[size];" << endl;
+  indent(out) << "return new " << tname << "[size];" << '\n';
   scope_down(out);
-  out << endl;
+  out << '\n';
 
-  indent(out) << java_override_annotation() << endl
+  indent(out) << java_override_annotation() << '\n'
               << indent() << "public " << tname << " createFromParcel(android.os.Parcel in) {"
-              << endl;
+              << '\n';
   indent_up();
-  indent(out) << "return new " << tname << "(in);" << endl;
+  indent(out) << "return new " << tname << "(in);" << '\n';
   scope_down(out);
 
   indent_down();
-  indent(out) << "};" << endl;
-  out << endl;
+  indent(out) << "};" << '\n';
+  out << '\n';
 }
 
 /**
@@ -2027,26 +2024,26 @@
  * @param tstruct The struct definition
  */
 void t_java_generator::generate_java_struct_equality(ostream& out, t_struct* tstruct) {
-  out << indent() << java_override_annotation() << endl
-      << indent() << "public boolean equals(java.lang.Object that) {" << endl;
+  out << indent() << java_override_annotation() << '\n'
+      << indent() << "public boolean equals(java.lang.Object that) {" << '\n';
   indent_up();
-  out << indent() << "if (that instanceof " << make_valid_java_identifier(tstruct->get_name()) << ")" << endl
-      << indent() << "  return this.equals((" << make_valid_java_identifier(tstruct->get_name()) << ")that);" << endl
-      << indent() << "return false;" << endl;
+  out << indent() << "if (that instanceof " << make_valid_java_identifier(tstruct->get_name()) << ")" << '\n'
+      << indent() << "  return this.equals((" << make_valid_java_identifier(tstruct->get_name()) << ")that);" << '\n'
+      << indent() << "return false;" << '\n';
   scope_down(out);
-  out << endl;
+  out << '\n';
 
-  out << indent() << "public boolean equals(" << make_valid_java_identifier(tstruct->get_name()) << " that) {" << endl;
+  out << indent() << "public boolean equals(" << make_valid_java_identifier(tstruct->get_name()) << " that) {" << '\n';
   indent_up();
-  out << indent() << "if (that == null)" << endl
-      << indent() << "  return false;" << endl
-      << indent() << "if (this == that)" << endl
-      << indent() << "  return true;" << endl;
+  out << indent() << "if (that == null)" << '\n'
+      << indent() << "  return false;" << '\n'
+      << indent() << "if (this == that)" << '\n'
+      << indent() << "  return true;" << '\n';
 
   const vector<t_field*>& members = tstruct->get_members();
   vector<t_field*>::const_iterator m_iter;
   for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
-    out << endl;
+    out << '\n';
 
     t_type* t = get_true_type((*m_iter)->get_type());
     // Most existing Thrift code does not use isset or optional/required,
@@ -2064,14 +2061,14 @@
       that_present += " && that." + generate_isset_check(*m_iter);
     }
 
-    out << indent() << "boolean this_present_" << name << " = " << this_present << ";" << endl
-        << indent() << "boolean that_present_" << name << " = " << that_present << ";" << endl
+    out << indent() << "boolean this_present_" << name << " = " << this_present << ";" << '\n'
+        << indent() << "boolean that_present_" << name << " = " << that_present << ";" << '\n'
         << indent() << "if ("
-        << "this_present_" << name << " || that_present_" << name << ") {" << endl;
+        << "this_present_" << name << " || that_present_" << name << ") {" << '\n';
     indent_up();
     out << indent() << "if (!("
-        << "this_present_" << name << " && that_present_" << name << "))" << endl
-        << indent() << "  return false;" << endl;
+        << "this_present_" << name << " && that_present_" << name << "))" << '\n'
+        << indent() << "  return false;" << '\n';
 
     if (t->is_binary()) {
       unequal = "!this." + make_valid_java_identifier(name) + ".equals(that." + make_valid_java_identifier(name) + ")";
@@ -2081,25 +2078,25 @@
       unequal = "this." + make_valid_java_identifier(name) + " != that." + make_valid_java_identifier(name);
     }
 
-    out << indent() << "if (" << unequal << ")" << endl << indent() << "  return false;" << endl;
+    out << indent() << "if (" << unequal << ")" << '\n' << indent() << "  return false;" << '\n';
 
     scope_down(out);
   }
-  out << endl;
-  indent(out) << "return true;" << endl;
+  out << '\n';
+  indent(out) << "return true;" << '\n';
   scope_down(out);
-  out << endl;
+  out << '\n';
 
   const int MUL = 8191; // HashCode multiplier
   const int B_YES = 131071;
   const int B_NO = 524287;
-  out << indent() << java_override_annotation() << endl
-      << indent() << "public int hashCode() {" << endl;
+  out << indent() << java_override_annotation() << '\n'
+      << indent() << "public int hashCode() {" << '\n';
   indent_up();
-  indent(out) << "int hashCode = 1;" << endl;
+  indent(out) << "int hashCode = 1;" << '\n';
 
   for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
-    out << endl;
+    out << '\n';
 
     t_type* t = get_true_type((*m_iter)->get_type());
     bool is_optional = (*m_iter)->get_req() == t_field::T_OPTIONAL;
@@ -2108,37 +2105,37 @@
 
     if (is_optional || can_be_null) {
       indent(out) << "hashCode = hashCode * " << MUL << " + ((" << generate_isset_check(*m_iter)
-                  << ") ? " << B_YES << " : " << B_NO << ");" << endl;
+                  << ") ? " << B_YES << " : " << B_NO << ");" << '\n';
     }
 
     if (is_optional || can_be_null) {
-      indent(out) << "if (" + generate_isset_check(*m_iter) + ")" << endl;
+      indent(out) << "if (" + generate_isset_check(*m_iter) + ")" << '\n';
       indent_up();
     }
 
     if (t->is_enum()) {
-      indent(out) << "hashCode = hashCode * " << MUL << " + " << name << ".getValue();" << endl;
+      indent(out) << "hashCode = hashCode * " << MUL << " + " << name << ".getValue();" << '\n';
     } else if (t->is_base_type()) {
       switch (((t_base_type*)t)->get_base()) {
       case t_base_type::TYPE_STRING:
       case t_base_type::TYPE_UUID:
-        indent(out) << "hashCode = hashCode * " << MUL << " + " << name << ".hashCode();" << endl;
+        indent(out) << "hashCode = hashCode * " << MUL << " + " << name << ".hashCode();" << '\n';
         break;
       case t_base_type::TYPE_BOOL:
         indent(out) << "hashCode = hashCode * " << MUL << " + ((" << name << ") ? " << B_YES
-                    << " : " << B_NO << ");" << endl;
+                    << " : " << B_NO << ");" << '\n';
         break;
       case t_base_type::TYPE_I8:
-        indent(out) << "hashCode = hashCode * " << MUL << " + (int) (" << name << ");" << endl;
+        indent(out) << "hashCode = hashCode * " << MUL << " + (int) (" << name << ");" << '\n';
         break;
       case t_base_type::TYPE_I16:
       case t_base_type::TYPE_I32:
-        indent(out) << "hashCode = hashCode * " << MUL << " + " << name << ";" << endl;
+        indent(out) << "hashCode = hashCode * " << MUL << " + " << name << ";" << '\n';
         break;
       case t_base_type::TYPE_I64:
       case t_base_type::TYPE_DOUBLE:
         indent(out) << "hashCode = hashCode * " << MUL
-                    << " + org.apache.thrift.TBaseHelper.hashCode(" << name << ");" << endl;
+                    << " + org.apache.thrift.TBaseHelper.hashCode(" << name << ");" << '\n';
         break;
       case t_base_type::TYPE_VOID:
         throw std::logic_error("compiler error: a struct field cannot be void");
@@ -2147,7 +2144,7 @@
                                + t_base_type::t_base_name(((t_base_type*)t)->get_base()));
       }
     } else {
-      indent(out) << "hashCode = hashCode * " << MUL << " + " << name << ".hashCode();" << endl;
+      indent(out) << "hashCode = hashCode * " << MUL << " + " << name << ".hashCode();" << '\n';
     }
 
     if (is_optional || can_be_null) {
@@ -2155,49 +2152,49 @@
     }
   }
 
-  out << endl;
-  indent(out) << "return hashCode;" << endl;
+  out << '\n';
+  indent(out) << "return hashCode;" << '\n';
   indent_down();
-  indent(out) << "}" << endl << endl;
+  indent(out) << "}" << '\n' << '\n';
 }
 
 void t_java_generator::generate_java_struct_compare_to(ostream& out, t_struct* tstruct) {
-  indent(out) << java_override_annotation() << endl;
-  indent(out) << "public int compareTo(" << type_name(tstruct) << " other) {" << endl;
+  indent(out) << java_override_annotation() << '\n';
+  indent(out) << "public int compareTo(" << type_name(tstruct) << " other) {" << '\n';
   indent_up();
 
-  indent(out) << "if (!getClass().equals(other.getClass())) {" << endl;
-  indent(out) << "  return getClass().getName().compareTo(other.getClass().getName());" << endl;
-  indent(out) << "}" << endl;
-  out << endl;
+  indent(out) << "if (!getClass().equals(other.getClass())) {" << '\n';
+  indent(out) << "  return getClass().getName().compareTo(other.getClass().getName());" << '\n';
+  indent(out) << "}" << '\n';
+  out << '\n';
 
-  indent(out) << "int lastComparison = 0;" << endl;
-  out << endl;
+  indent(out) << "int lastComparison = 0;" << '\n';
+  out << '\n';
 
   const vector<t_field*>& members = tstruct->get_members();
   vector<t_field*>::const_iterator m_iter;
   for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
     t_field* field = *m_iter;
     indent(out) << "lastComparison = java.lang.Boolean.compare(" << generate_isset_check(field)
-                << ", other." << generate_isset_check(field) << ");" << endl;
-    indent(out) << "if (lastComparison != 0) {" << endl;
-    indent(out) << "  return lastComparison;" << endl;
-    indent(out) << "}" << endl;
+                << ", other." << generate_isset_check(field) << ");" << '\n';
+    indent(out) << "if (lastComparison != 0) {" << '\n';
+    indent(out) << "  return lastComparison;" << '\n';
+    indent(out) << "}" << '\n';
 
-    indent(out) << "if (" << generate_isset_check(field) << ") {" << endl;
+    indent(out) << "if (" << generate_isset_check(field) << ") {" << '\n';
     indent(out) << "  lastComparison = org.apache.thrift.TBaseHelper.compareTo(this."
                 << make_valid_java_identifier(field->get_name())
-                << ", other." << make_valid_java_identifier(field->get_name()) << ");" << endl;
-    indent(out) << "  if (lastComparison != 0) {" << endl;
-    indent(out) << "    return lastComparison;" << endl;
-    indent(out) << "  }" << endl;
-    indent(out) << "}" << endl;
+                << ", other." << make_valid_java_identifier(field->get_name()) << ");" << '\n';
+    indent(out) << "  if (lastComparison != 0) {" << '\n';
+    indent(out) << "    return lastComparison;" << '\n';
+    indent(out) << "  }" << '\n';
+    indent(out) << "}" << '\n';
   }
 
-  indent(out) << "return 0;" << endl;
+  indent(out) << "return 0;" << '\n';
 
   indent_down();
-  indent(out) << "}" << endl << endl;
+  indent(out) << "}" << '\n' << '\n';
 }
 
 /**
@@ -2206,63 +2203,63 @@
  * @param tstruct The struct definition
  */
 void t_java_generator::generate_java_struct_reader(ostream& out, t_struct* /*tstruct*/) {
-  indent(out) << java_override_annotation() << endl;
+  indent(out) << java_override_annotation() << '\n';
   indent(out) << "public void read(org.apache.thrift.protocol.TProtocol iprot) throws "
                  "org.apache.thrift.TException {"
-              << endl;
+              << '\n';
   indent_up();
-  indent(out) << "scheme(iprot).read(iprot, this);" << endl;
+  indent(out) << "scheme(iprot).read(iprot, this);" << '\n';
   indent_down();
-  indent(out) << "}" << endl << endl;
+  indent(out) << "}" << '\n' << '\n';
 }
 
 // generates java method to perform various checks
 // (e.g. check that all required fields are set)
 void t_java_generator::generate_java_validator(ostream& out, t_struct* tstruct) {
-  indent(out) << "public void validate() throws org.apache.thrift.TException {" << endl;
+  indent(out) << "public void validate() throws org.apache.thrift.TException {" << '\n';
   indent_up();
 
   const vector<t_field*>& fields = tstruct->get_members();
   vector<t_field*>::const_iterator f_iter;
 
-  out << indent() << "// check for required fields" << endl;
+  out << indent() << "// check for required fields" << '\n';
   for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
     if ((*f_iter)->get_req() == t_field::T_REQUIRED) {
       if (bean_style_) {
-        out << indent() << "if (!" << generate_isset_check(*f_iter) << ") {" << endl
+        out << indent() << "if (!" << generate_isset_check(*f_iter) << ") {" << '\n'
             << indent()
             << "  throw new org.apache.thrift.protocol.TProtocolException(\"Required field '"
-            << (*f_iter)->get_name() << "' is unset! Struct:\" + toString());" << endl
-            << indent() << "}" << endl
-            << endl;
+            << (*f_iter)->get_name() << "' is unset! Struct:\" + toString());" << '\n'
+            << indent() << "}" << '\n'
+            << '\n';
       } else {
         if (type_can_be_null((*f_iter)->get_type())) {
-          indent(out) << "if (" << (*f_iter)->get_name() << " == null) {" << endl;
+          indent(out) << "if (" << (*f_iter)->get_name() << " == null) {" << '\n';
           indent(out)
               << "  throw new org.apache.thrift.protocol.TProtocolException(\"Required field '"
-              << (*f_iter)->get_name() << "' was not present! Struct: \" + toString());" << endl;
-          indent(out) << "}" << endl;
+              << (*f_iter)->get_name() << "' was not present! Struct: \" + toString());" << '\n';
+          indent(out) << "}" << '\n';
         } else {
           indent(out) << "// alas, we cannot check '" << (*f_iter)->get_name()
                       << "' because it's a primitive and you chose the non-beans generator."
-                      << endl;
+                      << '\n';
         }
       }
     }
   }
 
-  out << indent() << "// check for sub-struct validity" << endl;
+  out << indent() << "// check for sub-struct validity" << '\n';
   for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
     t_type* type = get_true_type((*f_iter)->get_type());
     if (type->is_struct() && !((t_struct*)type)->is_union()) {
-      out << indent() << "if (" << make_valid_java_identifier((*f_iter)->get_name()) << " != null) {" << endl;
-      out << indent() << "  " << make_valid_java_identifier((*f_iter)->get_name()) << ".validate();" << endl;
-      out << indent() << "}" << endl;
+      out << indent() << "if (" << make_valid_java_identifier((*f_iter)->get_name()) << " != null) {" << '\n';
+      out << indent() << "  " << make_valid_java_identifier((*f_iter)->get_name()) << ".validate();" << '\n';
+      out << indent() << "}" << '\n';
     }
   }
 
   indent_down();
-  indent(out) << "}" << endl << endl;
+  indent(out) << "}" << '\n' << '\n';
 }
 
 /**
@@ -2271,15 +2268,15 @@
  * @param tstruct The struct definition
  */
 void t_java_generator::generate_java_struct_writer(ostream& out, t_struct* /*tstruct*/) {
-  indent(out) << java_override_annotation() << endl;
+  indent(out) << java_override_annotation() << '\n';
   indent(out) << "public void write(org.apache.thrift.protocol.TProtocol oprot) throws "
                  "org.apache.thrift.TException {"
-              << endl;
+              << '\n';
   indent_up();
-  indent(out) << "scheme(oprot).write(oprot, this);" << endl;
+  indent(out) << "scheme(oprot).write(oprot, this);" << '\n';
 
   indent_down();
-  indent(out) << "}" << endl << endl;
+  indent(out) << "}" << '\n' << '\n';
 }
 
 /**
@@ -2294,30 +2291,30 @@
   (void)tstruct;
   indent(out) << "public void write(org.apache.thrift.protocol.TProtocol oprot) throws "
                  "org.apache.thrift.TException {"
-              << endl;
+              << '\n';
   indent_up();
-  indent(out) << "scheme(oprot).write(oprot, this);" << endl;
+  indent(out) << "scheme(oprot).write(oprot, this);" << '\n';
 
   indent_down();
-  indent(out) << "  }" << endl << endl;
+  indent(out) << "  }" << '\n' << '\n';
 }
 
 void t_java_generator::generate_java_struct_field_by_id(ostream& out, t_struct* tstruct) {
   (void)tstruct;
-  indent(out) << java_nullable_annotation() << endl;
-  indent(out) << java_override_annotation() << endl;
-  indent(out) << "public _Fields fieldForId(int fieldId) {" << endl;
-  indent(out) << "  return _Fields.findByThriftId(fieldId);" << endl;
-  indent(out) << "}" << endl << endl;
+  indent(out) << java_nullable_annotation() << '\n';
+  indent(out) << java_override_annotation() << '\n';
+  indent(out) << "public _Fields fieldForId(int fieldId) {" << '\n';
+  indent(out) << "  return _Fields.findByThriftId(fieldId);" << '\n';
+  indent(out) << "}" << '\n' << '\n';
 }
 
 void t_java_generator::generate_reflection_getters(ostringstream& out,
                                                    t_type* type,
                                                    string field_name,
                                                    string cap_name) {
-  indent(out) << "case " << constant_name(field_name) << ":" << endl;
+  indent(out) << "case " << constant_name(field_name) << ":" << '\n';
   indent_up();
-  indent(out) << "return " << (type->is_bool() ? "is" : "get") << cap_name << "();" << endl << endl;
+  indent(out) << "return " << (type->is_bool() ? "is" : "get") << cap_name << "();" << '\n' << '\n';
   indent_down();
 }
 
@@ -2326,24 +2323,24 @@
                                                    string field_name,
                                                    string cap_name) {
   const bool is_binary = type->is_binary();
-  indent(out) << "case " << constant_name(field_name) << ":" << endl;
+  indent(out) << "case " << constant_name(field_name) << ":" << '\n';
   indent_up();
-  indent(out) << "if (value == null) {" << endl;
-  indent(out) << "  unset" << get_cap_name(field_name) << "();" << endl;
-  indent(out) << "} else {" << endl;
+  indent(out) << "if (value == null) {" << '\n';
+  indent(out) << "  unset" << get_cap_name(field_name) << "();" << '\n';
+  indent(out) << "} else {" << '\n';
   if (is_binary) {
     indent_up();
-    indent(out) << "if (value instanceof byte[]) {" << endl;
-    indent(out) << "  set" << cap_name << "((byte[])value);" << endl;
-    indent(out) << "} else {" << endl;
+    indent(out) << "if (value instanceof byte[]) {" << '\n';
+    indent(out) << "  set" << cap_name << "((byte[])value);" << '\n';
+    indent(out) << "} else {" << '\n';
   }
-  indent(out) << "  set" << cap_name << "((" << type_name(type, true, false) << ")value);" << endl;
+  indent(out) << "  set" << cap_name << "((" << type_name(type, true, false) << ")value);" << '\n';
   if (is_binary) {
-    indent(out) << "}" << endl;
+    indent(out) << "}" << '\n';
     indent_down();
   }
-  indent(out) << "}" << endl;
-  indent(out) << "break;" << endl << endl;
+  indent(out) << "}" << '\n';
+  indent(out) << "break;" << '\n' << '\n';
 
   indent_down();
 }
@@ -2370,25 +2367,25 @@
 
   // create the setter
 
-  indent(out) << java_override_annotation() << endl;
+  indent(out) << java_override_annotation() << '\n';
   indent(out) << "public void setFieldValue(_Fields field, " << java_nullable_annotation()
-              << " java.lang.Object value) {" << endl;
-  indent(out) << "  switch (field) {" << endl;
+              << " java.lang.Object value) {" << '\n';
+  indent(out) << "  switch (field) {" << '\n';
   out << setter_stream.str();
-  indent(out) << "  }" << endl;
-  indent(out) << "}" << endl << endl;
+  indent(out) << "  }" << '\n';
+  indent(out) << "}" << '\n' << '\n';
 
   // create the getter
-  indent(out) << java_nullable_annotation() << endl;
-  indent(out) << java_override_annotation() << endl;
-  indent(out) << "public java.lang.Object getFieldValue(_Fields field) {" << endl;
+  indent(out) << java_nullable_annotation() << '\n';
+  indent(out) << java_override_annotation() << '\n';
+  indent(out) << "public java.lang.Object getFieldValue(_Fields field) {" << '\n';
   indent_up();
-  indent(out) << "switch (field) {" << endl;
+  indent(out) << "switch (field) {" << '\n';
   out << getter_stream.str();
-  indent(out) << "}" << endl;
-  indent(out) << "throw new java.lang.IllegalStateException();" << endl;
+  indent(out) << "}" << '\n';
+  indent(out) << "throw new java.lang.IllegalStateException();" << '\n';
   indent_down();
-  indent(out) << "}" << endl << endl;
+  indent(out) << "}" << '\n' << '\n';
 }
 
 // Creates a generic isSet method that takes the field number as argument
@@ -2399,28 +2396,28 @@
   // create the isSet method
   indent(out) << "/** Returns true if field corresponding to fieldID is set (has been assigned a "
                  "value) and false otherwise */"
-              << endl;
-  indent(out) << java_override_annotation() << endl;
-  indent(out) << "public boolean isSet(_Fields field) {" << endl;
+              << '\n';
+  indent(out) << java_override_annotation() << '\n';
+  indent(out) << "public boolean isSet(_Fields field) {" << '\n';
   indent_up();
-  indent(out) << "if (field == null) {" << endl;
-  indent(out) << "  throw new java.lang.IllegalArgumentException();" << endl;
-  indent(out) << "}" << endl << endl;
+  indent(out) << "if (field == null) {" << '\n';
+  indent(out) << "  throw new java.lang.IllegalArgumentException();" << '\n';
+  indent(out) << "}" << '\n' << '\n';
 
-  indent(out) << "switch (field) {" << endl;
+  indent(out) << "switch (field) {" << '\n';
 
   for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
     t_field* field = *f_iter;
-    indent(out) << "case " << constant_name(field->get_name()) << ":" << endl;
+    indent(out) << "case " << constant_name(field->get_name()) << ":" << '\n';
     indent_up();
-    indent(out) << "return " << generate_isset_check(field) << ";" << endl;
+    indent(out) << "return " << generate_isset_check(field) << ";" << '\n';
     indent_down();
   }
 
-  indent(out) << "}" << endl;
-  indent(out) << "throw new java.lang.IllegalStateException();" << endl;
+  indent(out) << "}" << '\n';
+  indent(out) << "throw new java.lang.IllegalStateException();" << '\n';
   indent_down();
-  indent(out) << "}" << endl << endl;
+  indent(out) << "}" << '\n' << '\n';
 }
 
 /**
@@ -2445,7 +2442,7 @@
       // Method to return the size of the collection
       if (optional) {
         if (is_deprecated) {
-          indent(out) << "@Deprecated" << endl;
+          indent(out) << "@Deprecated" << '\n';
         }
 
         if (use_jdk8_option_type_) {
@@ -2454,20 +2451,20 @@
           indent(out) << "public " << thrift_option_class << "<Integer> get" << cap_name;
         }
 
-        out << get_cap_name("size() {") << endl;
+        out << get_cap_name("size() {") << '\n';
 
         indent_up();
-        indent(out) << "if (this." << field_name << " == null) {" << endl;
+        indent(out) << "if (this." << field_name << " == null) {" << '\n';
         indent_up();
 
         if (use_jdk8_option_type_) {
-          indent(out) << "return " << jdk_option_class << ".empty();" << endl;
+          indent(out) << "return " << jdk_option_class << ".empty();" << '\n';
         } else {
-          indent(out) << "return " << thrift_option_class << ".none();" << endl;
+          indent(out) << "return " << thrift_option_class << ".none();" << '\n';
         }
 
         indent_down();
-        indent(out) << "} else {" << endl;
+        indent(out) << "} else {" << '\n';
         indent_up();
 
         if (use_jdk8_option_type_) {
@@ -2475,24 +2472,24 @@
         } else {
           indent(out) << "return " << thrift_option_class << ".some(this.";
         }
-        out << field_name << ".size());" << endl;
+        out << field_name << ".size());" << '\n';
 
         indent_down();
-        indent(out) << "}" << endl;
+        indent(out) << "}" << '\n';
         indent_down();
-        indent(out) << "}" << endl << endl;
+        indent(out) << "}" << '\n' << '\n';
       } else {
         if (is_deprecated) {
-          indent(out) << "@Deprecated" << endl;
+          indent(out) << "@Deprecated" << '\n';
         }
         indent(out) << "public int get" << cap_name;
-        out << get_cap_name("size() {") << endl;
+        out << get_cap_name("size() {") << '\n';
 
         indent_up();
         indent(out) << "return (this." << field_name << " == null) ? 0 : "
-                    << "this." << field_name << ".size();" << endl;
+                    << "this." << field_name << ".size();" << '\n';
         indent_down();
-        indent(out) << "}" << endl << endl;
+        indent(out) << "}" << '\n' << '\n';
       }
     }
 
@@ -2507,7 +2504,7 @@
       // Iterator getter for sets and lists
       if (optional) {
         if (is_deprecated) {
-          indent(out) << "@Deprecated" << endl;
+          indent(out) << "@Deprecated" << '\n';
         }
 
         if (use_jdk8_option_type_) {
@@ -2518,20 +2515,20 @@
         out << "java.util.Iterator<" << type_name(element_type, true, false) << ">> get"
             << cap_name;
 
-        out << get_cap_name("iterator() {") << endl;
+        out << get_cap_name("iterator() {") << '\n';
 
         indent_up();
-        indent(out) << "if (this." << field_name << " == null) {" << endl;
+        indent(out) << "if (this." << field_name << " == null) {" << '\n';
         indent_up();
 
         if (use_jdk8_option_type_) {
-          indent(out) << "return " << jdk_option_class << ".empty();" << endl;
+          indent(out) << "return " << jdk_option_class << ".empty();" << '\n';
         } else {
-          indent(out) << "return " << thrift_option_class << ".none();" << endl;
+          indent(out) << "return " << thrift_option_class << ".none();" << '\n';
         }
 
         indent_down();
-        indent(out) << "} else {" << endl;
+        indent(out) << "} else {" << '\n';
         indent_up();
 
         if (use_jdk8_option_type_) {
@@ -2539,104 +2536,104 @@
         } else {
           indent(out) << "return " << thrift_option_class << ".some(this.";
         }
-        out << field_name << ".iterator());" << endl;
+        out << field_name << ".iterator());" << '\n';
 
         indent_down();
-        indent(out) << "}" << endl;
+        indent(out) << "}" << '\n';
         indent_down();
-        indent(out) << "}" << endl << endl;
+        indent(out) << "}" << '\n' << '\n';
       } else {
         if (is_deprecated) {
-          indent(out) << "@Deprecated" << endl;
+          indent(out) << "@Deprecated" << '\n';
         }
-        indent(out) << java_nullable_annotation() << endl;
+        indent(out) << java_nullable_annotation() << '\n';
         indent(out) << "public java.util.Iterator<" << type_name(element_type, true, false)
                     << "> get" << cap_name;
-        out << get_cap_name("iterator() {") << endl;
+        out << get_cap_name("iterator() {") << '\n';
 
         indent_up();
         indent(out) << "return (this." << field_name << " == null) ? null : "
-                    << "this." << field_name << ".iterator();" << endl;
+                    << "this." << field_name << ".iterator();" << '\n';
         indent_down();
-        indent(out) << "}" << endl << endl;
+        indent(out) << "}" << '\n' << '\n';
       }
 
       // Add to set or list, create if the set/list is null
       if (is_deprecated) {
-        indent(out) << "@Deprecated" << endl;
+        indent(out) << "@Deprecated" << '\n';
       }
       indent(out) << "public void add" << get_cap_name("to");
-      out << cap_name << "(" << type_name(element_type) << " elem) {" << endl;
+      out << cap_name << "(" << type_name(element_type) << " elem) {" << '\n';
 
       indent_up();
-      indent(out) << "if (this." << field_name << " == null) {" << endl;
+      indent(out) << "if (this." << field_name << " == null) {" << '\n';
       indent_up();
       indent(out) << "this." << field_name;
       if (is_enum_set(type)) {
         out << " = " << type_name(type, false, true, true) << ".noneOf("
-            << inner_enum_type_name(type) << ");" << endl;
+            << inner_enum_type_name(type) << ");" << '\n';
       } else {
-        out << " = new " << type_name(type, false, true) << "();" << endl;
+        out << " = new " << type_name(type, false, true) << "();" << '\n';
       }
       indent_down();
-      indent(out) << "}" << endl;
-      indent(out) << "this." << field_name << ".add(elem);" << endl;
+      indent(out) << "}" << '\n';
+      indent(out) << "this." << field_name << ".add(elem);" << '\n';
       indent_down();
-      indent(out) << "}" << endl << endl;
+      indent(out) << "}" << '\n' << '\n';
     } else if (type->is_map()) {
       // Put to map
       t_type* key_type = ((t_map*)type)->get_key_type();
       t_type* val_type = ((t_map*)type)->get_val_type();
 
       if (is_deprecated) {
-        indent(out) << "@Deprecated" << endl;
+        indent(out) << "@Deprecated" << '\n';
       }
       indent(out) << "public void put" << get_cap_name("to");
       out << cap_name << "(" << type_name(key_type) << " key, " << type_name(val_type) << " val) {"
-          << endl;
+          << '\n';
 
       indent_up();
-      indent(out) << "if (this." << field_name << " == null) {" << endl;
+      indent(out) << "if (this." << field_name << " == null) {" << '\n';
       indent_up();
       std::string constructor_args;
       if (is_enum_map(type)) {
         constructor_args = inner_enum_type_name(type);
       }
       indent(out) << "this." << field_name << " = new " << type_name(type, false, true) << "("
-                  << constructor_args << ");" << endl;
+                  << constructor_args << ");" << '\n';
       indent_down();
-      indent(out) << "}" << endl;
-      indent(out) << "this." << field_name << ".put(key, val);" << endl;
+      indent(out) << "}" << '\n';
+      indent(out) << "this." << field_name << ".put(key, val);" << '\n';
       indent_down();
-      indent(out) << "}" << endl << endl;
+      indent(out) << "}" << '\n' << '\n';
     }
 
     // Simple getter
     generate_java_doc(out, field);
     if (type->is_binary()) {
       if (is_deprecated) {
-        indent(out) << "@Deprecated" << endl;
+        indent(out) << "@Deprecated" << '\n';
       }
-      indent(out) << "public byte[] get" << cap_name << "() {" << endl;
+      indent(out) << "public byte[] get" << cap_name << "() {" << '\n';
       indent(out) << "  set" << cap_name << "(org.apache.thrift.TBaseHelper.rightSize("
-                  << field_name << "));" << endl;
+                  << field_name << "));" << '\n';
       indent(out) << "  return " << field_name << " == null ? null : " << field_name << ".array();"
-                  << endl;
-      indent(out) << "}" << endl << endl;
+                  << '\n';
+      indent(out) << "}" << '\n' << '\n';
 
       indent(out) << "public java.nio.ByteBuffer buffer" << get_cap_name("for") << cap_name
-                  << "() {" << endl;
+                  << "() {" << '\n';
       if (unsafe_binaries_) {
-        indent(out) << "  return " << field_name << ";" << endl;
+        indent(out) << "  return " << field_name << ";" << '\n';
       } else {
         indent(out) << "  return org.apache.thrift.TBaseHelper.copyBinary(" << field_name << ");"
-                    << endl;
+                    << '\n';
       }
-      indent(out) << "}" << endl << endl;
+      indent(out) << "}" << '\n' << '\n';
     } else {
       if (optional) {
         if (is_deprecated) {
-          indent(out) << "@Deprecated" << endl;
+          indent(out) << "@Deprecated" << '\n';
         }
 
         if (use_jdk8_option_type_) {
@@ -2650,10 +2647,10 @@
         } else {
           out << " get";
         }
-        out << cap_name << "() {" << endl;
+        out << cap_name << "() {" << '\n';
         indent_up();
 
-        indent(out) << "if (this.isSet" << cap_name << "()) {" << endl;
+        indent(out) << "if (this.isSet" << cap_name << "()) {" << '\n';
         indent_up();
 
         if (use_jdk8_option_type_) {
@@ -2661,28 +2658,28 @@
         } else {
           indent(out) << "return " << thrift_option_class << ".some(this.";
         }
-        out << field_name << ");" << endl;
+        out << field_name << ");" << '\n';
 
         indent_down();
-        indent(out) << "} else {" << endl;
+        indent(out) << "} else {" << '\n';
         indent_up();
 
         if (use_jdk8_option_type_) {
-          indent(out) << "return " << jdk_option_class << ".empty();" << endl;
+          indent(out) << "return " << jdk_option_class << ".empty();" << '\n';
         } else {
-          indent(out) << "return " << thrift_option_class << ".none();" << endl;
+          indent(out) << "return " << thrift_option_class << ".none();" << '\n';
         }
 
         indent_down();
-        indent(out) << "}" << endl;
+        indent(out) << "}" << '\n';
         indent_down();
-        indent(out) << "}" << endl << endl;
+        indent(out) << "}" << '\n' << '\n';
       } else {
         if (is_deprecated) {
-          indent(out) << "@Deprecated" << endl;
+          indent(out) << "@Deprecated" << '\n';
         }
         if (type_can_be_null(type)) {
-          indent(out) << java_nullable_annotation() << endl;
+          indent(out) << java_nullable_annotation() << '\n';
         }
         indent(out) << "public " << type_name(type);
         if (type->is_base_type() && ((t_base_type*)type)->get_base() == t_base_type::TYPE_BOOL) {
@@ -2690,11 +2687,11 @@
         } else {
           out << " get";
         }
-        out << cap_name << "() {" << endl;
+        out << cap_name << "() {" << '\n';
         indent_up();
-        indent(out) << "return this." << make_valid_java_identifier(field_name) << ";" << endl;
+        indent(out) << "return this." << make_valid_java_identifier(field_name) << ";" << '\n';
         indent_down();
-        indent(out) << "}" << endl << endl;
+        indent(out) << "}" << '\n' << '\n';
       }
     }
 
@@ -2702,7 +2699,7 @@
     generate_java_doc(out, field);
     if (type->is_binary()) {
       if (is_deprecated) {
-        indent(out) << "@Deprecated" << endl;
+        indent(out) << "@Deprecated" << '\n';
       }
       indent(out) << "public ";
       if (bean_style_) {
@@ -2710,23 +2707,23 @@
       } else {
         out << type_name(tstruct);
       }
-      out << " set" << cap_name << "(byte[] " << make_valid_java_identifier(field_name) << ") {" << endl;
+      out << " set" << cap_name << "(byte[] " << make_valid_java_identifier(field_name) << ") {" << '\n';
       indent(out) << "  this." << make_valid_java_identifier(field_name) << " = " << make_valid_java_identifier(field_name)
                   << " == null ? (java.nio.ByteBuffer)null";
 
       if (unsafe_binaries_) {
-        indent(out) << " : java.nio.ByteBuffer.wrap(" << make_valid_java_identifier(field_name) << ");" << endl;
+        indent(out) << " : java.nio.ByteBuffer.wrap(" << make_valid_java_identifier(field_name) << ");" << '\n';
       } else {
-        indent(out) << " : java.nio.ByteBuffer.wrap(" << make_valid_java_identifier(field_name) << ".clone());" << endl;
+        indent(out) << " : java.nio.ByteBuffer.wrap(" << make_valid_java_identifier(field_name) << ".clone());" << '\n';
       }
 
       if (!bean_style_) {
-        indent(out) << "  return this;" << endl;
+        indent(out) << "  return this;" << '\n';
       }
-      indent(out) << "}" << endl << endl;
+      indent(out) << "}" << '\n' << '\n';
     }
     if (is_deprecated) {
-      indent(out) << "@Deprecated" << endl;
+      indent(out) << "@Deprecated" << '\n';
     }
     indent(out) << "public ";
     if (bean_style_) {
@@ -2737,7 +2734,7 @@
     out << " set" << cap_name << "("
         << (type_can_be_null(type) ? (java_nullable_annotation() + " ") : "")
         << type_name(type)
-        << " " << make_valid_java_identifier(field_name) << ") {" << endl;
+        << " " << make_valid_java_identifier(field_name) << ") {" << '\n';
     indent_up();
     indent(out) << "this." << make_valid_java_identifier(field_name) << " = ";
     if (type->is_binary() && !unsafe_binaries_) {
@@ -2745,70 +2742,70 @@
     } else {
       out << make_valid_java_identifier(field_name);
     }
-    out << ";" << endl;
+    out << ";" << '\n';
     generate_isset_set(out, field, "");
     if (!bean_style_) {
-      indent(out) << "return this;" << endl;
+      indent(out) << "return this;" << '\n';
     }
 
     indent_down();
-    indent(out) << "}" << endl << endl;
+    indent(out) << "}" << '\n' << '\n';
 
     // Unsetter
     if (is_deprecated) {
-      indent(out) << "@Deprecated" << endl;
+      indent(out) << "@Deprecated" << '\n';
     }
-    indent(out) << "public void unset" << cap_name << "() {" << endl;
+    indent(out) << "public void unset" << cap_name << "() {" << '\n';
     indent_up();
     if (type_can_be_null(type)) {
-      indent(out) << "this." << make_valid_java_identifier(field_name) << " = null;" << endl;
+      indent(out) << "this." << make_valid_java_identifier(field_name) << " = null;" << '\n';
     } else if (issetType == ISSET_PRIMITIVE) {
       indent(out)
           << "__isset_bitfield = org.apache.thrift.EncodingUtils.clearBit(__isset_bitfield, "
-          << isset_field_id(field) << ");" << endl;
+          << isset_field_id(field) << ");" << '\n';
     } else {
-      indent(out) << "__isset_bit_vector.clear(" << isset_field_id(field) << ");" << endl;
+      indent(out) << "__isset_bit_vector.clear(" << isset_field_id(field) << ");" << '\n';
     }
     indent_down();
-    indent(out) << "}" << endl << endl;
+    indent(out) << "}" << '\n' << '\n';
 
     // isSet method
     indent(out) << "/** Returns true if field " << field_name
-                << " is set (has been assigned a value) and false otherwise */" << endl;
+                << " is set (has been assigned a value) and false otherwise */" << '\n';
     if (is_deprecated) {
-      indent(out) << "@Deprecated" << endl;
+      indent(out) << "@Deprecated" << '\n';
     }
-    indent(out) << "public boolean is" << get_cap_name("set") << cap_name << "() {" << endl;
+    indent(out) << "public boolean is" << get_cap_name("set") << cap_name << "() {" << '\n';
     indent_up();
     if (type_can_be_null(type)) {
-      indent(out) << "return this." << make_valid_java_identifier(field_name) << " != null;" << endl;
+      indent(out) << "return this." << make_valid_java_identifier(field_name) << " != null;" << '\n';
     } else if (issetType == ISSET_PRIMITIVE) {
       indent(out) << "return org.apache.thrift.EncodingUtils.testBit(__isset_bitfield, "
-                  << isset_field_id(field) << ");" << endl;
+                  << isset_field_id(field) << ");" << '\n';
     } else {
-      indent(out) << "return __isset_bit_vector.get(" << isset_field_id(field) << ");" << endl;
+      indent(out) << "return __isset_bit_vector.get(" << isset_field_id(field) << ");" << '\n';
     }
     indent_down();
-    indent(out) << "}" << endl << endl;
+    indent(out) << "}" << '\n' << '\n';
 
     if (is_deprecated) {
-      indent(out) << "@Deprecated" << endl;
+      indent(out) << "@Deprecated" << '\n';
     }
     indent(out) << "public void set" << cap_name << get_cap_name("isSet") << "(boolean value) {"
-                << endl;
+                << '\n';
     indent_up();
     if (type_can_be_null(type)) {
-      indent(out) << "if (!value) {" << endl;
-      indent(out) << "  this." << make_valid_java_identifier(field_name) << " = null;" << endl;
-      indent(out) << "}" << endl;
+      indent(out) << "if (!value) {" << '\n';
+      indent(out) << "  this." << make_valid_java_identifier(field_name) << " = null;" << '\n';
+      indent(out) << "}" << '\n';
     } else if (issetType == ISSET_PRIMITIVE) {
       indent(out) << "__isset_bitfield = org.apache.thrift.EncodingUtils.setBit(__isset_bitfield, "
-                  << isset_field_id(field) << ", value);" << endl;
+                  << isset_field_id(field) << ", value);" << '\n';
     } else {
-      indent(out) << "__isset_bit_vector.set(" << isset_field_id(field) << ", value);" << endl;
+      indent(out) << "__isset_bit_vector.set(" << isset_field_id(field) << ", value);" << '\n';
     }
     indent_down();
-    indent(out) << "}" << endl << endl;
+    indent(out) << "}" << '\n' << '\n';
   }
 }
 
@@ -2818,13 +2815,13 @@
  * @param tstruct The struct definition
  */
 void t_java_generator::generate_java_struct_tostring(ostream& out, t_struct* tstruct) {
-  out << indent() << java_override_annotation() << endl
-      << indent() << "public java.lang.String toString() {" << endl;
+  out << indent() << java_override_annotation() << '\n'
+      << indent() << "public java.lang.String toString() {" << '\n';
   indent_up();
 
   out << indent() << "java.lang.StringBuilder sb = new java.lang.StringBuilder(\""
-      << tstruct->get_name() << "(\");" << endl;
-  out << indent() << "boolean first = true;" << endl << endl;
+      << tstruct->get_name() << "(\");" << '\n';
+  out << indent() << "boolean first = true;" << '\n' << '\n';
 
   const vector<t_field*>& fields = tstruct->get_members();
   vector<t_field*>::const_iterator f_iter;
@@ -2832,55 +2829,55 @@
   for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
     bool could_be_unset = (*f_iter)->get_req() == t_field::T_OPTIONAL;
     if (could_be_unset) {
-      indent(out) << "if (" << generate_isset_check(*f_iter) << ") {" << endl;
+      indent(out) << "if (" << generate_isset_check(*f_iter) << ") {" << '\n';
       indent_up();
     }
 
     t_field* field = (*f_iter);
 
     if (!first) {
-      indent(out) << "if (!first) sb.append(\", \");" << endl;
+      indent(out) << "if (!first) sb.append(\", \");" << '\n';
     }
-    indent(out) << "sb.append(\"" << (*f_iter)->get_name() << ":\");" << endl;
+    indent(out) << "sb.append(\"" << (*f_iter)->get_name() << ":\");" << '\n';
     bool can_be_null = type_can_be_null(field->get_type());
     if (can_be_null) {
-      indent(out) << "if (this." << make_valid_java_identifier((*f_iter)->get_name()) << " == null) {" << endl;
-      indent(out) << "  sb.append(\"null\");" << endl;
-      indent(out) << "} else {" << endl;
+      indent(out) << "if (this." << make_valid_java_identifier((*f_iter)->get_name()) << " == null) {" << '\n';
+      indent(out) << "  sb.append(\"null\");" << '\n';
+      indent(out) << "} else {" << '\n';
       indent_up();
     }
 
     if (get_true_type(field->get_type())->is_binary()) {
       indent(out) << "org.apache.thrift.TBaseHelper.toString(this." << make_valid_java_identifier(field->get_name()) << ", sb);"
-                  << endl;
+                  << '\n';
     } else if ((field->get_type()->is_set())
                && (get_true_type(((t_set*)field->get_type())->get_elem_type())->is_binary())) {
       indent(out) << "org.apache.thrift.TBaseHelper.toString(this." << make_valid_java_identifier(field->get_name()) << ", sb);"
-                  << endl;
+                  << '\n';
     } else if ((field->get_type()->is_list())
                && (get_true_type(((t_list*)field->get_type())->get_elem_type())->is_binary())) {
       indent(out) << "org.apache.thrift.TBaseHelper.toString(this." << make_valid_java_identifier(field->get_name()) << ", sb);"
-                  << endl;
+                  << '\n';
     } else {
-      indent(out) << "sb.append(this." << make_valid_java_identifier((*f_iter)->get_name()) << ");" << endl;
+      indent(out) << "sb.append(this." << make_valid_java_identifier((*f_iter)->get_name()) << ");" << '\n';
     }
 
     if (can_be_null) {
       indent_down();
-      indent(out) << "}" << endl;
+      indent(out) << "}" << '\n';
     }
-    indent(out) << "first = false;" << endl;
+    indent(out) << "first = false;" << '\n';
 
     if (could_be_unset) {
       indent_down();
-      indent(out) << "}" << endl;
+      indent(out) << "}" << '\n';
     }
     first = false;
   }
-  out << indent() << "sb.append(\")\");" << endl << indent() << "return sb.toString();" << endl;
+  out << indent() << "sb.append(\")\");" << '\n' << indent() << "return sb.toString();" << '\n';
 
   indent_down();
-  indent(out) << "}" << endl << endl;
+  indent(out) << "}" << '\n' << '\n';
 }
 
 /**
@@ -2896,14 +2893,14 @@
   // Static Map with fieldID -> org.apache.thrift.meta_data.FieldMetaData mappings
   indent(out) << "public static final java.util.Map<_Fields, "
                  "org.apache.thrift.meta_data.FieldMetaData> metaDataMap;"
-              << endl;
-  indent(out) << "static {" << endl;
+              << '\n';
+  indent(out) << "static {" << '\n';
   indent_up();
 
   indent(out)
       << "java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new "
          "java.util.EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);"
-      << endl;
+      << '\n';
 
   // Populate map
   for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
@@ -2928,15 +2925,15 @@
     if (annotations_as_metadata_) {
       generate_metadata_for_field_annotations(out, field);
     }
-    out << "));" << endl;
+    out << "));" << '\n';
   }
 
-  indent(out) << "metaDataMap = java.util.Collections.unmodifiableMap(tmpMap);" << endl;
+  indent(out) << "metaDataMap = java.util.Collections.unmodifiableMap(tmpMap);" << '\n';
 
   indent(out) << "org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap("
-              << type_name(tstruct) << ".class, metaDataMap);" << endl;
+              << type_name(tstruct) << ".class, metaDataMap);" << '\n';
   indent_down();
-  indent(out) << "}" << endl << endl;
+  indent(out) << "}" << '\n' << '\n';
 }
 
 /**
@@ -3003,19 +3000,19 @@
   if (field->annotations_.size() == 0) {
     return;
   }
-  out << ", " << endl;
+  out << ", " << '\n';
   indent_up();
   indent_up();
   indent(out) << "java.util.stream.Stream.<java.util.Map.Entry<java.lang.String, "
                  "java.lang.String>>builder()"
-              << endl;
+              << '\n';
 
   indent_up();
   indent_up();
   for (auto& annotation : field->annotations_) {
     indent(out) << ".add(new java.util.AbstractMap.SimpleImmutableEntry<>(\"" + annotation.first
                        + "\", \"" + annotation.second.back() + "\"))"
-                << endl;
+                << '\n';
   }
   indent(out) << ".build().collect(java.util.stream.Collectors.toMap(java.util.Map.Entry::getKey, "
                  "java.util.Map.Entry::getValue))";
@@ -3028,7 +3025,7 @@
 
 void t_java_generator::generate_field_value_meta_data(std::ostream& out, t_type* type) {
   t_type* ttype = get_true_type(type);
-  out << endl;
+  out << '\n';
   indent_up();
   indent_up();
   if (ttype->is_struct() || ttype->is_xception()) {
@@ -3093,7 +3090,7 @@
     generate_javax_generated_annotation(f_service_);
   }
   f_service_ << java_suppressions();
-  f_service_ << "public class " << make_valid_java_identifier(service_name_) << " {" << endl << endl;
+  f_service_ << "public class " << make_valid_java_identifier(service_name_) << " {" << '\n' << '\n';
   indent_up();
 
   // Generate the three main parts of the service
@@ -3112,7 +3109,7 @@
   generate_service_helpers(tservice);
 
   indent_down();
-  f_service_ << "}" << endl;
+  f_service_ << "}" << '\n';
   f_service_.close();
 }
 
@@ -3130,16 +3127,16 @@
   }
 
   generate_java_doc(f_service_, tservice);
-  f_service_ << indent() << "public interface Iface" << extends_iface << " {" << endl << endl;
+  f_service_ << indent() << "public interface Iface" << extends_iface << " {" << '\n' << '\n';
   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_java_doc(f_service_, *f_iter);
-    indent(f_service_) << "public " << function_signature(*f_iter) << ";" << endl << endl;
+    indent(f_service_) << "public " << function_signature(*f_iter) << ";" << '\n' << '\n';
   }
   indent_down();
-  f_service_ << indent() << "}" << endl << endl;
+  f_service_ << indent() << "}" << '\n' << '\n';
 }
 
 void t_java_generator::generate_service_async_interface(t_service* tservice) {
@@ -3150,17 +3147,17 @@
     extends_iface = " extends " + extends + ".AsyncIface";
   }
 
-  f_service_ << indent() << "public interface AsyncIface" << extends_iface << " {" << endl << endl;
+  f_service_ << indent() << "public interface AsyncIface" << extends_iface << " {" << '\n' << '\n';
   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) {
     indent(f_service_) << "public " << function_signature_async(*f_iter, true)
-                       << " throws org.apache.thrift.TException;" << endl
-                       << endl;
+                       << " throws org.apache.thrift.TException;" << '\n'
+                       << '\n';
   }
   indent_down();
-  f_service_ << indent() << "}" << endl << endl;
+  f_service_ << indent() << "}" << '\n' << '\n';
 }
 
 void t_java_generator::generate_service_future_interface(t_service* tservice) {
@@ -3171,15 +3168,15 @@
     extends_iface = " extends " + extends + " .FutureIface";
   }
 
-  f_service_ << indent() << "public interface FutureIface" << extends_iface << " {" << endl << endl;
+  f_service_ << indent() << "public interface FutureIface" << extends_iface << " {" << '\n' << '\n';
   indent_up();
   for (auto tfunc : tservice->get_functions()) {
     indent(f_service_) << "public " << function_signature_future(tfunc)
-                       << " throws org.apache.thrift.TException;" << endl
-                       << endl;
+                       << " throws org.apache.thrift.TException;" << '\n'
+                       << '\n';
   }
   scope_down(f_service_);
-  f_service_ << endl << endl;
+  f_service_ << '\n' << '\n';
 }
 
 /**
@@ -3209,43 +3206,43 @@
   }
 
   indent(f_service_) << "public static class Client extends " << extends_client
-                     << " implements Iface {" << endl;
+                     << " implements Iface {" << '\n';
   indent_up();
 
   indent(f_service_)
       << "public static class Factory implements org.apache.thrift.TServiceClientFactory<Client> {"
-      << endl;
+      << '\n';
   indent_up();
-  indent(f_service_) << "public Factory() {}" << endl;
-  indent(f_service_) << java_override_annotation() << endl;
+  indent(f_service_) << "public Factory() {}" << '\n';
+  indent(f_service_) << java_override_annotation() << '\n';
   indent(f_service_) << "public Client getClient(org.apache.thrift.protocol.TProtocol prot) {"
-                     << endl;
+                     << '\n';
   indent_up();
-  indent(f_service_) << "return new Client(prot);" << endl;
+  indent(f_service_) << "return new Client(prot);" << '\n';
   indent_down();
-  indent(f_service_) << "}" << endl;
-  indent(f_service_) << java_override_annotation() << endl;
+  indent(f_service_) << "}" << '\n';
+  indent(f_service_) << java_override_annotation() << '\n';
   indent(f_service_) << "public Client getClient(org.apache.thrift.protocol.TProtocol iprot, "
                         "org.apache.thrift.protocol.TProtocol oprot) {"
-                     << endl;
+                     << '\n';
   indent_up();
-  indent(f_service_) << "return new Client(iprot, oprot);" << endl;
+  indent(f_service_) << "return new Client(iprot, oprot);" << '\n';
   indent_down();
-  indent(f_service_) << "}" << endl;
+  indent(f_service_) << "}" << '\n';
   indent_down();
-  indent(f_service_) << "}" << endl << endl;
+  indent(f_service_) << "}" << '\n' << '\n';
 
-  indent(f_service_) << "public Client(org.apache.thrift.protocol.TProtocol prot)" << endl;
+  indent(f_service_) << "public Client(org.apache.thrift.protocol.TProtocol prot)" << '\n';
   scope_up(f_service_);
-  indent(f_service_) << "super(prot, prot);" << endl;
+  indent(f_service_) << "super(prot, prot);" << '\n';
   scope_down(f_service_);
-  f_service_ << endl;
+  f_service_ << '\n';
 
   indent(f_service_) << "public Client(org.apache.thrift.protocol.TProtocol iprot, "
                         "org.apache.thrift.protocol.TProtocol oprot) {"
-                     << endl;
-  indent(f_service_) << "  super(iprot, oprot);" << endl;
-  indent(f_service_) << "}" << endl << endl;
+                     << '\n';
+  indent(f_service_) << "  super(iprot, oprot);" << '\n';
+  indent(f_service_) << "}" << '\n' << '\n';
 
   // Generate client method implementations
   vector<t_function*> functions = tservice->get_functions();
@@ -3260,8 +3257,8 @@
     }
 
     // Open function
-    indent(f_service_) << java_override_annotation() << endl;
-    indent(f_service_) << "public " << function_signature(*f_iter) << endl;
+    indent(f_service_) << java_override_annotation() << '\n';
+    indent(f_service_) << "public " << function_signature(*f_iter) << '\n';
     scope_up(f_service_);
     indent(f_service_) << "send" << sep << javaname << "(";
 
@@ -3280,17 +3277,17 @@
       }
       f_service_ << make_valid_java_identifier((*fld_iter)->get_name());
     }
-    f_service_ << ");" << endl;
+    f_service_ << ");" << '\n';
 
     if (!(*f_iter)->is_oneway()) {
       f_service_ << indent();
       if (!(*f_iter)->get_returntype()->is_void()) {
         f_service_ << "return ";
       }
-      f_service_ << "recv" << sep << javaname << "();" << endl;
+      f_service_ << "recv" << sep << javaname << "();" << '\n';
     }
     scope_down(f_service_);
-    f_service_ << endl;
+    f_service_ << '\n';
 
     t_function send_function(g_type_void, string("send") + sep + javaname,
                              (*f_iter)->get_arglist());
@@ -3298,22 +3295,22 @@
     string argsname = (*f_iter)->get_name() + "_args";
 
     // Open function
-    indent(f_service_) << "public " << function_signature(&send_function) << endl;
+    indent(f_service_) << "public " << function_signature(&send_function) << '\n';
     scope_up(f_service_);
 
     // Serialize the request
-    indent(f_service_) << argsname << " args = new " << argsname << "();" << endl;
+    indent(f_service_) << argsname << " args = new " << argsname << "();" << '\n';
 
     for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) {
       indent(f_service_) << "args.set" << get_cap_name((*fld_iter)->get_name()) << "("
-                         << make_valid_java_identifier((*fld_iter)->get_name()) << ");" << endl;
+                         << make_valid_java_identifier((*fld_iter)->get_name()) << ");" << '\n';
     }
 
     const string sendBaseName = (*f_iter)->is_oneway() ? "sendBaseOneway" : "sendBase";
-    indent(f_service_) << sendBaseName << "(\"" << funname << "\", args);" << endl;
+    indent(f_service_) << sendBaseName << "(\"" << funname << "\", args);" << '\n';
 
     scope_down(f_service_);
-    f_service_ << endl;
+    f_service_ << '\n';
 
     if (!(*f_iter)->is_oneway()) {
       string resultname = (*f_iter)->get_name() + "_result";
@@ -3322,47 +3319,47 @@
       t_function recv_function((*f_iter)->get_returntype(), string("recv") + sep + javaname,
                                &noargs, (*f_iter)->get_xceptions());
       // Open function
-      indent(f_service_) << "public " << function_signature(&recv_function) << endl;
+      indent(f_service_) << "public " << function_signature(&recv_function) << '\n';
       scope_up(f_service_);
 
-      f_service_ << indent() << resultname << " result = new " << resultname << "();" << endl
-                 << indent() << "receiveBase(result, \"" << funname << "\");" << endl;
+      f_service_ << indent() << resultname << " result = new " << resultname << "();" << '\n'
+                 << indent() << "receiveBase(result, \"" << funname << "\");" << '\n';
 
       // Careful, only return _result if not a void function
       if (!(*f_iter)->get_returntype()->is_void()) {
-        f_service_ << indent() << "if (result." << generate_isset_check("success") << ") {" << endl
-                   << indent() << "  return result.success;" << endl
-                   << indent() << "}" << endl;
+        f_service_ << indent() << "if (result." << generate_isset_check("success") << ") {" << '\n'
+                   << indent() << "  return result.success;" << '\n'
+                   << indent() << "}" << '\n';
       }
 
       t_struct* xs = (*f_iter)->get_xceptions();
       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) {
-        f_service_ << indent() << "if (result." << make_valid_java_identifier((*x_iter)->get_name()) << " != null) {" << endl
-                   << indent() << "  throw result." << make_valid_java_identifier((*x_iter)->get_name()) << ";" << endl
-                   << indent() << "}" << endl;
+        f_service_ << indent() << "if (result." << make_valid_java_identifier((*x_iter)->get_name()) << " != null) {" << '\n'
+                   << indent() << "  throw result." << make_valid_java_identifier((*x_iter)->get_name()) << ";" << '\n'
+                   << indent() << "}" << '\n';
       }
 
       // If you get here it's an exception, unless a void function
       if ((*f_iter)->get_returntype()->is_void()) {
-        indent(f_service_) << "return;" << endl;
+        indent(f_service_) << "return;" << '\n';
       } else {
         f_service_ << indent()
                    << "throw new "
                       "org.apache.thrift.TApplicationException(org.apache.thrift."
                       "TApplicationException.MISSING_RESULT, \""
-                   << (*f_iter)->get_name() << " failed: unknown result\");" << endl;
+                   << (*f_iter)->get_name() << " failed: unknown result\");" << '\n';
       }
 
       // Close function
       scope_down(f_service_);
-      f_service_ << endl;
+      f_service_ << '\n';
     }
   }
 
   indent_down();
-  indent(f_service_) << "}" << endl;
+  indent(f_service_) << "}" << '\n';
 }
 
 void t_java_generator::generate_service_future_client(t_service* tservice) {
@@ -3373,13 +3370,13 @@
 
   static string adapter_class = "org.apache.thrift.async.AsyncMethodFutureAdapter";
   indent(f_service_) << "public static class FutureClient " << extends_client
-                     << "implements FutureIface {" << endl;
+                     << "implements FutureIface {" << '\n';
   indent_up();
-  indent(f_service_) << "public FutureClient(AsyncIface delegate) {" << endl;
+  indent(f_service_) << "public FutureClient(AsyncIface delegate) {" << '\n';
   indent_up();
-  indent(f_service_) << "this.delegate = delegate;" << endl;
+  indent(f_service_) << "this.delegate = delegate;" << '\n';
   scope_down(f_service_);
-  indent(f_service_) << "private final AsyncIface delegate;" << endl;
+  indent(f_service_) << "private final AsyncIface delegate;" << '\n';
   for (auto tfunc : tservice->get_functions()) {
     string funname = tfunc->get_name();
     string sep = "_";
@@ -3396,23 +3393,23 @@
     string args_name = funname + "_args";
     string result_name = funname + "_result";
 
-    indent(f_service_) << "@Override" << endl;
+    indent(f_service_) << "@Override" << '\n';
     indent(f_service_) << "public " << function_signature_future(tfunc)
-                       << " throws org.apache.thrift.TException {" << endl;
+                       << " throws org.apache.thrift.TException {" << '\n';
     indent_up();
     auto adapter = tmp("asyncMethodFutureAdapter");
     indent(f_service_) << adapter_class << "<" << ret_type_name << "> " << adapter << " = "
-                       << adapter_class << ".<" << ret_type_name << ">create();" << endl;
+                       << adapter_class << ".<" << ret_type_name << ">create();" << '\n';
     bool empty_args = tfunc->get_arglist()->get_members().empty();
     indent(f_service_) << "delegate." << get_rpc_method_name(funname) << "("
                        << argument_list(tfunc->get_arglist(), false) << (empty_args ? "" : ", ")
-                       << adapter << ");" << endl;
-    indent(f_service_) << "return " << adapter << ".getFuture();" << endl;
+                       << adapter << ");" << '\n';
+    indent(f_service_) << "return " << adapter << ".getFuture();" << '\n';
     scope_down(f_service_);
-    f_service_ << endl;
+    f_service_ << '\n';
   }
   scope_down(f_service_);
-  f_service_ << endl;
+  f_service_ << '\n';
 }
 
 void t_java_generator::generate_service_async_client(t_service* tservice) {
@@ -3422,41 +3419,41 @@
   }
 
   indent(f_service_) << "public static class AsyncClient extends " << extends_client
-                     << " implements AsyncIface {" << endl;
+                     << " implements AsyncIface {" << '\n';
   indent_up();
 
   // Factory method
   indent(f_service_) << "public static class Factory implements "
                         "org.apache.thrift.async.TAsyncClientFactory<AsyncClient> {"
-                     << endl;
+                     << '\n';
   indent(f_service_) << "  private org.apache.thrift.async.TAsyncClientManager clientManager;"
-                     << endl;
+                     << '\n';
   indent(f_service_) << "  private org.apache.thrift.protocol.TProtocolFactory protocolFactory;"
-                     << endl;
+                     << '\n';
   indent(f_service_) << "  public Factory(org.apache.thrift.async.TAsyncClientManager "
                         "clientManager, org.apache.thrift.protocol.TProtocolFactory "
                         "protocolFactory) {"
-                     << endl;
-  indent(f_service_) << "    this.clientManager = clientManager;" << endl;
-  indent(f_service_) << "    this.protocolFactory = protocolFactory;" << endl;
-  indent(f_service_) << "  }" << endl;
-  indent(f_service_) << java_override_annotation() << endl;
+                     << '\n';
+  indent(f_service_) << "    this.clientManager = clientManager;" << '\n';
+  indent(f_service_) << "    this.protocolFactory = protocolFactory;" << '\n';
+  indent(f_service_) << "  }" << '\n';
+  indent(f_service_) << java_override_annotation() << '\n';
   indent(f_service_) << "  public AsyncClient "
                         "getAsyncClient(org.apache.thrift.transport.TNonblockingTransport "
                         "transport) {"
-                     << endl;
+                     << '\n';
   indent(f_service_) << "    return new AsyncClient(protocolFactory, clientManager, transport);"
-                     << endl;
-  indent(f_service_) << "  }" << endl;
-  indent(f_service_) << "}" << endl << endl;
+                     << '\n';
+  indent(f_service_) << "  }" << '\n';
+  indent(f_service_) << "}" << '\n' << '\n';
 
   indent(f_service_) << "public AsyncClient(org.apache.thrift.protocol.TProtocolFactory "
                         "protocolFactory, org.apache.thrift.async.TAsyncClientManager "
                         "clientManager, org.apache.thrift.transport.TNonblockingTransport "
                         "transport) {"
-                     << endl;
-  indent(f_service_) << "  super(protocolFactory, clientManager, transport);" << endl;
-  indent(f_service_) << "}" << endl << endl;
+                     << '\n';
+  indent(f_service_) << "  super(protocolFactory, clientManager, transport);" << '\n';
+  indent(f_service_) << "}" << '\n' << '\n';
 
   // Generate client method implementations
   vector<t_function*> functions = tservice->get_functions();
@@ -3479,35 +3476,35 @@
     string result_name = (*f_iter)->get_name() + "_result";
 
     // Main method body
-    indent(f_service_) << java_override_annotation() << endl;
+    indent(f_service_) << java_override_annotation() << '\n';
     indent(f_service_) << "public " << function_signature_async(*f_iter, false)
-                       << " throws org.apache.thrift.TException {" << endl;
-    indent(f_service_) << "  checkReady();" << endl;
+                       << " throws org.apache.thrift.TException {" << '\n';
+    indent(f_service_) << "  checkReady();" << '\n';
     indent(f_service_) << "  " << funclassname << " method_call = new " + funclassname + "("
                        << async_argument_list(*f_iter, arg_struct, ret_type)
-                       << ", this, ___protocolFactory, ___transport);" << endl;
-    indent(f_service_) << "  this.___currentMethod = method_call;" << endl;
-    indent(f_service_) << "  ___manager.call(method_call);" << endl;
-    indent(f_service_) << "}" << endl;
+                       << ", this, ___protocolFactory, ___transport);" << '\n';
+    indent(f_service_) << "  this.___currentMethod = method_call;" << '\n';
+    indent(f_service_) << "  ___manager.call(method_call);" << '\n';
+    indent(f_service_) << "}" << '\n';
 
-    f_service_ << endl;
+    f_service_ << '\n';
 
     // TAsyncMethod object for this function call
     indent(f_service_) << "public static class " + funclassname
                               + " extends org.apache.thrift.async.TAsyncMethodCall<"
                               + type_name((*f_iter)->get_returntype(), true) + "> {"
-                       << endl;
+                       << '\n';
     indent_up();
 
     // Member variables
     for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) {
       indent(f_service_) << "private " + type_name((*fld_iter)->get_type()) + " "
                                 + make_valid_java_identifier((*fld_iter)->get_name()) + ";"
-                         << endl;
+                         << '\n';
     }
 
     // NOTE since we use a new Client instance to deserialize, let's keep seqid to 0 for now
-    // indent(f_service_) << "private int seqid;" << endl << endl;
+    // indent(f_service_) << "private int seqid;" << '\n' << '\n';
 
     // Constructor
     indent(f_service_) << "public " + funclassname + "("
@@ -3516,22 +3513,22 @@
                           "org.apache.thrift.protocol.TProtocolFactory protocolFactory, "
                           "org.apache.thrift.transport.TNonblockingTransport transport) throws "
                           "org.apache.thrift.TException {"
-                       << endl;
+                       << '\n';
     indent(f_service_) << "  super(client, protocolFactory, transport, resultHandler, "
-                       << ((*f_iter)->is_oneway() ? "true" : "false") << ");" << endl;
+                       << ((*f_iter)->is_oneway() ? "true" : "false") << ");" << '\n';
 
     // Assign member variables
     for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) {
       indent(f_service_) << "  this." + make_valid_java_identifier((*fld_iter)->get_name()) + " = " + make_valid_java_identifier((*fld_iter)->get_name())
                                 + ";"
-                         << endl;
+                         << '\n';
     }
 
-    indent(f_service_) << "}" << endl << endl;
-    indent(f_service_) << java_override_annotation() << endl;
+    indent(f_service_) << "}" << '\n' << '\n';
+    indent(f_service_) << java_override_annotation() << '\n';
     indent(f_service_) << "public void write_args(org.apache.thrift.protocol.TProtocol prot) "
                           "throws org.apache.thrift.TException {"
-                       << endl;
+                       << '\n';
     indent_up();
 
     // Serialize request
@@ -3539,68 +3536,68 @@
     f_service_ << indent() << "prot.writeMessageBegin(new org.apache.thrift.protocol.TMessage(\""
                << funname << "\", org.apache.thrift.protocol."
                << ((*f_iter)->is_oneway() ? "TMessageType.ONEWAY" : "TMessageType.CALL") << ", 0));"
-               << endl
-               << indent() << args_name << " args = new " << args_name << "();" << endl;
+               << '\n'
+               << indent() << args_name << " args = new " << args_name << "();" << '\n';
 
     for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) {
       f_service_ << indent() << "args.set" << get_cap_name((*fld_iter)->get_name()) << "("
-                 << make_valid_java_identifier((*fld_iter)->get_name()) << ");" << endl;
+                 << make_valid_java_identifier((*fld_iter)->get_name()) << ");" << '\n';
     }
 
-    f_service_ << indent() << "args.write(prot);" << endl
-               << indent() << "prot.writeMessageEnd();" << endl;
+    f_service_ << indent() << "args.write(prot);" << '\n'
+               << indent() << "prot.writeMessageEnd();" << '\n';
 
     indent_down();
-    indent(f_service_) << "}" << endl << endl;
+    indent(f_service_) << "}" << '\n' << '\n';
 
     // Return method
-    indent(f_service_) << java_override_annotation() << endl;
+    indent(f_service_) << java_override_annotation() << '\n';
     indent(f_service_) << "public " + type_name(ret_type, true) + " getResult() throws ";
     vector<t_field*>::const_iterator x_iter;
     for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) {
       f_service_ << type_name((*x_iter)->get_type(), false, false) + ", ";
     }
-    f_service_ << "org.apache.thrift.TException {" << endl;
+    f_service_ << "org.apache.thrift.TException {" << '\n';
 
     indent_up();
     f_service_
         << indent()
         << "if (getState() != org.apache.thrift.async.TAsyncMethodCall.State.RESPONSE_READ) {"
-        << endl
+        << '\n'
         << indent() << "  throw new java.lang.IllegalStateException(\"Method call not finished!\");"
-        << endl
-        << indent() << "}" << endl
+        << '\n'
+        << indent() << "}" << '\n'
         << indent()
         << "org.apache.thrift.transport.TMemoryInputTransport memoryTransport = new "
            "org.apache.thrift.transport.TMemoryInputTransport(getFrameBuffer().array());"
-        << endl
+        << '\n'
         << indent()
         << "org.apache.thrift.protocol.TProtocol prot = "
            "client.getProtocolFactory().getProtocol(memoryTransport);"
-        << endl;
+        << '\n';
     indent(f_service_);
     if (ret_type->is_void()) { // NB: Includes oneways which always return void.
       if (!(*f_iter)->is_oneway()) {
-        f_service_ << "(new Client(prot)).recv" + sep + javaname + "();" << endl;
+        f_service_ << "(new Client(prot)).recv" + sep + javaname + "();" << '\n';
         indent(f_service_);
       }
-      f_service_ << "return null;" << endl;
+      f_service_ << "return null;" << '\n';
     } else {
-      f_service_ << "return (new Client(prot)).recv" + sep + javaname + "();" << endl;
+      f_service_ << "return (new Client(prot)).recv" + sep + javaname + "();" << '\n';
     }
 
     // Close function
     indent_down();
-    indent(f_service_) << "}" << endl;
+    indent(f_service_) << "}" << '\n';
 
     // Close class
     indent_down();
-    indent(f_service_) << "}" << endl << endl;
+    indent(f_service_) << "}" << '\n' << '\n';
   }
 
   // Close AsyncClient
   scope_down(f_service_);
-  f_service_ << endl;
+  f_service_ << '\n';
 }
 
 /**
@@ -3625,41 +3622,42 @@
 
   // Generate the header portion
   indent(f_service_) << "public static class Processor<I extends Iface> extends "
-                     << extends_processor << " implements org.apache.thrift.TProcessor {" << endl;
+                     << extends_processor << " implements org.apache.thrift.TProcessor {" << '\n';
   indent_up();
 
   indent(f_service_) << "private static final org.slf4j.Logger _LOGGER = "
                         "org.slf4j.LoggerFactory.getLogger(Processor.class.getName());"
-                     << endl;
+                     << '\n';
 
-  indent(f_service_) << "public Processor(I iface) {" << endl;
+  indent(f_service_) << "public Processor(I iface) {" << '\n';
   indent(f_service_) << "  super(iface, getProcessMap(new java.util.HashMap<java.lang.String, "
                         "org.apache.thrift.ProcessFunction<I, ? extends "
-                        "org.apache.thrift.TBase>>()));"
-                     << endl;
-  indent(f_service_) << "}" << endl << endl;
+                        "org.apache.thrift.TBase, ? extends org.apache.thrift.TBase>>()));"
+                     << '\n';
+  indent(f_service_) << "}" << '\n' << '\n';
 
   indent(f_service_) << "protected Processor(I iface, java.util.Map<java.lang.String, "
-                        "org.apache.thrift.ProcessFunction<I, ? extends org.apache.thrift.TBase>> "
-                        "processMap) {"
-                     << endl;
-  indent(f_service_) << "  super(iface, getProcessMap(processMap));" << endl;
-  indent(f_service_) << "}" << endl << endl;
+                        "org.apache.thrift.ProcessFunction<I, ? extends org.apache.thrift.TBase, ? "
+                        "extends org.apache.thrift.TBase>> processMap) {"
+                     << '\n';
+  indent(f_service_) << "  super(iface, getProcessMap(processMap));" << '\n';
+  indent(f_service_) << "}" << '\n' << '\n';
 
-  indent(f_service_) << "private static <I extends Iface> java.util.Map<java.lang.String,  "
-                        "org.apache.thrift.ProcessFunction<I, ? extends org.apache.thrift.TBase>> "
+  indent(f_service_) << "private static <I extends Iface> java.util.Map<java.lang.String, "
+                        "org.apache.thrift.ProcessFunction<I, ? extends org.apache.thrift.TBase, "
+                        "? extends org.apache.thrift.TBase>> "
                         "getProcessMap(java.util.Map<java.lang.String, "
                         "org.apache.thrift.ProcessFunction<I, ? extends "
-                        " org.apache.thrift.TBase>> processMap) {"
-                     << endl;
+                        " org.apache.thrift.TBase, ? extends org.apache.thrift.TBase>> processMap) {"
+                     << '\n';
   indent_up();
   for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
     indent(f_service_) << "processMap.put(\"" << (*f_iter)->get_name() << "\", new "
-                       << make_valid_java_identifier((*f_iter)->get_name()) << "());" << endl;
+                       << make_valid_java_identifier((*f_iter)->get_name()) << "());" << '\n';
   }
-  indent(f_service_) << "return processMap;" << endl;
+  indent(f_service_) << "return processMap;" << '\n';
   indent_down();
-  indent(f_service_) << "}" << endl << endl;
+  indent(f_service_) << "}" << '\n' << '\n';
 
   // Generate the process subfunctions
   for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
@@ -3667,7 +3665,7 @@
   }
 
   indent_down();
-  indent(f_service_) << "}" << endl << endl;
+  indent(f_service_) << "}" << '\n' << '\n';
 }
 
 /**
@@ -3692,42 +3690,42 @@
 
   // Generate the header portion
   indent(f_service_) << "public static class AsyncProcessor<I extends AsyncIface> extends "
-                     << extends_processor << " {" << endl;
+                     << extends_processor << " {" << '\n';
   indent_up();
 
   indent(f_service_) << "private static final org.slf4j.Logger _LOGGER = "
                         "org.slf4j.LoggerFactory.getLogger(AsyncProcessor.class.getName());"
-                     << endl;
+                     << '\n';
 
-  indent(f_service_) << "public AsyncProcessor(I iface) {" << endl;
+  indent(f_service_) << "public AsyncProcessor(I iface) {" << '\n';
   indent(f_service_) << "  super(iface, getProcessMap(new java.util.HashMap<java.lang.String, "
                         "org.apache.thrift.AsyncProcessFunction<I, ? extends "
-                        "org.apache.thrift.TBase, ?>>()));"
-                     << endl;
-  indent(f_service_) << "}" << endl << endl;
+                        "org.apache.thrift.TBase, ?, ? extends org.apache.thrift.TBase>>()));"
+                     << '\n';
+  indent(f_service_) << "}" << '\n' << '\n';
 
   indent(f_service_) << "protected AsyncProcessor(I iface, java.util.Map<java.lang.String,  "
                         "org.apache.thrift.AsyncProcessFunction<I, ? extends  "
-                        "org.apache.thrift.TBase, ?>> processMap) {"
-                     << endl;
-  indent(f_service_) << "  super(iface, getProcessMap(processMap));" << endl;
-  indent(f_service_) << "}" << endl << endl;
+                        "org.apache.thrift.TBase, ?, ? extends org.apache.thrift.TBase>> processMap) {"
+                     << '\n';
+  indent(f_service_) << "  super(iface, getProcessMap(processMap));" << '\n';
+  indent(f_service_) << "}" << '\n' << '\n';
 
   indent(f_service_)
       << "private static <I extends AsyncIface> java.util.Map<java.lang.String,  "
          "org.apache.thrift.AsyncProcessFunction<I, ? extends  "
-         "org.apache.thrift.TBase,?>> getProcessMap(java.util.Map<java.lang.String,  "
+         "org.apache.thrift.TBase, ?, ? extends org.apache.thrift.TBase>> getProcessMap(java.util.Map<java.lang.String,  "
          "org.apache.thrift.AsyncProcessFunction<I, ? extends  "
-         "org.apache.thrift.TBase, ?>> processMap) {"
-      << endl;
+         "org.apache.thrift.TBase, ?, ? extends org.apache.thrift.TBase>> processMap) {"
+      << '\n';
   indent_up();
   for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
     indent(f_service_) << "processMap.put(\"" << (*f_iter)->get_name() << "\", new "
-                       << make_valid_java_identifier((*f_iter)->get_name()) << "());" << endl;
+                       << make_valid_java_identifier((*f_iter)->get_name()) << "());" << '\n';
   }
-  indent(f_service_) << "return processMap;" << endl;
+  indent(f_service_) << "return processMap;" << '\n';
   indent_down();
-  indent(f_service_) << "}" << endl << endl;
+  indent(f_service_) << "}" << '\n' << '\n';
 
   // Generate the process subfunctions
   for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
@@ -3735,7 +3733,7 @@
   }
 
   indent_down();
-  indent(f_service_) << "}" << endl << endl;
+  indent(f_service_) << "}" << '\n' << '\n';
 }
 
 /**
@@ -3783,91 +3781,101 @@
   // Open class
   indent(f_service_) << "public static class " << make_valid_java_identifier(tfunction->get_name())
                      << "<I extends AsyncIface> extends org.apache.thrift.AsyncProcessFunction<I, "
-                     << argsname << ", " << resulttype << "> {" << endl;
+                     << argsname << ", " << resulttype << ", " << resultname << "> {" << '\n';
   indent_up();
 
-  indent(f_service_) << "public " << make_valid_java_identifier(tfunction->get_name()) << "() {" << endl;
-  indent(f_service_) << "  super(\"" << tfunction->get_name() << "\");" << endl;
-  indent(f_service_) << "}" << endl << endl;
+  indent(f_service_) << "public " << make_valid_java_identifier(tfunction->get_name()) << "() {" << '\n';
+  indent(f_service_) << "  super(\"" << tfunction->get_name() << "\");" << '\n';
+  indent(f_service_) << "}" << '\n' << '\n';
 
-  indent(f_service_) << java_override_annotation() << endl;
-  indent(f_service_) << "public " << argsname << " getEmptyArgsInstance() {" << endl;
-  indent(f_service_) << "  return new " << argsname << "();" << endl;
-  indent(f_service_) << "}" << endl << endl;
+  indent(f_service_) << java_override_annotation() << '\n';
+  indent(f_service_) << "public " << resultname << " getEmptyResultInstance() {" << '\n';
+  if (tfunction->is_oneway()) {
+    indent(f_service_) << "  return null;" << '\n';
+  }
+  else {
+    indent(f_service_) << "  return new " << resultname << "();" << '\n';
+  }
+  indent(f_service_) << "}" << '\n' << '\n';
 
-  indent(f_service_) << java_override_annotation() << endl;
+  indent(f_service_) << java_override_annotation() << '\n';
+  indent(f_service_) << "public " << argsname << " getEmptyArgsInstance() {" << '\n';
+  indent(f_service_) << "  return new " << argsname << "();" << '\n';
+  indent(f_service_) << "}" << '\n' << '\n';
+
+  indent(f_service_) << java_override_annotation() << '\n';
   indent(f_service_) << "public org.apache.thrift.async.AsyncMethodCallback<" << resulttype
                      << "> getResultHandler(final "
                         "org.apache.thrift.server.AbstractNonblockingServer.AsyncFrameBuffer fb, "
                         "final int seqid) {"
-                     << endl;
+                     << '\n';
   indent_up();
-  indent(f_service_) << "final org.apache.thrift.AsyncProcessFunction fcall = this;" << endl;
+  indent(f_service_) << "final org.apache.thrift.AsyncProcessFunction fcall = this;" << '\n';
   indent(f_service_) << "return new org.apache.thrift.async.AsyncMethodCallback<" << resulttype
-                     << ">() { " << endl;
+                     << ">() { " << '\n';
   indent_up();
-  indent(f_service_) << java_override_annotation() << endl;
-  indent(f_service_) << "public void onComplete(" << resulttype << " o) {" << endl;
+  indent(f_service_) << java_override_annotation() << '\n';
+  indent(f_service_) << "public void onComplete(" << resulttype << " o) {" << '\n';
 
   indent_up();
   if (!tfunction->is_oneway()) {
-    indent(f_service_) << resultname << " result = new " << resultname << "();" << endl;
+    indent(f_service_) << resultname << " result = new " << resultname << "();" << '\n';
 
     if (!tfunction->get_returntype()->is_void()) {
-      indent(f_service_) << "result.success = o;" << endl;
+      indent(f_service_) << "result.success = o;" << '\n';
       // Set isset on success field
       if (!type_can_be_null(tfunction->get_returntype())) {
         indent(f_service_) << "result.set" << get_cap_name("success") << get_cap_name("isSet")
-                           << "(true);" << endl;
+                           << "(true);" << '\n';
       }
     }
 
-    indent(f_service_) << "try {" << endl;
+    indent(f_service_) << "try {" << '\n';
     indent(f_service_)
         << "  fcall.sendResponse(fb, result, org.apache.thrift.protocol.TMessageType.REPLY,seqid);"
-        << endl;
-    indent(f_service_) << "} catch (org.apache.thrift.transport.TTransportException e) {" << endl;
+        << '\n';
+    indent(f_service_) << "} catch (org.apache.thrift.transport.TTransportException e) {" << '\n';
     indent_up();
     f_service_ << indent()
                << "_LOGGER.error(\"TTransportException writing to internal frame buffer\", e);"
-               << endl
-               << indent() << "fb.close();" << endl;
+               << '\n'
+               << indent() << "fb.close();" << '\n';
     indent_down();
-    indent(f_service_) << "} catch (java.lang.Exception e) {" << endl;
+    indent(f_service_) << "} catch (java.lang.Exception e) {" << '\n';
     indent_up();
     f_service_ << indent() << "_LOGGER.error(\"Exception writing to internal frame buffer\", e);"
-               << endl
-               << indent() << "onError(e);" << endl;
+               << '\n'
+               << indent() << "onError(e);" << '\n';
     indent_down();
-    indent(f_service_) << "}" << endl;
+    indent(f_service_) << "}" << '\n';
   }
   indent_down();
-  indent(f_service_) << "}" << endl;
+  indent(f_service_) << "}" << '\n';
 
-  indent(f_service_) << java_override_annotation() << endl;
-  indent(f_service_) << "public void onError(java.lang.Exception e) {" << endl;
+  indent(f_service_) << java_override_annotation() << '\n';
+  indent(f_service_) << "public void onError(java.lang.Exception e) {" << '\n';
   indent_up();
 
   if (tfunction->is_oneway()) {
     indent(f_service_) << "if (e instanceof org.apache.thrift.transport.TTransportException) {"
-                       << endl;
+                       << '\n';
     indent_up();
 
-    f_service_ << indent() << "_LOGGER.error(\"TTransportException inside handler\", e);" << endl
-               << indent() << "fb.close();" << endl;
+    f_service_ << indent() << "_LOGGER.error(\"TTransportException inside handler\", e);" << '\n'
+               << indent() << "fb.close();" << '\n';
 
     indent_down();
-    indent(f_service_) << "} else {" << endl;
+    indent(f_service_) << "} else {" << '\n';
     indent_up();
 
-    f_service_ << indent() << "_LOGGER.error(\"Exception inside oneway handler\", e);" << endl;
+    f_service_ << indent() << "_LOGGER.error(\"Exception inside oneway handler\", e);" << '\n';
 
     indent_down();
-    indent(f_service_) << "}" << endl;
+    indent(f_service_) << "}" << '\n';
   } else {
-    indent(f_service_) << "byte msgType = org.apache.thrift.protocol.TMessageType.REPLY;" << endl;
-    indent(f_service_) << "org.apache.thrift.TSerializable msg;" << endl;
-    indent(f_service_) << resultname << " result = new " << resultname << "();" << endl;
+    indent(f_service_) << "byte msgType = org.apache.thrift.protocol.TMessageType.REPLY;" << '\n';
+    indent(f_service_) << "org.apache.thrift.TSerializable msg;" << '\n';
+    indent(f_service_) << resultname << " result = new " << resultname << "();" << '\n';
 
     t_struct* xs = tfunction->get_xceptions();
     const std::vector<t_field*>& xceptions = xs->get_members();
@@ -3879,66 +3887,66 @@
           f_service_ << indent();
         string type = type_name((*x_iter)->get_type(), false, false);
         string name = (*x_iter)->get_name();
-        f_service_ << "if (e instanceof " << type << ") {" << endl;
+        f_service_ << "if (e instanceof " << type << ") {" << '\n';
         indent_up();
-        f_service_ << indent() << "result." << make_valid_java_identifier(name) << " = (" << type << ") e;" << endl
+        f_service_ << indent() << "result." << make_valid_java_identifier(name) << " = (" << type << ") e;" << '\n'
                    << indent() << "result.set" << get_cap_name(name) << get_cap_name("isSet")
-                   << "(true);" << endl
-                   << indent() << "msg = result;" << endl;
+                   << "(true);" << '\n'
+                   << indent() << "msg = result;" << '\n';
         indent_down();
         indent(f_service_) << "} else ";
       }
     } else {
       indent(f_service_);
     }
-    f_service_ << "if (e instanceof org.apache.thrift.transport.TTransportException) {" << endl;
+    f_service_ << "if (e instanceof org.apache.thrift.transport.TTransportException) {" << '\n';
     indent_up();
-    f_service_ << indent() << "_LOGGER.error(\"TTransportException inside handler\", e);" << endl
-               << indent() << "fb.close();" << endl
-               << indent() << "return;" << endl;
+    f_service_ << indent() << "_LOGGER.error(\"TTransportException inside handler\", e);" << '\n'
+               << indent() << "fb.close();" << '\n'
+               << indent() << "return;" << '\n';
     indent_down();
     indent(f_service_) << "} else if (e instanceof org.apache.thrift.TApplicationException) {"
-                       << endl;
+                       << '\n';
     indent_up();
-    f_service_ << indent() << "_LOGGER.error(\"TApplicationException inside handler\", e);" << endl
-               << indent() << "msgType = org.apache.thrift.protocol.TMessageType.EXCEPTION;" << endl
-               << indent() << "msg = (org.apache.thrift.TApplicationException)e;" << endl;
+    f_service_ << indent() << "_LOGGER.error(\"TApplicationException inside handler\", e);" << '\n'
+               << indent() << "msgType = org.apache.thrift.protocol.TMessageType.EXCEPTION;" << '\n'
+               << indent() << "msg = (org.apache.thrift.TApplicationException)e;" << '\n';
     indent_down();
-    indent(f_service_) << "} else {" << endl;
+    indent(f_service_) << "} else {" << '\n';
     indent_up();
-    f_service_ << indent() << "_LOGGER.error(\"Exception inside handler\", e);" << endl
-               << indent() << "msgType = org.apache.thrift.protocol.TMessageType.EXCEPTION;" << endl
+    f_service_ << indent() << "_LOGGER.error(\"Exception inside handler\", e);" << '\n'
+               << indent() << "msgType = org.apache.thrift.protocol.TMessageType.EXCEPTION;" << '\n'
                << indent()
                << "msg = new "
                   "org.apache.thrift.TApplicationException(org.apache.thrift."
                   "TApplicationException.INTERNAL_ERROR, e.getMessage());"
-               << endl;
+               << '\n';
     indent_down();
-    f_service_ << indent() << "}" << endl
-               << indent() << "try {" << endl
-               << indent() << "  fcall.sendResponse(fb,msg,msgType,seqid);" << endl
-               << indent() << "} catch (java.lang.Exception ex) {" << endl
+    f_service_ << indent() << "}" << '\n'
+               << indent() << "try {" << '\n'
+               << indent() << "  fcall.sendResponse(fb,msg,msgType,seqid);" << '\n'
+               << indent() << "} catch (java.lang.Exception ex) {" << '\n'
                << indent() << "  _LOGGER.error(\"Exception writing to internal frame buffer\", ex);"
-               << endl
-               << indent() << "  fb.close();" << endl
-               << indent() << "}" << endl;
+               << '\n'
+               << indent() << "  fb.close();" << '\n'
+               << indent() << "}" << '\n';
   }
   indent_down();
-  indent(f_service_) << "}" << endl;
+  indent(f_service_) << "}" << '\n';
   indent_down();
-  indent(f_service_) << "};" << endl;
+  indent(f_service_) << "};" << '\n';
   indent_down();
-  indent(f_service_) << "}" << endl << endl;
+  indent(f_service_) << "}" << '\n' << '\n';
 
-  indent(f_service_) << java_override_annotation() << endl;
-  indent(f_service_) << "protected boolean isOneway() {" << endl;
-  indent(f_service_) << "  return " << ((tfunction->is_oneway()) ? "true" : "false") << ";" << endl;
-  indent(f_service_) << "}" << endl << endl;
+  indent(f_service_) << java_override_annotation() << '\n';
+  indent(f_service_) << "public boolean isOneway() {" << '\n';
+  indent(f_service_) << "  return " << ((tfunction->is_oneway()) ? "true" : "false") << ";" << '\n';
+  indent(f_service_) << "}" << '\n' << '\n';
 
-  indent(f_service_) << java_override_annotation() << endl;
+  indent(f_service_) << java_override_annotation() << '\n';
   indent(f_service_) << "public void start(I iface, " << argsname
                      << " args, org.apache.thrift.async.AsyncMethodCallback<" << resulttype
-                     << "> resultHandler) throws org.apache.thrift.TException {" << endl;
+                     << "> resultHandler) throws org.apache.thrift.TException {" << '\n';
   indent_up();
 
   // Generate the function call
@@ -3960,17 +3968,17 @@
   if (!first)
     f_service_ << ",";
   f_service_ << "resultHandler";
-  f_service_ << ");" << endl;
+  f_service_ << ");" << '\n';
 
   indent_down();
   indent(f_service_) << "}";
 
   // Close function
-  f_service_ << endl;
+  f_service_ << '\n';
 
   // Close class
   indent_down();
-  f_service_ << indent() << "}" << endl << endl;
+  f_service_ << indent() << "}" << '\n' << '\n';
 }
 
 /**
@@ -3989,35 +3997,45 @@
   // Open class
   indent(f_service_) << "public static class " << make_valid_java_identifier(tfunction->get_name())
                      << "<I extends Iface> extends org.apache.thrift.ProcessFunction<I, "
-                     << argsname << "> {" << endl;
+                     << argsname << ", " << resultname << "> {" << '\n';
   indent_up();
 
-  indent(f_service_) << "public " << make_valid_java_identifier(tfunction->get_name()) << "() {" << endl;
-  indent(f_service_) << "  super(\"" << tfunction->get_name() << "\");" << endl;
-  indent(f_service_) << "}" << endl << endl;
+  indent(f_service_) << "public " << make_valid_java_identifier(tfunction->get_name()) << "() {" << '\n';
+  indent(f_service_) << "  super(\"" << tfunction->get_name() << "\");" << '\n';
+  indent(f_service_) << "}" << '\n' << '\n';
 
-  indent(f_service_) << java_override_annotation() << endl;
-  indent(f_service_) << "public " << argsname << " getEmptyArgsInstance() {" << endl;
-  indent(f_service_) << "  return new " << argsname << "();" << endl;
-  indent(f_service_) << "}" << endl << endl;
+  indent(f_service_) << java_override_annotation() << '\n';
+  indent(f_service_) << "public " << argsname << " getEmptyArgsInstance() {" << '\n';
+  indent(f_service_) << "  return new " << argsname << "();" << '\n';
+  indent(f_service_) << "}" << '\n' << '\n';
 
-  indent(f_service_) << java_override_annotation() << endl;
-  indent(f_service_) << "protected boolean isOneway() {" << endl;
-  indent(f_service_) << "  return " << ((tfunction->is_oneway()) ? "true" : "false") << ";" << endl;
-  indent(f_service_) << "}" << endl << endl;
+  indent(f_service_) << java_override_annotation() << '\n';
+  indent(f_service_) << "public boolean isOneway() {" << '\n';
+  indent(f_service_) << "  return " << ((tfunction->is_oneway()) ? "true" : "false") << ";" << '\n';
+  indent(f_service_) << "}" << '\n' << '\n';
 
-  indent(f_service_) << java_override_annotation() << endl;
-  indent(f_service_) << "protected boolean rethrowUnhandledExceptions() {" << endl;
+  indent(f_service_) << java_override_annotation() << '\n';
+  indent(f_service_) << "protected boolean rethrowUnhandledExceptions() {" << '\n';
   indent(f_service_) << "  return " << ((rethrow_unhandled_exceptions_) ? "true" : "false") << ";"
-                     << endl;
-  indent(f_service_) << "}" << endl << endl;
+                     << '\n';
+  indent(f_service_) << "}" << '\n' << '\n';
 
-  indent(f_service_) << java_override_annotation() << endl;
+  indent(f_service_) << java_override_annotation() << '\n';
+  indent(f_service_) << "public " << resultname << " getEmptyResultInstance() {" << '\n';
+  if (tfunction->is_oneway()) {
+    indent(f_service_) << "  return null;" << '\n';
+  }
+  else {
+    indent(f_service_) << "  return new " << resultname << "();" << '\n';
+  }
+  indent(f_service_) << "}" << '\n' << '\n';
+
+  indent(f_service_) << java_override_annotation() << '\n';
   indent(f_service_) << "public " << resultname << " getResult(I iface, " << argsname
-                     << " args) throws org.apache.thrift.TException {" << endl;
+                     << " args) throws org.apache.thrift.TException {" << '\n';
   indent_up();
   if (!tfunction->is_oneway()) {
-    indent(f_service_) << resultname << " result = new " << resultname << "();" << endl;
+    indent(f_service_) << resultname << " result = getEmptyResultInstance();" << '\n';
   }
 
   t_struct* xs = tfunction->get_xceptions();
@@ -4026,7 +4044,7 @@
 
   // Try block for a function with exceptions
   if (xceptions.size() > 0) {
-    f_service_ << indent() << "try {" << endl;
+    f_service_ << indent() << "try {" << '\n';
     indent_up();
   }
 
@@ -4049,13 +4067,13 @@
     }
     f_service_ << "args." << make_valid_java_identifier((*f_iter)->get_name());
   }
-  f_service_ << ");" << endl;
+  f_service_ << ");" << '\n';
 
   // Set isset on success field
   if (!tfunction->is_oneway() && !tfunction->get_returntype()->is_void()
       && !type_can_be_null(tfunction->get_returntype())) {
     indent(f_service_) << "result.set" << get_cap_name("success") << get_cap_name("isSet")
-                       << "(true);" << endl;
+                       << "(true);" << '\n';
   }
 
   if (!tfunction->is_oneway() && xceptions.size() > 0) {
@@ -4063,34 +4081,34 @@
     f_service_ << indent() << "}";
     for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) {
       f_service_ << " catch (" << type_name((*x_iter)->get_type(), false, false) << " "
-                 << make_valid_java_identifier((*x_iter)->get_name()) << ") {" << endl;
+                 << make_valid_java_identifier((*x_iter)->get_name()) << ") {" << '\n';
       if (!tfunction->is_oneway()) {
         indent_up();
         f_service_ << indent() << "result." << make_valid_java_identifier((*x_iter)->get_name()) << " = "
-                   << make_valid_java_identifier((*x_iter)->get_name()) << ";" << endl;
+                   << make_valid_java_identifier((*x_iter)->get_name()) << ";" << '\n';
         indent_down();
         f_service_ << indent() << "}";
       } else {
         f_service_ << "}";
       }
     }
-    f_service_ << endl;
+    f_service_ << '\n';
   }
 
   if (tfunction->is_oneway()) {
-    indent(f_service_) << "return null;" << endl;
+    indent(f_service_) << "return null;" << '\n';
   } else {
-    indent(f_service_) << "return result;" << endl;
+    indent(f_service_) << "return result;" << '\n';
   }
   indent_down();
   indent(f_service_) << "}";
 
   // Close function
-  f_service_ << endl;
+  f_service_ << '\n';
 
   // Close class
   indent_down();
-  f_service_ << indent() << "}" << endl << endl;
+  f_service_ << indent() << "}" << '\n' << '\n';
 }
 
 /**
@@ -4154,12 +4172,12 @@
     default:
       throw "compiler error: no Java name for base type " + t_base_type::t_base_name(tbase);
     }
-    out << endl;
+    out << '\n';
   } else if (type->is_enum()) {
     indent(out) << name << " = "
                 << type_name(tfield->get_type(), true, false, false, true)
                        + ".findByValue(iprot.readI32());"
-                << endl;
+                << '\n';
   } else {
     printf("DO NOT KNOW HOW TO DESERIALIZE FIELD '%s' TYPE '%s'\n", tfield->get_name().c_str(),
            type_name(type).c_str());
@@ -4172,15 +4190,15 @@
 void t_java_generator::generate_deserialize_struct(ostream& out, t_struct* tstruct, string prefix) {
 
   if (reuse_objects_) {
-    indent(out) << "if (" << prefix << " == null) {" << endl;
+    indent(out) << "if (" << prefix << " == null) {" << '\n';
     indent_up();
   }
-  indent(out) << prefix << " = new " << type_name(tstruct) << "();" << endl;
+  indent(out) << prefix << " = new " << type_name(tstruct) << "();" << '\n';
   if (reuse_objects_) {
     indent_down();
-    indent(out) << "}" << endl;
+    indent(out) << "}" << '\n';
   }
-  indent(out) << prefix << ".read(iprot);" << endl;
+  indent(out) << prefix << ".read(iprot);" << '\n';
 }
 
 /**
@@ -4207,31 +4225,31 @@
     // Declare variables, read header
     if (ttype->is_map()) {
       indent(out) << "org.apache.thrift.protocol.TMap " << obj << " = iprot.readMapBegin();"
-                  << endl;
+                  << '\n';
     } else if (ttype->is_set()) {
       indent(out) << "org.apache.thrift.protocol.TSet " << obj << " = iprot.readSetBegin();"
-                  << endl;
+                  << '\n';
     } else if (ttype->is_list()) {
       indent(out) << "org.apache.thrift.protocol.TList " << obj << " = iprot.readListBegin();"
-                  << endl;
+                  << '\n';
     }
   } else {
     // Declare variables, read header
     if (ttype->is_map()) {
       indent(out) << "org.apache.thrift.protocol.TMap " << obj << " = iprot.readMapBegin("
                   << type_to_enum(((t_map*)ttype)->get_key_type()) << ", "
-                  << type_to_enum(((t_map*)ttype)->get_val_type()) << "); " << endl;
+                  << type_to_enum(((t_map*)ttype)->get_val_type()) << "); " << '\n';
     } else if (ttype->is_set()) {
       indent(out) << "org.apache.thrift.protocol.TSet " << obj << " = iprot.readSetBegin("
-                  << type_to_enum(((t_set*)ttype)->get_elem_type()) << ");" << endl;
+                  << type_to_enum(((t_set*)ttype)->get_elem_type()) << ");" << '\n';
     } else if (ttype->is_list()) {
       indent(out) << "org.apache.thrift.protocol.TList " << obj << " = iprot.readListBegin("
-                  << type_to_enum(((t_list*)ttype)->get_elem_type()) << ");" << endl;
+                  << type_to_enum(((t_list*)ttype)->get_elem_type()) << ");" << '\n';
     }
   }
 
   if (reuse_objects_) {
-    indent(out) << "if (" << prefix << " == null) {" << endl;
+    indent(out) << "if (" << prefix << " == null) {" << '\n';
     indent_up();
   }
 
@@ -4243,18 +4261,18 @@
 
   // construct the collection correctly i.e. with appropriate size/type
   if (is_enum_set(ttype) || is_enum_map(ttype)) {
-    out << "(" << inner_enum_type_name(ttype) << ");" << endl;
+    out << "(" << inner_enum_type_name(ttype) << ");" << '\n';
   } else if (sorted_containers_ && (ttype->is_map() || ttype->is_set())) {
     // TreeSet and TreeMap don't have any constructor which takes a capacity as an argument
-    out << "();" << endl;
+    out << "();" << '\n';
   } else {
     out << "(" << (ttype->is_list() ? "" : "2*") << obj << ".size"
-        << ");" << endl;
+        << ");" << '\n';
   }
 
   if (reuse_objects_) {
     indent_down();
-    indent(out) << "}" << endl;
+    indent(out) << "}" << '\n';
   }
 
   if (ttype->is_map()) {
@@ -4270,11 +4288,11 @@
   if (has_metadata) {
     // Read container end
     if (ttype->is_map()) {
-      indent(out) << "iprot.readMapEnd();" << endl;
+      indent(out) << "iprot.readMapEnd();" << '\n';
     } else if (ttype->is_set()) {
-      indent(out) << "iprot.readSetEnd();" << endl;
+      indent(out) << "iprot.readSetEnd();" << '\n';
     } else if (ttype->is_list()) {
-      indent(out) << "iprot.readListEnd();" << endl;
+      indent(out) << "iprot.readListEnd();" << '\n';
     }
   }
   scope_down(out);
@@ -4293,14 +4311,14 @@
   t_field fkey(tmap->get_key_type(), key);
   t_field fval(tmap->get_val_type(), val);
 
-  indent(out) << declare_field(&fkey, reuse_objects_, false) << endl;
-  indent(out) << declare_field(&fval, reuse_objects_, false) << endl;
+  indent(out) << declare_field(&fkey, reuse_objects_, false) << '\n';
+  indent(out) << declare_field(&fval, reuse_objects_, false) << '\n';
 
   // For loop iterates over elements
   string i = tmp("_i");
   indent(out) << "for (int " << i << " = 0; " << i << " < " << obj << ".size"
               << "; "
-              << "++" << i << ")" << endl;
+              << "++" << i << ")" << '\n';
 
   scope_up(out);
 
@@ -4308,22 +4326,22 @@
   generate_deserialize_field(out, &fval, "", has_metadata);
 
   if (get_true_type(fkey.get_type())->is_enum()) {
-    indent(out) << "if (" << key << " != null)" << endl;
+    indent(out) << "if (" << key << " != null)" << '\n';
     scope_up(out);
   }
 
-  indent(out) << prefix << ".put(" << key << ", " << val << ");" << endl;
+  indent(out) << prefix << ".put(" << key << ", " << val << ");" << '\n';
 
   if (get_true_type(fkey.get_type())->is_enum()) {
     scope_down(out);
   }
 
   if (reuse_objects_ && !get_true_type(fkey.get_type())->is_base_type()) {
-    indent(out) << key << " = null;" << endl;
+    indent(out) << key << " = null;" << '\n';
   }
 
   if (reuse_objects_ && !get_true_type(fval.get_type())->is_base_type()) {
-    indent(out) << val << " = null;" << endl;
+    indent(out) << val << " = null;" << '\n';
   }
 }
 
@@ -4338,30 +4356,30 @@
   string elem = tmp("_elem");
   t_field felem(tset->get_elem_type(), elem);
 
-  indent(out) << declare_field(&felem, reuse_objects_, false) << endl;
+  indent(out) << declare_field(&felem, reuse_objects_, false) << '\n';
 
   // For loop iterates over elements
   string i = tmp("_i");
   indent(out) << "for (int " << i << " = 0; " << i << " < " << obj << ".size"
               << "; "
-              << "++" << i << ")" << endl;
+              << "++" << i << ")" << '\n';
   scope_up(out);
 
   generate_deserialize_field(out, &felem, "", has_metadata);
 
   if (get_true_type(felem.get_type())->is_enum()) {
-    indent(out) << "if (" << elem << " != null)" << endl;
+    indent(out) << "if (" << elem << " != null)" << '\n';
     scope_up(out);
   }
 
-  indent(out) << prefix << ".add(" << elem << ");" << endl;
+  indent(out) << prefix << ".add(" << elem << ");" << '\n';
 
   if (get_true_type(felem.get_type())->is_enum()) {
     scope_down(out);
   }
 
   if (reuse_objects_ && !get_true_type(felem.get_type())->is_base_type()) {
-    indent(out) << elem << " = null;" << endl;
+    indent(out) << elem << " = null;" << '\n';
   }
 }
 
@@ -4376,30 +4394,30 @@
   string elem = tmp("_elem");
   t_field felem(tlist->get_elem_type(), elem);
 
-  indent(out) << declare_field(&felem, reuse_objects_, false) << endl;
+  indent(out) << declare_field(&felem, reuse_objects_, false) << '\n';
 
   // For loop iterates over elements
   string i = tmp("_i");
   indent(out) << "for (int " << i << " = 0; " << i << " < " << obj << ".size"
               << "; "
-              << "++" << i << ")" << endl;
+              << "++" << i << ")" << '\n';
   scope_up(out);
 
   generate_deserialize_field(out, &felem, "", has_metadata);
 
   if (get_true_type(felem.get_type())->is_enum()) {
-    indent(out) << "if (" << elem << " != null)" << endl;
+    indent(out) << "if (" << elem << " != null)" << '\n';
     scope_up(out);
   }
 
-  indent(out) << prefix << ".add(" << elem << ");" << endl;
+  indent(out) << prefix << ".add(" << elem << ");" << '\n';
 
   if (get_true_type(felem.get_type())->is_enum()) {
     scope_down(out);
   }
 
   if (reuse_objects_ && !get_true_type(felem.get_type())->is_base_type()) {
-    indent(out) << elem << " = null;" << endl;
+    indent(out) << elem << " = null;" << '\n';
   }
 }
 
@@ -4425,7 +4443,7 @@
   } else if (type->is_container()) {
     generate_serialize_container(out, type, prefix + make_valid_java_identifier(tfield->get_name()) + postfix, has_metadata);
   } else if (type->is_enum()) {
-    indent(out) << "oprot.writeI32(" << prefix + make_valid_java_identifier(tfield->get_name()) + postfix << ".getValue());" << endl;
+    indent(out) << "oprot.writeI32(" << prefix + make_valid_java_identifier(tfield->get_name()) + postfix << ".getValue());" << '\n';
   } else if (type->is_base_type()) {
     string name = prefix + make_valid_java_identifier(tfield->get_name()) + postfix;
     indent(out) << "oprot.";
@@ -4470,7 +4488,7 @@
     } else if (type->is_enum()) {
       out << "writeI32(struct." << name << ");";
     }
-    out << endl;
+    out << '\n';
   } else {
     printf("DO NOT KNOW HOW TO SERIALIZE FIELD '%s%s%s' TYPE '%s'\n", prefix.c_str(),
            tfield->get_name().c_str(), postfix.c_str(), type_name(type).c_str());
@@ -4485,7 +4503,7 @@
  */
 void t_java_generator::generate_serialize_struct(ostream& out, t_struct* tstruct, string prefix) {
   (void)tstruct;
-  out << indent() << prefix << ".write(oprot);" << endl;
+  out << indent() << prefix << ".write(oprot);" << '\n';
 }
 
 /**
@@ -4505,18 +4523,18 @@
       indent(out) << "oprot.writeMapBegin(new org.apache.thrift.protocol.TMap("
                   << type_to_enum(((t_map*)ttype)->get_key_type()) << ", "
                   << type_to_enum(((t_map*)ttype)->get_val_type()) << ", " << prefix << ".size()));"
-                  << endl;
+                  << '\n';
     } else if (ttype->is_set()) {
       indent(out) << "oprot.writeSetBegin(new org.apache.thrift.protocol.TSet("
                   << type_to_enum(((t_set*)ttype)->get_elem_type()) << ", " << prefix
-                  << ".size()));" << endl;
+                  << ".size()));" << '\n';
     } else if (ttype->is_list()) {
       indent(out) << "oprot.writeListBegin(new org.apache.thrift.protocol.TList("
                   << type_to_enum(((t_list*)ttype)->get_elem_type()) << ", " << prefix
-                  << ".size()));" << endl;
+                  << ".size()));" << '\n';
     }
   } else {
-    indent(out) << "oprot.writeI32(" << prefix << ".size());" << endl;
+    indent(out) << "oprot.writeI32(" << prefix << ".size());" << '\n';
   }
 
   string iter = tmp("_iter");
@@ -4533,7 +4551,7 @@
                 << prefix << ")";
   }
 
-  out << endl;
+  out << '\n';
   scope_up(out);
   if (ttype->is_map()) {
     generate_serialize_map_element(out, (t_map*)ttype, iter, prefix, has_metadata);
@@ -4546,11 +4564,11 @@
 
   if (has_metadata) {
     if (ttype->is_map()) {
-      indent(out) << "oprot.writeMapEnd();" << endl;
+      indent(out) << "oprot.writeMapEnd();" << '\n';
     } else if (ttype->is_set()) {
-      indent(out) << "oprot.writeSetEnd();" << endl;
+      indent(out) << "oprot.writeSetEnd();" << '\n';
     } else if (ttype->is_list()) {
-      indent(out) << "oprot.writeListEnd();" << endl;
+      indent(out) << "oprot.writeListEnd();" << '\n';
     }
   }
 
@@ -5080,7 +5098,7 @@
     // deep copy of base types can be done much more efficiently than iterating over all the
     // elements manually
     indent(out) << type_name(type, true, false) << " " << result_name << " = new "
-                << type_name(container, false, true) << "(" << source_name << ");" << endl;
+                << type_name(container, false, true) << "(" << source_name << ");" << '\n';
     return;
   }
 
@@ -5095,10 +5113,10 @@
   if (is_enum_set(container)) {
     indent(out) << type_name(type, true, false) << " " << result_name << " = "
                 << type_name(container, false, true, true) << ".noneOf(" << constructor_args << ");"
-                << endl;
+                << '\n';
   } else {
     indent(out) << type_name(type, true, false) << " " << result_name << " = new "
-                << type_name(container, false, true) << "(" << constructor_args << ");" << endl;
+                << type_name(container, false, true) << "(" << constructor_args << ");" << '\n';
   }
 
   std::string iterator_element_name = source_name_p1 + "_element";
@@ -5110,17 +5128,17 @@
 
     indent(out) << "for (java.util.Map.Entry<" << type_name(key_type, true, false) << ", "
                 << type_name(val_type, true, false) << "> " << iterator_element_name << " : "
-                << source_name << ".entrySet()) {" << endl;
+                << source_name << ".entrySet()) {" << '\n';
     indent_up();
 
-    out << endl;
+    out << '\n';
 
     indent(out) << type_name(key_type, true, false) << " " << iterator_element_name
-                << "_key = " << iterator_element_name << ".getKey();" << endl;
+                << "_key = " << iterator_element_name << ".getKey();" << '\n';
     indent(out) << type_name(val_type, true, false) << " " << iterator_element_name
-                << "_value = " << iterator_element_name << ".getValue();" << endl;
+                << "_value = " << iterator_element_name << ".getValue();" << '\n';
 
-    out << endl;
+    out << '\n';
 
     if (key_type->is_container()) {
       generate_deep_copy_container(out, iterator_element_name + "_key", "",
@@ -5129,10 +5147,10 @@
       indent(out) << type_name(key_type, true, false) << " " << result_element_name << "_key = ";
       generate_deep_copy_non_container(out, iterator_element_name + "_key",
                                        result_element_name + "_key", key_type);
-      out << ";" << endl;
+      out << ";" << '\n';
     }
 
-    out << endl;
+    out << '\n';
 
     if (val_type->is_container()) {
       generate_deep_copy_container(out, iterator_element_name + "_value", "",
@@ -5141,16 +5159,16 @@
       indent(out) << type_name(val_type, true, false) << " " << result_element_name << "_value = ";
       generate_deep_copy_non_container(out, iterator_element_name + "_value",
                                        result_element_name + "_value", val_type);
-      out << ";" << endl;
+      out << ";" << '\n';
     }
 
-    out << endl;
+    out << '\n';
 
     indent(out) << result_name << ".put(" << result_element_name << "_key, " << result_element_name
-                << "_value);" << endl;
+                << "_value);" << '\n';
 
     indent_down();
-    indent(out) << "}" << endl;
+    indent(out) << "}" << '\n';
 
   } else {
     t_type* elem_type;
@@ -5162,32 +5180,32 @@
     }
 
     indent(out) << "for (" << type_name(elem_type, true, false) << " " << iterator_element_name
-                << " : " << source_name << ") {" << endl;
+                << " : " << source_name << ") {" << '\n';
 
     indent_up();
 
     if (elem_type->is_container()) {
       // recursive deep copy
       generate_deep_copy_container(out, iterator_element_name, "", result_element_name, elem_type);
-      indent(out) << result_name << ".add(" << result_element_name << ");" << endl;
+      indent(out) << result_name << ".add(" << result_element_name << ");" << '\n';
     } else {
       // iterative copy
       if (elem_type->is_binary()) {
         indent(out) << "java.nio.ByteBuffer temp_binary_element = ";
         generate_deep_copy_non_container(out, iterator_element_name, "temp_binary_element",
                                          elem_type);
-        out << ";" << endl;
-        indent(out) << result_name << ".add(temp_binary_element);" << endl;
+        out << ";" << '\n';
+        indent(out) << result_name << ".add(temp_binary_element);" << '\n';
       } else {
         indent(out) << result_name << ".add(";
         generate_deep_copy_non_container(out, iterator_element_name, result_name, elem_type);
-        out << ");" << endl;
+        out << ");" << '\n';
       }
     }
 
     indent_down();
 
-    indent(out) << "}" << endl;
+    indent(out) << "}" << '\n';
   }
 }
 
@@ -5224,14 +5242,14 @@
 void t_java_generator::generate_isset_set(ostream& out, t_field* field, string prefix) {
   if (!type_can_be_null(field->get_type())) {
     indent(out) << prefix << "set" << get_cap_name(field->get_name()) << get_cap_name("isSet")
-                << "(true);" << endl;
+                << "(true);" << '\n';
   }
 }
 
 void t_java_generator::generate_struct_desc(ostream& out, t_struct* tstruct) {
   indent(out) << "private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new "
                  "org.apache.thrift.protocol.TStruct(\""
-              << tstruct->get_name() << "\");" << endl;
+              << tstruct->get_name() << "\");" << '\n';
 }
 
 void t_java_generator::generate_field_descs(ostream& out, t_struct* tstruct) {
@@ -5243,24 +5261,24 @@
                 << constant_name((*m_iter)->get_name())
                 << "_FIELD_DESC = new org.apache.thrift.protocol.TField(\"" << (*m_iter)->get_name()
                 << "\", " << type_to_enum((*m_iter)->get_type()) << ", "
-                << "(short)" << (*m_iter)->get_key() << ");" << endl;
+                << "(short)" << (*m_iter)->get_key() << ");" << '\n';
   }
 }
 
 void t_java_generator::generate_scheme_map(ostream& out, t_struct* tstruct) {
   indent(out) << "private static final org.apache.thrift.scheme.SchemeFactory "
                  "STANDARD_SCHEME_FACTORY = new "
-              << tstruct->get_name() << "StandardSchemeFactory();" << endl;
+              << tstruct->get_name() << "StandardSchemeFactory();" << '\n';
   indent(out)
       << "private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = new "
-      << tstruct->get_name() << "TupleSchemeFactory();" << endl;
+      << tstruct->get_name() << "TupleSchemeFactory();" << '\n';
 }
 
 void t_java_generator::generate_field_name_constants(ostream& out, t_struct* tstruct) {
   indent(out) << "/** The set of fields this struct contains, along with convenience methods for "
                  "finding and manipulating them. */"
-              << endl;
-  indent(out) << "public enum _Fields implements org.apache.thrift.TFieldIdEnum {" << endl;
+              << '\n';
+  indent(out) << "public enum _Fields implements org.apache.thrift.TFieldIdEnum {" << '\n';
 
   indent_up();
   bool first = true;
@@ -5268,7 +5286,7 @@
   vector<t_field*>::const_iterator m_iter;
   for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
     if (!first) {
-      out << "," << endl;
+      out << "," << '\n';
     }
     first = false;
     generate_java_doc(out, *m_iter);
@@ -5276,87 +5294,87 @@
                 << ", \"" << (*m_iter)->get_name() << "\")";
   }
 
-  out << ";" << endl << endl;
+  out << ";" << '\n' << '\n';
 
   indent(out) << "private static final java.util.Map<java.lang.String, _Fields> byName = new "
                  "java.util.HashMap<java.lang.String, _Fields>();"
-              << endl;
-  out << endl;
+              << '\n';
+  out << '\n';
 
-  indent(out) << "static {" << endl;
-  indent(out) << "  for (_Fields field : java.util.EnumSet.allOf(_Fields.class)) {" << endl;
-  indent(out) << "    byName.put(field.getFieldName(), field);" << endl;
-  indent(out) << "  }" << endl;
-  indent(out) << "}" << endl << endl;
+  indent(out) << "static {" << '\n';
+  indent(out) << "  for (_Fields field : java.util.EnumSet.allOf(_Fields.class)) {" << '\n';
+  indent(out) << "    byName.put(field.getFieldName(), field);" << '\n';
+  indent(out) << "  }" << '\n';
+  indent(out) << "}" << '\n' << '\n';
 
-  indent(out) << "/**" << endl;
+  indent(out) << "/**" << '\n';
   indent(out) << " * Find the _Fields constant that matches fieldId, or null if its not found."
-              << endl;
-  indent(out) << " */" << endl;
-  indent(out) << java_nullable_annotation() << endl;
-  indent(out) << "public static _Fields findByThriftId(int fieldId) {" << endl;
+              << '\n';
+  indent(out) << " */" << '\n';
+  indent(out) << java_nullable_annotation() << '\n';
+  indent(out) << "public static _Fields findByThriftId(int fieldId) {" << '\n';
   indent_up();
-  indent(out) << "switch(fieldId) {" << endl;
+  indent(out) << "switch(fieldId) {" << '\n';
   indent_up();
 
   for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
     indent(out) << "case " << (*m_iter)->get_key() << ": // "
-                << constant_name((*m_iter)->get_name()) << endl;
-    indent(out) << "  return " << constant_name((*m_iter)->get_name()) << ";" << endl;
+                << constant_name((*m_iter)->get_name()) << '\n';
+    indent(out) << "  return " << constant_name((*m_iter)->get_name()) << ";" << '\n';
   }
 
-  indent(out) << "default:" << endl;
-  indent(out) << "  return null;" << endl;
+  indent(out) << "default:" << '\n';
+  indent(out) << "  return null;" << '\n';
 
   indent_down();
-  indent(out) << "}" << endl;
+  indent(out) << "}" << '\n';
 
   indent_down();
-  indent(out) << "}" << endl << endl;
+  indent(out) << "}" << '\n' << '\n';
 
-  indent(out) << "/**" << endl;
-  indent(out) << " * Find the _Fields constant that matches fieldId, throwing an exception" << endl;
-  indent(out) << " * if it is not found." << endl;
-  indent(out) << " */" << endl;
-  indent(out) << "public static _Fields findByThriftIdOrThrow(int fieldId) {" << endl;
-  indent(out) << "  _Fields fields = findByThriftId(fieldId);" << endl;
+  indent(out) << "/**" << '\n';
+  indent(out) << " * Find the _Fields constant that matches fieldId, throwing an exception" << '\n';
+  indent(out) << " * if it is not found." << '\n';
+  indent(out) << " */" << '\n';
+  indent(out) << "public static _Fields findByThriftIdOrThrow(int fieldId) {" << '\n';
+  indent(out) << "  _Fields fields = findByThriftId(fieldId);" << '\n';
   indent(out) << "  if (fields == null) throw new java.lang.IllegalArgumentException(\"Field \" + "
                  "fieldId + "
                  "\" doesn't exist!\");"
-              << endl;
-  indent(out) << "  return fields;" << endl;
-  indent(out) << "}" << endl << endl;
+              << '\n';
+  indent(out) << "  return fields;" << '\n';
+  indent(out) << "}" << '\n' << '\n';
 
-  indent(out) << "/**" << endl;
+  indent(out) << "/**" << '\n';
   indent(out) << " * Find the _Fields constant that matches name, or null if its not found."
-              << endl;
-  indent(out) << " */" << endl;
-  indent(out) << java_nullable_annotation() << endl;
-  indent(out) << "public static _Fields findByName(java.lang.String name) {" << endl;
-  indent(out) << "  return byName.get(name);" << endl;
-  indent(out) << "}" << endl << endl;
+              << '\n';
+  indent(out) << " */" << '\n';
+  indent(out) << java_nullable_annotation() << '\n';
+  indent(out) << "public static _Fields findByName(java.lang.String name) {" << '\n';
+  indent(out) << "  return byName.get(name);" << '\n';
+  indent(out) << "}" << '\n' << '\n';
 
-  indent(out) << "private final short _thriftId;" << endl;
-  indent(out) << "private final java.lang.String _fieldName;" << endl << endl;
+  indent(out) << "private final short _thriftId;" << '\n';
+  indent(out) << "private final java.lang.String _fieldName;" << '\n' << '\n';
 
-  indent(out) << "_Fields(short thriftId, java.lang.String fieldName) {" << endl;
-  indent(out) << "  _thriftId = thriftId;" << endl;
-  indent(out) << "  _fieldName = fieldName;" << endl;
-  indent(out) << "}" << endl << endl;
+  indent(out) << "_Fields(short thriftId, java.lang.String fieldName) {" << '\n';
+  indent(out) << "  _thriftId = thriftId;" << '\n';
+  indent(out) << "  _fieldName = fieldName;" << '\n';
+  indent(out) << "}" << '\n' << '\n';
 
-  indent(out) << java_override_annotation() << endl;
-  indent(out) << "public short getThriftFieldId() {" << endl;
-  indent(out) << "  return _thriftId;" << endl;
-  indent(out) << "}" << endl << endl;
+  indent(out) << java_override_annotation() << '\n';
+  indent(out) << "public short getThriftFieldId() {" << '\n';
+  indent(out) << "  return _thriftId;" << '\n';
+  indent(out) << "}" << '\n' << '\n';
 
-  indent(out) << java_override_annotation() << endl;
-  indent(out) << "public java.lang.String getFieldName() {" << endl;
-  indent(out) << "  return _fieldName;" << endl;
-  indent(out) << "}" << endl;
+  indent(out) << java_override_annotation() << '\n';
+  indent(out) << "public java.lang.String getFieldName() {" << '\n';
+  indent(out) << "  return _fieldName;" << '\n';
+  indent(out) << "}" << '\n';
 
   indent_down();
 
-  indent(out) << "}" << endl;
+  indent(out) << "}" << '\n';
 }
 
 t_java_generator::isset_type t_java_generator::needs_isset(t_struct* tstruct,
@@ -5390,8 +5408,8 @@
 }
 
 void t_java_generator::generate_java_struct_clear(std::ostream& out, t_struct* tstruct) {
-  indent(out) << java_override_annotation() << endl;
-  indent(out) << "public void clear() {" << endl;
+  indent(out) << java_override_annotation() << '\n';
+  indent(out) << "public void clear() {" << '\n';
 
   indent_up();
   for (auto field : tstruct->get_members()) {
@@ -5404,13 +5422,13 @@
 
     if (type_can_be_null(t)) {
       if (reuse_objects_ && (t->is_container() || t->is_struct())) {
-        indent(out) << "if (this." << make_valid_java_identifier(field->get_name()) << " != null) {" << endl;
+        indent(out) << "if (this." << make_valid_java_identifier(field->get_name()) << " != null) {" << '\n';
         indent_up();
-        indent(out) << "this." << make_valid_java_identifier(field->get_name()) << ".clear();" << endl;
+        indent(out) << "this." << make_valid_java_identifier(field->get_name()) << ".clear();" << '\n';
         indent_down();
-        indent(out) << "}" << endl;
+        indent(out) << "}" << '\n';
       } else {
-        indent(out) << "this." << make_valid_java_identifier(field->get_name()) << " = null;" << endl;
+        indent(out) << "this." << make_valid_java_identifier(field->get_name()) << " = null;" << '\n';
       }
       continue;
     }
@@ -5418,7 +5436,7 @@
     // must be a base type
     // means it also needs to be explicitly unset
     indent(out) << "set" << get_cap_name(field->get_name()) << get_cap_name("isSet") << "(false);"
-                << endl;
+                << '\n';
     t_base_type* base_type = (t_base_type*)t;
 
     switch (base_type->get_base()) {
@@ -5426,13 +5444,13 @@
     case t_base_type::TYPE_I16:
     case t_base_type::TYPE_I32:
     case t_base_type::TYPE_I64:
-      indent(out) << "this." << make_valid_java_identifier(field->get_name()) << " = 0;" << endl;
+      indent(out) << "this." << make_valid_java_identifier(field->get_name()) << " = 0;" << '\n';
       break;
     case t_base_type::TYPE_DOUBLE:
-      indent(out) << "this." << make_valid_java_identifier(field->get_name()) << " = 0.0;" << endl;
+      indent(out) << "this." << make_valid_java_identifier(field->get_name()) << " = 0.0;" << '\n';
       break;
     case t_base_type::TYPE_BOOL:
-      indent(out) << "this." << make_valid_java_identifier(field->get_name()) << " = false;" << endl;
+      indent(out) << "this." << make_valid_java_identifier(field->get_name()) << " = false;" << '\n';
       break;
     default:
       throw "unsupported type: " + base_type->get_name() + " for field " + field->get_name();
@@ -5440,7 +5458,7 @@
   }
   indent_down();
 
-  indent(out) << "}" << endl << endl;
+  indent(out) << "}" << '\n' << '\n';
 }
 
 // generates java method to serialize (in the Java sense) the object
@@ -5448,24 +5466,24 @@
   (void)tstruct;
   indent(out)
       << "private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException {"
-      << endl;
-  indent(out) << "  try {" << endl;
+      << '\n';
+  indent(out) << "  try {" << '\n';
   indent(out) << "    write(new org.apache.thrift.protocol.TCompactProtocol(new "
                  "org.apache.thrift.transport.TIOStreamTransport(out)));"
-              << endl;
-  indent(out) << "  } catch (org.apache.thrift.TException te) {" << endl;
+              << '\n';
+  indent(out) << "  } catch (org.apache.thrift.TException te) {" << '\n';
   indent(out) << "    throw new java.io.IOException(te" << (android_legacy_ ? ".getMessage()" : "")
-              << ");" << endl;
-  indent(out) << "  }" << endl;
-  indent(out) << "}" << endl << endl;
+              << ");" << '\n';
+  indent(out) << "  }" << '\n';
+  indent(out) << "}" << '\n' << '\n';
 }
 
 // generates java method to serialize (in the Java sense) the object
 void t_java_generator::generate_java_struct_read_object(ostream& out, t_struct* tstruct) {
   indent(out) << "private void readObject(java.io.ObjectInputStream in) throws "
                  "java.io.IOException, java.lang.ClassNotFoundException {"
-              << endl;
-  indent(out) << "  try {" << endl;
+              << '\n';
+  indent(out) << "  try {" << '\n';
   if (!tstruct->is_union()) {
     switch (needs_isset(tstruct)) {
     case ISSET_NONE:
@@ -5473,174 +5491,174 @@
     case ISSET_PRIMITIVE:
       indent(out) << "    // it doesn't seem like you should have to do this, but java "
                      "serialization is wacky, and doesn't call the default constructor."
-                  << endl;
-      indent(out) << "    __isset_bitfield = 0;" << endl;
+                  << '\n';
+      indent(out) << "    __isset_bitfield = 0;" << '\n';
       break;
     case ISSET_BITSET:
       indent(out) << "    // it doesn't seem like you should have to do this, but java "
                      "serialization is wacky, and doesn't call the default constructor."
-                  << endl;
-      indent(out) << "    __isset_bit_vector = new java.util.BitSet(1);" << endl;
+                  << '\n';
+      indent(out) << "    __isset_bit_vector = new java.util.BitSet(1);" << '\n';
       break;
     }
   }
   indent(out) << "    read(new org.apache.thrift.protocol.TCompactProtocol(new "
                  "org.apache.thrift.transport.TIOStreamTransport(in)));"
-              << endl;
-  indent(out) << "  } catch (org.apache.thrift.TException te) {" << endl;
+              << '\n';
+  indent(out) << "  } catch (org.apache.thrift.TException te) {" << '\n';
   indent(out) << "    throw new java.io.IOException(te" << (android_legacy_ ? ".getMessage()" : "")
-              << ");" << endl;
-  indent(out) << "  }" << endl;
-  indent(out) << "}" << endl << endl;
+              << ");" << '\n';
+  indent(out) << "  }" << '\n';
+  indent(out) << "}" << '\n' << '\n';
 }
 
 void t_java_generator::generate_standard_reader(ostream& out, t_struct* tstruct) {
-  indent(out) << java_override_annotation() << endl;
+  indent(out) << java_override_annotation() << '\n';
   indent(out) << "public void read(org.apache.thrift.protocol.TProtocol iprot, "
-              << make_valid_java_identifier(tstruct->get_name()) << " struct) throws org.apache.thrift.TException {" << endl;
+              << make_valid_java_identifier(tstruct->get_name()) << " struct) throws org.apache.thrift.TException {" << '\n';
   indent_up();
 
   const vector<t_field*>& fields = tstruct->get_members();
   vector<t_field*>::const_iterator f_iter;
 
   // Declare stack tmp variables and read struct header
-  out << indent() << "org.apache.thrift.protocol.TField schemeField;" << endl
-      << indent() << "iprot.readStructBegin();" << endl;
+  out << indent() << "org.apache.thrift.protocol.TField schemeField;" << '\n'
+      << indent() << "iprot.readStructBegin();" << '\n';
 
   // Loop over reading in fields
-  indent(out) << "while (true)" << endl;
+  indent(out) << "while (true)" << '\n';
   scope_up(out);
 
   // Read beginning field marker
-  indent(out) << "schemeField = iprot.readFieldBegin();" << endl;
+  indent(out) << "schemeField = iprot.readFieldBegin();" << '\n';
 
   // Check for field STOP marker and break
-  indent(out) << "if (schemeField.type == org.apache.thrift.protocol.TType.STOP) { " << endl;
+  indent(out) << "if (schemeField.type == org.apache.thrift.protocol.TType.STOP) { " << '\n';
   indent_up();
-  indent(out) << "break;" << endl;
+  indent(out) << "break;" << '\n';
   indent_down();
-  indent(out) << "}" << endl;
+  indent(out) << "}" << '\n';
 
   // Switch statement on the field we are reading
-  indent(out) << "switch (schemeField.id) {" << endl;
+  indent(out) << "switch (schemeField.id) {" << '\n';
 
   indent_up();
 
   // Generate deserialization code for known cases
   for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
     indent(out) << "case " << (*f_iter)->get_key() << ": // "
-                << constant_name((*f_iter)->get_name()) << endl;
+                << constant_name((*f_iter)->get_name()) << '\n';
     indent_up();
     indent(out) << "if (schemeField.type == " << type_to_enum((*f_iter)->get_type()) << ") {"
-                << endl;
+                << '\n';
     indent_up();
 
     generate_deserialize_field(out, *f_iter, "struct.", true);
     indent(out) << "struct."
                 << "set" << get_cap_name((*f_iter)->get_name()) << get_cap_name("isSet")
-                << "(true);" << endl;
+                << "(true);" << '\n';
     indent_down();
-    out << indent() << "} else { " << endl
+    out << indent() << "} else { " << '\n'
         << indent() << "  org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);"
-        << endl
-        << indent() << "}" << endl
-        << indent() << "break;" << endl;
+        << '\n'
+        << indent() << "}" << '\n'
+        << indent() << "break;" << '\n';
     indent_down();
   }
 
-  indent(out) << "default:" << endl;
+  indent(out) << "default:" << '\n';
   indent(out) << "  org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);"
-              << endl;
+              << '\n';
 
   indent_down();
-  indent(out) << "}" << endl;
+  indent(out) << "}" << '\n';
 
   // Read field end marker
-  indent(out) << "iprot.readFieldEnd();" << endl;
+  indent(out) << "iprot.readFieldEnd();" << '\n';
 
   indent_down();
-  indent(out) << "}" << endl;
+  indent(out) << "}" << '\n';
 
-  out << indent() << "iprot.readStructEnd();" << endl;
+  out << indent() << "iprot.readStructEnd();" << '\n';
 
   // in non-beans style, check for required fields of primitive type
   // (which can be checked here but not in the general validate method)
   if (!bean_style_) {
-    out << endl
+    out << '\n'
         << indent()
         << "// check for required fields of primitive type, which can't be "
            "checked in the validate method"
-        << endl;
+        << '\n';
     for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
       if ((*f_iter)->get_req() == t_field::T_REQUIRED && !type_can_be_null((*f_iter)->get_type())) {
-        out << indent() << "if (!struct." << generate_isset_check(*f_iter) << ") {" << endl
+        out << indent() << "if (!struct." << generate_isset_check(*f_iter) << ") {" << '\n'
             << indent()
             << "  throw new org.apache.thrift.protocol.TProtocolException(\"Required field '"
             << (*f_iter)->get_name()
-            << "' was not found in serialized data! Struct: \" + toString());" << endl
-            << indent() << "}" << endl;
+            << "' was not found in serialized data! Struct: \" + toString());" << '\n'
+            << indent() << "}" << '\n';
       }
     }
   }
 
   // performs various checks (e.g. check that all required fields are set)
-  indent(out) << "struct.validate();" << endl;
+  indent(out) << "struct.validate();" << '\n';
 
   indent_down();
-  out << indent() << "}" << endl;
+  out << indent() << "}" << '\n';
 }
 
 void t_java_generator::generate_standard_writer(ostream& out, t_struct* tstruct, bool is_result) {
   indent_up();
-  indent(out) << java_override_annotation() << endl;
+  indent(out) << java_override_annotation() << '\n';
   indent(out) << "public void write(org.apache.thrift.protocol.TProtocol oprot, "
-              << make_valid_java_identifier(tstruct->get_name()) << " struct) throws org.apache.thrift.TException {" << endl;
+              << make_valid_java_identifier(tstruct->get_name()) << " struct) throws org.apache.thrift.TException {" << '\n';
   indent_up();
   const vector<t_field*>& fields = tstruct->get_sorted_members();
   vector<t_field*>::const_iterator f_iter;
 
   // performs various checks (e.g. check that all required fields are set)
-  indent(out) << "struct.validate();" << endl << endl;
+  indent(out) << "struct.validate();" << '\n' << '\n';
 
-  indent(out) << "oprot.writeStructBegin(STRUCT_DESC);" << endl;
+  indent(out) << "oprot.writeStructBegin(STRUCT_DESC);" << '\n';
 
   for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
     bool null_allowed = type_can_be_null((*f_iter)->get_type());
     if (null_allowed) {
-      out << indent() << "if (struct." << make_valid_java_identifier((*f_iter)->get_name()) << " != null) {" << endl;
+      out << indent() << "if (struct." << make_valid_java_identifier((*f_iter)->get_name()) << " != null) {" << '\n';
       indent_up();
     }
     bool optional = ((*f_iter)->get_req() == t_field::T_OPTIONAL) || (is_result && !null_allowed);
     if (optional) {
       indent(out) << "if ("
-                  << "struct." << generate_isset_check((*f_iter)) << ") {" << endl;
+                  << "struct." << generate_isset_check((*f_iter)) << ") {" << '\n';
       indent_up();
     }
 
     indent(out) << "oprot.writeFieldBegin(" << constant_name((*f_iter)->get_name())
-                << "_FIELD_DESC);" << endl;
+                << "_FIELD_DESC);" << '\n';
 
     // Write field contents
     generate_serialize_field(out, *f_iter, "struct.", "", true);
 
     // Write field closer
-    indent(out) << "oprot.writeFieldEnd();" << endl;
+    indent(out) << "oprot.writeFieldEnd();" << '\n';
 
     if (optional) {
       indent_down();
-      indent(out) << "}" << endl;
+      indent(out) << "}" << '\n';
     }
     if (null_allowed) {
       indent_down();
-      indent(out) << "}" << endl;
+      indent(out) << "}" << '\n';
     }
   }
   // Write the struct map
-  out << indent() << "oprot.writeFieldStop();" << endl
-      << indent() << "oprot.writeStructEnd();" << endl;
+  out << indent() << "oprot.writeFieldStop();" << '\n'
+      << indent() << "oprot.writeStructEnd();" << '\n';
 
   indent_down();
-  out << indent() << "}" << endl << endl;
+  out << indent() << "}" << '\n' << '\n';
   indent_down();
 }
 
@@ -5649,38 +5667,38 @@
                                                             bool is_result) {
   indent(out) << "private static class " << tstruct->get_name()
               << "StandardSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {"
-              << endl;
+              << '\n';
   indent_up();
-  indent(out) << java_override_annotation() << endl;
-  indent(out) << "public " << tstruct->get_name() << "StandardScheme getScheme() {" << endl;
+  indent(out) << java_override_annotation() << '\n';
+  indent(out) << "public " << tstruct->get_name() << "StandardScheme getScheme() {" << '\n';
   indent_up();
-  indent(out) << "return new " << tstruct->get_name() << "StandardScheme();" << endl;
+  indent(out) << "return new " << tstruct->get_name() << "StandardScheme();" << '\n';
   indent_down();
-  indent(out) << "}" << endl;
+  indent(out) << "}" << '\n';
   indent_down();
-  indent(out) << "}" << endl << endl;
+  indent(out) << "}" << '\n' << '\n';
 
   out << indent() << "private static class " << tstruct->get_name()
       << "StandardScheme extends org.apache.thrift.scheme.StandardScheme<" << make_valid_java_identifier(tstruct->get_name())
-      << "> {" << endl
-      << endl;
+      << "> {" << '\n'
+      << '\n';
   indent_up();
   generate_standard_reader(out, tstruct);
   indent_down();
-  out << endl;
+  out << '\n';
   generate_standard_writer(out, tstruct, is_result);
 
-  out << indent() << "}" << endl << endl;
+  out << indent() << "}" << '\n' << '\n';
 }
 
 void t_java_generator::generate_java_struct_tuple_reader(ostream& out, t_struct* tstruct) {
-  indent(out) << java_override_annotation() << endl;
+  indent(out) << java_override_annotation() << '\n';
   indent(out) << "public void read(org.apache.thrift.protocol.TProtocol prot, "
-              << make_valid_java_identifier(tstruct->get_name()) << " struct) throws org.apache.thrift.TException {" << endl;
+              << make_valid_java_identifier(tstruct->get_name()) << " struct) throws org.apache.thrift.TException {" << '\n';
   indent_up();
   indent(out) << "org.apache.thrift.protocol.TTupleProtocol iprot = "
                  "(org.apache.thrift.protocol.TTupleProtocol) prot;"
-              << endl;
+              << '\n';
   int optional_count = 0;
   const vector<t_field*>& fields = tstruct->get_members();
   vector<t_field*>::const_iterator f_iter;
@@ -5692,39 +5710,39 @@
     if ((*f_iter)->get_req() == t_field::T_REQUIRED) {
       generate_deserialize_field(out, (*f_iter), "struct.", false);
       indent(out) << "struct.set" << get_cap_name((*f_iter)->get_name()) << get_cap_name("isSet")
-                  << "(true);" << endl;
+                  << "(true);" << '\n';
     }
   }
   if (optional_count > 0) {
     indent(out) << "java.util.BitSet incoming = iprot.readBitSet(" << optional_count << ");"
-                << endl;
+                << '\n';
     int i = 0;
     for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
       if ((*f_iter)->get_req() == t_field::T_OPTIONAL
           || (*f_iter)->get_req() == t_field::T_OPT_IN_REQ_OUT) {
-        indent(out) << "if (incoming.get(" << i << ")) {" << endl;
+        indent(out) << "if (incoming.get(" << i << ")) {" << '\n';
         indent_up();
         generate_deserialize_field(out, (*f_iter), "struct.", false);
         indent(out) << "struct.set" << get_cap_name((*f_iter)->get_name()) << get_cap_name("isSet")
-                    << "(true);" << endl;
+                    << "(true);" << '\n';
         indent_down();
-        indent(out) << "}" << endl;
+        indent(out) << "}" << '\n';
         i++;
       }
     }
   }
   indent_down();
-  indent(out) << "}" << endl;
+  indent(out) << "}" << '\n';
 }
 
 void t_java_generator::generate_java_struct_tuple_writer(ostream& out, t_struct* tstruct) {
-  indent(out) << java_override_annotation() << endl;
+  indent(out) << java_override_annotation() << '\n';
   indent(out) << "public void write(org.apache.thrift.protocol.TProtocol prot, "
-              << make_valid_java_identifier(tstruct->get_name()) << " struct) throws org.apache.thrift.TException {" << endl;
+              << make_valid_java_identifier(tstruct->get_name()) << " struct) throws org.apache.thrift.TException {" << '\n';
   indent_up();
   indent(out) << "org.apache.thrift.protocol.TTupleProtocol oprot = "
                  "(org.apache.thrift.protocol.TTupleProtocol) prot;"
-              << endl;
+              << '\n';
 
   const vector<t_field*>& fields = tstruct->get_members();
   vector<t_field*>::const_iterator f_iter;
@@ -5741,70 +5759,70 @@
     }
   }
   if (has_optional) {
-    indent(out) << "java.util.BitSet optionals = new java.util.BitSet();" << endl;
+    indent(out) << "java.util.BitSet optionals = new java.util.BitSet();" << '\n';
     int i = 0;
     for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
       if ((*f_iter)->get_req() == t_field::T_OPTIONAL
           || (*f_iter)->get_req() == t_field::T_OPT_IN_REQ_OUT) {
-        indent(out) << "if (struct." << generate_isset_check((*f_iter)) << ") {" << endl;
+        indent(out) << "if (struct." << generate_isset_check((*f_iter)) << ") {" << '\n';
         indent_up();
-        indent(out) << "optionals.set(" << i << ");" << endl;
+        indent(out) << "optionals.set(" << i << ");" << '\n';
         indent_down();
-        indent(out) << "}" << endl;
+        indent(out) << "}" << '\n';
         i++;
       }
     }
 
-    indent(out) << "oprot.writeBitSet(optionals, " << optional_count << ");" << endl;
+    indent(out) << "oprot.writeBitSet(optionals, " << optional_count << ");" << '\n';
     for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
       if ((*f_iter)->get_req() == t_field::T_OPTIONAL
           || (*f_iter)->get_req() == t_field::T_OPT_IN_REQ_OUT) {
-        indent(out) << "if (struct." << generate_isset_check(*f_iter) << ") {" << endl;
+        indent(out) << "if (struct." << generate_isset_check(*f_iter) << ") {" << '\n';
         indent_up();
         generate_serialize_field(out, (*f_iter), "struct.", "", false);
         indent_down();
-        indent(out) << "}" << endl;
+        indent(out) << "}" << '\n';
       }
     }
   }
   indent_down();
-  indent(out) << "}" << endl;
+  indent(out) << "}" << '\n';
 }
 
 void t_java_generator::generate_java_struct_tuple_scheme(ostream& out, t_struct* tstruct) {
   indent(out) << "private static class " << tstruct->get_name()
-              << "TupleSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {" << endl;
+              << "TupleSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {" << '\n';
   indent_up();
-  indent(out) << java_override_annotation() << endl;
-  indent(out) << "public " << tstruct->get_name() << "TupleScheme getScheme() {" << endl;
+  indent(out) << java_override_annotation() << '\n';
+  indent(out) << "public " << tstruct->get_name() << "TupleScheme getScheme() {" << '\n';
   indent_up();
-  indent(out) << "return new " << tstruct->get_name() << "TupleScheme();" << endl;
+  indent(out) << "return new " << tstruct->get_name() << "TupleScheme();" << '\n';
   indent_down();
-  indent(out) << "}" << endl;
+  indent(out) << "}" << '\n';
   indent_down();
-  indent(out) << "}" << endl << endl;
+  indent(out) << "}" << '\n' << '\n';
   out << indent() << "private static class " << tstruct->get_name()
       << "TupleScheme extends org.apache.thrift.scheme.TupleScheme<" << make_valid_java_identifier(tstruct->get_name()) << "> {"
-      << endl
-      << endl;
+      << '\n'
+      << '\n';
   indent_up();
   generate_java_struct_tuple_writer(out, tstruct);
-  out << endl;
+  out << '\n';
   generate_java_struct_tuple_reader(out, tstruct);
   indent_down();
-  out << indent() << "}" << endl << endl;
+  out << indent() << "}" << '\n' << '\n';
 }
 
 void t_java_generator::generate_java_scheme_lookup(ostream& out) {
   indent(out) << "private static <S extends org.apache.thrift.scheme.IScheme> S scheme("
-              << "org.apache.thrift.protocol.TProtocol proto) {" << endl;
+              << "org.apache.thrift.protocol.TProtocol proto) {" << '\n';
   indent_up();
   indent(out) << "return (org.apache.thrift.scheme.StandardScheme.class.equals(proto.getScheme()) "
               << "? STANDARD_SCHEME_FACTORY "
               << ": TUPLE_SCHEME_FACTORY"
-              << ").getScheme();" << endl;
+              << ").getScheme();" << '\n';
   indent_down();
-  indent(out) << "}" << endl;
+  indent(out) << "}" << '\n';
 }
 
 void t_java_generator::generate_javax_generated_annotation(ostream& out) {
@@ -5817,11 +5835,11 @@
   }
 
   if (undated_generated_annotations_) {
-    out << ")" << endl;
+    out << ")" << '\n';
   } else {
     indent(out) << ", date = \"" << (now->tm_year + 1900) << "-" << setfill('0') << setw(2)
                 << (now->tm_mon + 1) << "-" << setfill('0') << setw(2) << now->tm_mday << "\")"
-                << endl;
+                << '\n';
   }
 }
 
diff --git a/compiler/cpp/src/thrift/generate/t_javame_generator.cc b/compiler/cpp/src/thrift/generate/t_javame_generator.cc
index d8d9056..e2c3a39 100644
--- a/compiler/cpp/src/thrift/generate/t_javame_generator.cc
+++ b/compiler/cpp/src/thrift/generate/t_javame_generator.cc
@@ -37,8 +37,6 @@
 using std::stringstream;
 using std::vector;
 
-static const string endl = "\n"; // avoid ostream << std::endl flushes
-
 /**
  * Java code generator.
  *
@@ -339,7 +337,7 @@
   generate_java_doc(f_enum, tenum);
   indent(f_enum) << "public class " << tenum->get_name() << " implements org.apache.thrift.TEnum ";
   scope_up(f_enum);
-  f_enum << endl;
+  f_enum << '\n';
 
   vector<t_enum_value*> constants = tenum->get_constants();
   vector<t_enum_value*>::iterator c_iter;
@@ -347,53 +345,53 @@
     int value = (*c_iter)->get_value();
     generate_java_doc(f_enum, *c_iter);
     indent(f_enum) << "public static final " << tenum->get_name() << " " << (*c_iter)->get_name()
-                   << " = new " << tenum->get_name() << "(" << value << ");" << endl;
+                   << " = new " << tenum->get_name() << "(" << value << ");" << '\n';
   }
-  f_enum << endl;
+  f_enum << '\n';
 
   // Field for thriftCode
-  indent(f_enum) << "private final int value;" << endl << endl;
+  indent(f_enum) << "private final int value;" << '\n' << '\n';
 
-  indent(f_enum) << "private " << tenum->get_name() << "(int value) {" << endl;
-  indent(f_enum) << "  this.value = value;" << endl;
-  indent(f_enum) << "}" << endl << endl;
+  indent(f_enum) << "private " << tenum->get_name() << "(int value) {" << '\n';
+  indent(f_enum) << "  this.value = value;" << '\n';
+  indent(f_enum) << "}" << '\n' << '\n';
 
-  indent(f_enum) << "/**" << endl;
+  indent(f_enum) << "/**" << '\n';
   indent(f_enum) << " * Get the integer value of this enum value, as defined in the Thrift IDL."
-                 << endl;
-  indent(f_enum) << " */" << endl;
-  indent(f_enum) << "public int getValue() {" << endl;
-  indent(f_enum) << "  return value;" << endl;
-  indent(f_enum) << "}" << endl << endl;
+                 << '\n';
+  indent(f_enum) << " */" << '\n';
+  indent(f_enum) << "public int getValue() {" << '\n';
+  indent(f_enum) << "  return value;" << '\n';
+  indent(f_enum) << "}" << '\n' << '\n';
 
-  indent(f_enum) << "/**" << endl;
+  indent(f_enum) << "/**" << '\n';
   indent(f_enum) << " * Find a the enum type by its integer value, as defined in the Thrift IDL."
-                 << endl;
-  indent(f_enum) << " * @return null if the value is not found." << endl;
-  indent(f_enum) << " */" << endl;
-  indent(f_enum) << "public static " + tenum->get_name() + " findByValue(int value) { " << endl;
+                 << '\n';
+  indent(f_enum) << " * @return null if the value is not found." << '\n';
+  indent(f_enum) << " */" << '\n';
+  indent(f_enum) << "public static " + tenum->get_name() + " findByValue(int value) { " << '\n';
 
   indent_up();
 
-  indent(f_enum) << "switch (value) {" << endl;
+  indent(f_enum) << "switch (value) {" << '\n';
   indent_up();
 
   for (c_iter = constants.begin(); c_iter != constants.end(); ++c_iter) {
     int value = (*c_iter)->get_value();
-    indent(f_enum) << "case " << value << ":" << endl;
-    indent(f_enum) << "  return " << (*c_iter)->get_name() << ";" << endl;
+    indent(f_enum) << "case " << value << ":" << '\n';
+    indent(f_enum) << "  return " << (*c_iter)->get_name() << ";" << '\n';
   }
 
-  indent(f_enum) << "default:" << endl;
-  indent(f_enum) << "  return null;" << endl;
+  indent(f_enum) << "default:" << '\n';
+  indent(f_enum) << "  return null;" << '\n';
 
   indent_down();
 
-  indent(f_enum) << "}" << endl;
+  indent(f_enum) << "}" << '\n';
 
   indent_down();
 
-  indent(f_enum) << "}" << endl;
+  indent(f_enum) << "}" << '\n';
 
   scope_down(f_enum);
 
@@ -415,7 +413,7 @@
   // Print header
   f_consts << autogen_comment() << java_package() << java_type_imports();
 
-  f_consts << "public class " << program_name_ << "Constants {" << endl << endl;
+  f_consts << "public class " << program_name_ << "Constants {" << '\n' << '\n';
   indent_up();
   vector<t_const*>::iterator c_iter;
   for (c_iter = consts.begin(); c_iter != consts.end(); ++c_iter) {
@@ -426,7 +424,7 @@
                       false);
   }
   indent_down();
-  indent(f_consts) << "}" << endl;
+  indent(f_consts) << "}" << '\n';
   f_consts.close();
 }
 
@@ -449,17 +447,17 @@
   }
   if (type->is_base_type()) {
     string v2 = render_const_value(out, name, type, value);
-    out << name << " = " << v2 << ";" << endl << endl;
+    out << name << " = " << v2 << ";" << '\n' << '\n';
   } else if (type->is_enum()) {
-    out << name << " = " << render_const_value(out, name, type, value) << ";" << endl << endl;
+    out << name << " = " << render_const_value(out, name, type, value) << ";" << '\n' << '\n';
   } else 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;
-    out << name << " = new " << type_name(type, false, true) << "();" << endl;
+    out << name << " = new " << type_name(type, false, true) << "();" << '\n';
     if (!in_static) {
-      indent(out) << "static {" << endl;
+      indent(out) << "static {" << '\n';
       indent_up();
     }
     for (v_iter = val.begin(); v_iter != val.end(); ++v_iter) {
@@ -475,17 +473,17 @@
       string val = render_const_value(out, name, field_type, v_iter->second);
       indent(out) << name << ".";
       std::string cap_name = get_cap_name(v_iter->first->get_string());
-      out << "set" << cap_name << "(" << val << ");" << endl;
+      out << "set" << cap_name << "(" << val << ");" << '\n';
     }
     if (!in_static) {
       indent_down();
-      indent(out) << "}" << endl;
+      indent(out) << "}" << '\n';
     }
-    out << endl;
+    out << '\n';
   } else if (type->is_map()) {
-    out << name << " = new " << type_name(type, false, true) << "();" << endl;
+    out << name << " = new " << type_name(type, false, true) << "();" << '\n';
     if (!in_static) {
-      indent(out) << "static {" << endl;
+      indent(out) << "static {" << '\n';
       indent_up();
     }
     t_type* ktype = ((t_map*)type)->get_key_type();
@@ -496,17 +494,17 @@
       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 << ".put(" << box_type(ktype, key) << ", " << box_type(vtype, val) << ");"
-                  << endl;
+                  << '\n';
     }
     if (!in_static) {
       indent_down();
-      indent(out) << "}" << endl;
+      indent(out) << "}" << '\n';
     }
-    out << endl;
+    out << '\n';
   } else if (type->is_list() || type->is_set()) {
-    out << name << " = new " << type_name(type, false, true) << "();" << endl;
+    out << name << " = new " << type_name(type, false, true) << "();" << '\n';
     if (!in_static) {
-      indent(out) << "static {" << endl;
+      indent(out) << "static {" << '\n';
       indent_up();
     }
     t_type* etype;
@@ -520,17 +518,17 @@
     for (v_iter = val.begin(); v_iter != val.end(); ++v_iter) {
       string val = render_const_value(out, name, etype, *v_iter);
       if (type->is_list()) {
-        indent(out) << name << ".addElement(" << box_type(etype, val) << ");" << endl;
+        indent(out) << name << ".addElement(" << box_type(etype, val) << ");" << '\n';
       } else {
         indent(out) << name << ".put(" << box_type(etype, val) << ", " << box_type(etype, val)
-                    << ");" << endl;
+                    << ");" << '\n';
       }
     }
     if (!in_static) {
       indent_down();
-      indent(out) << "}" << endl;
+      indent(out) << "}" << '\n';
     }
-    out << endl;
+    out << '\n';
   } else {
     throw "compiler error: no const of type " + type->get_name();
   }
@@ -673,27 +671,27 @@
   generate_struct_desc(f_struct, tstruct);
   generate_field_descs(f_struct, tstruct);
 
-  f_struct << endl;
+  f_struct << '\n';
 
   generate_union_constructor(f_struct, tstruct);
 
-  f_struct << endl;
+  f_struct << '\n';
 
   generate_union_abstract_methods(f_struct, tstruct);
 
-  f_struct << endl;
+  f_struct << '\n';
 
   generate_union_getters_and_setters(f_struct, tstruct);
 
-  f_struct << endl;
+  f_struct << '\n';
 
   generate_union_comparisons(f_struct, tstruct);
 
-  f_struct << endl;
+  f_struct << '\n';
 
   generate_union_hashcode(f_struct, tstruct);
 
-  f_struct << endl;
+  f_struct << '\n';
 
   scope_down(f_struct);
 
@@ -701,33 +699,33 @@
 }
 
 void t_javame_generator::generate_union_constructor(ostream& out, t_struct* tstruct) {
-  indent(out) << "public " << type_name(tstruct) << "() {" << endl;
-  indent(out) << "  super();" << endl;
-  indent(out) << "}" << endl << endl;
+  indent(out) << "public " << type_name(tstruct) << "() {" << '\n';
+  indent(out) << "  super();" << '\n';
+  indent(out) << "}" << '\n' << '\n';
 
-  indent(out) << "public " << type_name(tstruct) << "(_Fields setField, Object value) {" << endl;
-  indent(out) << "  super(setField, value);" << endl;
-  indent(out) << "}" << endl << endl;
+  indent(out) << "public " << type_name(tstruct) << "(_Fields setField, Object value) {" << '\n';
+  indent(out) << "  super(setField, value);" << '\n';
+  indent(out) << "}" << '\n' << '\n';
 
   indent(out) << "public " << type_name(tstruct) << "(" << type_name(tstruct) << " other) {"
-              << endl;
-  indent(out) << "  super(other);" << endl;
-  indent(out) << "}" << endl;
+              << '\n';
+  indent(out) << "  super(other);" << '\n';
+  indent(out) << "}" << '\n';
 
-  indent(out) << "public " << tstruct->get_name() << " deepCopy() {" << endl;
-  indent(out) << "  return new " << tstruct->get_name() << "(this);" << endl;
-  indent(out) << "}" << endl << endl;
+  indent(out) << "public " << tstruct->get_name() << " deepCopy() {" << '\n';
+  indent(out) << "  return new " << tstruct->get_name() << "(this);" << '\n';
+  indent(out) << "}" << '\n' << '\n';
 
   // generate "constructors" for each field
   const vector<t_field*>& members = tstruct->get_members();
   vector<t_field*>::const_iterator m_iter;
   for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
     indent(out) << "public static " << type_name(tstruct) << " " << (*m_iter)->get_name() << "("
-                << type_name((*m_iter)->get_type()) << " value) {" << endl;
-    indent(out) << "  " << type_name(tstruct) << " x = new " << type_name(tstruct) << "();" << endl;
-    indent(out) << "  x.set" << get_cap_name((*m_iter)->get_name()) << "(value);" << endl;
-    indent(out) << "  return x;" << endl;
-    indent(out) << "}" << endl << endl;
+                << type_name((*m_iter)->get_type()) << " value) {" << '\n';
+    indent(out) << "  " << type_name(tstruct) << " x = new " << type_name(tstruct) << "();" << '\n';
+    indent(out) << "  x.set" << get_cap_name((*m_iter)->get_name()) << "(value);" << '\n';
+    indent(out) << "  return x;" << '\n';
+    indent(out) << "}" << '\n' << '\n';
   }
 }
 
@@ -740,59 +738,59 @@
     if (first) {
       first = false;
     } else {
-      out << endl;
+      out << '\n';
     }
 
     t_field* field = (*m_iter);
 
     generate_java_doc(out, field);
     indent(out) << "public " << type_name(field->get_type()) << " get"
-                << get_cap_name(field->get_name()) << "() {" << endl;
+                << get_cap_name(field->get_name()) << "() {" << '\n';
     indent(out) << "  if (getSetField() == _Fields." << constant_name(field->get_name()) << ") {"
-                << endl;
+                << '\n';
     indent(out) << "    return (" << type_name(field->get_type(), true) << ")getFieldValue();"
-                << endl;
-    indent(out) << "  } else {" << endl;
+                << '\n';
+    indent(out) << "  } else {" << '\n';
     indent(out) << "    throw new RuntimeException(\"Cannot get field '" << field->get_name()
                 << "' because union is currently set to \" + getFieldDesc(getSetField()).name);"
-                << endl;
-    indent(out) << "  }" << endl;
-    indent(out) << "}" << endl;
+                << '\n';
+    indent(out) << "  }" << '\n';
+    indent(out) << "}" << '\n';
 
-    out << endl;
+    out << '\n';
 
     generate_java_doc(out, field);
     indent(out) << "public void set" << get_cap_name(field->get_name()) << "("
-                << type_name(field->get_type()) << " value) {" << endl;
+                << type_name(field->get_type()) << " value) {" << '\n';
     if (type_can_be_null(field->get_type())) {
-      indent(out) << "  if (value == null) throw new NullPointerException();" << endl;
+      indent(out) << "  if (value == null) throw new NullPointerException();" << '\n';
     }
-    indent(out) << "  setField_ = _Fields." << constant_name(field->get_name()) << ";" << endl;
-    indent(out) << "  value_ = value;" << endl;
-    indent(out) << "}" << endl;
+    indent(out) << "  setField_ = _Fields." << constant_name(field->get_name()) << ";" << '\n';
+    indent(out) << "  value_ = value;" << '\n';
+    indent(out) << "}" << '\n';
   }
 }
 
 void t_javame_generator::generate_union_abstract_methods(ostream& out, t_struct* tstruct) {
   generate_check_type(out, tstruct);
-  out << endl;
+  out << '\n';
   generate_read_value(out, tstruct);
-  out << endl;
+  out << '\n';
   generate_write_value(out, tstruct);
-  out << endl;
+  out << '\n';
   generate_get_field_desc(out, tstruct);
-  out << endl;
+  out << '\n';
   generate_get_struct_desc(out, tstruct);
-  out << endl;
+  out << '\n';
 }
 
 void t_javame_generator::generate_check_type(ostream& out, t_struct* tstruct) {
   indent(out)
       << "protected void checkType(_Fields setField, Object value) throws ClassCastException {"
-      << endl;
+      << '\n';
   indent_up();
 
-  indent(out) << "switch (setField) {" << endl;
+  indent(out) << "switch (setField) {" << '\n';
   indent_up();
 
   const vector<t_field*>& members = tstruct->get_members();
@@ -801,37 +799,37 @@
   for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
     t_field* field = (*m_iter);
 
-    indent(out) << "case " << constant_name(field->get_name()) << ":" << endl;
+    indent(out) << "case " << constant_name(field->get_name()) << ":" << '\n';
     indent(out) << "  if (value instanceof " << type_name(field->get_type(), true, false, true)
-                << ") {" << endl;
-    indent(out) << "    break;" << endl;
-    indent(out) << "  }" << endl;
+                << ") {" << '\n';
+    indent(out) << "    break;" << '\n';
+    indent(out) << "  }" << '\n';
     indent(out) << "  throw new ClassCastException(\"Was expecting value of type "
                 << type_name(field->get_type(), true, false) << " for field '" << field->get_name()
-                << "', but got \" + value.getClass().getSimpleName());" << endl;
+                << "', but got \" + value.getClass().getSimpleName());" << '\n';
     // do the real check here
   }
 
-  indent(out) << "default:" << endl;
-  indent(out) << "  throw new IllegalArgumentException(\"Unknown field id \" + setField);" << endl;
+  indent(out) << "default:" << '\n';
+  indent(out) << "  throw new IllegalArgumentException(\"Unknown field id \" + setField);" << '\n';
 
   indent_down();
-  indent(out) << "}" << endl;
+  indent(out) << "}" << '\n';
 
   indent_down();
-  indent(out) << "}" << endl;
+  indent(out) << "}" << '\n';
 }
 
 void t_javame_generator::generate_read_value(ostream& out, t_struct* tstruct) {
   indent(out) << "protected Object readValue(TProtocol iprot, TField field) throws TException {"
-              << endl;
+              << '\n';
 
   indent_up();
 
-  indent(out) << "_Fields setField = _Fields.findByThriftId(field.id);" << endl;
-  indent(out) << "if (setField != null) {" << endl;
+  indent(out) << "_Fields setField = _Fields.findByThriftId(field.id);" << '\n';
+  indent(out) << "if (setField != null) {" << '\n';
   indent_up();
-  indent(out) << "switch (setField) {" << endl;
+  indent(out) << "switch (setField) {" << '\n';
   indent_up();
 
   const vector<t_field*>& members = tstruct->get_members();
@@ -840,48 +838,48 @@
   for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
     t_field* field = (*m_iter);
 
-    indent(out) << "case " << constant_name(field->get_name()) << ":" << endl;
+    indent(out) << "case " << constant_name(field->get_name()) << ":" << '\n';
     indent_up();
     indent(out) << "if (field.type == " << constant_name(field->get_name()) << "_FIELD_DESC.type) {"
-                << endl;
+                << '\n';
     indent_up();
     indent(out) << type_name(field->get_type(), true, false) << " " << field->get_name() << ";"
-                << endl;
+                << '\n';
     generate_deserialize_field(out, field, "");
-    indent(out) << "return " << field->get_name() << ";" << endl;
+    indent(out) << "return " << field->get_name() << ";" << '\n';
     indent_down();
-    indent(out) << "} else {" << endl;
-    indent(out) << "  TProtocolUtil.skip(iprot, field.type);" << endl;
-    indent(out) << "  return null;" << endl;
-    indent(out) << "}" << endl;
+    indent(out) << "} else {" << '\n';
+    indent(out) << "  TProtocolUtil.skip(iprot, field.type);" << '\n';
+    indent(out) << "  return null;" << '\n';
+    indent(out) << "}" << '\n';
     indent_down();
   }
 
-  indent(out) << "default:" << endl;
+  indent(out) << "default:" << '\n';
   indent(out) << "  throw new IllegalStateException(\"setField wasn't null, but didn't match any "
-                 "of the case statements!\");" << endl;
+                 "of the case statements!\");" << '\n';
 
   indent_down();
-  indent(out) << "}" << endl;
+  indent(out) << "}" << '\n';
 
   indent_down();
-  indent(out) << "} else {" << endl;
+  indent(out) << "} else {" << '\n';
   indent_up();
-  indent(out) << "TProtocolUtil.skip(iprot, field.type);" << endl;
-  indent(out) << "return null;" << endl;
+  indent(out) << "TProtocolUtil.skip(iprot, field.type);" << '\n';
+  indent(out) << "return null;" << '\n';
   indent_down();
-  indent(out) << "}" << endl;
+  indent(out) << "}" << '\n';
 
   indent_down();
-  indent(out) << "}" << endl;
+  indent(out) << "}" << '\n';
 }
 
 void t_javame_generator::generate_write_value(ostream& out, t_struct* tstruct) {
-  indent(out) << "protected void writeValue(TProtocol oprot) throws TException {" << endl;
+  indent(out) << "protected void writeValue(TProtocol oprot) throws TException {" << '\n';
 
   indent_up();
 
-  indent(out) << "switch (setField_) {" << endl;
+  indent(out) << "switch (setField_) {" << '\n';
   indent_up();
 
   const vector<t_field*>& members = tstruct->get_members();
@@ -890,100 +888,100 @@
   for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
     t_field* field = (*m_iter);
 
-    indent(out) << "case " << constant_name(field->get_name()) << ":" << endl;
+    indent(out) << "case " << constant_name(field->get_name()) << ":" << '\n';
     indent_up();
     indent(out) << type_name(field->get_type(), true, false) << " " << field->get_name() << " = ("
-                << type_name(field->get_type(), true, false) << ")value_;" << endl;
+                << type_name(field->get_type(), true, false) << ")value_;" << '\n';
     generate_serialize_field(out, field, "");
-    indent(out) << "return;" << endl;
+    indent(out) << "return;" << '\n';
     indent_down();
   }
 
-  indent(out) << "default:" << endl;
+  indent(out) << "default:" << '\n';
   indent(out) << "  throw new IllegalStateException(\"Cannot write union with unknown field \" + "
-                 "setField_);" << endl;
+                 "setField_);" << '\n';
 
   indent_down();
-  indent(out) << "}" << endl;
+  indent(out) << "}" << '\n';
 
   indent_down();
 
-  indent(out) << "}" << endl;
+  indent(out) << "}" << '\n';
 }
 
 void t_javame_generator::generate_get_field_desc(ostream& out, t_struct* tstruct) {
-  indent(out) << "protected TField getFieldDesc(_Fields setField) {" << endl;
+  indent(out) << "protected TField getFieldDesc(_Fields setField) {" << '\n';
   indent_up();
 
   const vector<t_field*>& members = tstruct->get_members();
   vector<t_field*>::const_iterator m_iter;
 
-  indent(out) << "switch (setField) {" << endl;
+  indent(out) << "switch (setField) {" << '\n';
   indent_up();
 
   for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
     t_field* field = (*m_iter);
-    indent(out) << "case " << constant_name(field->get_name()) << ":" << endl;
-    indent(out) << "  return " << constant_name(field->get_name()) << "_FIELD_DESC;" << endl;
+    indent(out) << "case " << constant_name(field->get_name()) << ":" << '\n';
+    indent(out) << "  return " << constant_name(field->get_name()) << "_FIELD_DESC;" << '\n';
   }
 
-  indent(out) << "default:" << endl;
-  indent(out) << "  throw new IllegalArgumentException(\"Unknown field id \" + setField);" << endl;
+  indent(out) << "default:" << '\n';
+  indent(out) << "  throw new IllegalArgumentException(\"Unknown field id \" + setField);" << '\n';
 
   indent_down();
-  indent(out) << "}" << endl;
+  indent(out) << "}" << '\n';
 
   indent_down();
-  indent(out) << "}" << endl;
+  indent(out) << "}" << '\n';
 }
 
 void t_javame_generator::generate_get_struct_desc(ostream& out, t_struct* tstruct) {
   (void)tstruct;
-  indent(out) << "protected TStruct getStructDesc() {" << endl;
-  indent(out) << "  return STRUCT_DESC;" << endl;
-  indent(out) << "}" << endl;
+  indent(out) << "protected TStruct getStructDesc() {" << '\n';
+  indent(out) << "  return STRUCT_DESC;" << '\n';
+  indent(out) << "}" << '\n';
 }
 
 void t_javame_generator::generate_union_comparisons(ostream& out, t_struct* tstruct) {
   // equality
-  indent(out) << "public boolean equals(Object other) {" << endl;
-  indent(out) << "  if (other instanceof " << tstruct->get_name() << ") {" << endl;
-  indent(out) << "    return equals((" << tstruct->get_name() << ")other);" << endl;
-  indent(out) << "  } else {" << endl;
-  indent(out) << "    return false;" << endl;
-  indent(out) << "  }" << endl;
-  indent(out) << "}" << endl;
+  indent(out) << "public boolean equals(Object other) {" << '\n';
+  indent(out) << "  if (other instanceof " << tstruct->get_name() << ") {" << '\n';
+  indent(out) << "    return equals((" << tstruct->get_name() << ")other);" << '\n';
+  indent(out) << "  } else {" << '\n';
+  indent(out) << "    return false;" << '\n';
+  indent(out) << "  }" << '\n';
+  indent(out) << "}" << '\n';
 
-  out << endl;
+  out << '\n';
 
-  indent(out) << "public boolean equals(" << tstruct->get_name() << " other) {" << endl;
+  indent(out) << "public boolean equals(" << tstruct->get_name() << " other) {" << '\n';
   indent(out) << "  return other != null && getSetField() == other.getSetField() && "
-                 "getFieldValue().equals(other.getFieldValue());" << endl;
-  indent(out) << "}" << endl;
-  out << endl;
+                 "getFieldValue().equals(other.getFieldValue());" << '\n';
+  indent(out) << "}" << '\n';
+  out << '\n';
 
-  indent(out) << "public int compareTo(" << type_name(tstruct) << " other) {" << endl;
+  indent(out) << "public int compareTo(" << type_name(tstruct) << " other) {" << '\n';
   indent(out) << "  int lastComparison = TBaseHelper.compareTo(getSetField(), other.getSetField());"
-              << endl;
-  indent(out) << "  if (lastComparison == 0) {" << endl;
+              << '\n';
+  indent(out) << "  if (lastComparison == 0) {" << '\n';
   indent(out) << "    return TBaseHelper.compareTo(getFieldValue(), other.getFieldValue());"
-              << endl;
-  indent(out) << "  }" << endl;
-  indent(out) << "  return lastComparison;" << endl;
-  indent(out) << "}" << endl;
-  out << endl;
+              << '\n';
+  indent(out) << "  }" << '\n';
+  indent(out) << "  return lastComparison;" << '\n';
+  indent(out) << "}" << '\n';
+  out << '\n';
 }
 
 void t_javame_generator::generate_union_hashcode(ostream& out, t_struct* tstruct) {
   (void)tstruct;
-  indent(out) << "/**" << endl;
+  indent(out) << "/**" << '\n';
   indent(out)
       << " * If you'd like this to perform more respectably, use the hashcode generator option."
-      << endl;
-  indent(out) << " */" << endl;
-  indent(out) << "public int hashCode() {" << endl;
-  indent(out) << "  return 0;" << endl;
-  indent(out) << "}" << endl;
+      << '\n';
+  indent(out) << " */" << '\n';
+  indent(out) << "public int hashCode() {" << '\n';
+  indent(out) << "  return 0;" << '\n';
+  indent(out) << "}" << '\n';
 }
 
 /**
@@ -1021,43 +1019,43 @@
   const vector<t_field*>& members = tstruct->get_members();
   vector<t_field*>::const_iterator m_iter;
 
-  out << endl;
+  out << '\n';
 
   generate_field_descs(out, tstruct);
 
-  out << endl;
+  out << '\n';
 
   for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
     indent(out) << "private ";
-    out << declare_field(*m_iter, false) << endl;
+    out << declare_field(*m_iter, false) << '\n';
   }
 
   // isset data
   if (members.size() > 0) {
-    out << endl;
+    out << '\n';
 
-    indent(out) << "// isset id assignments" << endl;
+    indent(out) << "// isset id assignments" << '\n';
 
     int i = 0;
     for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
       if (!type_can_be_null((*m_iter)->get_type())) {
         indent(out) << "private static final int " << isset_field_id(*m_iter) << " = " << i << ";"
-                    << endl;
+                    << '\n';
         i++;
       }
     }
 
     if (i > 0) {
-      indent(out) << "private boolean[] __isset_vector = new boolean[" << i << "];" << endl;
+      indent(out) << "private boolean[] __isset_vector = new boolean[" << i << "];" << '\n';
     }
 
-    out << endl;
+    out << '\n';
   }
 
   bool all_optional_members = true;
 
   // Default constructor
-  indent(out) << "public " << tstruct->get_name() << "() {" << endl;
+  indent(out) << "public " << tstruct->get_name() << "() {" << '\n';
   indent_up();
   for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
     t_type* t = get_true_type((*m_iter)->get_type());
@@ -1074,49 +1072,49 @@
     }
   }
   indent_down();
-  indent(out) << "}" << endl << endl;
+  indent(out) << "}" << '\n' << '\n';
 
   if (!members.empty() && !all_optional_members) {
     // Full constructor for all fields
-    indent(out) << "public " << tstruct->get_name() << "(" << endl;
+    indent(out) << "public " << tstruct->get_name() << "(" << '\n';
     indent_up();
     bool first = true;
     for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
       if ((*m_iter)->get_req() != t_field::T_OPTIONAL) {
         if (!first) {
-          out << "," << endl;
+          out << "," << '\n';
         }
         first = false;
         indent(out) << type_name((*m_iter)->get_type()) << " " << (*m_iter)->get_name();
       }
     }
-    out << ")" << endl;
+    out << ")" << '\n';
     indent_down();
-    indent(out) << "{" << endl;
+    indent(out) << "{" << '\n';
     indent_up();
-    indent(out) << "this();" << endl;
+    indent(out) << "this();" << '\n';
     for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
       if ((*m_iter)->get_req() != t_field::T_OPTIONAL) {
         indent(out) << "this." << (*m_iter)->get_name() << " = " << (*m_iter)->get_name() << ";"
-                    << endl;
+                    << '\n';
         generate_isset_set(out, (*m_iter));
       }
     }
     indent_down();
-    indent(out) << "}" << endl << endl;
+    indent(out) << "}" << '\n' << '\n';
   }
 
   // copy constructor
-  indent(out) << "/**" << endl;
-  indent(out) << " * Performs a deep copy on <i>other</i>." << endl;
-  indent(out) << " */" << endl;
+  indent(out) << "/**" << '\n';
+  indent(out) << " * Performs a deep copy on <i>other</i>." << '\n';
+  indent(out) << " */" << '\n';
   indent(out) << "public " << tstruct->get_name() << "(" << tstruct->get_name() << " other) {"
-              << endl;
+              << '\n';
   indent_up();
 
   if (has_bit_vector(tstruct)) {
     indent(out) << "System.arraycopy(other.__isset_vector, 0, __isset_vector, 0, "
-                   "other.__isset_vector.length);" << endl;
+                   "other.__isset_vector.length);" << '\n';
   }
 
   for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
@@ -1126,32 +1124,32 @@
     bool can_be_null = type_can_be_null(type);
 
     if (can_be_null) {
-      indent(out) << "if (other." << generate_isset_check(field) << ") {" << endl;
+      indent(out) << "if (other." << generate_isset_check(field) << ") {" << '\n';
       indent_up();
     }
 
     if (type->is_container()) {
       generate_deep_copy_container(out, "other", field_name, "__this__" + field_name, type);
-      indent(out) << "this." << field_name << " = __this__" << field_name << ";" << endl;
+      indent(out) << "this." << field_name << " = __this__" << field_name << ";" << '\n';
     } else {
       indent(out) << "this." << field_name << " = ";
       generate_deep_copy_non_container(out, "other." + field_name, field_name, type);
-      out << ";" << endl;
+      out << ";" << '\n';
     }
 
     if (can_be_null) {
       indent_down();
-      indent(out) << "}" << endl;
+      indent(out) << "}" << '\n';
     }
   }
 
   indent_down();
-  indent(out) << "}" << endl << endl;
+  indent(out) << "}" << '\n' << '\n';
 
   // clone method, so that you can deep copy an object when you don't know its class.
-  indent(out) << "public " << tstruct->get_name() << " deepCopy() {" << endl;
-  indent(out) << "  return new " << tstruct->get_name() << "(this);" << endl;
-  indent(out) << "}" << endl << endl;
+  indent(out) << "public " << tstruct->get_name() << " deepCopy() {" << '\n';
+  indent(out) << "  return new " << tstruct->get_name() << "(this);" << '\n';
+  indent(out) << "}" << '\n' << '\n';
 
   generate_java_struct_clear(out, tstruct);
 
@@ -1170,7 +1168,7 @@
   generate_java_struct_tostring(out, tstruct);
   generate_java_validator(out, tstruct);
   scope_down(out);
-  out << endl;
+  out << '\n';
 }
 
 /**
@@ -1179,24 +1177,24 @@
  * @param tstruct The struct definition
  */
 void t_javame_generator::generate_java_struct_equality(ostream& out, t_struct* tstruct) {
-  out << indent() << "public boolean equals(Object that) {" << endl;
+  out << indent() << "public boolean equals(Object that) {" << '\n';
   indent_up();
-  out << indent() << "if (that == null)" << endl << indent() << "  return false;" << endl
-      << indent() << "if (that instanceof " << tstruct->get_name() << ")" << endl << indent()
-      << "  return this.equals((" << tstruct->get_name() << ")that);" << endl << indent()
-      << "return false;" << endl;
+  out << indent() << "if (that == null)" << '\n' << indent() << "  return false;" << '\n'
+      << indent() << "if (that instanceof " << tstruct->get_name() << ")" << '\n' << indent()
+      << "  return this.equals((" << tstruct->get_name() << ")that);" << '\n' << indent()
+      << "return false;" << '\n';
   scope_down(out);
-  out << endl;
+  out << '\n';
 
-  out << indent() << "public boolean equals(" << tstruct->get_name() << " that) {" << endl;
+  out << indent() << "public boolean equals(" << tstruct->get_name() << " that) {" << '\n';
   indent_up();
-  out << indent() << "if (that == null)" << endl << indent() << "  return false;" << endl
-      << indent() << "if (this == that)" << endl << indent() << "  return true;"  << endl;
+  out << indent() << "if (that == null)" << '\n' << indent() << "  return false;" << '\n'
+      << indent() << "if (this == that)" << '\n' << indent() << "  return true;"  << '\n';
 
   const vector<t_field*>& members = tstruct->get_members();
   vector<t_field*>::const_iterator m_iter;
   for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
-    out << endl;
+    out << '\n';
 
     t_type* t = get_true_type((*m_iter)->get_type());
     // Most existing Thrift code does not use isset or optional/required,
@@ -1214,14 +1212,14 @@
       that_present += " && that." + generate_isset_check(*m_iter);
     }
 
-    out << indent() << "boolean this_present_" << name << " = " << this_present << ";" << endl
-        << indent() << "boolean that_present_" << name << " = " << that_present << ";" << endl
+    out << indent() << "boolean this_present_" << name << " = " << this_present << ";" << '\n'
+        << indent() << "boolean that_present_" << name << " = " << that_present << ";" << '\n'
         << indent() << "if ("
-        << "this_present_" << name << " || that_present_" << name << ") {" << endl;
+        << "this_present_" << name << " || that_present_" << name << ") {" << '\n';
     indent_up();
     out << indent() << "if (!("
-        << "this_present_" << name << " && that_present_" << name << "))" << endl << indent()
-        << "  return false;" << endl;
+        << "this_present_" << name << " && that_present_" << name << "))" << '\n' << indent()
+        << "  return false;" << '\n';
 
     if (t->is_binary()) {
       unequal = "TBaseHelper.compareTo(this." + name + ", that." + name + ") != 0";
@@ -1231,66 +1229,66 @@
       unequal = "this." + name + " != that." + name;
     }
 
-    out << indent() << "if (" << unequal << ")" << endl << indent() << "  return false;" << endl;
+    out << indent() << "if (" << unequal << ")" << '\n' << indent() << "  return false;" << '\n';
 
     scope_down(out);
   }
-  out << endl;
-  indent(out) << "return true;" << endl;
+  out << '\n';
+  indent(out) << "return true;" << '\n';
   scope_down(out);
-  out << endl;
+  out << '\n';
 
-  out << indent() << "public int hashCode() {" << endl;
+  out << indent() << "public int hashCode() {" << '\n';
   indent_up();
-  indent(out) << "return 0;" << endl;
+  indent(out) << "return 0;" << '\n';
   indent_down();
-  indent(out) << "}" << endl << endl;
+  indent(out) << "}" << '\n' << '\n';
 }
 
 void t_javame_generator::generate_java_struct_compare_to(ostream& out, t_struct* tstruct) {
-  indent(out) << "public int compareTo(Object otherObject) {" << endl;
-  //  indent(out) << "public int compareTo(" << type_name(tstruct) << " other) {" << endl;
+  indent(out) << "public int compareTo(Object otherObject) {" << '\n';
+  //  indent(out) << "public int compareTo(" << type_name(tstruct) << " other) {" << '\n';
   indent_up();
 
-  indent(out) << "if (!getClass().equals(otherObject.getClass())) {" << endl;
+  indent(out) << "if (!getClass().equals(otherObject.getClass())) {" << '\n';
   indent(out) << "  return getClass().getName().compareTo(otherObject.getClass().getName());"
-              << endl;
-  indent(out) << "}" << endl;
-  out << endl;
+              << '\n';
+  indent(out) << "}" << '\n';
+  out << '\n';
   indent(out) << type_name(tstruct) << " other = (" << type_name(tstruct) << ")otherObject;";
 
-  indent(out) << "int lastComparison = 0;" << endl;
-  out << endl;
+  indent(out) << "int lastComparison = 0;" << '\n';
+  out << '\n';
 
   const vector<t_field*>& members = tstruct->get_members();
   vector<t_field*>::const_iterator m_iter;
   for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
     t_field* field = *m_iter;
     indent(out) << "lastComparison = TBaseHelper.compareTo(" << generate_isset_check(field)
-                << ", other." << generate_isset_check(field) << ");" << endl;
-    indent(out) << "if (lastComparison != 0) {" << endl;
-    indent(out) << "  return lastComparison;" << endl;
-    indent(out) << "}" << endl;
+                << ", other." << generate_isset_check(field) << ");" << '\n';
+    indent(out) << "if (lastComparison != 0) {" << '\n';
+    indent(out) << "  return lastComparison;" << '\n';
+    indent(out) << "}" << '\n';
 
-    indent(out) << "if (" << generate_isset_check(field) << ") {" << endl;
+    indent(out) << "if (" << generate_isset_check(field) << ") {" << '\n';
     if (field->get_type()->is_struct() || field->get_type()->is_xception()) {
       indent(out) << "  lastComparison = this." << field->get_name() << ".compareTo(other."
-                  << field->get_name() << ");" << endl;
+                  << field->get_name() << ");" << '\n';
     } else {
       indent(out) << "  lastComparison = TBaseHelper.compareTo(this." << field->get_name()
-                  << ", other." << field->get_name() << ");" << endl;
+                  << ", other." << field->get_name() << ");" << '\n';
     }
 
-    indent(out) << "  if (lastComparison != 0) {" << endl;
-    indent(out) << "    return lastComparison;" << endl;
-    indent(out) << "  }" << endl;
-    indent(out) << "}" << endl;
+    indent(out) << "  if (lastComparison != 0) {" << '\n';
+    indent(out) << "    return lastComparison;" << '\n';
+    indent(out) << "  }" << '\n';
+    indent(out) << "}" << '\n';
   }
 
-  indent(out) << "return 0;" << endl;
+  indent(out) << "return 0;" << '\n';
 
   indent_down();
-  indent(out) << "}" << endl << endl;
+  indent(out) << "}" << '\n' << '\n';
 }
 
 /**
@@ -1299,91 +1297,91 @@
  * @param tstruct The struct definition
  */
 void t_javame_generator::generate_java_struct_reader(ostream& out, t_struct* tstruct) {
-  out << indent() << "public void read(TProtocol iprot) throws TException {" << endl;
+  out << indent() << "public void read(TProtocol iprot) throws TException {" << '\n';
   indent_up();
 
   const vector<t_field*>& fields = tstruct->get_members();
   vector<t_field*>::const_iterator f_iter;
 
   // Declare stack tmp variables and read struct header
-  out << indent() << "TField field;" << endl << indent() << "iprot.readStructBegin();" << endl;
+  out << indent() << "TField field;" << '\n' << indent() << "iprot.readStructBegin();" << '\n';
 
   // Loop over reading in fields
-  indent(out) << "while (true)" << endl;
+  indent(out) << "while (true)" << '\n';
   scope_up(out);
 
   // Read beginning field marker
-  indent(out) << "field = iprot.readFieldBegin();" << endl;
+  indent(out) << "field = iprot.readFieldBegin();" << '\n';
 
   // Check for field STOP marker and break
-  indent(out) << "if (field.type == TType.STOP) { " << endl;
+  indent(out) << "if (field.type == TType.STOP) { " << '\n';
   indent_up();
-  indent(out) << "break;" << endl;
+  indent(out) << "break;" << '\n';
   indent_down();
-  indent(out) << "}" << endl;
+  indent(out) << "}" << '\n';
 
   // Switch statement on the field we are reading
-  indent(out) << "switch (field.id) {" << endl;
+  indent(out) << "switch (field.id) {" << '\n';
 
   indent_up();
 
   // Generate deserialization code for known cases
   for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
     indent(out) << "case " << (*f_iter)->get_key() << ": // "
-                << constant_name((*f_iter)->get_name()) << endl;
+                << constant_name((*f_iter)->get_name()) << '\n';
     indent_up();
-    indent(out) << "if (field.type == " << type_to_enum((*f_iter)->get_type()) << ") {" << endl;
+    indent(out) << "if (field.type == " << type_to_enum((*f_iter)->get_type()) << ") {" << '\n';
     indent_up();
 
     generate_deserialize_field(out, *f_iter, "this.");
     generate_isset_set(out, *f_iter);
     indent_down();
-    out << indent() << "} else { " << endl << indent() << "  TProtocolUtil.skip(iprot, field.type);"
-        << endl << indent() << "}" << endl << indent() << "break;" << endl;
+    out << indent() << "} else { " << '\n' << indent() << "  TProtocolUtil.skip(iprot, field.type);"
+        << '\n' << indent() << "}" << '\n' << indent() << "break;" << '\n';
     indent_down();
   }
 
-  indent(out) << "default:" << endl;
-  indent(out) << "  TProtocolUtil.skip(iprot, field.type);" << endl;
+  indent(out) << "default:" << '\n';
+  indent(out) << "  TProtocolUtil.skip(iprot, field.type);" << '\n';
 
   indent_down();
-  indent(out) << "}" << endl;
+  indent(out) << "}" << '\n';
 
   // Read field end marker
-  indent(out) << "iprot.readFieldEnd();" << endl;
+  indent(out) << "iprot.readFieldEnd();" << '\n';
 
   indent_down();
-  indent(out) << "}" << endl;
+  indent(out) << "}" << '\n';
 
-  out << indent() << "iprot.readStructEnd();" << endl;
+  out << indent() << "iprot.readStructEnd();" << '\n';
 
   // performs various checks (e.g. check that all required fields are set)
-  indent(out) << "validate();" << endl;
+  indent(out) << "validate();" << '\n';
 
   indent_down();
-  out << indent() << "}" << endl << endl;
+  out << indent() << "}" << '\n' << '\n';
 }
 
 // generates java method to perform various checks
 // (e.g. check that all required fields are set)
 void t_javame_generator::generate_java_validator(ostream& out, t_struct* tstruct) {
-  indent(out) << "public void validate() throws TException {" << endl;
+  indent(out) << "public void validate() throws TException {" << '\n';
   indent_up();
 
   const vector<t_field*>& fields = tstruct->get_members();
   vector<t_field*>::const_iterator f_iter;
 
-  out << indent() << "// check for required fields" << endl;
+  out << indent() << "// check for required fields" << '\n';
   for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
     if ((*f_iter)->get_req() == t_field::T_REQUIRED) {
-      out << indent() << "if (!" << generate_isset_check(*f_iter) << ") {" << endl << indent()
+      out << indent() << "if (!" << generate_isset_check(*f_iter) << ") {" << '\n' << indent()
           << "  throw new TProtocolException(\"Required field '" << (*f_iter)->get_name()
-          << "' is unset! Struct:\" + toString());" << endl << indent() << "}" << endl << endl;
+          << "' is unset! Struct:\" + toString());" << '\n' << indent() << "}" << '\n' << '\n';
     }
   }
 
   indent_down();
-  indent(out) << "}" << endl << endl;
+  indent(out) << "}" << '\n' << '\n';
 }
 
 /**
@@ -1392,7 +1390,7 @@
  * @param tstruct The struct definition
  */
 void t_javame_generator::generate_java_struct_writer(ostream& out, t_struct* tstruct) {
-  out << indent() << "public void write(TProtocol oprot) throws TException {" << endl;
+  out << indent() << "public void write(TProtocol oprot) throws TException {" << '\n';
   indent_up();
 
   string name = tstruct->get_name();
@@ -1400,46 +1398,46 @@
   vector<t_field*>::const_iterator f_iter;
 
   // performs various checks (e.g. check that all required fields are set)
-  indent(out) << "validate();" << endl << endl;
+  indent(out) << "validate();" << '\n' << '\n';
 
-  indent(out) << "oprot.writeStructBegin(STRUCT_DESC);" << endl;
+  indent(out) << "oprot.writeStructBegin(STRUCT_DESC);" << '\n';
 
   for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
     bool null_allowed = type_can_be_null((*f_iter)->get_type());
     if (null_allowed) {
-      out << indent() << "if (this." << (*f_iter)->get_name() << " != null) {" << endl;
+      out << indent() << "if (this." << (*f_iter)->get_name() << " != null) {" << '\n';
       indent_up();
     }
     bool optional = (*f_iter)->get_req() == t_field::T_OPTIONAL;
     if (optional) {
-      indent(out) << "if (" << generate_isset_check((*f_iter)) << ") {" << endl;
+      indent(out) << "if (" << generate_isset_check((*f_iter)) << ") {" << '\n';
       indent_up();
     }
 
     indent(out) << "oprot.writeFieldBegin(" << constant_name((*f_iter)->get_name())
-                << "_FIELD_DESC);" << endl;
+                << "_FIELD_DESC);" << '\n';
 
     // Write field contents
     generate_serialize_field(out, *f_iter, "this.");
 
     // Write field closer
-    indent(out) << "oprot.writeFieldEnd();" << endl;
+    indent(out) << "oprot.writeFieldEnd();" << '\n';
 
     if (optional) {
       indent_down();
-      indent(out) << "}" << endl;
+      indent(out) << "}" << '\n';
     }
     if (null_allowed) {
       indent_down();
-      indent(out) << "}" << endl;
+      indent(out) << "}" << '\n';
     }
   }
   // Write the struct map
-  out << indent() << "oprot.writeFieldStop();" << endl << indent() << "oprot.writeStructEnd();"
-      << endl;
+  out << indent() << "oprot.writeFieldStop();" << '\n' << indent() << "oprot.writeStructEnd();"
+      << '\n';
 
   indent_down();
-  out << indent() << "}" << endl << endl;
+  out << indent() << "}" << '\n' << '\n';
 }
 
 /**
@@ -1451,62 +1449,62 @@
  * @param tstruct The struct definition
  */
 void t_javame_generator::generate_java_struct_result_writer(ostream& out, t_struct* tstruct) {
-  out << indent() << "public void write(TProtocol oprot) throws TException {" << endl;
+  out << indent() << "public void write(TProtocol oprot) throws TException {" << '\n';
   indent_up();
 
   string name = tstruct->get_name();
   const vector<t_field*>& fields = tstruct->get_sorted_members();
   vector<t_field*>::const_iterator f_iter;
 
-  indent(out) << "oprot.writeStructBegin(STRUCT_DESC);" << endl;
+  indent(out) << "oprot.writeStructBegin(STRUCT_DESC);" << '\n';
 
   bool first = true;
   for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
     if (first) {
       first = false;
-      out << endl << indent() << "if ";
+      out << '\n' << indent() << "if ";
     } else {
       out << " else if ";
     }
 
-    out << "(this." << generate_isset_check(*f_iter) << ") {" << endl;
+    out << "(this." << generate_isset_check(*f_iter) << ") {" << '\n';
 
     indent_up();
 
     indent(out) << "oprot.writeFieldBegin(" << constant_name((*f_iter)->get_name())
-                << "_FIELD_DESC);" << endl;
+                << "_FIELD_DESC);" << '\n';
 
     // Write field contents
     generate_serialize_field(out, *f_iter, "this.");
 
     // Write field closer
-    indent(out) << "oprot.writeFieldEnd();" << endl;
+    indent(out) << "oprot.writeFieldEnd();" << '\n';
 
     indent_down();
     indent(out) << "}";
   }
   // Write the struct map
-  out << endl << indent() << "oprot.writeFieldStop();" << endl << indent()
-      << "oprot.writeStructEnd();" << endl;
+  out << '\n' << indent() << "oprot.writeFieldStop();" << '\n' << indent()
+      << "oprot.writeStructEnd();" << '\n';
 
   indent_down();
-  out << indent() << "}" << endl << endl;
+  out << indent() << "}" << '\n' << '\n';
 }
 
 void t_javame_generator::generate_reflection_getters(ostringstream& out,
                                                      t_type* type,
                                                      string field_name,
                                                      string cap_name) {
-  indent(out) << "case " << constant_name(field_name) << ":" << endl;
+  indent(out) << "case " << constant_name(field_name) << ":" << '\n';
   indent_up();
 
   if (type->is_base_type() && !type->is_string()) {
     t_base_type* base_type = (t_base_type*)type;
 
     indent(out) << "return new " << type_name(type, true, false) << "("
-                << (base_type->is_bool() ? "is" : "get") << cap_name << "());" << endl << endl;
+                << (base_type->is_bool() ? "is" : "get") << cap_name << "());" << '\n' << '\n';
   } else {
-    indent(out) << "return get" << cap_name << "();" << endl << endl;
+    indent(out) << "return get" << cap_name << "();" << '\n' << '\n';
   }
 
   indent_down();
@@ -1516,14 +1514,14 @@
                                                      t_type* type,
                                                      string field_name,
                                                      string cap_name) {
-  indent(out) << "case " << constant_name(field_name) << ":" << endl;
+  indent(out) << "case " << constant_name(field_name) << ":" << '\n';
   indent_up();
-  indent(out) << "if (value == null) {" << endl;
-  indent(out) << "  unset" << get_cap_name(field_name) << "();" << endl;
-  indent(out) << "} else {" << endl;
-  indent(out) << "  set" << cap_name << "((" << type_name(type, true, false) << ")value);" << endl;
-  indent(out) << "}" << endl;
-  indent(out) << "break;" << endl << endl;
+  indent(out) << "if (value == null) {" << '\n';
+  indent(out) << "  unset" << get_cap_name(field_name) << "();" << '\n';
+  indent(out) << "} else {" << '\n';
+  indent(out) << "  set" << cap_name << "((" << type_name(type, true, false) << ")value);" << '\n';
+  indent(out) << "}" << '\n';
+  indent(out) << "break;" << '\n' << '\n';
 
   indent_down();
 }
@@ -1568,13 +1566,13 @@
     if (type->is_container()) {
       // Method to return the size of the collection
       indent(out) << "public int get" << cap_name;
-      out << get_cap_name("size() {") << endl;
+      out << get_cap_name("size() {") << '\n';
 
       indent_up();
       indent(out) << "return (this." << field_name << " == null) ? 0 : "
-                  << "this." << field_name << ".size();" << endl;
+                  << "this." << field_name << ".size();" << '\n';
       indent_down();
-      indent(out) << "}" << endl << endl;
+      indent(out) << "}" << '\n' << '\n';
     }
 
     if (type->is_set() || type->is_list()) {
@@ -1588,35 +1586,35 @@
 
       // Iterator getter for sets and lists
       indent(out) << "public Enumeration get" << cap_name;
-      out << get_cap_name("Enumeration() {") << endl;
+      out << get_cap_name("Enumeration() {") << '\n';
 
       indent_up();
       indent(out) << "return (this." << field_name << " == null) ? null : "
-                  << "this." << field_name << ".elements();" << endl;
+                  << "this." << field_name << ".elements();" << '\n';
       indent_down();
-      indent(out) << "}" << endl << endl;
+      indent(out) << "}" << '\n' << '\n';
 
       // Add to set or list, create if the set/list is null
       indent(out);
       out << "public void add" << get_cap_name("to");
-      out << cap_name << "(" << type_name(element_type) << " elem) {" << endl;
+      out << cap_name << "(" << type_name(element_type) << " elem) {" << '\n';
 
       indent_up();
-      indent(out) << "if (this." << field_name << " == null) {" << endl;
+      indent(out) << "if (this." << field_name << " == null) {" << '\n';
       indent_up();
       indent(out) << "this." << field_name << " = new " << type_name(type, false, true) << "();"
-                  << endl;
+                  << '\n';
       indent_down();
-      indent(out) << "}" << endl;
+      indent(out) << "}" << '\n';
       if (type->is_set()) {
         indent(out) << "this." << field_name << ".put(" << box_type(element_type, "elem") << ", "
-                    << box_type(element_type, "elem") << ");" << endl;
+                    << box_type(element_type, "elem") << ");" << '\n';
       } else {
         indent(out) << "this." << field_name << ".addElement(" << box_type(element_type, "elem")
-                    << ");" << endl;
+                    << ");" << '\n';
       }
       indent_down();
-      indent(out) << "}" << endl << endl;
+      indent(out) << "}" << '\n' << '\n';
 
     } else if (type->is_map()) {
       // Put to map
@@ -1625,18 +1623,18 @@
 
       indent(out);
       out << "public void putTo" << cap_name << "(" << type_name(key_type, true) << " key, "
-          << type_name(val_type, true) << " val) {" << endl;
+          << type_name(val_type, true) << " val) {" << '\n';
 
       indent_up();
-      indent(out) << "if (this." << field_name << " == null) {" << endl;
+      indent(out) << "if (this." << field_name << " == null) {" << '\n';
       indent_up();
       indent(out) << "this." << field_name << " = new " << type_name(type, false, true) << "();"
-                  << endl;
+                  << '\n';
       indent_down();
-      indent(out) << "}" << endl;
-      indent(out) << "this." << field_name << ".put(key, val);" << endl;
+      indent(out) << "}" << '\n';
+      indent(out) << "this." << field_name << ".put(key, val);" << '\n';
       indent_down();
-      indent(out) << "}" << endl << endl;
+      indent(out) << "}" << '\n' << '\n';
     }
 
     // Simple getter
@@ -1647,60 +1645,60 @@
     } else {
       out << " get";
     }
-    out << cap_name << "() {" << endl;
+    out << cap_name << "() {" << '\n';
     indent_up();
-    indent(out) << "return this." << field_name << ";" << endl;
+    indent(out) << "return this." << field_name << ";" << '\n';
     indent_down();
-    indent(out) << "}" << endl << endl;
+    indent(out) << "}" << '\n' << '\n';
 
     // Simple setter
     generate_java_doc(out, field);
     indent(out) << "public ";
     out << "void";
-    out << " set" << cap_name << "(" << type_name(type) << " " << field_name << ") {" << endl;
+    out << " set" << cap_name << "(" << type_name(type) << " " << field_name << ") {" << '\n';
     indent_up();
-    indent(out) << "this." << field_name << " = " << field_name << ";" << endl;
+    indent(out) << "this." << field_name << " = " << field_name << ";" << '\n';
     generate_isset_set(out, field);
 
     indent_down();
-    indent(out) << "}" << endl << endl;
+    indent(out) << "}" << '\n' << '\n';
 
     // Unsetter
-    indent(out) << "public void unset" << cap_name << "() {" << endl;
+    indent(out) << "public void unset" << cap_name << "() {" << '\n';
     indent_up();
     if (type_can_be_null(type)) {
-      indent(out) << "this." << field_name << " = null;" << endl;
+      indent(out) << "this." << field_name << " = null;" << '\n';
     } else {
-      indent(out) << "__isset_vector[" << isset_field_id(field) << "] = false;" << endl;
+      indent(out) << "__isset_vector[" << isset_field_id(field) << "] = false;" << '\n';
     }
     indent_down();
-    indent(out) << "}" << endl << endl;
+    indent(out) << "}" << '\n' << '\n';
 
     // isSet method
     indent(out) << "/** Returns true if field " << field_name
-                << " is set (has been assigned a value) and false otherwise */" << endl;
-    indent(out) << "public boolean is" << get_cap_name("set") << cap_name << "() {" << endl;
+                << " is set (has been assigned a value) and false otherwise */" << '\n';
+    indent(out) << "public boolean is" << get_cap_name("set") << cap_name << "() {" << '\n';
     indent_up();
     if (type_can_be_null(type)) {
-      indent(out) << "return this." << field_name << " != null;" << endl;
+      indent(out) << "return this." << field_name << " != null;" << '\n';
     } else {
-      indent(out) << "return __isset_vector[" << isset_field_id(field) << "];" << endl;
+      indent(out) << "return __isset_vector[" << isset_field_id(field) << "];" << '\n';
     }
     indent_down();
-    indent(out) << "}" << endl << endl;
+    indent(out) << "}" << '\n' << '\n';
 
     indent(out) << "public void set" << cap_name << get_cap_name("isSet") << "(boolean value) {"
-                << endl;
+                << '\n';
     indent_up();
     if (type_can_be_null(type)) {
-      indent(out) << "if (!value) {" << endl;
-      indent(out) << "  this." << field_name << " = null;" << endl;
-      indent(out) << "}" << endl;
+      indent(out) << "if (!value) {" << '\n';
+      indent(out) << "  this." << field_name << " = null;" << '\n';
+      indent(out) << "}" << '\n';
     } else {
-      indent(out) << "__isset_vector[" << isset_field_id(field) << "] = value;" << endl;
+      indent(out) << "__isset_vector[" << isset_field_id(field) << "] = value;" << '\n';
     }
     indent_down();
-    indent(out) << "}" << endl << endl;
+    indent(out) << "}" << '\n' << '\n';
   }
 }
 
@@ -1710,12 +1708,12 @@
  * @param tstruct The struct definition
  */
 void t_javame_generator::generate_java_struct_tostring(ostream& out, t_struct* tstruct) {
-  out << indent() << "public String toString() {" << endl;
+  out << indent() << "public String toString() {" << '\n';
   indent_up();
 
   out << indent() << "StringBuffer sb = new StringBuffer(\"" << tstruct->get_name() << "(\");"
-      << endl;
-  out << indent() << "boolean first = true;" << endl << endl;
+      << '\n';
+  out << indent() << "boolean first = true;" << '\n' << '\n';
 
   const vector<t_field*>& fields = tstruct->get_members();
   vector<t_field*>::const_iterator f_iter;
@@ -1723,46 +1721,46 @@
   for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
     bool could_be_unset = (*f_iter)->get_req() == t_field::T_OPTIONAL;
     if (could_be_unset) {
-      indent(out) << "if (" << generate_isset_check(*f_iter) << ") {" << endl;
+      indent(out) << "if (" << generate_isset_check(*f_iter) << ") {" << '\n';
       indent_up();
     }
 
     t_field* field = (*f_iter);
 
     if (!first) {
-      indent(out) << "if (!first) sb.append(\", \");" << endl;
+      indent(out) << "if (!first) sb.append(\", \");" << '\n';
     }
-    indent(out) << "sb.append(\"" << (*f_iter)->get_name() << ":\");" << endl;
+    indent(out) << "sb.append(\"" << (*f_iter)->get_name() << ":\");" << '\n';
     bool can_be_null = type_can_be_null(field->get_type());
     if (can_be_null) {
-      indent(out) << "if (this." << (*f_iter)->get_name() << " == null) {" << endl;
-      indent(out) << "  sb.append(\"null\");" << endl;
-      indent(out) << "} else {" << endl;
+      indent(out) << "if (this." << (*f_iter)->get_name() << " == null) {" << '\n';
+      indent(out) << "  sb.append(\"null\");" << '\n';
+      indent(out) << "} else {" << '\n';
       indent_up();
     }
 
     if (field->get_type()->is_binary()) {
-      indent(out) << "TBaseHelper.toString(this." << field->get_name() << ", sb);" << endl;
+      indent(out) << "TBaseHelper.toString(this." << field->get_name() << ", sb);" << '\n';
     } else {
-      indent(out) << "sb.append(this." << (*f_iter)->get_name() << ");" << endl;
+      indent(out) << "sb.append(this." << (*f_iter)->get_name() << ");" << '\n';
     }
 
     if (can_be_null) {
       indent_down();
-      indent(out) << "}" << endl;
+      indent(out) << "}" << '\n';
     }
-    indent(out) << "first = false;" << endl;
+    indent(out) << "first = false;" << '\n';
 
     if (could_be_unset) {
       indent_down();
-      indent(out) << "}" << endl;
+      indent(out) << "}" << '\n';
     }
     first = false;
   }
-  out << indent() << "sb.append(\")\");" << endl << indent() << "return sb.toString();" << endl;
+  out << indent() << "sb.append(\")\");" << '\n' << indent() << "return sb.toString();" << '\n';
 
   indent_down();
-  indent(out) << "}" << endl << endl;
+  indent(out) << "}" << '\n' << '\n';
 }
 
 /**
@@ -1821,7 +1819,7 @@
 }
 
 void t_javame_generator::generate_field_value_meta_data(std::ostream& out, t_type* type) {
-  out << endl;
+  out << '\n';
   indent_up();
   indent_up();
   if (type->is_struct() || type->is_xception()) {
@@ -1871,7 +1869,7 @@
 
   f_service_ << autogen_comment() << java_package() << java_type_imports() << java_thrift_imports();
 
-  f_service_ << "public class " << service_name_ << " {" << endl << endl;
+  f_service_ << "public class " << service_name_ << " {" << '\n' << '\n';
   indent_up();
 
   // Generate the three main parts of the service
@@ -1881,7 +1879,7 @@
   generate_service_helpers(tservice);
 
   indent_down();
-  f_service_ << "}" << endl;
+  f_service_ << "}" << '\n';
   f_service_.close();
 }
 
@@ -1892,7 +1890,7 @@
  */
 void t_javame_generator::generate_primitive_service_interface(t_service* tservice) {
   f_service_ << indent() << "public interface Iface extends " << service_name_ << "Iface { }"
-             << endl << endl;
+             << '\n' << '\n';
 
   string f_interface_name = package_dir_ + "/" + service_name_ + "Iface.java";
   ofstream_with_content_based_conditional_update f_iface;
@@ -1905,15 +1903,15 @@
 
   f_iface << autogen_comment() << java_package() << java_type_imports() << java_thrift_imports();
   generate_java_doc(f_iface, tservice);
-  f_iface << "public interface " << service_name_ << "Iface" << extends_iface << " {" << endl
-          << endl;
+  f_iface << "public interface " << service_name_ << "Iface" << extends_iface << " {" << '\n'
+          << '\n';
   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_java_doc(f_iface, *f_iter);
-    f_iface << "  public " << function_signature(*f_iter) << ";" << endl << endl;
+    f_iface << "  public " << function_signature(*f_iter) << ";" << '\n' << '\n';
   }
-  f_iface << "}" << endl << endl;
+  f_iface << "}" << '\n' << '\n';
 }
 
 /**
@@ -1930,16 +1928,16 @@
   }
 
   generate_java_doc(f_service_, tservice);
-  f_service_ << indent() << "public interface Iface" << extends_iface << " {" << endl << endl;
+  f_service_ << indent() << "public interface Iface" << extends_iface << " {" << '\n' << '\n';
   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_java_doc(f_service_, *f_iter);
-    indent(f_service_) << "public " << function_signature(*f_iter) << ";" << endl << endl;
+    indent(f_service_) << "public " << function_signature(*f_iter) << ";" << '\n' << '\n';
   }
   indent_down();
-  f_service_ << indent() << "}" << endl << endl;
+  f_service_ << indent() << "}" << '\n' << '\n';
 }
 
 /**
@@ -1971,41 +1969,41 @@
   }
 
   indent(f_service_) << "public static class Client" << extends_client
-                     << " implements TServiceClient, Iface {" << endl;
+                     << " implements TServiceClient, Iface {" << '\n';
   indent_up();
 
-  indent(f_service_) << "public Client(TProtocol prot)" << endl;
+  indent(f_service_) << "public Client(TProtocol prot)" << '\n';
   scope_up(f_service_);
-  indent(f_service_) << "this(prot, prot);" << endl;
+  indent(f_service_) << "this(prot, prot);" << '\n';
   scope_down(f_service_);
-  f_service_ << endl;
+  f_service_ << '\n';
 
-  indent(f_service_) << "public Client(TProtocol iprot, TProtocol oprot)" << endl;
+  indent(f_service_) << "public Client(TProtocol iprot, TProtocol oprot)" << '\n';
   scope_up(f_service_);
   if (extends.empty()) {
-    f_service_ << indent() << "iprot_ = iprot;" << endl << indent() << "oprot_ = oprot;" << endl;
+    f_service_ << indent() << "iprot_ = iprot;" << '\n' << indent() << "oprot_ = oprot;" << '\n';
   } else {
-    f_service_ << indent() << "super(iprot, oprot);" << endl;
+    f_service_ << indent() << "super(iprot, oprot);" << '\n';
   }
   scope_down(f_service_);
-  f_service_ << endl;
+  f_service_ << '\n';
 
   if (extends.empty()) {
-    f_service_ << indent() << "protected TProtocol iprot_;" << endl << indent()
-               << "protected TProtocol oprot_;" << endl << endl << indent()
-               << "protected int seqid_;" << endl << endl;
+    f_service_ << indent() << "protected TProtocol iprot_;" << '\n' << indent()
+               << "protected TProtocol oprot_;" << '\n' << '\n' << indent()
+               << "protected int seqid_;" << '\n' << '\n';
 
-    indent(f_service_) << "public TProtocol getInputProtocol()" << endl;
+    indent(f_service_) << "public TProtocol getInputProtocol()" << '\n';
     scope_up(f_service_);
-    indent(f_service_) << "return this.iprot_;" << endl;
+    indent(f_service_) << "return this.iprot_;" << '\n';
     scope_down(f_service_);
-    f_service_ << endl;
+    f_service_ << '\n';
 
-    indent(f_service_) << "public TProtocol getOutputProtocol()" << endl;
+    indent(f_service_) << "public TProtocol getOutputProtocol()" << '\n';
     scope_up(f_service_);
-    indent(f_service_) << "return this.oprot_;" << endl;
+    indent(f_service_) << "return this.oprot_;" << '\n';
     scope_down(f_service_);
-    f_service_ << endl;
+    f_service_ << '\n';
   }
 
   // Generate client method implementations
@@ -2015,7 +2013,7 @@
     string funname = (*f_iter)->get_name();
 
     // Open function
-    indent(f_service_) << "public " << function_signature(*f_iter) << endl;
+    indent(f_service_) << "public " << function_signature(*f_iter) << '\n';
     scope_up(f_service_);
     indent(f_service_) << "send_" << funname << "(";
 
@@ -2034,17 +2032,17 @@
       }
       f_service_ << (*fld_iter)->get_name();
     }
-    f_service_ << ");" << endl;
+    f_service_ << ");" << '\n';
 
     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_ << "recv_" << funname << "();" << '\n';
     }
     scope_down(f_service_);
-    f_service_ << endl;
+    f_service_ << '\n';
 
     t_function send_function(g_type_void,
                              string("send_") + (*f_iter)->get_name(),
@@ -2053,26 +2051,26 @@
     string argsname = (*f_iter)->get_name() + "_args";
 
     // Open function
-    indent(f_service_) << "public " << function_signature(&send_function) << endl;
+    indent(f_service_) << "public " << function_signature(&send_function) << '\n';
     scope_up(f_service_);
 
     // Serialize the request
     f_service_ << indent() << "oprot_.writeMessageBegin(new TMessage(\"" << funname << "\", "
                << ((*f_iter)->is_oneway() ? "TMessageType.ONEWAY" : "TMessageType.CALL")
-               << ", ++seqid_));" << endl << indent() << argsname << " args = new " << argsname
-               << "();" << endl;
+               << ", ++seqid_));" << '\n' << indent() << argsname << " args = new " << argsname
+               << "();" << '\n';
 
     for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) {
       f_service_ << indent() << "args.set" << get_cap_name((*fld_iter)->get_name()) << "("
-                 << (*fld_iter)->get_name() << ");" << endl;
+                 << (*fld_iter)->get_name() << ");" << '\n';
     }
 
-    f_service_ << indent() << "args.write(oprot_);" << endl << indent()
-               << "oprot_.writeMessageEnd();" << endl << indent()
-               << "oprot_.getTransport().flush();" << endl;
+    f_service_ << indent() << "args.write(oprot_);" << '\n' << indent()
+               << "oprot_.writeMessageEnd();" << '\n' << indent()
+               << "oprot_.getTransport().flush();" << '\n';
 
     scope_down(f_service_);
-    f_service_ << endl;
+    f_service_ << '\n';
 
     if (!(*f_iter)->is_oneway()) {
       string resultname = (*f_iter)->get_name() + "_result";
@@ -2083,53 +2081,53 @@
                                &noargs,
                                (*f_iter)->get_xceptions());
       // Open function
-      indent(f_service_) << "public " << function_signature(&recv_function) << endl;
+      indent(f_service_) << "public " << function_signature(&recv_function) << '\n';
       scope_up(f_service_);
 
-      f_service_ << indent() << "TMessage msg = iprot_.readMessageBegin();" << endl << indent()
-                 << "if (msg.type == TMessageType.EXCEPTION) {" << endl << indent()
-                 << "  TApplicationException x = TApplicationException.read(iprot_);" << endl
-                 << indent() << "  iprot_.readMessageEnd();" << endl << indent() << "  throw x;"
-                 << endl << indent() << "}" << endl << indent() << "if (msg.seqid != seqid_) {"
-                 << endl << indent()
+      f_service_ << indent() << "TMessage msg = iprot_.readMessageBegin();" << '\n' << indent()
+                 << "if (msg.type == TMessageType.EXCEPTION) {" << '\n' << indent()
+                 << "  TApplicationException x = TApplicationException.read(iprot_);" << '\n'
+                 << indent() << "  iprot_.readMessageEnd();" << '\n' << indent() << "  throw x;"
+                 << '\n' << indent() << "}" << '\n' << indent() << "if (msg.seqid != seqid_) {"
+                 << '\n' << indent()
                  << "  throw new TApplicationException(TApplicationException.BAD_SEQUENCE_ID, \""
-                 << (*f_iter)->get_name() << " failed: out of sequence response\");" << endl
-                 << indent() << "}" << endl << indent() << resultname << " result = new "
-                 << resultname << "();" << endl << indent() << "result.read(iprot_);" << endl
-                 << indent() << "iprot_.readMessageEnd();" << endl;
+                 << (*f_iter)->get_name() << " failed: out of sequence response\");" << '\n'
+                 << indent() << "}" << '\n' << indent() << resultname << " result = new "
+                 << resultname << "();" << '\n' << indent() << "result.read(iprot_);" << '\n'
+                 << indent() << "iprot_.readMessageEnd();" << '\n';
 
       // Careful, only return _result if not a void function
       if (!(*f_iter)->get_returntype()->is_void()) {
-        f_service_ << indent() << "if (result." << generate_isset_check("success") << ") {" << endl
-                   << indent() << "  return result.success;" << endl << indent() << "}" << endl;
+        f_service_ << indent() << "if (result." << generate_isset_check("success") << ") {" << '\n'
+                   << indent() << "  return result.success;" << '\n' << indent() << "}" << '\n';
       }
 
       t_struct* xs = (*f_iter)->get_xceptions();
       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) {
-        f_service_ << indent() << "if (result." << (*x_iter)->get_name() << " != null) {" << endl
-                   << indent() << "  throw result." << (*x_iter)->get_name() << ";" << endl
-                   << indent() << "}" << endl;
+        f_service_ << indent() << "if (result." << (*x_iter)->get_name() << " != null) {" << '\n'
+                   << indent() << "  throw result." << (*x_iter)->get_name() << ";" << '\n'
+                   << indent() << "}" << '\n';
       }
 
       // If you get here it's an exception, unless a void function
       if ((*f_iter)->get_returntype()->is_void()) {
-        indent(f_service_) << "return;" << endl;
+        indent(f_service_) << "return;" << '\n';
       } else {
         f_service_ << indent()
                    << "throw new TApplicationException(TApplicationException.MISSING_RESULT, \""
-                   << (*f_iter)->get_name() << " failed: unknown result\");" << endl;
+                   << (*f_iter)->get_name() << " failed: unknown result\");" << '\n';
       }
 
       // Close function
       scope_down(f_service_);
-      f_service_ << endl;
+      f_service_ << '\n';
     }
   }
 
   indent_down();
-  indent(f_service_) << "}" << endl;
+  indent(f_service_) << "}" << '\n';
 }
 
 /**
@@ -2152,66 +2150,66 @@
 
   // Generate the header portion
   indent(f_service_) << "public static class Processor" << extends_processor
-                     << " implements TProcessor {" << endl;
+                     << " implements TProcessor {" << '\n';
   indent_up();
 
-  indent(f_service_) << "public Processor(Iface iface)" << endl;
+  indent(f_service_) << "public Processor(Iface iface)" << '\n';
   scope_up(f_service_);
   if (!extends.empty()) {
-    f_service_ << indent() << "super(iface);" << endl;
+    f_service_ << indent() << "super(iface);" << '\n';
   }
-  f_service_ << indent() << "iface_ = iface;" << endl;
+  f_service_ << indent() << "iface_ = iface;" << '\n';
 
   for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
     f_service_ << indent() << "processMap_.put(\"" << (*f_iter)->get_name() << "\", new "
-               << (*f_iter)->get_name() << "());" << endl;
+               << (*f_iter)->get_name() << "());" << '\n';
   }
 
   scope_down(f_service_);
-  f_service_ << endl;
+  f_service_ << '\n';
 
   if (extends.empty()) {
     f_service_
-        << indent() << "protected static interface ProcessFunction {" << endl << indent()
+        << indent() << "protected static interface ProcessFunction {" << '\n' << indent()
         << "  public void process(int seqid, TProtocol iprot, TProtocol oprot) throws TException;"
-        << endl << indent() << "}" << endl << endl;
+        << '\n' << indent() << "}" << '\n' << '\n';
   }
 
-  f_service_ << indent() << "private Iface iface_;" << endl;
+  f_service_ << indent() << "private Iface iface_;" << '\n';
 
   if (extends.empty()) {
-    f_service_ << indent() << "protected final Hashtable processMap_ = new Hashtable();" << endl;
+    f_service_ << indent() << "protected final Hashtable processMap_ = new Hashtable();" << '\n';
   }
 
-  f_service_ << endl;
+  f_service_ << '\n';
 
   // Generate the server implementation
   indent(f_service_) << "public boolean process(TProtocol iprot, TProtocol oprot) throws TException"
-                     << endl;
+                     << '\n';
   scope_up(f_service_);
 
-  f_service_ << indent() << "TMessage msg = iprot.readMessageBegin();" << endl;
+  f_service_ << indent() << "TMessage msg = iprot.readMessageBegin();" << '\n';
 
   // TODO(mcslee): validate message, was the seqid etc. legit?
 
   f_service_
-      << indent() << "ProcessFunction fn = (ProcessFunction)processMap_.get(msg.name);" << endl
-      << indent() << "if (fn == null) {" << endl << indent()
-      << "  TProtocolUtil.skip(iprot, TType.STRUCT);" << endl << indent()
-      << "  iprot.readMessageEnd();" << endl << indent()
+      << indent() << "ProcessFunction fn = (ProcessFunction)processMap_.get(msg.name);" << '\n'
+      << indent() << "if (fn == null) {" << '\n' << indent()
+      << "  TProtocolUtil.skip(iprot, TType.STRUCT);" << '\n' << indent()
+      << "  iprot.readMessageEnd();" << '\n' << indent()
       << "  TApplicationException x = new "
          "TApplicationException(TApplicationException.UNKNOWN_METHOD, \"Invalid method name: "
-         "'\"+msg.name+\"'\");" << endl << indent()
+         "'\"+msg.name+\"'\");" << '\n' << indent()
       << "  oprot.writeMessageBegin(new TMessage(msg.name, TMessageType.EXCEPTION, msg.seqid));"
-      << endl << indent() << "  x.write(oprot);" << endl << indent() << "  oprot.writeMessageEnd();"
-      << endl << indent() << "  oprot.getTransport().flush();" << endl << indent()
-      << "  return true;" << endl << indent() << "}" << endl << indent()
-      << "fn.process(msg.seqid, iprot, oprot);" << endl;
+      << '\n' << indent() << "  x.write(oprot);" << '\n' << indent() << "  oprot.writeMessageEnd();"
+      << '\n' << indent() << "  oprot.getTransport().flush();" << '\n' << indent()
+      << "  return true;" << '\n' << indent() << "}" << '\n' << indent()
+      << "fn.process(msg.seqid, iprot, oprot);" << '\n';
 
-  f_service_ << indent() << "return true;" << endl;
+  f_service_ << indent() << "return true;" << '\n';
 
   scope_down(f_service_);
-  f_service_ << endl;
+  f_service_ << '\n';
 
   // Generate the process subfunctions
   for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
@@ -2219,7 +2217,7 @@
   }
 
   indent_down();
-  indent(f_service_) << "}" << endl << endl;
+  indent(f_service_) << "}" << '\n' << '\n';
 }
 
 /**
@@ -2257,36 +2255,36 @@
   (void)tservice;
   // Open class
   indent(f_service_) << "private class " << tfunction->get_name() << " implements ProcessFunction {"
-                     << endl;
+                     << '\n';
   indent_up();
 
   // Open function
   indent(f_service_)
       << "public void process(int seqid, TProtocol iprot, TProtocol oprot) throws TException"
-      << endl;
+      << '\n';
   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()
-             << "try {" << endl;
+  f_service_ << indent() << argsname << " args = new " << argsname << "();" << '\n' << indent()
+             << "try {" << '\n';
   indent_up();
-  f_service_ << indent() << "args.read(iprot);" << endl;
+  f_service_ << indent() << "args.read(iprot);" << '\n';
   indent_down();
-  f_service_ << indent() << "} catch (TProtocolException e) {" << endl;
+  f_service_ << indent() << "} catch (TProtocolException e) {" << '\n';
   indent_up();
-  f_service_ << indent() << "iprot.readMessageEnd();" << endl << indent()
+  f_service_ << indent() << "iprot.readMessageEnd();" << '\n' << indent()
              << "TApplicationException x = new "
                 "TApplicationException(TApplicationException.PROTOCOL_ERROR, e.getMessage());"
-             << endl << indent() << "oprot.writeMessageBegin(new TMessage(\""
-             << tfunction->get_name() << "\", TMessageType.EXCEPTION, seqid));" << endl << indent()
-             << "x.write(oprot);" << endl << indent() << "oprot.writeMessageEnd();" << endl
-             << indent() << "oprot.getTransport().flush();" << endl << indent() << "return;"
-             << endl;
+             << '\n' << indent() << "oprot.writeMessageBegin(new TMessage(\""
+             << tfunction->get_name() << "\", TMessageType.EXCEPTION, seqid));" << '\n' << indent()
+             << "x.write(oprot);" << '\n' << indent() << "oprot.writeMessageEnd();" << '\n'
+             << indent() << "oprot.getTransport().flush();" << '\n' << indent() << "return;"
+             << '\n';
   indent_down();
-  f_service_ << indent() << "}" << endl;
-  f_service_ << indent() << "iprot.readMessageEnd();" << endl;
+  f_service_ << indent() << "}" << '\n';
+  f_service_ << indent() << "iprot.readMessageEnd();" << '\n';
 
   t_struct* xs = tfunction->get_xceptions();
   const std::vector<t_field*>& xceptions = xs->get_members();
@@ -2294,12 +2292,12 @@
 
   // Declare result for non oneway function
   if (!tfunction->is_oneway()) {
-    f_service_ << indent() << resultname << " result = new " << resultname << "();" << endl;
+    f_service_ << indent() << resultname << " result = new " << resultname << "();" << '\n';
   }
 
   // Try block for a function with exceptions
   if (xceptions.size() > 0) {
-    f_service_ << indent() << "try {" << endl;
+    f_service_ << indent() << "try {" << '\n';
     indent_up();
   }
 
@@ -2322,13 +2320,13 @@
     }
     f_service_ << "args." << (*f_iter)->get_name();
   }
-  f_service_ << ");" << endl;
+  f_service_ << ");" << '\n';
 
   // Set isset on success field
   if (!tfunction->is_oneway() && !tfunction->get_returntype()->is_void()
       && !type_can_be_null(tfunction->get_returntype())) {
     f_service_ << indent() << "result.set" << get_cap_name("success") << get_cap_name("isSet")
-               << "(true);" << endl;
+               << "(true);" << '\n';
   }
 
   if (!tfunction->is_oneway() && xceptions.size() > 0) {
@@ -2336,54 +2334,54 @@
     f_service_ << indent() << "}";
     for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) {
       f_service_ << " catch (" << type_name((*x_iter)->get_type(), false, false) << " "
-                 << (*x_iter)->get_name() << ") {" << endl;
+                 << (*x_iter)->get_name() << ") {" << '\n';
       if (!tfunction->is_oneway()) {
         indent_up();
         f_service_ << indent() << "result." << (*x_iter)->get_name() << " = "
-                   << (*x_iter)->get_name() << ";" << endl;
+                   << (*x_iter)->get_name() << ";" << '\n';
         indent_down();
         f_service_ << indent() << "}";
       } else {
         f_service_ << "}";
       }
     }
-    f_service_ << " catch (Throwable th) {" << endl;
+    f_service_ << " catch (Throwable th) {" << '\n';
     indent_up();
     f_service_ << indent() << "TApplicationException x = new "
                               "TApplicationException(TApplicationException.INTERNAL_ERROR, "
                               "\"Internal error processing " << tfunction->get_name() << "\");"
-               << endl << indent() << "oprot.writeMessageBegin(new TMessage(\""
-               << tfunction->get_name() << "\", TMessageType.EXCEPTION, seqid));" << endl
-               << indent() << "x.write(oprot);" << endl << indent() << "oprot.writeMessageEnd();"
-               << endl << indent() << "oprot.getTransport().flush();" << endl << indent()
-               << "return;" << endl;
+               << '\n' << indent() << "oprot.writeMessageBegin(new TMessage(\""
+               << tfunction->get_name() << "\", TMessageType.EXCEPTION, seqid));" << '\n'
+               << indent() << "x.write(oprot);" << '\n' << indent() << "oprot.writeMessageEnd();"
+               << '\n' << indent() << "oprot.getTransport().flush();" << '\n' << indent()
+               << "return;" << '\n';
     indent_down();
-    f_service_ << indent() << "}" << endl;
+    f_service_ << indent() << "}" << '\n';
   }
 
   // Shortcut out here for oneway functions
   if (tfunction->is_oneway()) {
-    f_service_ << indent() << "return;" << endl;
+    f_service_ << indent() << "return;" << '\n';
     scope_down(f_service_);
 
     // Close class
     indent_down();
-    f_service_ << indent() << "}" << endl << endl;
+    f_service_ << indent() << "}" << '\n' << '\n';
     return;
   }
 
   f_service_ << indent() << "oprot.writeMessageBegin(new TMessage(\"" << tfunction->get_name()
-             << "\", TMessageType.REPLY, seqid));" << endl << indent() << "result.write(oprot);"
-             << endl << indent() << "oprot.writeMessageEnd();" << endl << indent()
-             << "oprot.getTransport().flush();" << endl;
+             << "\", TMessageType.REPLY, seqid));" << '\n' << indent() << "result.write(oprot);"
+             << '\n' << indent() << "oprot.writeMessageEnd();" << '\n' << indent()
+             << "oprot.getTransport().flush();" << '\n';
 
   // Close function
   scope_down(f_service_);
-  f_service_ << endl;
+  f_service_ << '\n';
 
   // Close class
   indent_down();
-  f_service_ << indent() << "}" << endl << endl;
+  f_service_ << indent() << "}" << '\n' << '\n';
 }
 
 /**
@@ -2441,11 +2439,11 @@
     default:
       throw "compiler error: no Java name for base type " + t_base_type::t_base_name(tbase);
     }
-    out << endl;
+    out << '\n';
   } else if (type->is_enum()) {
     indent(out) << name << " = "
                 << type_name(tfield->get_type(), true, false) + ".findByValue(iprot.readI32());"
-                << endl;
+                << '\n';
   } else {
     printf("DO NOT KNOW HOW TO DESERIALIZE FIELD '%s' TYPE '%s'\n",
            tfield->get_name().c_str(),
@@ -2459,8 +2457,8 @@
 void t_javame_generator::generate_deserialize_struct(ostream& out,
                                                      t_struct* tstruct,
                                                      string prefix) {
-  out << indent() << prefix << " = new " << type_name(tstruct) << "();" << endl << indent()
-      << prefix << ".read(iprot);" << endl;
+  out << indent() << prefix << " = new " << type_name(tstruct) << "();" << '\n' << indent()
+      << prefix << ".read(iprot);" << '\n';
 }
 
 /**
@@ -2483,23 +2481,23 @@
 
   // Declare variables, read header
   if (ttype->is_map()) {
-    indent(out) << "TMap " << obj << " = iprot.readMapBegin();" << endl;
+    indent(out) << "TMap " << obj << " = iprot.readMapBegin();" << '\n';
   } else if (ttype->is_set()) {
-    indent(out) << "TSet " << obj << " = iprot.readSetBegin();" << endl;
+    indent(out) << "TSet " << obj << " = iprot.readSetBegin();" << '\n';
   } else if (ttype->is_list()) {
-    indent(out) << "TList " << obj << " = iprot.readListBegin();" << endl;
+    indent(out) << "TList " << obj << " = iprot.readListBegin();" << '\n';
   }
 
   indent(out) << prefix << " = new " << type_name(ttype, false, true)
               // size the collection correctly
               << "(" << (ttype->is_list() ? "" : "2*") << obj << ".size"
-              << ");" << endl;
+              << ");" << '\n';
 
   // For loop iterates over elements
   string i = tmp("_i");
   indent(out) << "for (int " << i << " = 0; " << i << " < " << obj << ".size"
               << "; "
-              << "++" << i << ")" << endl;
+              << "++" << i << ")" << '\n';
 
   scope_up(out);
 
@@ -2515,11 +2513,11 @@
 
   // Read container end
   if (ttype->is_map()) {
-    indent(out) << "iprot.readMapEnd();" << endl;
+    indent(out) << "iprot.readMapEnd();" << '\n';
   } else if (ttype->is_set()) {
-    indent(out) << "iprot.readSetEnd();" << endl;
+    indent(out) << "iprot.readSetEnd();" << '\n';
   } else if (ttype->is_list()) {
-    indent(out) << "iprot.readListEnd();" << endl;
+    indent(out) << "iprot.readListEnd();" << '\n';
   }
 
   scope_down(out);
@@ -2536,14 +2534,14 @@
   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;
+  indent(out) << declare_field(&fkey) << '\n';
+  indent(out) << declare_field(&fval) << '\n';
 
   generate_deserialize_field(out, &fkey);
   generate_deserialize_field(out, &fval);
 
   indent(out) << prefix << ".put(" << box_type(tmap->get_key_type(), key) << ", "
-              << box_type(tmap->get_val_type(), val) << ");" << endl;
+              << box_type(tmap->get_val_type(), val) << ");" << '\n';
 }
 
 /**
@@ -2555,12 +2553,12 @@
   string elem = tmp("_elem");
   t_field felem(tset->get_elem_type(), elem);
 
-  indent(out) << declare_field(&felem) << endl;
+  indent(out) << declare_field(&felem) << '\n';
 
   generate_deserialize_field(out, &felem);
 
   indent(out) << prefix << ".put(" << box_type(tset->get_elem_type(), elem) << ", "
-              << box_type(tset->get_elem_type(), elem) << ");" << endl;
+              << box_type(tset->get_elem_type(), elem) << ");" << '\n';
 }
 
 /**
@@ -2572,11 +2570,11 @@
   string elem = tmp("_elem");
   t_field felem(tlist->get_elem_type(), elem);
 
-  indent(out) << declare_field(&felem) << endl;
+  indent(out) << declare_field(&felem) << '\n';
 
   generate_deserialize_field(out, &felem);
 
-  indent(out) << prefix << ".addElement(" << box_type(tlist->get_elem_type(), elem) << ");" << endl;
+  indent(out) << prefix << ".addElement(" << box_type(tlist->get_elem_type(), elem) << ");" << '\n';
 }
 
 /**
@@ -2598,7 +2596,7 @@
   } else if (type->is_container()) {
     generate_serialize_container(out, type, prefix + tfield->get_name());
   } else if (type->is_enum()) {
-    indent(out) << "oprot.writeI32(" << prefix + tfield->get_name() << ".getValue());" << endl;
+    indent(out) << "oprot.writeI32(" << prefix + tfield->get_name() << ".getValue());" << '\n';
   } else if (type->is_base_type()) {
     string name = prefix + tfield->get_name();
     indent(out) << "oprot.";
@@ -2640,7 +2638,7 @@
     } else if (type->is_enum()) {
       out << "writeI32(" << name << ");";
     }
-    out << endl;
+    out << '\n';
   } else {
     printf("DO NOT KNOW HOW TO SERIALIZE FIELD '%s%s' TYPE '%s'\n",
            prefix.c_str(),
@@ -2659,7 +2657,7 @@
                                                    t_struct* tstruct,
                                                    string prefix) {
   (void)tstruct;
-  out << indent() << prefix << ".write(oprot);" << endl;
+  out << indent() << prefix << ".write(oprot);" << '\n';
 }
 
 /**
@@ -2674,14 +2672,14 @@
   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
-                << ".size()));" << endl;
+                << ".size()));" << '\n';
   } else if (ttype->is_set()) {
     indent(out) << "oprot.writeSetBegin(new TSet(" << type_to_enum(((t_set*)ttype)->get_elem_type())
-                << ", " << prefix << ".size()));" << endl;
+                << ", " << prefix << ".size()));" << '\n';
   } else if (ttype->is_list()) {
     indent(out) << "oprot.writeListBegin(new TList("
                 << type_to_enum(((t_list*)ttype)->get_elem_type()) << ", " << prefix << ".size()));"
-                << endl;
+                << '\n';
   }
 
   string iter = tmp("_iter");
@@ -2692,7 +2690,7 @@
                 << ".hasMoreElements(); ) ";
     scope_up(out);
     indent(out) << key_type << " " << iter << " = (" << key_type << ")" << enumer
-                << ".nextElement();" << endl;
+                << ".nextElement();" << '\n';
   } else if (ttype->is_set()) {
     string enumer = iter + "_enum";
     string ele_type = type_name(((t_list*)ttype)->get_elem_type(), true);
@@ -2700,7 +2698,7 @@
                 << ".hasMoreElements(); ) ";
     scope_up(out);
     indent(out) << ele_type << " " << iter << " = (" << ele_type << ")" << enumer
-                << ".nextElement();" << endl;
+                << ".nextElement();" << '\n';
   } else if (ttype->is_list()) {
     string enumer = iter + "_enum";
     indent(out) << "for (Enumeration " << enumer << " = " << prefix << ".elements(); " << enumer
@@ -2708,7 +2706,7 @@
     scope_up(out);
     string ele_type = type_name(((t_list*)ttype)->get_elem_type(), true);
     indent(out) << ele_type << " " << iter << " = (" << ele_type << ")" << enumer
-                << ".nextElement();" << endl;
+                << ".nextElement();" << '\n';
   }
 
   if (ttype->is_map()) {
@@ -2721,11 +2719,11 @@
   scope_down(out);
 
   if (ttype->is_map()) {
-    indent(out) << "oprot.writeMapEnd();" << endl;
+    indent(out) << "oprot.writeMapEnd();" << '\n';
   } else if (ttype->is_set()) {
-    indent(out) << "oprot.writeSetEnd();" << endl;
+    indent(out) << "oprot.writeSetEnd();" << '\n';
   } else if (ttype->is_list()) {
-    indent(out) << "oprot.writeListEnd();" << endl;
+    indent(out) << "oprot.writeListEnd();" << '\n';
   }
 
   scope_down(out);
@@ -3056,7 +3054,7 @@
     source_name = source_name_p1 + "." + source_name_p2;
 
   indent(out) << type_name(type, true, false) << " " << result_name << " = new "
-              << type_name(container, false, true) << "();" << endl;
+              << type_name(container, false, true) << "();" << '\n';
 
   std::string iterator_element_name = source_name_p1 + "_element";
   std::string enumeration_name = source_name_p1 + "_enum";
@@ -3067,19 +3065,19 @@
     t_type* val_type = ((t_map*)container)->get_val_type();
 
     indent(out) << "for (Enumeration " << enumeration_name << " = " << source_name << ".keys(); "
-                << enumeration_name << ".hasMoreElements(); ) {" << endl;
+                << enumeration_name << ".hasMoreElements(); ) {" << '\n';
     indent_up();
 
-    out << endl;
+    out << '\n';
 
     indent(out) << type_name(key_type, true, false) << " " << iterator_element_name << "_key = ("
                 << type_name(key_type, true, false) << ")" << enumeration_name << ".nextElement();"
-                << endl;
+                << '\n';
     indent(out) << type_name(val_type, true, false) << " " << iterator_element_name << "_value = ("
                 << type_name(val_type, true, false) << ")" << source_name << ".get("
-                << iterator_element_name << "_key);" << endl;
+                << iterator_element_name << "_key);" << '\n';
 
-    out << endl;
+    out << '\n';
 
     if (key_type->is_container()) {
       generate_deep_copy_container(out,
@@ -3093,10 +3091,10 @@
                                        iterator_element_name + "_key",
                                        result_element_name + "_key",
                                        key_type);
-      out << ";" << endl;
+      out << ";" << '\n';
     }
 
-    out << endl;
+    out << '\n';
 
     if (val_type->is_container()) {
       generate_deep_copy_container(out,
@@ -3110,16 +3108,16 @@
                                        iterator_element_name + "_value",
                                        result_element_name + "_value",
                                        val_type);
-      out << ";" << endl;
+      out << ";" << '\n';
     }
 
-    out << endl;
+    out << '\n';
 
     indent(out) << result_name << ".put(" << result_element_name << "_key, " << result_element_name
-                << "_value);" << endl;
+                << "_value);" << '\n';
 
     indent_down();
-    indent(out) << "}" << endl;
+    indent(out) << "}" << '\n';
 
   } else {
     t_type* elem_type;
@@ -3131,19 +3129,19 @@
     }
 
     indent(out) << "for (Enumeration " << enumeration_name << " = " << source_name
-                << ".elements(); " << enumeration_name << ".hasMoreElements(); ) {" << endl;
+                << ".elements(); " << enumeration_name << ".hasMoreElements(); ) {" << '\n';
     indent_up();
     indent(out) << type_name(elem_type, true, false) << " " << iterator_element_name << " = ("
                 << type_name(elem_type, true, false) << ")" << enumeration_name << ".nextElement();"
-                << endl;
+                << '\n';
     if (elem_type->is_container()) {
       // recursive deep copy
       generate_deep_copy_container(out, iterator_element_name, "", result_element_name, elem_type);
       if (elem_type->is_list()) {
-        indent(out) << result_name << ".addElement(" << result_element_name << ");" << endl;
+        indent(out) << result_name << ".addElement(" << result_element_name << ");" << '\n';
       } else {
         indent(out) << result_name << ".put(" << result_element_name << ", " << result_element_name
-                    << ");" << endl;
+                    << ");" << '\n';
       }
     } else {
       // iterative copy
@@ -3153,22 +3151,22 @@
                                          iterator_element_name,
                                          "temp_binary_element",
                                          elem_type);
-        out << ";" << endl;
+        out << ";" << '\n';
         if (elem_type->is_list()) {
-          indent(out) << result_name << ".addElement(temp_binary_element);" << endl;
+          indent(out) << result_name << ".addElement(temp_binary_element);" << '\n';
         } else {
-          indent(out) << result_name << ".put(temp_binary_element, temp_binary_element);" << endl;
+          indent(out) << result_name << ".put(temp_binary_element, temp_binary_element);" << '\n';
         }
       } else {
         indent(out) << result_name << ".addElement(";
         generate_deep_copy_non_container(out, iterator_element_name, result_name, elem_type);
-        out << ");" << endl;
+        out << ");" << '\n';
       }
     }
 
     indent_down();
 
-    indent(out) << "}" << endl;
+    indent(out) << "}" << '\n';
   }
 }
 
@@ -3179,7 +3177,7 @@
   if (type->is_base_type() || type->is_enum() || type->is_typedef()) {
     // binary fields need to be copied with System.arraycopy
     if (type->is_binary()) {
-      out << "new byte[" << source_name << ".length];" << endl;
+      out << "new byte[" << source_name << ".length];" << '\n';
       indent(out) << "System.arraycopy(" << source_name << ", 0, " << dest_name << ", 0, "
                   << source_name << ".length)";
     }
@@ -3206,7 +3204,7 @@
 void t_javame_generator::generate_isset_set(ostream& out, t_field* field) {
   if (!type_can_be_null(field->get_type())) {
     indent(out) << "set" << get_cap_name(field->get_name()) << get_cap_name("isSet") << "(true);"
-                << endl;
+                << '\n';
   }
 }
 
@@ -3221,7 +3219,7 @@
 
 void t_javame_generator::generate_struct_desc(ostream& out, t_struct* tstruct) {
   indent(out) << "private static final TStruct STRUCT_DESC = new TStruct(\"" << tstruct->get_name()
-              << "\");" << endl;
+              << "\");" << '\n';
 }
 
 void t_javame_generator::generate_field_descs(ostream& out, t_struct* tstruct) {
@@ -3232,7 +3230,7 @@
     indent(out) << "private static final TField " << constant_name((*m_iter)->get_name())
                 << "_FIELD_DESC = new TField(\"" << (*m_iter)->get_name() << "\", "
                 << type_to_enum((*m_iter)->get_type()) << ", "
-                << "(short)" << (*m_iter)->get_key() << ");" << endl;
+                << "(short)" << (*m_iter)->get_key() << ");" << '\n';
   }
 }
 
@@ -3249,7 +3247,7 @@
 }
 
 void t_javame_generator::generate_java_struct_clear(std::ostream& out, t_struct* tstruct) {
-  indent(out) << "public void clear() {" << endl;
+  indent(out) << "public void clear() {" << '\n';
 
   const vector<t_field*>& members = tstruct->get_members();
   vector<t_field*>::const_iterator m_iter;
@@ -3266,24 +3264,24 @@
                         true);
     } else {
       if (type_can_be_null(t)) {
-        indent(out) << "this." << (*m_iter)->get_name() << " = null;" << endl;
+        indent(out) << "this." << (*m_iter)->get_name() << " = null;" << '\n';
       } else {
         // must be a base type
         // means it also needs to be explicitly unset
         indent(out) << "set" << get_cap_name((*m_iter)->get_name()) << get_cap_name("isSet")
-                    << "(false);" << endl;
+                    << "(false);" << '\n';
         switch (((t_base_type*)t)->get_base()) {
         case t_base_type::TYPE_I8:
         case t_base_type::TYPE_I16:
         case t_base_type::TYPE_I32:
         case t_base_type::TYPE_I64:
-          indent(out) << "this." << (*m_iter)->get_name() << " = 0;" << endl;
+          indent(out) << "this." << (*m_iter)->get_name() << " = 0;" << '\n';
           break;
         case t_base_type::TYPE_DOUBLE:
-          indent(out) << "this." << (*m_iter)->get_name() << " = 0.0;" << endl;
+          indent(out) << "this." << (*m_iter)->get_name() << " = 0.0;" << '\n';
           break;
         case t_base_type::TYPE_BOOL:
-          indent(out) << "this." << (*m_iter)->get_name() << " = false;" << endl;
+          indent(out) << "this." << (*m_iter)->get_name() << " = false;" << '\n';
           break;
         default: // prevent gcc compiler warning
           break;
@@ -3293,7 +3291,7 @@
   }
   indent_down();
 
-  indent(out) << "}" << endl << endl;
+  indent(out) << "}" << '\n' << '\n';
 }
 
 std::string t_javame_generator::display_name() const {
diff --git a/compiler/cpp/src/thrift/generate/t_js_generator.cc b/compiler/cpp/src/thrift/generate/t_js_generator.cc
index 0e8da59..dfc334b 100644
--- a/compiler/cpp/src/thrift/generate/t_js_generator.cc
+++ b/compiler/cpp/src/thrift/generate/t_js_generator.cc
@@ -43,7 +43,6 @@
 using std::unordered_map;
 using std::vector;
 
-static const string endl = "\n"; // avoid ostream << std::endl flushes
 static const string episode_file_name = "thrift.js.episode";
 // largest consecutive integer representable by a double (2 ^ 53 - 1)
 static const int64_t max_safe_integer = 0x1fffffffffffff;
@@ -339,17 +338,17 @@
    * @return string The documentation
    */
   string ts_print_doc(t_doc* tdoc) {
-    string result = endl;
+    string result = "\n";
 
     if (tdoc->has_doc()) {
       std::stringstream doc(tdoc->get_doc());
       string item;
 
-      result += ts_indent() + "/**" + endl;
+      result += ts_indent() + "/**" + "\n";
       while (std::getline(doc, item)) {
-        result += ts_indent() + " * " + item + endl;
+        result += ts_indent() + " * " + item + "\n";
       }
-      result += ts_indent() + " */" + endl;
+      result += ts_indent() + " */" + "\n";
     }
     return result;
   }
@@ -457,7 +456,7 @@
   f_types_.open(f_types_name.c_str());
   if (gen_episode_file_) {
     const auto types_module = program_->get_name() + "_types";
-    f_episode_ << types_module << ":" << thrift_package_output_directory_ << "/" << types_module << endl;
+    f_episode_ << types_module << ":" << thrift_package_output_directory_ << "/" << types_module << '\n';
   }
 
   if (gen_ts_) {
@@ -469,17 +468,17 @@
   f_types_ << autogen_comment();
 
   if ((gen_node_ || gen_es6_) && no_ns_) {
-    f_types_ << "\"use strict\";" << endl << endl;
+    f_types_ << "\"use strict\";" << '\n' << '\n';
   }
 
-  f_types_ << js_includes() << endl << render_includes() << endl;
+  f_types_ << js_includes() << '\n' << render_includes() << '\n';
 
   if (gen_ts_) {
-    f_types_ts_ << autogen_comment() << ts_includes() << endl << render_ts_includes() << endl;
+    f_types_ts_ << autogen_comment() << ts_includes() << '\n' << render_ts_includes() << '\n';
   }
 
   if (gen_node_) {
-    f_types_ << js_const_type_ << "ttypes = module.exports = {};" << endl;
+    f_types_ << js_const_type_ << "ttypes = module.exports = {};" << '\n';
   }
 
   string pns;
@@ -490,11 +489,11 @@
   if (ns_pieces.size() > 0) {
     for (size_t i = 0; i < ns_pieces.size(); ++i) {
       pns += ((i == 0) ? "" : ".") + ns_pieces[i];
-      f_types_ << "if (typeof " << pns << " === 'undefined') {" << endl;
-      f_types_ << "  " << pns << " = {};" << endl;
-      f_types_ << "}" << endl;
-      f_types_ << "" << "if (typeof module !== 'undefined' && module.exports) {" << endl;
-      f_types_ << "  module.exports." << pns << " = " << pns << ";" << endl << "}" << endl;
+      f_types_ << "if (typeof " << pns << " === 'undefined') {" << '\n';
+      f_types_ << "  " << pns << " = {};" << '\n';
+      f_types_ << "}" << '\n';
+      f_types_ << "" << "if (typeof module !== 'undefined' && module.exports) {" << '\n';
+      f_types_ << "  module.exports." << pns << " = " << pns << ";" << '\n' << "}" << '\n';
     }
     if (gen_ts_) {
       ts_module_ = pns;
@@ -639,11 +638,11 @@
  * @param tenum The enumeration
  */
 void t_js_generator::generate_enum(t_enum* tenum) {
-  f_types_ << js_type_namespace(tenum->get_program()) << tenum->get_name() << " = {" << endl;
+  f_types_ << js_type_namespace(tenum->get_program()) << tenum->get_name() << " = {" << '\n';
 
   if (gen_ts_) {
     f_types_ts_ << ts_print_doc(tenum) << ts_indent() << ts_declare() << "enum "
-                << tenum->get_name() << " {" << endl;
+                << tenum->get_name() << " {" << '\n';
   }
 
   indent_up();
@@ -653,23 +652,23 @@
   for (c_iter = constants.begin(); c_iter != constants.end(); ++c_iter) {
     int value = (*c_iter)->get_value();
     if (gen_ts_) {
-      f_types_ts_ << ts_indent() << (*c_iter)->get_name() << " = " << value << "," << endl;
+      f_types_ts_ << ts_indent() << (*c_iter)->get_name() << " = " << value << "," << '\n';
       // add 'value: key' in addition to 'key: value' for TypeScript enums
-      f_types_ << indent() << "'" << value << "' : '" << (*c_iter)->get_name() << "'," << endl;
+      f_types_ << indent() << "'" << value << "' : '" << (*c_iter)->get_name() << "'," << '\n';
     }
     f_types_ << indent() << "'" << (*c_iter)->get_name() << "' : " << value;
     if (c_iter != constants.end() - 1) {
       f_types_ << ",";
     }
-    f_types_ << endl;
+    f_types_ << '\n';
   }
 
   indent_down();
 
-  f_types_ << "};" << endl;
+  f_types_ << "};" << '\n';
 
   if (gen_ts_) {
-    f_types_ts_ << ts_indent() << "}" << endl;
+    f_types_ts_ << ts_indent() << "}" << '\n';
   }
 }
 
@@ -682,11 +681,11 @@
   t_const_value* value = tconst->get_value();
 
   f_types_ << js_type_namespace(program_) << name << " = ";
-  f_types_ << render_const_value(type, value) << ";" << endl;
+  f_types_ << render_const_value(type, value) << ";" << '\n';
 
   if (gen_ts_) {
     f_types_ts_ << ts_print_doc(tconst) << ts_indent() << ts_declare() << js_const_type_ << name << ": "
-                << ts_get_type(type) << ";" << endl;
+                << ts_get_type(type) << ";" << '\n';
   }
 }
 
@@ -755,24 +754,24 @@
       }
       if (v_iter != val.begin())
         out << ",";
-      out << endl << indent() << render_const_value(g_type_string, v_iter->first);
+      out << '\n' << indent() << render_const_value(g_type_string, v_iter->first);
       out << " : ";
       out << render_const_value(field_type, v_iter->second);
     }
     indent_down();
-    out << endl << indent() << "})";
+    out << '\n' << indent() << "})";
   } else if (type->is_map()) {
     t_type* ktype = ((t_map*)type)->get_key_type();
 
     t_type* vtype = ((t_map*)type)->get_val_type();
-    out << "{" << endl;
+    out << "{" << '\n';
     indent_up();
 
     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) {
       if (v_iter != val.begin())
-        out << "," << endl;
+        out << "," << '\n';
 
       if (ktype->is_base_type() && ((t_base_type*)get_true_type(ktype))->get_base() == t_base_type::TYPE_I64){
         out << indent() << "\"" << v_iter->first->get_integer() << "\"";
@@ -784,7 +783,7 @@
       out << render_const_value(vtype, v_iter->second);
     }
     indent_down();
-    out << endl << indent() << "}";
+    out << '\n' << indent() << "}";
   } else if (type->is_list() || type->is_set()) {
     t_type* etype;
     if (type->is_list()) {
@@ -866,27 +865,27 @@
     if (gen_ts_) {
       f_types_ts_ << ts_print_doc(tstruct) << ts_indent() << ts_declare() << "class "
                   << tstruct->get_name() << (is_exception ? " extends Thrift.TException" : "")
-                  << " {" << endl;
+                  << " {" << '\n';
     }
   } else {
     out << js_namespace(tstruct->get_program()) << tstruct->get_name();
     if (gen_ts_) {
       f_types_ts_ << ts_print_doc(tstruct) << ts_indent() << ts_declare() << "class "
                   << tstruct->get_name() << (is_exception ? " extends Thrift.TException" : "")
-                  << " {" << endl;
+                  << " {" << '\n';
     }
   }
 
   if (gen_es6_) {
     if (gen_node_ && is_exception) {
-      out << " = class extends Thrift.TException {" << endl;
+      out << " = class extends Thrift.TException {" << '\n';
     } else {
-      out << " = class {" << endl;
+      out << " = class {" << '\n';
     }
     indent_up();
-    indent(out) << "constructor(args) {" << endl;
+    indent(out) << "constructor(args) {" << '\n';
   } else {
-    out << " = function(args) {" << endl;
+    out << " = function(args) {" << '\n';
   }
 
   indent_up();
@@ -894,13 +893,13 @@
   // Call super() method on inherited Error class
   if (gen_node_ && is_exception) {
     if (gen_es6_) {
-      indent(out) << "super(args);" << endl;
+      indent(out) << "super(args);" << '\n';
     } else {
       indent(out) << "Thrift.TException.call(this, \"" << js_namespace(tstruct->get_program())
-        << tstruct->get_name() << "\");" << endl;
+        << tstruct->get_name() << "\");" << '\n';
     }
     out << indent() << "this.name = \"" << js_namespace(tstruct->get_program())
-        << tstruct->get_name() << "\";" << endl;
+        << tstruct->get_name() << "\";" << '\n';
   }
 
   // members with arguments
@@ -909,9 +908,9 @@
     t_type* t = get_true_type((*m_iter)->get_type());
     if ((*m_iter)->get_value() != nullptr && !(t->is_struct() || t->is_xception())) {
       dval = render_const_value((*m_iter)->get_type(), (*m_iter)->get_value());
-      out << indent() << "this." << (*m_iter)->get_name() << " = " << dval << ";" << endl;
+      out << indent() << "this." << (*m_iter)->get_name() << " = " << dval << ";" << '\n';
     } else {
-      out << indent() << dval << ";" << endl;
+      out << indent() << dval << ";" << '\n';
     }
     if (gen_ts_) {
       string ts_access = gen_node_ ? "public " : "";
@@ -919,11 +918,11 @@
 
       // Special case. Exceptions derive from Error, and error has a non optional message field.
       // Ignore the optional flag in this case, otherwise we will generate a incompatible field
-      // in the eyes of typescript. 
+      // in the eyes of typescript.
       string optional_flag = is_exception && member_name == "message" ? "" : ts_get_req(*m_iter);
- 
+
       f_types_ts_ << ts_indent() << ts_access << member_name << optional_flag << ": "
-                  << ts_get_type((*m_iter)->get_type()) << ";" << endl;
+                  << ts_get_type((*m_iter)->get_type()) << ";" << '\n';
     }
   }
 
@@ -934,7 +933,7 @@
       t_type* t = get_true_type((*m_iter)->get_type());
       if ((*m_iter)->get_value() != nullptr && (t->is_struct() || t->is_xception())) {
         indent(out) << "this." << (*m_iter)->get_name() << " = "
-                    << render_const_value(t, (*m_iter)->get_value()) << ";" << endl;
+                    << render_const_value(t, (*m_iter)->get_value()) << ";" << '\n';
       }
     }
 
@@ -943,28 +942,28 @@
       t_type* t = get_true_type((*m_iter)->get_type());
       if (t->is_xception()) {
         out << indent() << "if (args instanceof " << js_type_namespace(t->get_program())
-            << t->get_name() << ") {" << endl << indent() << indent() << "this."
-            << (*m_iter)->get_name() << " = args;" << endl << indent() << indent() << "return;"
-            << endl << indent() << "}" << endl;
+            << t->get_name() << ") {" << '\n' << indent() << indent() << "this."
+            << (*m_iter)->get_name() << " = args;" << '\n' << indent() << indent() << "return;"
+            << '\n' << indent() << "}" << '\n';
       }
     }
 
-    indent(out) << "if (args) {" << endl;
+    indent(out) << "if (args) {" << '\n';
     indent_up();
     if (gen_ts_) {
-      f_types_ts_ << endl << ts_indent() << "constructor(args?: { ";
+      f_types_ts_ << '\n' << ts_indent() << "constructor(args?: { ";
     }
 
     for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
       t_type* t = get_true_type((*m_iter)->get_type());
-      indent(out) << "if (args." << (*m_iter)->get_name() << " !== undefined && args." << (*m_iter)->get_name() << " !== null) {" << endl;
+      indent(out) << "if (args." << (*m_iter)->get_name() << " !== undefined && args." << (*m_iter)->get_name() << " !== null) {" << '\n';
       indent_up();
       indent(out) << "this." << (*m_iter)->get_name();
 
       if (t->is_struct()) {
         out << (" = new " + js_type_namespace(t->get_program()) + t->get_name() +
                 "(args."+(*m_iter)->get_name() +");");
-        out << endl;
+        out << '\n';
       } else if (t->is_container()) {
         t_type* etype = get_contained_type(t);
         string copyFunc = t->is_map() ? "Thrift.copyMap" : "Thrift.copyList";
@@ -993,53 +992,53 @@
 
         out << (" = " + copyFunc + "(args." + (*m_iter)->get_name() +
                 ", [" + type_list + "]);");
-        out << endl;
+        out << '\n';
       } else {
-        out << " = args." << (*m_iter)->get_name() << ";" << endl;
+        out << " = args." << (*m_iter)->get_name() << ";" << '\n';
       }
 
       indent_down();
       if (!(*m_iter)->get_req()) {
-        indent(out) << "} else {" << endl;
+        indent(out) << "} else {" << '\n';
          indent(out)
             << "  throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, "
-               "'Required field " << (*m_iter)->get_name() << " is unset!');" << endl;
+               "'Required field " << (*m_iter)->get_name() << " is unset!');" << '\n';
       }
-      indent(out) << "}" << endl;
+      indent(out) << "}" << '\n';
       if (gen_ts_) {
         f_types_ts_ << (*m_iter)->get_name() << ts_get_req(*m_iter) << ": "
                     << ts_get_type((*m_iter)->get_type()) << "; ";
       }
     }
     indent_down();
-    out << indent() << "}" << endl;
+    out << indent() << "}" << '\n';
     if (gen_ts_) {
-      f_types_ts_ << "});" << endl;
+      f_types_ts_ << "});" << '\n';
     }
   }
 
   // Done with constructor
   indent_down();
   if (gen_es6_) {
-    indent(out) << "}" << endl << endl;
+    indent(out) << "}" << '\n' << '\n';
   } else {
-    indent(out) << "};" << endl;
+    indent(out) << "};" << '\n';
   }
 
   if (gen_ts_) {
-    f_types_ts_ << ts_indent() << "}" << endl;
+    f_types_ts_ << ts_indent() << "}" << '\n';
   }
 
   if (!gen_es6_) {
     if (is_exception) {
       out << "Thrift.inherits(" << js_namespace(tstruct->get_program()) << tstruct->get_name()
-          << ", Thrift.TException);" << endl;
+          << ", Thrift.TException);" << '\n';
       out << js_namespace(tstruct->get_program()) << tstruct->get_name() << ".prototype.name = '"
-          << tstruct->get_name() << "';" << endl;
+          << tstruct->get_name() << "';" << '\n';
     } else {
       // init prototype manually if we aren't using es6
       out << js_namespace(tstruct->get_program()) << tstruct->get_name() << ".prototype = {};"
-          << endl;
+          << '\n';
     }
 
   }
@@ -1050,7 +1049,7 @@
   // Close out the class definition
   if (gen_es6_) {
     indent_down();
-    indent(out) << "};" << endl;
+    indent(out) << "};" << '\n';
   }
 }
 
@@ -1062,84 +1061,84 @@
   vector<t_field*>::const_iterator f_iter;
 
   if (gen_es6_) {
-    indent(out) << "read (input) {" << endl;
+    indent(out) << "read (input) {" << '\n';
   } else {
     indent(out) << js_namespace(tstruct->get_program()) << tstruct->get_name()
-        << ".prototype.read = function(input) {" << endl;
+        << ".prototype.read = function(input) {" << '\n';
   }
 
   indent_up();
 
-  indent(out) << "input.readStructBegin();" << endl;
+  indent(out) << "input.readStructBegin();" << '\n';
 
   // Loop over reading in fields
-  indent(out) << "while (true) {" << endl;
+  indent(out) << "while (true) {" << '\n';
 
   indent_up();
 
-  indent(out) << js_const_type_ << "ret = input.readFieldBegin();" << endl;
-  indent(out) << js_const_type_ << "ftype = ret.ftype;" << endl;
+  indent(out) << js_const_type_ << "ret = input.readFieldBegin();" << '\n';
+  indent(out) << js_const_type_ << "ftype = ret.ftype;" << '\n';
   if (!fields.empty()) {
-    indent(out) << js_const_type_ << "fid = ret.fid;" << endl;
+    indent(out) << js_const_type_ << "fid = ret.fid;" << '\n';
   }
 
   // Check for field STOP marker and break
-  indent(out) << "if (ftype == Thrift.Type.STOP) {" << endl;
+  indent(out) << "if (ftype == Thrift.Type.STOP) {" << '\n';
   indent_up();
-  indent(out) << "break;" << endl;
+  indent(out) << "break;" << '\n';
   indent_down();
-  indent(out) << "}" << endl;
+  indent(out) << "}" << '\n';
   if (!fields.empty()) {
     // Switch statement on the field we are reading
-    indent(out) << "switch (fid) {" << endl;
+    indent(out) << "switch (fid) {" << '\n';
 
     indent_up();
 
     // Generate deserialization code for known cases
     for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
 
-      indent(out) << "case " << (*f_iter)->get_key() << ":" << endl;
-      indent(out) << "if (ftype == " << type_to_enum((*f_iter)->get_type()) << ") {" << endl;
+      indent(out) << "case " << (*f_iter)->get_key() << ":" << '\n';
+      indent(out) << "if (ftype == " << type_to_enum((*f_iter)->get_type()) << ") {" << '\n';
 
       indent_up();
       generate_deserialize_field(out, *f_iter, "this.");
       indent_down();
 
-      indent(out) << "} else {" << endl;
+      indent(out) << "} else {" << '\n';
 
-      indent(out) << "  input.skip(ftype);" << endl;
+      indent(out) << "  input.skip(ftype);" << '\n';
 
-      out << indent() << "}" << endl << indent() << "break;" << endl;
+      out << indent() << "}" << '\n' << indent() << "break;" << '\n';
     }
     if (fields.size() == 1) {
       // pseudo case to make jslint happy
-      indent(out) << "case 0:" << endl;
-      indent(out) << "  input.skip(ftype);" << endl;
-      indent(out) << "  break;" << endl;
+      indent(out) << "case 0:" << '\n';
+      indent(out) << "  input.skip(ftype);" << '\n';
+      indent(out) << "  break;" << '\n';
     }
     // In the default case we skip the field
-    indent(out) << "default:" << endl;
-    indent(out) << "  input.skip(ftype);" << endl;
+    indent(out) << "default:" << '\n';
+    indent(out) << "  input.skip(ftype);" << '\n';
 
     scope_down(out);
   } else {
-    indent(out) << "input.skip(ftype);" << endl;
+    indent(out) << "input.skip(ftype);" << '\n';
   }
 
-  indent(out) << "input.readFieldEnd();" << endl;
+  indent(out) << "input.readFieldEnd();" << '\n';
 
   scope_down(out);
 
-  indent(out) << "input.readStructEnd();" << endl;
+  indent(out) << "input.readStructEnd();" << '\n';
 
-  indent(out) << "return;" << endl;
+  indent(out) << "return;" << '\n';
 
   indent_down();
 
   if (gen_es6_) {
-    indent(out) << "}" << endl << endl;
+    indent(out) << "}" << '\n' << '\n';
   } else {
-    indent(out) << "};" << endl << endl;
+    indent(out) << "};" << '\n' << '\n';
   }
 }
 
@@ -1152,44 +1151,44 @@
   vector<t_field*>::const_iterator f_iter;
 
   if (gen_es6_) {
-    indent(out) << "write (output) {" << endl;
+    indent(out) << "write (output) {" << '\n';
   } else {
     indent(out) << js_namespace(tstruct->get_program()) << tstruct->get_name()
-        << ".prototype.write = function(output) {" << endl;
+        << ".prototype.write = function(output) {" << '\n';
   }
 
   indent_up();
 
-  indent(out) << "output.writeStructBegin('" << name << "');" << endl;
+  indent(out) << "output.writeStructBegin('" << name << "');" << '\n';
 
   for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
     out << indent() << "if (this." << (*f_iter)->get_name() << " !== null && this."
-        << (*f_iter)->get_name() << " !== undefined) {" << endl;
+        << (*f_iter)->get_name() << " !== undefined) {" << '\n';
     indent_up();
 
     indent(out) << "output.writeFieldBegin("
                 << "'" << (*f_iter)->get_name() << "', " << type_to_enum((*f_iter)->get_type())
-                << ", " << (*f_iter)->get_key() << ");" << endl;
+                << ", " << (*f_iter)->get_key() << ");" << '\n';
 
     // Write field contents
     generate_serialize_field(out, *f_iter, "this.");
 
-    indent(out) << "output.writeFieldEnd();" << endl;
+    indent(out) << "output.writeFieldEnd();" << '\n';
 
     indent_down();
-    indent(out) << "}" << endl;
+    indent(out) << "}" << '\n';
   }
 
-  out << indent() << "output.writeFieldStop();" << endl << indent() << "output.writeStructEnd();"
-      << endl;
+  out << indent() << "output.writeFieldStop();" << '\n' << indent() << "output.writeStructEnd();"
+      << '\n';
 
-  out << indent() << "return;" << endl;
+  out << indent() << "return;" << '\n';
 
   indent_down();
   if (gen_es6_) {
-    out << indent() << "}" << endl << endl;
+    out << indent() << "}" << '\n' << '\n';
   } else {
-    out << indent() << "};" << endl << endl;
+    out << indent() << "};" << '\n' << '\n';
   }
 }
 
@@ -1202,7 +1201,7 @@
   string f_service_name = get_out_dir() + service_name_ + ".js";
   f_service_.open(f_service_name.c_str());
   if (gen_episode_file_) {
-    f_episode_ << service_name_ << ":" << thrift_package_output_directory_ << "/" << service_name_ << endl;
+    f_episode_ << service_name_ << ":" << thrift_package_output_directory_ << "/" << service_name_ << '\n';
   }
 
   if (gen_ts_) {
@@ -1213,58 +1212,58 @@
   f_service_ << autogen_comment();
 
   if ((gen_node_ || gen_es6_) && no_ns_) {
-    f_service_ << "\"use strict\";" << endl << endl;
+    f_service_ << "\"use strict\";" << '\n' << '\n';
   }
 
-  f_service_ << js_includes() << endl << render_includes() << endl;
+  f_service_ << js_includes() << '\n' << render_includes() << '\n';
 
   if (gen_ts_) {
     if (tservice->get_extends() != nullptr) {
       f_service_ts_ << "/// <reference path=\"" << tservice->get_extends()->get_name()
-                    << ".d.ts\" />" << endl;
+                    << ".d.ts\" />" << '\n';
     }
-    f_service_ts_ << autogen_comment() << endl << ts_includes() << endl << render_ts_includes() << endl;
+    f_service_ts_ << autogen_comment() << '\n' << ts_includes() << '\n' << render_ts_includes() << '\n';
     if (gen_node_) {
-      f_service_ts_ << "import ttypes = require('./" + program_->get_name() + "_types');" << endl;
+      f_service_ts_ << "import ttypes = require('./" + program_->get_name() + "_types');" << '\n';
       // Generate type aliases
       // enum
       vector<t_enum*> const& enums = program_->get_enums();
       vector<t_enum*>::const_iterator e_iter;
       for (e_iter = enums.begin(); e_iter != enums.end(); ++e_iter) {
         f_service_ts_ << "import " << (*e_iter)->get_name() << " = ttypes."
-                  << js_namespace(program_) << (*e_iter)->get_name() << endl;
+                  << js_namespace(program_) << (*e_iter)->get_name() << '\n';
       }
       // const
       vector<t_const*> const& consts = program_->get_consts();
       vector<t_const*>::const_iterator c_iter;
       for (c_iter = consts.begin(); c_iter != consts.end(); ++c_iter) {
         f_service_ts_ << "import " << (*c_iter)->get_name() << " = ttypes."
-                  << js_namespace(program_) << (*c_iter)->get_name() << endl;
+                  << js_namespace(program_) << (*c_iter)->get_name() << '\n';
       }
       // exception
       vector<t_struct*> const& exceptions = program_->get_xceptions();
       vector<t_struct*>::const_iterator x_iter;
       for (x_iter = exceptions.begin(); x_iter != exceptions.end(); ++x_iter) {
         f_service_ts_ << "import " << (*x_iter)->get_name() << " = ttypes."
-                  << js_namespace(program_) << (*x_iter)->get_name() << endl;
+                  << js_namespace(program_) << (*x_iter)->get_name() << '\n';
       }
       // structs
       vector<t_struct*> const& structs = program_->get_structs();
       vector<t_struct*>::const_iterator s_iter;
       for (s_iter = structs.begin(); s_iter != structs.end(); ++s_iter) {
         f_service_ts_ << "import " << (*s_iter)->get_name() << " = ttypes."
-                  << js_namespace(program_) << (*s_iter)->get_name() << endl;
+                  << js_namespace(program_) << (*s_iter)->get_name() << '\n';
       }
     } else {
-      f_service_ts_ << "import { " << program_->get_name() << " } from \"./" << program_->get_name() << "_types\";" << endl << endl;
+      f_service_ts_ << "import { " << program_->get_name() << " } from \"./" << program_->get_name() << "_types\";" << '\n' << '\n';
     }
     if (!ts_module_.empty()) {
       if (gen_node_) {
         f_service_ts_ << "declare module " << ts_module_ << " {";
       } else {
-        f_service_ts_ << "declare module \"./" << program_->get_name() << "_types\" {" << endl;
+        f_service_ts_ << "declare module \"./" << program_->get_name() << "_types\" {" << '\n';
         indent_up();
-        f_service_ts_ << ts_indent() << "module " << program_->get_name() << " {" << endl;
+        f_service_ts_ << ts_indent() << "module " << program_->get_name() << " {" << '\n';
         indent_up();
       }
     }
@@ -1273,17 +1272,17 @@
   if (gen_node_) {
     if (tservice->get_extends() != nullptr) {
       f_service_ << js_const_type_ <<  tservice->get_extends()->get_name() << " = require('./"
-                 << tservice->get_extends()->get_name() << "');" << endl << js_const_type_
+                 << tservice->get_extends()->get_name() << "');" << '\n' << js_const_type_
                  << tservice->get_extends()->get_name()
-                 << "Client = " << tservice->get_extends()->get_name() << ".Client;" << endl
+                 << "Client = " << tservice->get_extends()->get_name() << ".Client;" << '\n'
                  << js_const_type_ << tservice->get_extends()->get_name()
-                 << "Processor = " << tservice->get_extends()->get_name() << ".Processor;" << endl;
+                 << "Processor = " << tservice->get_extends()->get_name() << ".Processor;" << '\n';
 
       f_service_ts_ << "import " << tservice->get_extends()->get_name() << " = require('./"
-                    << tservice->get_extends()->get_name() << "');" << endl;
+                    << tservice->get_extends()->get_name() << "');" << '\n';
     }
 
-    f_service_ << js_const_type_ << "ttypes = require('./" + program_->get_name() + "_types');" << endl;
+    f_service_ << js_const_type_ << "ttypes = require('./" + program_->get_name() + "_types');" << '\n';
   }
 
   generate_service_helpers(tservice);
@@ -1298,11 +1297,11 @@
   if (gen_ts_) {
     if (!ts_module_.empty()) {
       if (gen_node_) {
-        f_service_ts_ << "}" << endl;
+        f_service_ts_ << "}" << '\n';
       } else {
         indent_down();
-        f_service_ts_ << ts_indent() << "}" << endl;
-        f_service_ts_ << "}" << endl;
+        f_service_ts_ << ts_indent() << "}" << '\n';
+        f_service_ts_ << "}" << '\n';
       }
     }
     f_service_ts_.close();
@@ -1322,18 +1321,18 @@
     string prefix = has_js_namespace(tservice->get_program()) ? js_namespace(tservice->get_program()) : js_const_type_;
     f_service_ << prefix << service_name_ << "Processor = " << "exports.Processor";
     if (gen_ts_) {
-      f_service_ts_ << endl << "declare class Processor ";
+      f_service_ts_ << '\n' << "declare class Processor ";
       if (tservice->get_extends() != nullptr) {
         f_service_ts_ << "extends " << tservice->get_extends()->get_name() << ".Processor ";
       }
-      f_service_ts_ << "{" << endl;
+      f_service_ts_ << "{" << '\n';
       indent_up();
 
       if(tservice->get_extends() == nullptr) {
-        f_service_ts_ << ts_indent() << "private _handler: object;" << endl << endl;
+        f_service_ts_ << ts_indent() << "private _handler: object;" << '\n' << '\n';
       }
-      f_service_ts_ << ts_indent() << "constructor(handler: object);" << endl;
-      f_service_ts_ << ts_indent() << "process(input: thrift.TProtocol, output: thrift.TProtocol): void;" << endl;
+      f_service_ts_ << ts_indent() << "constructor(handler: object);" << '\n';
+      f_service_ts_ << ts_indent() << "process(input: thrift.TProtocol, output: thrift.TProtocol): void;" << '\n';
       indent_down();
     }
   } else {
@@ -1346,65 +1345,65 @@
   // ES6 Constructor
   if (gen_es6_) {
     if (is_subclass_service) {
-      f_service_ << " = class " << service_name_ << "Processor extends " << tservice->get_extends()->get_name() << "Processor {" << endl;
+      f_service_ << " = class " << service_name_ << "Processor extends " << tservice->get_extends()->get_name() << "Processor {" << '\n';
     } else {
-      f_service_ << " = class " << service_name_ << "Processor {" << endl;
+      f_service_ << " = class " << service_name_ << "Processor {" << '\n';
     }
     indent_up();
-    indent(f_service_) << "constructor(handler) {" << endl;
+    indent(f_service_) << "constructor(handler) {" << '\n';
   } else {
-    f_service_ << " = function(handler) {" << endl;
+    f_service_ << " = function(handler) {" << '\n';
   }
 
   indent_up();
   if (gen_es6_ && is_subclass_service) {
-    indent(f_service_) << "super(handler);" << endl;
+    indent(f_service_) << "super(handler);" << '\n';
   }
-  indent(f_service_) << "this._handler = handler;" << endl;
+  indent(f_service_) << "this._handler = handler;" << '\n';
   indent_down();
 
   // Done with constructor
   if (gen_es6_) {
-    indent(f_service_) << "}" << endl;
+    indent(f_service_) << "}" << '\n';
   } else {
-    indent(f_service_) << "};" << endl;
+    indent(f_service_) << "};" << '\n';
   }
 
   // ES5 service inheritance
   if (!gen_es6_ && is_subclass_service) {
     indent(f_service_) << "Thrift.inherits(" << js_namespace(tservice->get_program())
                        << service_name_ << "Processor, " << tservice->get_extends()->get_name()
-                       << "Processor);" << endl;
+                       << "Processor);" << '\n';
   }
 
   // Generate the server implementation
   if (gen_es6_) {
-    indent(f_service_) << "process (input, output) {" << endl;
+    indent(f_service_) << "process (input, output) {" << '\n';
   } else {
     indent(f_service_) << js_namespace(tservice->get_program()) << service_name_
-                      << "Processor.prototype.process = function(input, output) {" << endl;
+                      << "Processor.prototype.process = function(input, output) {" << '\n';
   }
 
   indent_up();
 
-  indent(f_service_) << js_const_type_ << "r = input.readMessageBegin();" << endl << indent()
-             << "if (this['process_' + r.fname]) {" << endl << indent()
-             << "  return this['process_' + r.fname].call(this, r.rseqid, input, output);" << endl
-             << indent() << "} else {" << endl << indent() << "  input.skip(Thrift.Type.STRUCT);"
-             << endl << indent() << "  input.readMessageEnd();" << endl << indent()
+  indent(f_service_) << js_const_type_ << "r = input.readMessageBegin();" << '\n' << indent()
+             << "if (this['process_' + r.fname]) {" << '\n' << indent()
+             << "  return this['process_' + r.fname].call(this, r.rseqid, input, output);" << '\n'
+             << indent() << "} else {" << '\n' << indent() << "  input.skip(Thrift.Type.STRUCT);"
+             << '\n' << indent() << "  input.readMessageEnd();" << '\n' << indent()
              << "  " << js_const_type_ << "x = new "
                 "Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN_METHOD, "
-                "'Unknown function ' + r.fname);" << endl << indent()
+                "'Unknown function ' + r.fname);" << '\n' << indent()
              << "  output.writeMessageBegin(r.fname, Thrift.MessageType.EXCEPTION, r.rseqid);"
-             << endl << indent() << "  x.write(output);" << endl << indent()
-             << "  output.writeMessageEnd();" << endl << indent() << "  output.flush();" << endl
-             << indent() << "}" << endl;
+             << '\n' << indent() << "  x.write(output);" << '\n' << indent()
+             << "  output.writeMessageEnd();" << '\n' << indent() << "  output.flush();" << '\n'
+             << indent() << "}" << '\n';
 
   indent_down();
   if (gen_es6_) {
-    indent(f_service_) << "}" << endl;
+    indent(f_service_) << "}" << '\n';
   } else {
-    indent(f_service_) << "};" << endl;
+    indent(f_service_) << "};" << '\n';
   }
 
   // Generate the process subfunctions
@@ -1415,10 +1414,10 @@
   // Close off the processor class definition
   if (gen_es6_) {
     indent_down();
-    indent(f_service_) << "};" << endl;
+    indent(f_service_) << "};" << '\n';
   }
   if (gen_node_ && gen_ts_) {
-    f_service_ts_ << "}" << endl;
+    f_service_ts_ << "}" << '\n';
   }
 }
 
@@ -1429,15 +1428,15 @@
  */
 void t_js_generator::generate_process_function(t_service* tservice, t_function* tfunction) {
   if (gen_es6_) {
-    indent(f_service_) << "process_" + tfunction->get_name() + " (seqid, input, output) {" << endl;
+    indent(f_service_) << "process_" + tfunction->get_name() + " (seqid, input, output) {" << '\n';
   } else {
     indent(f_service_) << js_namespace(tservice->get_program()) << service_name_
                       << "Processor.prototype.process_" + tfunction->get_name()
-                          + " = function(seqid, input, output) {" << endl;
+                          + " = function(seqid, input, output) {" << '\n';
   }
   if (gen_ts_) {
     indent_up();
-    f_service_ts_ << ts_indent() << "process_" << tfunction->get_name() << "(seqid: number, input: thrift.TProtocol, output: thrift.TProtocol): void;" << endl;
+    f_service_ts_ << ts_indent() << "process_" << tfunction->get_name() << "(seqid: number, input: thrift.TProtocol, output: thrift.TProtocol): void;" << '\n';
     indent_down();
   }
 
@@ -1447,8 +1446,8 @@
   string resultname = js_namespace(program_) + service_name_ + "_" + tfunction->get_name()
                       + "_result";
 
-  indent(f_service_) << js_const_type_ << "args = new " << argsname << "();" << endl << indent()
-             << "args.read(input);" << endl << indent() << "input.readMessageEnd();" << endl;
+  indent(f_service_) << js_const_type_ << "args = new " << argsname << "();" << '\n' << indent()
+             << "args.read(input);" << '\n' << indent() << "input.readMessageEnd();" << '\n';
 
   // Generate the function call
   t_struct* arg_struct = tfunction->get_arglist();
@@ -1469,58 +1468,58 @@
       f_service_ << "args." << (*f_iter)->get_name();
     }
 
-    f_service_ << ");" << endl;
+    f_service_ << ");" << '\n';
     indent_down();
 
     if (gen_es6_) {
-      indent(f_service_) << "}" << endl;
+      indent(f_service_) << "}" << '\n';
     } else {
-      indent(f_service_) << "};" << endl;
+      indent(f_service_) << "};" << '\n';
     }
     return;
   }
 
   // Promise style invocation
   indent(f_service_) << "if (this._handler." << tfunction->get_name()
-             << ".length === " << fields.size() << ") {" << endl;
+             << ".length === " << fields.size() << ") {" << '\n';
   indent_up();
 
   if (gen_es6_) {
-    indent(f_service_) << "new Promise((resolve) => resolve(this._handler." << tfunction->get_name() << ".bind(this._handler)(" << endl;
+    indent(f_service_) << "new Promise((resolve) => resolve(this._handler." << tfunction->get_name() << ".bind(this._handler)(" << '\n';
   } else {
     string maybeComma = (fields.size() > 0 ? "," : "");
     indent(f_service_) << "Q.fcall(this._handler." << tfunction->get_name() << ".bind(this._handler)"
-                       << maybeComma << endl;
+                       << maybeComma << '\n';
   }
 
   indent_up();
   for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
     string maybeComma = (f_iter != fields.end() - 1 ? "," : "");
-    indent(f_service_) << "args." << (*f_iter)->get_name() << maybeComma << endl;
+    indent(f_service_) << "args." << (*f_iter)->get_name() << maybeComma << '\n';
   }
   indent_down();
 
   if (gen_es6_) {
-    indent(f_service_) << "))).then(result => {" << endl;
+    indent(f_service_) << "))).then(result => {" << '\n';
   } else {
-    indent(f_service_) << ").then(function(result) {" << endl;
+    indent(f_service_) << ").then(function(result) {" << '\n';
   }
 
   indent_up();
-  f_service_ << indent() << js_const_type_ << "result_obj = new " << resultname << "({success: result});" << endl
+  f_service_ << indent() << js_const_type_ << "result_obj = new " << resultname << "({success: result});" << '\n'
              << indent() << "output.writeMessageBegin(\"" << tfunction->get_name()
-             << "\", Thrift.MessageType.REPLY, seqid);" << endl << indent()
-             << "result_obj.write(output);" << endl << indent() << "output.writeMessageEnd();" << endl
-             << indent() << "output.flush();" << endl;
+             << "\", Thrift.MessageType.REPLY, seqid);" << '\n' << indent()
+             << "result_obj.write(output);" << '\n' << indent() << "output.writeMessageEnd();" << '\n'
+             << indent() << "output.flush();" << '\n';
   indent_down();
 
   if (gen_es6_) {
-    indent(f_service_) << "}).catch(err => {" << endl;
+    indent(f_service_) << "}).catch(err => {" << '\n';
   } else {
-    indent(f_service_) << "}).catch(function (err) {" << endl;
+    indent(f_service_) << "}).catch(function (err) {" << '\n';
   }
   indent_up();
-  indent(f_service_) << js_let_type_ << "result;" << endl;
+  indent(f_service_) << js_let_type_ << "result;" << '\n';
 
   bool has_exception = false;
   t_struct* exceptions = tfunction->get_xceptions();
@@ -1542,36 +1541,36 @@
   }
 
   if (has_exception) {
-    f_service_ << ") {" << endl;
+    f_service_ << ") {" << '\n';
     indent_up();
-    f_service_ << indent() << "result = new " << resultname << "(err);" << endl << indent()
+    f_service_ << indent() << "result = new " << resultname << "(err);" << '\n' << indent()
                << "output.writeMessageBegin(\"" << tfunction->get_name()
-               << "\", Thrift.MessageType.REPLY, seqid);" << endl;
+               << "\", Thrift.MessageType.REPLY, seqid);" << '\n';
 
     indent_down();
-    indent(f_service_) << "} else {" << endl;
+    indent(f_service_) << "} else {" << '\n';
     indent_up();
   }
 
   f_service_ << indent() << "result = new "
                             "Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN,"
-                            " err.message);" << endl << indent() << "output.writeMessageBegin(\""
-             << tfunction->get_name() << "\", Thrift.MessageType.EXCEPTION, seqid);" << endl;
+                            " err.message);" << '\n' << indent() << "output.writeMessageBegin(\""
+             << tfunction->get_name() << "\", Thrift.MessageType.EXCEPTION, seqid);" << '\n';
 
   if (has_exception) {
     indent_down();
-    indent(f_service_) << "}" << endl;
+    indent(f_service_) << "}" << '\n';
   }
 
-  f_service_ << indent() << "result.write(output);" << endl << indent()
-             << "output.writeMessageEnd();" << endl << indent() << "output.flush();" << endl;
+  f_service_ << indent() << "result.write(output);" << '\n' << indent()
+             << "output.writeMessageEnd();" << '\n' << indent() << "output.flush();" << '\n';
   indent_down();
-  indent(f_service_) << "});" << endl;
+  indent(f_service_) << "});" << '\n';
   indent_down();
   // End promise style invocation
 
   // Callback style invocation
-  indent(f_service_) << "} else {" << endl;
+  indent(f_service_) << "} else {" << '\n';
   indent_up();
   indent(f_service_) << "this._handler." << tfunction->get_name() << "(";
 
@@ -1580,12 +1579,12 @@
   }
 
   if (gen_es6_) {
-    f_service_ << "(err, result) => {" << endl;
+    f_service_ << "(err, result) => {" << '\n';
   } else {
-    f_service_ << "function (err, result) {" << endl;
+    f_service_ << "function (err, result) {" << '\n';
   }
   indent_up();
-  indent(f_service_) << js_let_type_ << "result_obj;" << endl;
+  indent(f_service_) << js_let_type_ << "result_obj;" << '\n';
 
   indent(f_service_) << "if ((err === null || typeof err === 'undefined')";
   if (has_exception) {
@@ -1597,35 +1596,35 @@
       }
     }
   }
-  f_service_ << ") {" << endl;
+  f_service_ << ") {" << '\n';
   indent_up();
   f_service_ << indent() << "result_obj = new " << resultname
-             << "((err !== null || typeof err === 'undefined') ? err : {success: result});" << endl << indent()
+             << "((err !== null || typeof err === 'undefined') ? err : {success: result});" << '\n' << indent()
              << "output.writeMessageBegin(\"" << tfunction->get_name()
-             << "\", Thrift.MessageType.REPLY, seqid);" << endl;
+             << "\", Thrift.MessageType.REPLY, seqid);" << '\n';
   indent_down();
-  indent(f_service_) << "} else {" << endl;
+  indent(f_service_) << "} else {" << '\n';
   indent_up();
   f_service_ << indent() << "result_obj = new "
                             "Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN,"
-                            " err.message);" << endl << indent() << "output.writeMessageBegin(\""
-             << tfunction->get_name() << "\", Thrift.MessageType.EXCEPTION, seqid);" << endl;
+                            " err.message);" << '\n' << indent() << "output.writeMessageBegin(\""
+             << tfunction->get_name() << "\", Thrift.MessageType.EXCEPTION, seqid);" << '\n';
   indent_down();
-  f_service_ << indent() << "}" << endl << indent() << "result_obj.write(output);" << endl << indent()
-             << "output.writeMessageEnd();" << endl << indent() << "output.flush();" << endl;
+  f_service_ << indent() << "}" << '\n' << indent() << "result_obj.write(output);" << '\n' << indent()
+             << "output.writeMessageEnd();" << '\n' << indent() << "output.flush();" << '\n';
 
   indent_down();
-  indent(f_service_) << "});" << endl;
+  indent(f_service_) << "});" << '\n';
   indent_down();
-  indent(f_service_) << "}" << endl;
+  indent(f_service_) << "}" << '\n';
   // End callback style invocation
 
   indent_down();
 
   if (gen_es6_) {
-    indent(f_service_) << "}" << endl;
+    indent(f_service_) << "}" << '\n';
   } else {
-    indent(f_service_) << "};" << endl;
+    indent(f_service_) << "};" << '\n';
   }
 }
 
@@ -1642,7 +1641,7 @@
   vector<t_function*> functions = tservice->get_functions();
   vector<t_function*>::iterator f_iter;
 
-  f_service_ << "//HELPER FUNCTIONS AND STRUCTURES" << endl << endl;
+  f_service_ << "//HELPER FUNCTIONS AND STRUCTURES" << '\n' << '\n';
 
   for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
     t_struct* ts = (*f_iter)->get_arglist();
@@ -1712,7 +1711,7 @@
       if (tservice->get_extends() != nullptr) {
         f_service_ts_ << "extends " << tservice->get_extends()->get_name() << ".Client ";
       }
-      f_service_ts_ << "{" << endl;
+      f_service_ts_ << "{" << '\n';
     }
   } else {
     f_service_ << js_namespace(tservice->get_program()) << service_name_
@@ -1723,7 +1722,7 @@
       if (is_subclass_service) {
         f_service_ts_ << "extends " << tservice->get_extends()->get_name() << "Client ";
       }
-      f_service_ts_ << "{" << endl;
+      f_service_ts_ << "{" << '\n';
     }
   }
 
@@ -1732,21 +1731,21 @@
 
     if (is_subclass_service) {
       f_service_ << " = class " << service_name_ << "Client extends " << js_namespace(tservice->get_extends()->get_program())
-                       << tservice->get_extends()->get_name() << "Client {" << endl;
+                       << tservice->get_extends()->get_name() << "Client {" << '\n';
     } else {
-      f_service_ << " = class " << service_name_ << "Client {" << endl;
+      f_service_ << " = class " << service_name_ << "Client {" << '\n';
     }
     indent_up();
     if (gen_node_) {
-      indent(f_service_) << "constructor(output, pClass) {" << endl;
+      indent(f_service_) << "constructor(output, pClass) {" << '\n';
     } else {
-      indent(f_service_) << "constructor(input, output) {" << endl;
+      indent(f_service_) << "constructor(input, output) {" << '\n';
     }
   } else {
     if (gen_node_) {
-      f_service_ << " = function(output, pClass) {" << endl;
+      f_service_ << " = function(output, pClass) {" << '\n';
     } else {
-      f_service_ << " = function(input, output) {" << endl;
+      f_service_ << " = function(input, output) {" << '\n';
     }
   }
 
@@ -1754,65 +1753,65 @@
 
   if (gen_node_) {
     if (gen_es6_ && is_subclass_service) {
-      indent(f_service_) << "super(output, pClass);" << endl;
+      indent(f_service_) << "super(output, pClass);" << '\n';
     }
-    indent(f_service_) << "this.output = output;" << endl;
-    indent(f_service_) << "this.pClass = pClass;" << endl;
-    indent(f_service_) << "this._seqid = 0;" << endl;
-    indent(f_service_) << "this._reqs = {};" << endl;
+    indent(f_service_) << "this.output = output;" << '\n';
+    indent(f_service_) << "this.pClass = pClass;" << '\n';
+    indent(f_service_) << "this._seqid = 0;" << '\n';
+    indent(f_service_) << "this._reqs = {};" << '\n';
     if (gen_ts_) {
       if(!is_subclass_service) {
-        f_service_ts_ << ts_indent() << "private output: thrift.TTransport;" << endl
-                      << ts_indent() << "private pClass: thrift.TProtocol;" << endl
-                      << ts_indent() << "private _seqid: number;" << endl
-                      << endl;
+        f_service_ts_ << ts_indent() << "private output: thrift.TTransport;" << '\n'
+                      << ts_indent() << "private pClass: thrift.TProtocol;" << '\n'
+                      << ts_indent() << "private _seqid: number;" << '\n'
+                      << '\n';
       }
 
       f_service_ts_ << ts_indent() << "constructor(output: thrift.TTransport, pClass: { new(trans: thrift.TTransport): thrift.TProtocol });"
-                    << endl;
+                    << '\n';
     }
   } else {
-    indent(f_service_) << "this.input = input;" << endl;
-    indent(f_service_) << "this.output = (!output) ? input : output;" << endl;
-    indent(f_service_) << "this.seqid = 0;" << endl;
+    indent(f_service_) << "this.input = input;" << '\n';
+    indent(f_service_) << "this.output = (!output) ? input : output;" << '\n';
+    indent(f_service_) << "this.seqid = 0;" << '\n';
     if (gen_ts_) {
-      f_service_ts_ << ts_indent() << "input: Thrift.TJSONProtocol;" << endl << ts_indent()
-                    << "output: Thrift.TJSONProtocol;" << endl << ts_indent() << "seqid: number;"
-                    << endl << endl << ts_indent()
+      f_service_ts_ << ts_indent() << "input: Thrift.TJSONProtocol;" << '\n' << ts_indent()
+                    << "output: Thrift.TJSONProtocol;" << '\n' << ts_indent() << "seqid: number;"
+                    << '\n' << '\n' << ts_indent()
                     << "constructor(input: Thrift.TJSONProtocol, output?: Thrift.TJSONProtocol);"
-                    << endl;
+                    << '\n';
     }
   }
 
   indent_down();
 
   if (gen_es6_) {
-    indent(f_service_) << "}" << endl;
+    indent(f_service_) << "}" << '\n';
   } else {
-    indent(f_service_) << "};" << endl;
+    indent(f_service_) << "};" << '\n';
     if (is_subclass_service) {
       indent(f_service_) << "Thrift.inherits(" << js_namespace(tservice->get_program())
                         << service_name_ << "Client, "
                         << js_namespace(tservice->get_extends()->get_program())
-                        << tservice->get_extends()->get_name() << "Client);" << endl;
+                        << tservice->get_extends()->get_name() << "Client);" << '\n';
     } else {
       // init prototype
       indent(f_service_) << js_namespace(tservice->get_program()) << service_name_
-                        << "Client.prototype = {};" << endl;
+                        << "Client.prototype = {};" << '\n';
     }
   }
 
   // utils for multiplexed services
   if (gen_node_) {
     if (gen_es6_) {
-      indent(f_service_) << "seqid () { return this._seqid; }" << endl;
-      indent(f_service_) << "new_seqid () { return this._seqid += 1; }" << endl;
+      indent(f_service_) << "seqid () { return this._seqid; }" << '\n';
+      indent(f_service_) << "new_seqid () { return this._seqid += 1; }" << '\n';
     } else {
       indent(f_service_) << js_namespace(tservice->get_program()) << service_name_
-                        << "Client.prototype.seqid = function() { return this._seqid; };" << endl
+                        << "Client.prototype.seqid = function() { return this._seqid; };" << '\n'
                         << js_namespace(tservice->get_program()) << service_name_
                         << "Client.prototype.new_seqid = function() { return this._seqid += 1; };"
-                        << endl;
+                        << '\n';
     }
   }
 
@@ -1827,144 +1826,144 @@
     string arglist = argument_list(arg_struct);
 
     // Open function
-    f_service_ << endl;
+    f_service_ << '\n';
     if (gen_es6_) {
-      indent(f_service_) << funname << " (" << arglist << ") {" << endl;
+      indent(f_service_) << funname << " (" << arglist << ") {" << '\n';
     } else {
       indent(f_service_) << js_namespace(tservice->get_program()) << service_name_ << "Client.prototype."
-                << function_signature(*f_iter, "", !gen_es6_) << " {" << endl;
+                << function_signature(*f_iter, "", !gen_es6_) << " {" << '\n';
     }
 
     indent_up();
 
     if (gen_ts_) {
       // function definition without callback
-      f_service_ts_ << ts_print_doc(*f_iter) << ts_indent() << ts_function_signature(*f_iter, false) << endl;
+      f_service_ts_ << ts_print_doc(*f_iter) << ts_indent() << ts_function_signature(*f_iter, false) << '\n';
       if (!gen_es6_) {
         // overload with callback
-        f_service_ts_ << ts_print_doc(*f_iter) << ts_indent() << ts_function_signature(*f_iter, true) << endl;
+        f_service_ts_ << ts_print_doc(*f_iter) << ts_indent() << ts_function_signature(*f_iter, true) << '\n';
       } else {
         // overload with callback
-        f_service_ts_ << ts_print_doc(*f_iter) << ts_indent() << ts_function_signature(*f_iter, true) << endl;
+        f_service_ts_ << ts_print_doc(*f_iter) << ts_indent() << ts_function_signature(*f_iter, true) << '\n';
       }
     }
 
     if (gen_es6_ && gen_node_) {
-      indent(f_service_) << "this._seqid = this.new_seqid();" << endl;
-      indent(f_service_) << js_const_type_ << "self = this;" << endl << indent()
-                 << "return new Promise((resolve, reject) => {" << endl;
+      indent(f_service_) << "this._seqid = this.new_seqid();" << '\n';
+      indent(f_service_) << js_const_type_ << "self = this;" << '\n' << indent()
+                 << "return new Promise((resolve, reject) => {" << '\n';
       indent_up();
-      indent(f_service_) << "self._reqs[self.seqid()] = (error, result) => {" << endl;
+      indent(f_service_) << "self._reqs[self.seqid()] = (error, result) => {" << '\n';
       indent_up();
-      indent(f_service_) << "return error ? reject(error) : resolve(result);" << endl;
+      indent(f_service_) << "return error ? reject(error) : resolve(result);" << '\n';
       indent_down();
-      indent(f_service_) << "};" << endl;
-      indent(f_service_) << "self.send_" << funname << "(" << arglist << ");" << endl;
+      indent(f_service_) << "};" << '\n';
+      indent(f_service_) << "self.send_" << funname << "(" << arglist << ");" << '\n';
       indent_down();
-      indent(f_service_) << "});" << endl;
+      indent(f_service_) << "});" << '\n';
     } else if (gen_node_) { // Node.js output      ./gen-nodejs
-      f_service_ << indent() << "this._seqid = this.new_seqid();" << endl << indent()
-                 << "if (callback === undefined) {" << endl;
+      f_service_ << indent() << "this._seqid = this.new_seqid();" << '\n' << indent()
+                 << "if (callback === undefined) {" << '\n';
       indent_up();
-      f_service_ << indent() << js_const_type_ << "_defer = Q.defer();" << endl << indent()
-                 << "this._reqs[this.seqid()] = function(error, result) {" << endl;
+      f_service_ << indent() << js_const_type_ << "_defer = Q.defer();" << '\n' << indent()
+                 << "this._reqs[this.seqid()] = function(error, result) {" << '\n';
       indent_up();
-      indent(f_service_) << "if (error) {" << endl;
+      indent(f_service_) << "if (error) {" << '\n';
       indent_up();
-      indent(f_service_) << "_defer.reject(error);" << endl;
+      indent(f_service_) << "_defer.reject(error);" << '\n';
       indent_down();
-      indent(f_service_) << "} else {" << endl;
+      indent(f_service_) << "} else {" << '\n';
       indent_up();
-      indent(f_service_) << "_defer.resolve(result);" << endl;
+      indent(f_service_) << "_defer.resolve(result);" << '\n';
       indent_down();
-      indent(f_service_) << "}" << endl;
+      indent(f_service_) << "}" << '\n';
       indent_down();
-      indent(f_service_) << "};" << endl;
-      f_service_ << indent() << "this.send_" << funname << "(" << arglist << ");" << endl
-                 << indent() << "return _defer.promise;" << endl;
+      indent(f_service_) << "};" << '\n';
+      f_service_ << indent() << "this.send_" << funname << "(" << arglist << ");" << '\n'
+                 << indent() << "return _defer.promise;" << '\n';
       indent_down();
-      indent(f_service_) << "} else {" << endl;
+      indent(f_service_) << "} else {" << '\n';
       indent_up();
-      f_service_ << indent() << "this._reqs[this.seqid()] = callback;" << endl << indent()
-                 << "this.send_" << funname << "(" << arglist << ");" << endl;
+      f_service_ << indent() << "this._reqs[this.seqid()] = callback;" << '\n' << indent()
+                 << "this.send_" << funname << "(" << arglist << ");" << '\n';
       indent_down();
-      indent(f_service_) << "}" << endl;
+      indent(f_service_) << "}" << '\n';
     } else if (gen_es6_) {
-      f_service_ << indent() << js_const_type_ << "self = this;" << endl << indent()
-                 << "return new Promise((resolve, reject) => {" << endl;
+      f_service_ << indent() << js_const_type_ << "self = this;" << '\n' << indent()
+                 << "return new Promise((resolve, reject) => {" << '\n';
       indent_up();
       f_service_ << indent() << "self.send_" << funname << "(" << arglist
-                 << (arglist.empty() ? "" : ", ") << "(error, result) => {" << endl;
+                 << (arglist.empty() ? "" : ", ") << "(error, result) => {" << '\n';
       indent_up();
-      indent(f_service_) << "return error ? reject(error) : resolve(result);" << endl;
+      indent(f_service_) << "return error ? reject(error) : resolve(result);" << '\n';
       indent_down();
-      f_service_ << indent() << "});" << endl;
+      f_service_ << indent() << "});" << '\n';
       indent_down();
-      f_service_ << indent() << "});" << endl;
+      f_service_ << indent() << "});" << '\n';
 
     } else if (gen_jquery_) { // jQuery output       ./gen-js
-      f_service_ << indent() << "if (callback === undefined) {" << endl;
+      f_service_ << indent() << "if (callback === undefined) {" << '\n';
       indent_up();
-      f_service_ << indent() << "this.send_" << funname << "(" << arglist << ");" << endl;
+      f_service_ << indent() << "this.send_" << funname << "(" << arglist << ");" << '\n';
       if (!(*f_iter)->is_oneway()) {
         f_service_ << indent();
         if (!(*f_iter)->get_returntype()->is_void()) {
           f_service_ << "return ";
         }
-        f_service_ << "this.recv_" << funname << "();" << endl;
+        f_service_ << "this.recv_" << funname << "();" << '\n';
       }
       indent_down();
-      f_service_ << indent() << "} else {" << endl;
+      f_service_ << indent() << "} else {" << '\n';
       indent_up();
       f_service_ << indent() << js_const_type_ << "postData = this.send_" << funname << "(" << arglist
-                 << (arglist.empty() ? "" : ", ") << "true);" << endl;
-      f_service_ << indent() << "return this.output.getTransport()" << endl;
+                 << (arglist.empty() ? "" : ", ") << "true);" << '\n';
+      f_service_ << indent() << "return this.output.getTransport()" << '\n';
       indent_up();
       f_service_ << indent() << ".jqRequest(this, postData, arguments, this.recv_" << funname
-                 << ");" << endl;
+                 << ");" << '\n';
       indent_down();
       indent_down();
-      f_service_ << indent() << "}" << endl;
+      f_service_ << indent() << "}" << '\n';
     } else { // Standard JavaScript ./gen-js
       f_service_ << indent() << "this.send_" << funname << "(" << arglist
-                 << (arglist.empty() ? "" : ", ") << "callback); " << endl;
+                 << (arglist.empty() ? "" : ", ") << "callback); " << '\n';
       if (!(*f_iter)->is_oneway()) {
-        f_service_ << indent() << "if (!callback) {" << endl;
+        f_service_ << indent() << "if (!callback) {" << '\n';
         f_service_ << indent();
         if (!(*f_iter)->get_returntype()->is_void()) {
           f_service_ << "  return ";
         }
-        f_service_ << "this.recv_" << funname << "();" << endl;
-        f_service_ << indent() << "}" << endl;
+        f_service_ << "this.recv_" << funname << "();" << '\n';
+        f_service_ << indent() << "}" << '\n';
       }
     }
 
     indent_down();
 
     if (gen_es6_) {
-      indent(f_service_) << "}" << endl << endl;
+      indent(f_service_) << "}" << '\n' << '\n';
     } else {
-      indent(f_service_) << "};" << endl << endl;
+      indent(f_service_) << "};" << '\n' << '\n';
     }
 
     // Send function
     if (gen_es6_) {
       if (gen_node_) {
-        indent(f_service_) << "send_" << funname << " (" << arglist << ") {" << endl;
+        indent(f_service_) << "send_" << funname << " (" << arglist << ") {" << '\n';
       } else {
         // ES6 js still uses callbacks here. Should refactor this to promise style later..
-        indent(f_service_) << "send_" << funname << " (" << argument_list(arg_struct, true) << ") {" << endl;
+        indent(f_service_) << "send_" << funname << " (" << argument_list(arg_struct, true) << ") {" << '\n';
       }
     } else {
       indent(f_service_) << js_namespace(tservice->get_program()) << service_name_ << "Client.prototype.send_"
-                << function_signature(*f_iter, "", !gen_node_) << " {" << endl;
+                << function_signature(*f_iter, "", !gen_node_) << " {" << '\n';
     }
 
     indent_up();
 
     std::string outputVar;
     if (gen_node_) {
-      f_service_ << indent() << js_const_type_ << "output = new this.pClass(this.output);" << endl;
+      f_service_ << indent() << js_const_type_ << "output = new this.pClass(this.output);" << '\n';
       outputVar = "output";
     } else {
       outputVar = "this.output";
@@ -1980,127 +1979,127 @@
       // It is possible that a method argument is named "params", we need to ensure the locally
       // generated identifier "params" is uniquely named
       std::string params_identifier = this->next_identifier_name(fields, "params");
-      f_service_ << indent() << js_const_type_ << params_identifier << " = {" << endl;
+      f_service_ << indent() << js_const_type_ << params_identifier << " = {" << '\n';
       indent_up();
       for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) {
         indent(f_service_) << (*fld_iter)->get_name() << ": " << (*fld_iter)->get_name();
         if (fld_iter != fields.end()-1) {
-          f_service_ << "," << endl;
+          f_service_ << "," << '\n';
         } else {
-          f_service_ << endl;
+          f_service_ << '\n';
         }
       }
       indent_down();
-      indent(f_service_) << "};" << endl;
+      indent(f_service_) << "};" << '\n';
 
       // NOTE: "args" is a reserved keyword, so no need to generate a unique identifier
-      indent(f_service_) << js_const_type_ << "args = new " << argsname << "(" << params_identifier << ");" << endl;
+      indent(f_service_) << js_const_type_ << "args = new " << argsname << "(" << params_identifier << ");" << '\n';
     } else {
-      indent(f_service_) << js_const_type_ << "args = new " << argsname << "();" << endl;
+      indent(f_service_) << js_const_type_ << "args = new " << argsname << "();" << '\n';
     }
 
 
     // Serialize the request header within try/catch
-    indent(f_service_) << "try {" << endl;
+    indent(f_service_) << "try {" << '\n';
     indent_up();
 
     if (gen_node_) {
       f_service_ << indent() << outputVar << ".writeMessageBegin('" << (*f_iter)->get_name()
-                 << "', " << messageType << ", this.seqid());" << endl;
+                 << "', " << messageType << ", this.seqid());" << '\n';
     } else {
       f_service_ << indent() << outputVar << ".writeMessageBegin('" << (*f_iter)->get_name()
-                 << "', " << messageType << ", this.seqid);" << endl;
+                 << "', " << messageType << ", this.seqid);" << '\n';
     }
 
 
     // Write to the stream
-    f_service_ << indent() << "args.write(" << outputVar << ");" << endl << indent() << outputVar
-               << ".writeMessageEnd();" << endl;
+    f_service_ << indent() << "args.write(" << outputVar << ");" << '\n' << indent() << outputVar
+               << ".writeMessageEnd();" << '\n';
 
     if (gen_node_) {
       if((*f_iter)->is_oneway()) {
-        f_service_ << indent() << "this.output.flush();" << endl;
-        f_service_ << indent() << js_const_type_ << "callback = this._reqs[this.seqid()] || function() {};" << endl;
-        f_service_ << indent() << "delete this._reqs[this.seqid()];" << endl;
-        f_service_ << indent() << "callback(null);" << endl;
+        f_service_ << indent() << "this.output.flush();" << '\n';
+        f_service_ << indent() << js_const_type_ << "callback = this._reqs[this.seqid()] || function() {};" << '\n';
+        f_service_ << indent() << "delete this._reqs[this.seqid()];" << '\n';
+        f_service_ << indent() << "callback(null);" << '\n';
       } else {
-        f_service_ << indent() << "return this.output.flush();" << endl;
+        f_service_ << indent() << "return this.output.flush();" << '\n';
       }
     } else {
       if (gen_jquery_) {
-        f_service_ << indent() << "return this.output.getTransport().flush(callback);" << endl;
+        f_service_ << indent() << "return this.output.getTransport().flush(callback);" << '\n';
       } else if (gen_es6_) {
-        f_service_ << indent() << js_const_type_ << "self = this;" << endl;
+        f_service_ << indent() << js_const_type_ << "self = this;" << '\n';
         if((*f_iter)->is_oneway()) {
-          f_service_ << indent() << "this.output.getTransport().flush(true, null);" << endl;
-          f_service_ << indent() << "callback();" << endl;
+          f_service_ << indent() << "this.output.getTransport().flush(true, null);" << '\n';
+          f_service_ << indent() << "callback();" << '\n';
         } else {
-          f_service_ << indent() << "this.output.getTransport().flush(true, () => {" << endl;
+          f_service_ << indent() << "this.output.getTransport().flush(true, () => {" << '\n';
           indent_up();
-          f_service_ << indent() << js_let_type_ << "error = null, result = null;" << endl;
-          f_service_ << indent() << "try {" << endl;
-          f_service_ << indent() << "  result = self.recv_" << funname << "();" << endl;
-          f_service_ << indent() << "} catch (e) {" << endl;
-          f_service_ << indent() << "  error = e;" << endl;
-          f_service_ << indent() << "}" << endl;
-          f_service_ << indent() << "callback(error, result);" << endl;
+          f_service_ << indent() << js_let_type_ << "error = null, result = null;" << '\n';
+          f_service_ << indent() << "try {" << '\n';
+          f_service_ << indent() << "  result = self.recv_" << funname << "();" << '\n';
+          f_service_ << indent() << "} catch (e) {" << '\n';
+          f_service_ << indent() << "  error = e;" << '\n';
+          f_service_ << indent() << "}" << '\n';
+          f_service_ << indent() << "callback(error, result);" << '\n';
           indent_down();
-          f_service_ << indent() << "});" << endl;
+          f_service_ << indent() << "});" << '\n';
         }
       } else {
-        f_service_ << indent() << "if (callback) {" << endl;
+        f_service_ << indent() << "if (callback) {" << '\n';
         indent_up();
         if((*f_iter)->is_oneway()) {
-          f_service_ << indent() << "this.output.getTransport().flush(true, null);" << endl;
-          f_service_ << indent() << "callback();" << endl;
+          f_service_ << indent() << "this.output.getTransport().flush(true, null);" << '\n';
+          f_service_ << indent() << "callback();" << '\n';
         } else {
-          f_service_ << indent() << js_const_type_ << "self = this;" << endl;
-          f_service_ << indent() << "this.output.getTransport().flush(true, function() {" << endl;
+          f_service_ << indent() << js_const_type_ << "self = this;" << '\n';
+          f_service_ << indent() << "this.output.getTransport().flush(true, function() {" << '\n';
           indent_up();
-          f_service_ << indent() << js_let_type_ << "result = null;" << endl;
-          f_service_ << indent() << "try {" << endl;
-          f_service_ << indent() << "  result = self.recv_" << funname << "();" << endl;
-          f_service_ << indent() << "} catch (e) {" << endl;
-          f_service_ << indent() << "  result = e;" << endl;
-          f_service_ << indent() << "}" << endl;
-          f_service_ << indent() << "callback(result);" << endl;
+          f_service_ << indent() << js_let_type_ << "result = null;" << '\n';
+          f_service_ << indent() << "try {" << '\n';
+          f_service_ << indent() << "  result = self.recv_" << funname << "();" << '\n';
+          f_service_ << indent() << "} catch (e) {" << '\n';
+          f_service_ << indent() << "  result = e;" << '\n';
+          f_service_ << indent() << "}" << '\n';
+          f_service_ << indent() << "callback(result);" << '\n';
           indent_down();
-          f_service_ << indent() << "});" << endl;
+          f_service_ << indent() << "});" << '\n';
         }
         indent_down();
-        f_service_ << indent() << "} else {" << endl;
-        f_service_ << indent() << "  return this.output.getTransport().flush();" << endl;
-        f_service_ << indent() << "}" << endl;
+        f_service_ << indent() << "} else {" << '\n';
+        f_service_ << indent() << "  return this.output.getTransport().flush();" << '\n';
+        f_service_ << indent() << "}" << '\n';
       }
     }
 
     indent_down();
-    f_service_ << indent() << "}" << endl;
+    f_service_ << indent() << "}" << '\n';
 
     // Reset the transport and delete registered callback if there was a serialization error
-    f_service_ << indent() << "catch (e) {" << endl;
+    f_service_ << indent() << "catch (e) {" << '\n';
     indent_up();
     if (gen_node_) {
-      f_service_ << indent() << "delete this._reqs[this.seqid()];" << endl;
-      f_service_ << indent() << "if (typeof " << outputVar << ".reset === 'function') {" << endl;
-      f_service_ << indent() << "  " << outputVar << ".reset();" << endl;
-      f_service_ << indent() << "}" << endl;
+      f_service_ << indent() << "delete this._reqs[this.seqid()];" << '\n';
+      f_service_ << indent() << "if (typeof " << outputVar << ".reset === 'function') {" << '\n';
+      f_service_ << indent() << "  " << outputVar << ".reset();" << '\n';
+      f_service_ << indent() << "}" << '\n';
     } else {
-      f_service_ << indent() << "if (typeof " << outputVar << ".getTransport().reset === 'function') {" << endl;
-      f_service_ << indent() << "  " << outputVar << ".getTransport().reset();" << endl;
-      f_service_ << indent() << "}" << endl;
+      f_service_ << indent() << "if (typeof " << outputVar << ".getTransport().reset === 'function') {" << '\n';
+      f_service_ << indent() << "  " << outputVar << ".getTransport().reset();" << '\n';
+      f_service_ << indent() << "}" << '\n';
     }
-    f_service_ << indent() << "throw e;" << endl;
+    f_service_ << indent() << "throw e;" << '\n';
     indent_down();
-    f_service_ << indent() << "}" << endl;
+    f_service_ << indent() << "}" << '\n';
 
     indent_down();
 
     // Close send function
     if (gen_es6_) {
-      indent(f_service_) << "}" << endl;
+      indent(f_service_) << "}" << '\n';
     } else {
-      indent(f_service_) << "};" << endl;
+      indent(f_service_) << "};" << '\n';
     }
 
     // Receive function
@@ -2108,19 +2107,19 @@
       std::string resultname = js_namespace(tservice->get_program()) + service_name_ + "_"
                                + (*f_iter)->get_name() + "_result";
 
-      f_service_ << endl;
+      f_service_ << '\n';
       // Open receive function
       if (gen_node_) {
         if (gen_es6_) {
-          indent(f_service_) << "recv_" << (*f_iter)->get_name() << " (input, mtype, rseqid) {" << endl;
+          indent(f_service_) << "recv_" << (*f_iter)->get_name() << " (input, mtype, rseqid) {" << '\n';
         } else {
           indent(f_service_) << js_namespace(tservice->get_program()) << service_name_
                       << "Client.prototype.recv_" << (*f_iter)->get_name()
-                      << " = function(input,mtype,rseqid) {" << endl;
+                      << " = function(input,mtype,rseqid) {" << '\n';
         }
       } else {
         if (gen_es6_) {
-          indent(f_service_) << "recv_" << (*f_iter)->get_name() << " () {" << endl;
+          indent(f_service_) << "recv_" << (*f_iter)->get_name() << " () {" << '\n';
         } else {
           t_struct noargs(program_);
 
@@ -2128,7 +2127,7 @@
                                   string("recv_") + (*f_iter)->get_name(),
                                   &noargs);
           indent(f_service_) << js_namespace(tservice->get_program()) << service_name_
-                    << "Client.prototype." << function_signature(&recv_function) << " {" << endl;
+                    << "Client.prototype." << function_signature(&recv_function) << " {" << '\n';
         }
       }
 
@@ -2142,68 +2141,68 @@
       }
 
       if (gen_node_) {
-        f_service_ << indent() << js_const_type_ << "callback = this._reqs[rseqid] || function() {};" << endl
-                   << indent() << "delete this._reqs[rseqid];" << endl;
+        f_service_ << indent() << js_const_type_ << "callback = this._reqs[rseqid] || function() {};" << '\n'
+                   << indent() << "delete this._reqs[rseqid];" << '\n';
       } else {
-        f_service_ << indent() << js_const_type_ << "ret = this.input.readMessageBegin();" << endl
-                   << indent() << js_const_type_ << "mtype = ret.mtype;" << endl;
+        f_service_ << indent() << js_const_type_ << "ret = this.input.readMessageBegin();" << '\n'
+                   << indent() << js_const_type_ << "mtype = ret.mtype;" << '\n';
       }
 
-      f_service_ << indent() << "if (mtype == Thrift.MessageType.EXCEPTION) {" << endl;
+      f_service_ << indent() << "if (mtype == Thrift.MessageType.EXCEPTION) {" << '\n';
 
       indent_up();
-      f_service_ << indent() << js_const_type_ << "x = new Thrift.TApplicationException();" << endl
-                 << indent() << "x.read(" << inputVar << ");" << endl
-                 << indent() << inputVar << ".readMessageEnd();" << endl
-                 << indent() << render_recv_throw("x") << endl;
+      f_service_ << indent() << js_const_type_ << "x = new Thrift.TApplicationException();" << '\n'
+                 << indent() << "x.read(" << inputVar << ");" << '\n'
+                 << indent() << inputVar << ".readMessageEnd();" << '\n'
+                 << indent() << render_recv_throw("x") << '\n';
       scope_down(f_service_);
 
-      f_service_ << indent() << js_const_type_ << "result = new " << resultname << "();" << endl << indent()
-                 << "result.read(" << inputVar << ");" << endl;
+      f_service_ << indent() << js_const_type_ << "result = new " << resultname << "();" << '\n' << indent()
+                 << "result.read(" << inputVar << ");" << '\n';
 
-      f_service_ << indent() << inputVar << ".readMessageEnd();" << endl << endl;
+      f_service_ << indent() << inputVar << ".readMessageEnd();" << '\n' << '\n';
 
       t_struct* xs = (*f_iter)->get_xceptions();
       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) {
-        f_service_ << indent() << "if (null !== result." << (*x_iter)->get_name() << ") {" << endl
+        f_service_ << indent() << "if (null !== result." << (*x_iter)->get_name() << ") {" << '\n'
                    << indent() << "  " << render_recv_throw("result." + (*x_iter)->get_name())
-                   << endl << indent() << "}" << endl;
+                   << '\n' << indent() << "}" << '\n';
       }
 
       // Careful, only return result if not a void function
       if (!(*f_iter)->get_returntype()->is_void()) {
-        f_service_ << indent() << "if (null !== result.success) {" << endl << indent() << "  "
-                   << render_recv_return("result.success") << endl << indent() << "}" << endl;
+        f_service_ << indent() << "if (null !== result.success) {" << '\n' << indent() << "  "
+                   << render_recv_return("result.success") << '\n' << indent() << "}" << '\n';
         f_service_ << indent()
                    << render_recv_throw("'" + (*f_iter)->get_name() + " failed: unknown result'")
-                   << endl;
+                   << '\n';
       } else {
         if (gen_node_) {
-          indent(f_service_) << "callback(null);" << endl;
+          indent(f_service_) << "callback(null);" << '\n';
         } else {
-          indent(f_service_) << "return;" << endl;
+          indent(f_service_) << "return;" << '\n';
         }
       }
 
       // Close receive function
       indent_down();
       if (gen_es6_) {
-        indent(f_service_) << "}" << endl;
+        indent(f_service_) << "}" << '\n';
       } else {
-        indent(f_service_) << "};" << endl;
+        indent(f_service_) << "};" << '\n';
       }
     }
   }
 
   // Finish class definitions
   if (gen_ts_) {
-    f_service_ts_ << ts_indent() << "}" << endl;
+    f_service_ts_ << ts_indent() << "}" << '\n';
   }
   if (gen_es6_) {
     indent_down();
-    f_service_ << "};" << endl;
+    f_service_ << "};" << '\n';
   }
 }
 
@@ -2284,7 +2283,7 @@
       out << ".value";
     }
 
-    out << ";" << endl;
+    out << ";" << '\n';
   } else {
     printf("DO NOT KNOW HOW TO DESERIALIZE FIELD '%s' TYPE '%s'\n",
            tfield->get_name().c_str(),
@@ -2300,7 +2299,7 @@
  */
 void t_js_generator::generate_deserialize_struct(ostream& out, t_struct* tstruct, string prefix) {
   out << indent() << prefix << " = new " << js_type_namespace(tstruct->get_program())
-      << tstruct->get_name() << "();" << endl << indent() << prefix << ".read(input);" << endl;
+      << tstruct->get_name() << "();" << '\n' << indent() << prefix << ".read(input);" << '\n';
 }
 
 void t_js_generator::generate_deserialize_container(ostream& out, t_type* ttype, string prefix) {
@@ -2311,36 +2310,36 @@
 
   // Declare variables, read header
   if (ttype->is_map()) {
-    out << indent() << prefix << " = {};" << endl;
+    out << indent() << prefix << " = {};" << '\n';
 
-    out << indent() << js_const_type_ << rtmp3 << " = input.readMapBegin();" << endl;
-    out << indent() << js_const_type_ << size << " = " << rtmp3 << ".size || 0;" << endl;
+    out << indent() << js_const_type_ << rtmp3 << " = input.readMapBegin();" << '\n';
+    out << indent() << js_const_type_ << size << " = " << rtmp3 << ".size || 0;" << '\n';
 
   } else if (ttype->is_set()) {
 
-    out << indent() << prefix << " = [];" << endl
-        << indent() << js_const_type_ << rtmp3 << " = input.readSetBegin();" << endl
-        << indent() << js_const_type_ << size << " = " << rtmp3 << ".size || 0;" << endl;
+    out << indent() << prefix << " = [];" << '\n'
+        << indent() << js_const_type_ << rtmp3 << " = input.readSetBegin();" << '\n'
+        << indent() << js_const_type_ << size << " = " << rtmp3 << ".size || 0;" << '\n';
 
   } else if (ttype->is_list()) {
 
-    out << indent() << prefix << " = [];" << endl
-        << indent() << js_const_type_ << rtmp3 << " = input.readListBegin();" << endl
-        << indent() << js_const_type_ << size << " = " << rtmp3 << ".size || 0;" << endl;
+    out << indent() << prefix << " = [];" << '\n'
+        << indent() << js_const_type_ << rtmp3 << " = input.readListBegin();" << '\n'
+        << indent() << js_const_type_ << size << " = " << rtmp3 << ".size || 0;" << '\n';
   }
 
   // For loop iterates over elements
   string i = tmp("_i");
-  indent(out) << "for (" << js_let_type_ << i << " = 0; " << i << " < " << size << "; ++" << i << ") {" << endl;
+  indent(out) << "for (" << js_let_type_ << i << " = 0; " << i << " < " << size << "; ++" << i << ") {" << '\n';
 
   indent_up();
 
   if (ttype->is_map()) {
     if (!gen_node_) {
-      out << indent() << "if (" << i << " > 0 ) {" << endl << indent()
-          << "  if (input.rstack.length > input.rpos[input.rpos.length -1] + 1) {" << endl
-          << indent() << "    input.rstack.pop();" << endl << indent() << "  }" << endl << indent()
-          << "}" << endl;
+      out << indent() << "if (" << i << " > 0 ) {" << '\n' << indent()
+          << "  if (input.rstack.length > input.rpos[input.rpos.length -1] + 1) {" << '\n'
+          << indent() << "    input.rstack.pop();" << '\n' << indent() << "  }" << '\n' << indent()
+          << "}" << '\n';
     }
 
     generate_deserialize_map_element(out, (t_map*)ttype, prefix);
@@ -2354,11 +2353,11 @@
 
   // Read container end
   if (ttype->is_map()) {
-    indent(out) << "input.readMapEnd();" << endl;
+    indent(out) << "input.readMapEnd();" << '\n';
   } else if (ttype->is_set()) {
-    indent(out) << "input.readSetEnd();" << endl;
+    indent(out) << "input.readSetEnd();" << '\n';
   } else if (ttype->is_list()) {
-    indent(out) << "input.readListEnd();" << endl;
+    indent(out) << "input.readListEnd();" << '\n';
   }
 }
 
@@ -2371,24 +2370,24 @@
   t_field fkey(tmap->get_key_type(), key);
   t_field fval(tmap->get_val_type(), val);
 
-  indent(out) << declare_field(&fkey, false, false) << ";" << endl;
-  indent(out) << declare_field(&fval, false, false) << ";" << endl;
+  indent(out) << declare_field(&fkey, false, false) << ";" << '\n';
+  indent(out) << declare_field(&fval, false, false) << ";" << '\n';
 
   generate_deserialize_field(out, &fkey);
   generate_deserialize_field(out, &fval);
 
-  indent(out) << prefix << "[" << key << "] = " << val << ";" << endl;
+  indent(out) << prefix << "[" << key << "] = " << val << ";" << '\n';
 }
 
 void t_js_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) << js_let_type_ << elem << " = null;" << endl;
+  indent(out) << js_let_type_ << elem << " = null;" << '\n';
 
   generate_deserialize_field(out, &felem);
 
-  indent(out) << prefix << ".push(" << elem << ");" << endl;
+  indent(out) << prefix << ".push(" << elem << ");" << '\n';
 }
 
 void t_js_generator::generate_deserialize_list_element(ostream& out,
@@ -2397,11 +2396,11 @@
   string elem = tmp("elem");
   t_field felem(tlist->get_elem_type(), elem);
 
-  indent(out) << js_let_type_ << elem << " = null;" << endl;
+  indent(out) << js_let_type_ << elem << " = null;" << '\n';
 
   generate_deserialize_field(out, &felem);
 
-  indent(out) << prefix << ".push(" << elem << ");" << endl;
+  indent(out) << prefix << ".push(" << elem << ");" << '\n';
 }
 
 /**
@@ -2465,7 +2464,7 @@
     } else if (type->is_enum()) {
       out << "writeI32(" << name << ")";
     }
-    out << ";" << endl;
+    out << ";" << '\n';
 
   } else {
     printf("DO NOT KNOW HOW TO SERIALIZE FIELD '%s%s' TYPE '%s'\n",
@@ -2483,7 +2482,7 @@
  */
 void t_js_generator::generate_serialize_struct(ostream& out, t_struct* tstruct, string prefix) {
   (void)tstruct;
-  indent(out) << prefix << ".write(output);" << endl;
+  indent(out) << prefix << ".write(output);" << '\n';
 }
 
 /**
@@ -2493,58 +2492,58 @@
   if (ttype->is_map()) {
     indent(out) << "output.writeMapBegin(" << type_to_enum(((t_map*)ttype)->get_key_type()) << ", "
                 << type_to_enum(((t_map*)ttype)->get_val_type()) << ", "
-                << "Thrift.objectLength(" << prefix << "));" << endl;
+                << "Thrift.objectLength(" << prefix << "));" << '\n';
   } else if (ttype->is_set()) {
     indent(out) << "output.writeSetBegin(" << type_to_enum(((t_set*)ttype)->get_elem_type()) << ", "
-                << prefix << ".length);" << endl;
+                << prefix << ".length);" << '\n';
 
   } else if (ttype->is_list()) {
 
     indent(out) << "output.writeListBegin(" << type_to_enum(((t_list*)ttype)->get_elem_type())
-                << ", " << prefix << ".length);" << endl;
+                << ", " << prefix << ".length);" << '\n';
   }
 
   if (ttype->is_map()) {
     string kiter = tmp("kiter");
     string viter = tmp("viter");
-    indent(out) << "for (" << js_let_type_ << kiter << " in " << prefix << ") {" << endl;
+    indent(out) << "for (" << js_let_type_ << kiter << " in " << prefix << ") {" << '\n';
     indent_up();
-    indent(out) << "if (" << prefix << ".hasOwnProperty(" << kiter << ")) {" << endl;
+    indent(out) << "if (" << prefix << ".hasOwnProperty(" << kiter << ")) {" << '\n';
     indent_up();
-    indent(out) << js_let_type_ << viter << " = " << prefix << "[" << kiter << "];" << endl;
+    indent(out) << js_let_type_ << viter << " = " << prefix << "[" << kiter << "];" << '\n';
     generate_serialize_map_element(out, (t_map*)ttype, kiter, viter);
     scope_down(out);
     scope_down(out);
 
   } else if (ttype->is_set()) {
     string iter = tmp("iter");
-    indent(out) << "for (" << js_let_type_ << iter << " in " << prefix << ") {" << endl;
+    indent(out) << "for (" << js_let_type_ << iter << " in " << prefix << ") {" << '\n';
     indent_up();
-    indent(out) << "if (" << prefix << ".hasOwnProperty(" << iter << ")) {" << endl;
+    indent(out) << "if (" << prefix << ".hasOwnProperty(" << iter << ")) {" << '\n';
     indent_up();
-    indent(out) << iter << " = " << prefix << "[" << iter << "];" << endl;
+    indent(out) << iter << " = " << prefix << "[" << iter << "];" << '\n';
     generate_serialize_set_element(out, (t_set*)ttype, iter);
     scope_down(out);
     scope_down(out);
 
   } else if (ttype->is_list()) {
     string iter = tmp("iter");
-    indent(out) << "for (" << js_let_type_ << iter << " in " << prefix << ") {" << endl;
+    indent(out) << "for (" << js_let_type_ << iter << " in " << prefix << ") {" << '\n';
     indent_up();
-    indent(out) << "if (" << prefix << ".hasOwnProperty(" << iter << ")) {" << endl;
+    indent(out) << "if (" << prefix << ".hasOwnProperty(" << iter << ")) {" << '\n';
     indent_up();
-    indent(out) << iter << " = " << prefix << "[" << iter << "];" << endl;
+    indent(out) << iter << " = " << prefix << "[" << iter << "];" << '\n';
     generate_serialize_list_element(out, (t_list*)ttype, iter);
     scope_down(out);
     scope_down(out);
   }
 
   if (ttype->is_map()) {
-    indent(out) << "output.writeMapEnd();" << endl;
+    indent(out) << "output.writeMapEnd();" << '\n';
   } else if (ttype->is_set()) {
-    indent(out) << "output.writeSetEnd();" << endl;
+    indent(out) << "output.writeSetEnd();" << '\n';
   } else if (ttype->is_list()) {
-    indent(out) << "output.writeListEnd();" << endl;
+    indent(out) << "output.writeListEnd();" << '\n';
   }
 }
 
diff --git a/compiler/cpp/src/thrift/generate/t_json_generator.cc b/compiler/cpp/src/thrift/generate/t_json_generator.cc
index e91d65a..3fb973a 100644
--- a/compiler/cpp/src/thrift/generate/t_json_generator.cc
+++ b/compiler/cpp/src/thrift/generate/t_json_generator.cc
@@ -42,8 +42,6 @@
 using std::vector;
 using std::stack;
 
-static const string endl = "\n";
-static const string quot = "\"";
 static const bool NO_INDENT = false;
 static const bool FORCE_STRING = true;
 
@@ -182,20 +180,20 @@
 }
 
 void t_json_generator::start_object(bool should_indent) {
-  f_json_ << (should_indent ? indent() : "") << "{" << endl;
+  f_json_ << (should_indent ? indent() : "") << "{" << '\n';
   indent_up();
   comma_needed_.push(false);
 }
 
 void t_json_generator::start_array() {
-  f_json_ << "[" << endl;
+  f_json_ << "[" << '\n';
   indent_up();
   comma_needed_.push(false);
 }
 
 void t_json_generator::write_comma_if_needed() {
   if (comma_needed_.top()) {
-    f_json_ << "," << endl;
+    f_json_ << "," << '\n';
   }
 }
 
@@ -230,14 +228,14 @@
 
 void t_json_generator::end_object() {
   indent_down();
-  f_json_ << endl << indent() << "}";
+  f_json_ << '\n' << indent() << "}";
   comma_needed_.pop();
 }
 
 void t_json_generator::end_array() {
   indent_down();
   if (comma_needed_.top()) {
-    f_json_ << endl;
+    f_json_ << '\n';
   }
   indent(f_json_) << "]";
   comma_needed_.pop();
@@ -296,7 +294,7 @@
 }
 
 void t_json_generator::close_generator() {
-  f_json_ << endl;
+  f_json_ << '\n';
   f_json_.close();
 }
 
@@ -471,7 +469,7 @@
 }
 
 void t_json_generator::write_string(const string& value) {
-  f_json_ << quot << escape_json_string(value) << quot;
+  f_json_ << '\"' << escape_json_string(value) << '\"';
 }
 
 void t_json_generator::write_const_value(t_const_value* value, bool should_force_string) {
@@ -537,7 +535,7 @@
 }
 
 string t_json_generator::json_str(const string& str) {
-  return quot + escape_json_string(str) + quot;
+  return string("\"") + escape_json_string(str) + string("\"");
 }
 
 void t_json_generator::generate_constant(t_const* con) {
diff --git a/compiler/cpp/src/thrift/generate/t_kotlin_generator.cc b/compiler/cpp/src/thrift/generate/t_kotlin_generator.cc
index a017272..2e81909 100644
--- a/compiler/cpp/src/thrift/generate/t_kotlin_generator.cc
+++ b/compiler/cpp/src/thrift/generate/t_kotlin_generator.cc
@@ -45,8 +45,6 @@
 using std::stringstream;
 using std::vector;
 
-static const string endl = "\n"; // avoid ostream << std::endl flushes
-
 static const string KOTLIN_RESERVED_WORDS[] = {
     "as",      "as?",      "break",    "class",   "continue",  "do",          "else",
     "false",   "for",      "fun",      "if",      "in",        "!in",         "interface",
@@ -209,7 +207,7 @@
  * Nothing in Kotlin generator
  */
 void t_kotlin_generator::close_generator() {
-  f_types_ << endl;
+  f_types_ << '\n';
   f_types_.close();
 }
 
@@ -222,7 +220,7 @@
  */
 void t_kotlin_generator::generate_typedef(t_typedef* ttypedef) {
   f_types_ << "typealias " << ttypedef->get_symbolic() << " = "
-           << type_name(ttypedef->get_type(), true) << endl;
+           << type_name(ttypedef->get_type(), true) << '\n';
 }
 
 void t_kotlin_generator::generate_enum(t_enum* tenum) {
@@ -241,32 +239,32 @@
   auto first = true;
   auto enum_values = tenum->get_constants();
   for (auto& enum_value : enum_values) {
-    f_enum << (first ? "" : ",") << endl;
+    f_enum << (first ? "" : ",") << '\n';
     first = false;
     indent(f_enum) << enum_value->get_name() << "(" << enum_value->get_value() << ")";
   }
   if (first) {
     indent(f_enum);
   }
-  f_enum << ";" << endl << endl;
-  indent(f_enum) << "override fun getValue() = value" << endl << endl;
+  f_enum << ";" << '\n' << '\n';
+  indent(f_enum) << "override fun getValue() = value" << '\n' << '\n';
   {
-    indent(f_enum) << "companion object {" << endl;
+    indent(f_enum) << "companion object {" << '\n';
     indent_up();
     {
-      indent(f_enum) << "@kotlin.jvm.JvmStatic" << endl;
+      indent(f_enum) << "@kotlin.jvm.JvmStatic" << '\n';
       indent(f_enum) << "fun findByValue(i: kotlin.Int): " << kotlin_safe_name(tenum->get_name())
-                     << "? {" << endl;
+                     << "? {" << '\n';
       indent_up();
       {
-        indent(f_enum) << "return when (i) {" << endl;
+        indent(f_enum) << "return when (i) {" << '\n';
         indent_up();
         {
           auto enum_values = tenum->get_constants();
           for (auto& enum_value : enum_values) {
-            indent(f_enum) << enum_value->get_value() << " -> " << enum_value->get_name() << endl;
+            indent(f_enum) << enum_value->get_value() << " -> " << enum_value->get_name() << '\n';
           }
-          indent(f_enum) << "else -> null" << endl;
+          indent(f_enum) << "else -> null" << '\n';
         }
         scope_down(f_enum);
       }
@@ -322,7 +320,7 @@
     } else {
       // TODO
     }
-    f_types_ << endl;
+    f_types_ << '\n';
   }
 }
 
@@ -442,7 +440,7 @@
                                                               t_struct* tstruct) {
   indent(out) << "enum class _Fields(private val thriftFieldId: kotlin.Short, private val "
                  "fieldName: kotlin.String) : org.apache.thrift.TFieldIdEnum {"
-              << endl;
+              << '\n';
   indent_up();
   {
     // fields
@@ -450,7 +448,7 @@
       bool first = true;
       for (auto& field : tstruct->get_members()) {
         if (!first) {
-          out << "," << endl;
+          out << "," << '\n';
         }
         first = false;
         indent(out) << constant_name(field->get_name()) << "(" << field->get_key() << ", \""
@@ -459,49 +457,49 @@
       if (first) {
         indent(out);
       }
-      out << ";" << endl << endl;
+      out << ";" << '\n' << '\n';
     }
 
     // methods
-    indent(out) << "override fun getThriftFieldId() = thriftFieldId" << endl << endl;
-    indent(out) << "override fun getFieldName() = fieldName" << endl << endl;
+    indent(out) << "override fun getThriftFieldId() = thriftFieldId" << '\n' << '\n';
+    indent(out) << "override fun getFieldName() = fieldName" << '\n' << '\n';
 
     // companion object
-    indent(out) << "companion object {" << endl;
+    indent(out) << "companion object {" << '\n';
     indent_up();
     {
-      indent(out) << "@kotlin.jvm.JvmStatic" << endl;
-      indent(out) << "fun findByValue(value: kotlin.Int): _Fields? {" << endl;
+      indent(out) << "@kotlin.jvm.JvmStatic" << '\n';
+      indent(out) << "fun findByValue(value: kotlin.Int): _Fields? {" << '\n';
       indent_up();
       {
-        indent(out) << "return when (value) {" << endl;
+        indent(out) << "return when (value) {" << '\n';
         indent_up();
         {
           for (auto& field : tstruct->get_members()) {
-            indent(out) << field->get_key() << " -> " << constant_name(field->get_name()) << endl;
+            indent(out) << field->get_key() << " -> " << constant_name(field->get_name()) << '\n';
           }
-          indent(out) << "else -> null" << endl;
+          indent(out) << "else -> null" << '\n';
         }
         scope_down(out);
       }
       scope_down(out);
     }
 
-    out << endl;
+    out << '\n';
 
     {
-      indent(out) << "@kotlin.jvm.JvmStatic" << endl;
-      indent(out) << "fun findByName(name: kotlin.String): _Fields? {" << endl;
+      indent(out) << "@kotlin.jvm.JvmStatic" << '\n';
+      indent(out) << "fun findByName(name: kotlin.String): _Fields? {" << '\n';
       indent_up();
       {
-        indent(out) << "return when (name) {" << endl;
+        indent(out) << "return when (name) {" << '\n';
         indent_up();
         {
           for (auto& field : tstruct->get_members()) {
             indent(out) << "\"" << field->get_name() << "\""
-                        << " -> " << constant_name(field->get_name()) << endl;
+                        << " -> " << constant_name(field->get_name()) << '\n';
           }
-          indent(out) << "else -> null" << endl;
+          indent(out) << "else -> null" << '\n';
         }
         scope_down(out);
       }
@@ -511,16 +509,16 @@
     scope_down(out);
   }
   scope_down(out);
-  out << endl;
+  out << '\n';
 }
 
 void t_kotlin_generator::generate_struct_companion_object(std::ostream& out, t_struct* tstruct) {
-  indent(out) << "companion object {" << endl;
+  indent(out) << "companion object {" << '\n';
   indent_up();
   {
     indent(out) << "private val STRUCT_DESC: org.apache.thrift.protocol.TStruct = "
                    "org.apache.thrift.protocol.TStruct(\""
-                << tstruct->get_name() << "\")" << endl;
+                << tstruct->get_name() << "\")" << '\n';
     {
       for (auto& field : tstruct->get_members()) {
         // field desc
@@ -528,15 +526,15 @@
                     << "_FIELD_DESC: org.apache.thrift.protocol.TField = "
                        "org.apache.thrift.protocol.TField(\""
                     << field->get_name() << "\", " << type_to_enum(field->get_type()) << ", "
-                    << field->get_key() << ")" << endl;
+                    << field->get_key() << ")" << '\n';
         // field metadata
         indent(out) << "private val " << constant_name(field->get_name())
                     << "_FIELD_META_DATA: org.apache.thrift.meta_data.FieldMetaData = "
                        "org.apache.thrift.meta_data.FieldMetaData("
-                    << endl;
+                    << '\n';
         indent_up();
         {
-          indent(out) << '"' << field->get_name() << '"' << ',' << endl;
+          indent(out) << '"' << field->get_name() << '"' << ',' << '\n';
           indent(out) << "org.apache.thrift.TFieldRequirementType.";
           if (field->get_req() == t_field::T_REQUIRED) {
             out << "REQUIRED";
@@ -545,12 +543,12 @@
           } else {
             out << "DEFAULT";
           }
-          out << ',' << endl;
+          out << ',' << '\n';
           generate_field_value_meta_data(indent(out), field->get_type());
-          out << ',' << endl;
+          out << ',' << '\n';
           generate_metadata_for_field_annotations(indent(out), field);
         }
-        out << ")" << endl;
+        out << ")" << '\n';
         indent_down();
       }
     }
@@ -558,23 +556,23 @@
     // all fields in a map
     indent(out)
         << "private val metadata: Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> = mapOf("
-        << endl;
+        << '\n';
     indent_up();
     for (auto& field : tstruct->get_members()) {
       indent(out) << "_Fields." << constant_name(field->get_name()) << " to "
-                  << constant_name(field->get_name()) << "_FIELD_META_DATA," << endl;
+                  << constant_name(field->get_name()) << "_FIELD_META_DATA," << '\n';
     }
     indent_down();
-    indent(out) << ")" << endl;
+    indent(out) << ")" << '\n';
 
-    indent(out) << "init {" << endl;
+    indent(out) << "init {" << '\n';
     indent_up();
     indent(out) << "org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap("
-                << tstruct->get_name() << "::class.java, metadata)" << endl;
+                << tstruct->get_name() << "::class.java, metadata)" << '\n';
     scope_down(out);
   }
   scope_down(out);
-  out << endl;
+  out << '\n';
 }
 
 void t_kotlin_generator::generate_metadata_for_field_annotations(std::ostream& out,
@@ -582,10 +580,10 @@
   if (field->annotations_.size() == 0) {
     out << "emptyMap()";
   } else {
-    out << "mapOf(" << endl;
+    out << "mapOf(" << '\n';
     indent_up();
     for (auto& annotation : field->annotations_) {
-      indent(out) << "\"" + annotation.first + "\" to \"" + annotation.second.back() + "\"," << endl;
+      indent(out) << "\"" + annotation.first + "\" to \"" + annotation.second.back() + "\"," << '\n';
     }
     indent_down();
     indent(out) << ")";
@@ -600,24 +598,24 @@
     out << "StructMetaData(" << ttype_class << "STRUCT, " << type_name(type) << "::class.java";
   } else if (type->is_container()) {
     if (type->is_list()) {
-      out << "ListMetaData(" << ttype_class << "LIST," << endl;
+      out << "ListMetaData(" << ttype_class << "LIST," << '\n';
       indent_up();
       t_type* elem_type = ((t_list*)type)->get_elem_type();
       generate_field_value_meta_data(indent(out), elem_type);
       indent_down();
     } else if (type->is_set()) {
-      out << "SetMetaData(" << ttype_class << "SET," << endl;
+      out << "SetMetaData(" << ttype_class << "SET," << '\n';
       indent_up();
       t_type* elem_type = ((t_set*)type)->get_elem_type();
       generate_field_value_meta_data(indent(out), elem_type);
       indent_down();
     } else {
-      out << "MapMetaData(" << ttype_class << "MAP," << endl;
+      out << "MapMetaData(" << ttype_class << "MAP," << '\n';
       indent_up();
       t_type* key_type = ((t_map*)type)->get_key_type();
       t_type* val_type = ((t_map*)type)->get_val_type();
       generate_field_value_meta_data(indent(out), key_type);
-      out << "," << endl;
+      out << "," << '\n';
       generate_field_value_meta_data(indent(out), val_type);
       indent_down();
     }
@@ -635,30 +633,30 @@
 }
 
 void t_kotlin_generator::generate_struct_method_deep_copy(std::ostream& out, t_struct* tstruct) {
-  indent(out) << "override fun deepCopy(): " << tstruct->get_name() << " {" << endl;
+  indent(out) << "override fun deepCopy(): " << tstruct->get_name() << " {" << '\n';
   indent_up();
   {
-    indent(out) << "return " << tstruct->get_name() << " (" << endl;
+    indent(out) << "return " << tstruct->get_name() << " (" << '\n';
     indent_up();
     {
       for (auto& field : tstruct->get_members()) {
-        indent(out) << kotlin_safe_name(field->get_name()) << "," << endl;
+        indent(out) << kotlin_safe_name(field->get_name()) << "," << '\n';
       }
     }
     indent_down();
-    indent(out) << ")" << endl;
+    indent(out) << ")" << '\n';
   }
   scope_down(out);
-  out << endl;
+  out << '\n';
 }
 
 void t_kotlin_generator::generate_struct_method_compare_to(std::ostream& out, t_struct* tstruct) {
   indent(out) << "override fun compareTo(other: " << tstruct->get_name() << "?): kotlin.Int {"
-              << endl;
+              << '\n';
   indent_up();
   {
     indent(out) << "val comparator = compareBy<" << tstruct->get_name()
-                << "> { it::class.java.name }" << endl;
+                << "> { it::class.java.name }" << '\n';
     indent_up();
     for (auto& field : tstruct->get_members()) {
       indent(out) << ".thenBy";
@@ -667,33 +665,33 @@
           || field_type->is_binary()) {
         out << "(org.apache.thrift.TBaseHelper::compareTo)";
       }
-      out << " { it." << kotlin_safe_name(field->get_name()) << " } " << endl;
+      out << " { it." << kotlin_safe_name(field->get_name()) << " } " << '\n';
     }
     indent_down();
-    indent(out) << "return nullsFirst(comparator).compare(this, other)" << endl;
+    indent(out) << "return nullsFirst(comparator).compare(this, other)" << '\n';
   }
   scope_down(out);
-  out << endl;
+  out << '\n';
 }
 
 void t_kotlin_generator::generate_struct_method_field_for_id(std::ostream& out,
                                                              t_struct* /*tstruct*/) {
-  indent(out) << "override fun fieldForId(fieldId: kotlin.Int): _Fields {" << endl;
+  indent(out) << "override fun fieldForId(fieldId: kotlin.Int): _Fields {" << '\n';
   indent_up();
   {
     indent(out) << "return _Fields.findByValue(fieldId) ?: throw "
                    "kotlin.IllegalArgumentException(\"invalid fieldId $fieldId\")"
-                << endl;
+                << '\n';
   }
   scope_down(out);
-  out << endl;
+  out << '\n';
 }
 
 void t_kotlin_generator::generate_struct_method_is_set(std::ostream& out, t_struct* tstruct) {
-  indent(out) << "override fun isSet(field: _Fields): kotlin.Boolean {" << endl;
+  indent(out) << "override fun isSet(field: _Fields): kotlin.Boolean {" << '\n';
   indent_up();
   {
-    indent(out) << "return when (field) {" << endl;
+    indent(out) << "return when (field) {" << '\n';
     indent_up();
     {
       auto members = tstruct->get_members();
@@ -705,67 +703,67 @@
           } else {
             out << "this." << kotlin_safe_name(field->get_name()) << " != null";
           }
-          out << endl;
+          out << '\n';
         }
       } else {
-        indent(out) << "else -> false" << endl;
+        indent(out) << "else -> false" << '\n';
       }
     }
     scope_down(out);
   }
   scope_down(out);
-  out << endl;
+  out << '\n';
 }
 
 void t_kotlin_generator::generate_struct_method_clear(std::ostream& out, t_struct* tstruct) {
-  indent(out) << "override fun clear(): kotlin.Unit {" << endl;
+  indent(out) << "override fun clear(): kotlin.Unit {" << '\n';
   indent_up();
   {
     for (auto& field : tstruct->get_members()) {
       auto is_required = field->get_req() == t_field::T_REQUIRED;
       indent(out) << (is_required ? "_" + field->get_name() : kotlin_safe_name(field->get_name()))
-                  << " = null" << endl;
+                  << " = null" << '\n';
     }
   }
   scope_down(out);
-  out << endl;
+  out << '\n';
 }
 
 void t_kotlin_generator::generate_struct_method_validate(std::ostream& out, t_struct* tstruct) {
-  indent(out) << "@kotlin.jvm.Throws(org.apache.thrift.TException::class)" << endl;
-  indent(out) << "fun validate(): kotlin.Unit {" << endl;
+  indent(out) << "@kotlin.jvm.Throws(org.apache.thrift.TException::class)" << '\n';
+  indent(out) << "fun validate(): kotlin.Unit {" << '\n';
   indent_up();
   {
     for (auto& field : tstruct->get_members()) {
       bool is_required = field->get_req() == t_field::T_REQUIRED;
       if (is_required) {
-        indent(out) << "if (_" << field->get_name() << " == null) {" << endl;
+        indent(out) << "if (_" << field->get_name() << " == null) {" << '\n';
         indent_up();
         {
           indent(out) << "throw org.apache.thrift.TException(\"Required field `"
                       << field->get_name()
                       << "' is null, "
                          "struct is: $this\")"
-                      << endl;
+                      << '\n';
         }
         scope_down(out);
       }
     }
   }
   scope_down(out);
-  out << endl;
+  out << '\n';
 }
 
 void t_kotlin_generator::generate_struct_method_set_field_value(std::ostream& out,
                                                                 t_struct* tstruct) {
-  indent(out) << "@Suppress(\"UNCHECKED_CAST\")" << endl;
+  indent(out) << "@Suppress(\"UNCHECKED_CAST\")" << '\n';
   indent(out) << "override fun setFieldValue(field: _Fields, value: kotlin.Any?): kotlin.Unit {"
-              << endl;
+              << '\n';
   indent_up();
   {
     const vector<t_field*>& members = tstruct->get_members();
     if (members.size() > 0) {
-      indent(out) << "when (field) {" << endl;
+      indent(out) << "when (field) {" << '\n';
       indent_up();
       {
         for (auto& field : tstruct->get_members()) {
@@ -773,155 +771,155 @@
           indent(out) << "_Fields." << constant_name(field->get_name()) << " -> this."
                       << (is_required ? "_" + field->get_name()
                                       : kotlin_safe_name(field->get_name()))
-                      << " = value as " << type_name(field->get_type()) << "?" << endl;
+                      << " = value as " << type_name(field->get_type()) << "?" << '\n';
         }
       }
       scope_down(out);
     } else {
-      indent(out) << "return" << endl;
+      indent(out) << "return" << '\n';
     }
   }
   scope_down(out);
-  out << endl;
+  out << '\n';
 }
 
 void t_kotlin_generator::generate_struct_method_get_field_value(std::ostream& out,
                                                                 t_struct* tstruct) {
-  indent(out) << "override fun getFieldValue(field: _Fields): kotlin.Any? {" << endl;
+  indent(out) << "override fun getFieldValue(field: _Fields): kotlin.Any? {" << '\n';
   indent_up();
   {
     auto members = tstruct->get_members();
     if (members.size() > 0) {
-      indent(out) << "return when (field) {" << endl;
+      indent(out) << "return when (field) {" << '\n';
       indent_up();
       {
         for (auto& field : tstruct->get_members()) {
           indent(out) << "_Fields." << constant_name(field->get_name()) << " -> this."
-                      << kotlin_safe_name(field->get_name()) << endl;
+                      << kotlin_safe_name(field->get_name()) << '\n';
         }
       }
       scope_down(out);
     } else {
-      indent(out) << "return null" << endl;
+      indent(out) << "return null" << '\n';
     }
   }
   scope_down(out);
-  out << endl;
+  out << '\n';
 }
 
 void t_kotlin_generator::generate_struct_method_read(std::ostream& out, t_struct* tstruct) {
   indent(out) << "override fun read(iproto: org.apache.thrift.protocol.TProtocol): kotlin.Unit {"
-              << endl;
+              << '\n';
   indent_up();
   {
     indent(out)
         << "require(org.apache.thrift.scheme.StandardScheme::class.java == iproto.scheme) { "
            "\"only standard scheme is "
            "supported for now\" }"
-        << endl;
-    indent(out) << tstruct->get_name() << "StandardScheme.read(iproto, this)" << endl;
+        << '\n';
+    indent(out) << tstruct->get_name() << "StandardScheme.read(iproto, this)" << '\n';
   }
   scope_down(out);
-  out << endl;
+  out << '\n';
 }
 void t_kotlin_generator::generate_struct_method_write(std::ostream& out, t_struct* tstruct) {
   indent(out) << "override fun write(oproto: org.apache.thrift.protocol.TProtocol): kotlin.Unit {"
-              << endl;
+              << '\n';
   indent_up();
   {
     indent(out)
         << "require(org.apache.thrift.scheme.StandardScheme::class.java == oproto.scheme) { "
            "\"only standard scheme is "
            "supported for now\" }"
-        << endl;
-    indent(out) << tstruct->get_name() << "StandardScheme.write(oproto, this)" << endl;
+        << '\n';
+    indent(out) << tstruct->get_name() << "StandardScheme.write(oproto, this)" << '\n';
   }
   scope_down(out);
-  out << endl;
+  out << '\n';
 }
 
 void t_kotlin_generator::generate_struct_standard_scheme_read(std::ostream& out,
                                                               t_struct* tstruct) {
   indent(out) << "override fun read(iproto: org.apache.thrift.protocol.TProtocol, struct: "
-              << tstruct->get_name() << ") {" << endl;
+              << tstruct->get_name() << ") {" << '\n';
   indent_up();
   {
-    indent(out) << "iproto.apply {" << endl;
+    indent(out) << "iproto.apply {" << '\n';
     indent_up();
     {
-      indent(out) << "readStruct {" << endl;
+      indent(out) << "readStruct {" << '\n';
       indent_up();
       {
-        indent(out) << "var stopped = false" << endl;
-        indent(out) << "while (!stopped) {" << endl;
+        indent(out) << "var stopped = false" << '\n';
+        indent(out) << "while (!stopped) {" << '\n';
         indent_up();
         {
-          indent(out) << "stopped = readField {" << endl;
+          indent(out) << "stopped = readField {" << '\n';
           indent_up();
           {
             indent(out) << "val skipNext = { "
                            "org.apache.thrift.protocol.TProtocolUtil.skip(iproto, it.type) }"
-                        << endl;
+                        << '\n';
 
-            indent(out) << "when (it.id.toInt()) {" << endl;
+            indent(out) << "when (it.id.toInt()) {" << '\n';
             indent_up();
             {
               for (auto& field : tstruct->get_members()) {
-                indent(out) << field->get_key() << " -> {" << endl;
+                indent(out) << field->get_key() << " -> {" << '\n';
                 indent_up();
                 {
                   indent(out) << "if (it.type == " << type_to_enum(field->get_type()) << ") {"
-                              << endl;
+                              << '\n';
                   indent_up();
                   generate_deserialize_field(out, field, "struct.");
                   indent_down();
-                  indent(out) << "} else {" << endl;
+                  indent(out) << "} else {" << '\n';
                   indent_up();
-                  indent(out) << "skipNext()" << endl;
+                  indent(out) << "skipNext()" << '\n';
                   indent_down();
-                  indent(out) << "}" << endl;
+                  indent(out) << "}" << '\n';
                 }
                 scope_down(out);
               }
-              indent(out) << "else -> skipNext()" << endl;
+              indent(out) << "else -> skipNext()" << '\n';
             }
             scope_down(out);
           }
           scope_down(out);
         }
         scope_down(out);
-        indent(out) << "struct.validate()" << endl;
+        indent(out) << "struct.validate()" << '\n';
       }
       scope_down(out);
     }
     scope_down(out);
   }
   scope_down(out);
-  out << endl;
+  out << '\n';
 }
 
 void t_kotlin_generator::generate_struct_standard_scheme_write(std::ostream& out,
                                                                t_struct* tstruct) {
   indent(out) << "override fun write(oproto: org.apache.thrift.protocol.TProtocol, struct: "
-              << tstruct->get_name() << ") {" << endl;
+              << tstruct->get_name() << ") {" << '\n';
   indent_up();
   {
-    indent(out) << "struct.validate()" << endl;
-    indent(out) << "oproto.apply {" << endl;
+    indent(out) << "struct.validate()" << '\n';
+    indent(out) << "oproto.apply {" << '\n';
     indent_up();
     {
-      indent(out) << "writeStruct(STRUCT_DESC) {" << endl;
+      indent(out) << "writeStruct(STRUCT_DESC) {" << '\n';
       indent_up();
       {
         for (auto& field : tstruct->get_members()) {
           auto is_required = field->get_req() == t_field::T_REQUIRED;
           indent(out) << "struct." << kotlin_safe_name(field->get_name())
                       << (is_required ? "" : "?") << ".let { "
-                      << kotlin_safe_name(field->get_name()) << " ->" << endl;
+                      << kotlin_safe_name(field->get_name()) << " ->" << '\n';
           indent_up();
           {
             indent(out) << "writeField(" << constant_name(field->get_name()) << "_FIELD_DESC) {"
-                        << endl;
+                        << '\n';
             indent_up();
             generate_serialize_field(out, field);
             scope_down(out);
@@ -929,36 +927,36 @@
           scope_down(out);
         }
       }
-      indent(out) << "writeFieldStop()" << endl;
+      indent(out) << "writeFieldStop()" << '\n';
       scope_down(out);
     }
     scope_down(out);
   }
   scope_down(out);
-  out << endl;
+  out << '\n';
 }
 
 void t_kotlin_generator::generate_struct_standard_scheme(std::ostream& out, t_struct* tstruct) {
   indent(out) << "private object " << tstruct->get_name()
               << "StandardScheme : org.apache.thrift.scheme.StandardScheme<" << tstruct->get_name()
-              << ">() {" << endl;
+              << ">() {" << '\n';
   indent_up();
   generate_struct_standard_scheme_read(out, tstruct);
   generate_struct_standard_scheme_write(out, tstruct);
   scope_down(out);
-  out << endl;
+  out << '\n';
 }
 
 void t_kotlin_generator::generate_union_tuple_scheme(std::ostream& out, t_struct* /*tunion*/) {
   indent(out) << "override fun tupleSchemeReadValue(iproto: org.apache.thrift.protocol.TProtocol, "
                  "fieldID: kotlin.Short) = throw kotlin.UnsupportedOperationException(\"only "
                  "standard scheme is supported for now\")"
-              << endl;
+              << '\n';
   indent(out)
       << "override fun tupleSchemeWriteValue(oproto: org.apache.thrift.protocol.TProtocol) = "
          "throw kotlin.UnsupportedOperationException(\"only standard scheme is supported for "
          "now\")"
-      << endl;
+      << '\n';
 }
 
 void t_kotlin_generator::generate_union_standard_scheme(std::ostream& out, t_struct* tunion) {
@@ -970,61 +968,61 @@
   indent(out)
       << "override fun standardSchemeReadValue(iproto: org.apache.thrift.protocol.TProtocol, "
          "field: org.apache.thrift.protocol.TField): Any? ="
-      << endl;
+      << '\n';
   indent_up();
-  indent(out) << "when (_Fields.findByValue(field.id.toInt())) {" << endl;
+  indent(out) << "when (_Fields.findByValue(field.id.toInt())) {" << '\n';
   indent_up();
   for (auto& member : tunion->get_members()) {
     auto expect_type = type_name(member->get_type());
-    indent(out) << "_Fields." << constant_name(member->get_name()) << " -> {" << endl;
+    indent(out) << "_Fields." << constant_name(member->get_name()) << " -> {" << '\n';
     indent_up();
     {
       indent(out) << "if (field.type == " << constant_name(member->get_name())
-                  << "_FIELD_DESC.type) {" << endl;
+                  << "_FIELD_DESC.type) {" << '\n';
       indent_up();
-      indent(out) << "iproto.run {" << endl;
+      indent(out) << "iproto.run {" << '\n';
       indent_up();
       indent(out);
       generate_deserialize_value(out, member->get_type());
-      out << endl;
+      out << '\n';
       scope_down(out);
       indent_down();
-      indent(out) << "} else {" << endl;
+      indent(out) << "} else {" << '\n';
       indent_up();
-      indent(out) << "org.apache.thrift.protocol.TProtocolUtil.skip(iproto, field.type)" << endl;
-      indent(out) << "null" << endl;
+      indent(out) << "org.apache.thrift.protocol.TProtocolUtil.skip(iproto, field.type)" << '\n';
+      indent(out) << "null" << '\n';
       scope_down(out);
     }
     scope_down(out);
   }
-  indent(out) << "null -> {" << endl;
+  indent(out) << "null -> {" << '\n';
   indent_up();
-  indent(out) << "org.apache.thrift.protocol.TProtocolUtil.skip(iproto, field.type)" << endl;
-  indent(out) << "null" << endl;
+  indent(out) << "org.apache.thrift.protocol.TProtocolUtil.skip(iproto, field.type)" << '\n';
+  indent(out) << "null" << '\n';
   scope_down(out);
   scope_down(out);
   indent_down();
 }
 
 void t_kotlin_generator::generate_union_standard_scheme_write(std::ostream& out, t_struct* tunion) {
-  indent(out) << "@Suppress(\"UNCHECKED_CAST\")" << endl;
+  indent(out) << "@Suppress(\"UNCHECKED_CAST\")" << '\n';
   indent(out)
       << "override fun standardSchemeWriteValue(oproto: org.apache.thrift.protocol.TProtocol) {"
-      << endl;
+      << '\n';
   indent_up();
-  indent(out) << "when (setField_) {" << endl;
+  indent(out) << "when (setField_) {" << '\n';
   indent_up();
   for (auto& member : tunion->get_members()) {
-    indent(out) << "_Fields." << constant_name(member->get_name()) << " -> {" << endl;
+    indent(out) << "_Fields." << constant_name(member->get_name()) << " -> {" << '\n';
     indent_up();
     {
-      indent(out) << "val it = value_ as " << type_name(member->get_type()) << endl;
-      indent(out) << "oproto.apply {" << endl;
+      indent(out) << "val it = value_ as " << type_name(member->get_type()) << '\n';
+      indent(out) << "oproto.apply {" << '\n';
       indent_up();
       {
         indent(out);
         generate_serialize_value(out, member->get_type());
-        out << endl;
+        out << '\n';
       }
       scope_down(out);
     }
@@ -1032,7 +1030,7 @@
   }
   indent(out) << "null -> throw kotlin.IllegalStateException(\"Cannot write union with unknown "
                  "field $setField_\")"
-              << endl;
+              << '\n';
   scope_down(out);
   scope_down(out);
 }
@@ -1052,25 +1050,25 @@
   }
 
   auto union_class_name = kotlin_safe_name(tunion->get_name());
-  { indent(out) << "override fun deepCopy() = " << union_class_name << "(this)" << endl; }
-  { indent(out) << "override fun enumForId(id: kotlin.Short) = fieldForId(id.toInt())" << endl; }
-  { indent(out) << "override fun getStructDesc() = STRUCT_DESC" << endl; }
+  { indent(out) << "override fun deepCopy() = " << union_class_name << "(this)" << '\n'; }
+  { indent(out) << "override fun enumForId(id: kotlin.Short) = fieldForId(id.toInt())" << '\n'; }
+  { indent(out) << "override fun getStructDesc() = STRUCT_DESC" << '\n'; }
   {
-    indent(out) << "override fun getFieldDesc(setField: _Fields) = when (setField) {" << endl;
+    indent(out) << "override fun getFieldDesc(setField: _Fields) = when (setField) {" << '\n';
     indent_up();
     for (auto& member : tunion->get_members()) {
       indent(out) << "_Fields." << constant_name(member->get_name()) << " -> "
-                  << constant_name(member->get_name()) << "_FIELD_DESC" << endl;
+                  << constant_name(member->get_name()) << "_FIELD_DESC" << '\n';
     }
     scope_down(out);
   }
 }
 
 void t_kotlin_generator::generate_union_method_check_type(std::ostream& out, t_struct* tunion) {
-  indent(out) << "@Suppress(\"UNCHECKED_CAST\")" << endl;
-  indent(out) << "override fun checkType(setField: _Fields, value: kotlin.Any?) {" << endl;
+  indent(out) << "@Suppress(\"UNCHECKED_CAST\")" << '\n';
+  indent(out) << "override fun checkType(setField: _Fields, value: kotlin.Any?) {" << '\n';
   indent_up();
-  indent(out) << "when (setField) {" << endl;
+  indent(out) << "when (setField) {" << '\n';
   indent_up();
   for (auto& member : tunion->get_members()) {
     auto expect_type = type_name(member->get_type());
@@ -1078,7 +1076,7 @@
                 << expect_type
                 << " ?: throw kotlin.ClassCastException(\"Was expecting value of type `"
                 << expect_type << "' for field `" << member->get_name()
-                << "', but got ${value?.javaClass}\")" << endl;
+                << "', but got ${value?.javaClass}\")" << '\n';
   }
   scope_down(out);
   scope_down(out);
@@ -1089,12 +1087,12 @@
                                                    string /*additional interface*/) {
   auto union_class_name = kotlin_safe_name(tunion->get_name());
   indent(out) << "class " << union_class_name << " : org.apache.thrift.TUnion<" << union_class_name
-              << ", " << union_class_name << "._Fields> {" << endl;
+              << ", " << union_class_name << "._Fields> {" << '\n';
   indent_up();
   indent(out) << "constructor(setField: _Fields, value: kotlin.Any) : super(setField, value)"
-              << endl;
-  indent(out) << "constructor(other: " << union_class_name << ") : super(other)" << endl;
-  indent(out) << "constructor() : super()" << endl;
+              << '\n';
+  indent(out) << "constructor(other: " << union_class_name << ") : super(other)" << '\n';
+  indent(out) << "constructor() : super()" << '\n';
 
   generate_struct_field_name_constants(out, tunion);
   generate_struct_companion_object(out, tunion);
@@ -1104,7 +1102,7 @@
   generate_union_standard_scheme(out, tunion);
   generate_union_tuple_scheme(out, tunion);
   indent_down();
-  indent(out) << "}" << endl;
+  indent(out) << "}" << '\n';
 }
 
 void t_kotlin_generator::generate_struct_definition(std::ostream& out,
@@ -1123,7 +1121,7 @@
   indent_up();
   auto sep = "";
   for (auto field : members) {
-    out << sep << endl;
+    out << sep << '\n';
     sep = ",";
     generate_kdoc_comment(out, field);
     auto is_required = field->get_req() == t_field::T_REQUIRED;
@@ -1141,7 +1139,7 @@
     out << ": " << type_name(field->get_type()) << "? = null";
   }
   indent_down();
-  out << endl;
+  out << '\n';
   indent(out) << ") : ";
   if (is_exception) {
     out << "org.apache.thrift.TException(), ";
@@ -1150,7 +1148,7 @@
     additional_interface = ", " + additional_interface;
   }
   out << "org.apache.thrift.TBase<" << tstruct->get_name() << ", " << tstruct->get_name()
-      << "._Fields>" << additional_interface << " {" << endl;
+      << "._Fields>" << additional_interface << " {" << '\n';
 
   indent_up();
 
@@ -1162,7 +1160,7 @@
         out << "override ";
       }
       out << "val " << kotlin_safe_name(field->get_name()) << ": " << type_name(field->get_type())
-          << " get() = _" + kotlin_safe_name(field->get_name()) << "!!" << endl;
+          << " get() = _" + kotlin_safe_name(field->get_name()) << "!!" << '\n';
     }
   }
 
@@ -1181,7 +1179,7 @@
   generate_struct_method_write(out, tstruct);
 
   indent_down();
-  indent(out) << "}" << endl;
+  indent(out) << "}" << '\n';
 }
 
 string t_kotlin_generator::base_type_write_expression(t_base_type* tbase, string it) {
@@ -1286,7 +1284,7 @@
   }
   indent(out);
   generate_serialize_value(out, type, kotlin_safe_name(tfield->get_name()));
-  out << endl;
+  out << '\n';
 }
 
 /**
@@ -1305,7 +1303,7 @@
       = prefix + (is_required ? "_" + tfield->get_name() : kotlin_safe_name(tfield->get_name()));
   indent(out) << name << " = ";
   generate_deserialize_value(out, type);
-  out << endl;
+  out << '\n';
 }
 
 /**
@@ -1315,33 +1313,33 @@
   if (ttype->is_map()) {
     out << "writeMap(" << type_to_enum(((t_map*)ttype)->get_key_type()) << ", "
         << type_to_enum(((t_map*)ttype)->get_val_type()) << ", " << it << ") { (key, value) ->"
-        << endl;
+        << '\n';
     indent_up();
     {
       generate_serialize_value(indent(out), ((t_map*)ttype)->get_key_type(), "key");
-      out << endl;
+      out << '\n';
       generate_serialize_value(indent(out), ((t_map*)ttype)->get_val_type(), "value");
-      out << endl;
+      out << '\n';
       indent_down();
     }
     indent(out) << "}";
   } else if (ttype->is_set()) {
     out << "writeSet(" << type_to_enum(((t_set*)ttype)->get_elem_type()) << ", " << it << ") {"
-        << endl;
+        << '\n';
     indent_up();
     {
       generate_serialize_value(indent(out), ((t_set*)ttype)->get_elem_type());
-      out << endl;
+      out << '\n';
       indent_down();
     }
     indent(out) << "}";
   } else if (ttype->is_list()) {
     out << "writeList(" << type_to_enum(((t_list*)ttype)->get_elem_type()) << ", " << it << ") {"
-        << endl;
+        << '\n';
     {
       indent_up();
       generate_serialize_value(indent(out), ((t_list*)ttype)->get_elem_type());
-      out << endl;
+      out << '\n';
       indent_down();
     }
     indent(out) << "}";
@@ -1355,41 +1353,41 @@
  */
 void t_kotlin_generator::generate_deserialize_container(ostream& out, t_type* ttype) {
   if (ttype->is_map()) {
-    out << "readMap { tmap ->" << endl;
+    out << "readMap { tmap ->" << '\n';
     indent_up();
-    indent(out) << "kotlin.collections.List(tmap.size) {" << endl;
+    indent(out) << "kotlin.collections.List(tmap.size) {" << '\n';
     indent_up();
     indent(out);
     generate_deserialize_value(out, ((t_map*)ttype)->get_key_type());
     out << " to ";
     generate_deserialize_value(out, ((t_map*)ttype)->get_val_type());
-    out << endl;
+    out << '\n';
     indent_down();
-    indent(out) << "}.associate { it }" << endl;
+    indent(out) << "}.associate { it }" << '\n';
     indent_down();
     indent(out) << "}";
   } else if (ttype->is_set()) {
-    out << "readSet { tset ->" << endl;
+    out << "readSet { tset ->" << '\n';
     indent_up();
-    indent(out) << "kotlin.collections.List(tset.size) {" << endl;
+    indent(out) << "kotlin.collections.List(tset.size) {" << '\n';
     indent_up();
     indent(out);
     generate_deserialize_value(out, ((t_set*)ttype)->get_elem_type());
-    out << endl;
+    out << '\n';
     indent_down();
-    indent(out) << "}.toSet()" << endl;
+    indent(out) << "}.toSet()" << '\n';
     indent_down();
     indent(out) << "}";
   } else if (ttype->is_list()) {
-    out << "readList { tlist ->" << endl;
+    out << "readList { tlist ->" << '\n';
     indent_up();
-    indent(out) << "kotlin.collections.List(tlist.size) {" << endl;
+    indent(out) << "kotlin.collections.List(tlist.size) {" << '\n';
     indent_up();
     indent(out);
     generate_deserialize_value(out, ((t_list*)ttype)->get_elem_type());
-    out << endl;
+    out << '\n';
     indent_down();
-    indent(out) << "}" << endl;
+    indent(out) << "}" << '\n';
     indent_down();
     indent(out) << "}";
   } else {
@@ -1419,14 +1417,14 @@
   ofstream_with_content_based_conditional_update out;
   out.open(f_service_name.c_str());
   out << autogen_comment() << kotlin_package();
-  out << "interface " << tservice->get_name() << " {" << endl;
+  out << "interface " << tservice->get_name() << " {" << '\n';
   indent_up();
   for (auto tfunc : tservice->get_functions()) {
     generate_kdoc_comment(out, tfunc);
-    indent(out) << function_signature(tfunc) << endl;
+    indent(out) << function_signature(tfunc) << '\n';
   }
   scope_down(out);
-  out << endl << endl;
+  out << '\n' << '\n';
   out.close();
 }
 
@@ -1437,22 +1435,22 @@
   out << autogen_comment() << warning_surpressions() << kotlin_package();
   generate_docstring_comment(out, "/**\n", " * ",
                              "client implementation for [" + tservice->get_name() + "]", " */\n");
-  indent(out) << "class " << tservice->get_name() << "Client(" << endl;
+  indent(out) << "class " << tservice->get_name() << "Client(" << '\n';
   indent_up();
-  indent(out) << "protocolFactory: org.apache.thrift.protocol.TProtocolFactory," << endl;
-  indent(out) << "clientManager: org.apache.thrift.async.TAsyncClientManager," << endl;
-  indent(out) << "transport: org.apache.thrift.transport.TNonblockingTransport" << endl;
+  indent(out) << "protocolFactory: org.apache.thrift.protocol.TProtocolFactory," << '\n';
+  indent(out) << "clientManager: org.apache.thrift.async.TAsyncClientManager," << '\n';
+  indent(out) << "transport: org.apache.thrift.transport.TNonblockingTransport" << '\n';
   indent_down();
   out << "): org.apache.thrift.async.TAsyncClient(protocolFactory, clientManager, transport), "
-      << tservice->get_name() << " {" << endl
-      << endl;
+      << tservice->get_name() << " {" << '\n'
+      << '\n';
 
   indent_up();
   {
-    indent(out) << "private val seqId = java.util.concurrent.atomic.AtomicInteger()" << endl
-                << endl;
+    indent(out) << "private val seqId = java.util.concurrent.atomic.AtomicInteger()" << '\n'
+                << '\n';
     for (auto tfunc : tservice->get_functions()) {
-      indent(out) << "override " << function_signature(tfunc) << " {" << endl;
+      indent(out) << "override " << function_signature(tfunc) << " {" << '\n';
       indent_up();
       {
         string args_name = tservice->get_name() + "FunctionArgs." + tfunc->get_name() + "_args";
@@ -1465,16 +1463,16 @@
           first = false;
           out << tfield->get_name();
         }
-        out << ")" << endl;
-        indent(out) << "return transformCallback {" << endl;
+        out << ")" << '\n';
+        indent(out) << "return transformCallback {" << '\n';
         indent_up();
         {
-          indent(out) << "checkReady()" << endl;
+          indent(out) << "checkReady()" << '\n';
           indent(out)
               << "___currentMethod = ProcessCall." << tfunc->get_name()
               << "Call(args, seqId.getAndIncrement(), this, ___protocolFactory, ___transport, it)"
-              << endl;
-          indent(out) << "___manager.call(___currentMethod)" << endl;
+              << '\n';
+          indent(out) << "___manager.call(___currentMethod)" << '\n';
         }
         scope_down(out);
       }
@@ -1484,22 +1482,22 @@
     indent(out) << "private suspend fun <R> "
                    "org.apache.thrift.async.TAsyncClient.transformCallback(action: "
                    "(org.apache.thrift.async.AsyncMethodCallback<R>) -> Unit): R {"
-                << endl;
+                << '\n';
     indent_up();
-    indent(out) << "val deferred = kotlinx.coroutines.CompletableDeferred<R>()" << endl;
+    indent(out) << "val deferred = kotlinx.coroutines.CompletableDeferred<R>()" << '\n';
     indent(out) << "val callback = object : org.apache.thrift.async.AsyncMethodCallback<R> {"
-                << endl;
+                << '\n';
     indent_up();
-    indent(out) << "override fun onComplete(response: R) { deferred.complete(response) }" << endl;
+    indent(out) << "override fun onComplete(response: R) { deferred.complete(response) }" << '\n';
     indent(out) << "override fun onError(exception: java.lang.Exception) { "
                    "deferred.completeExceptionally(exception) }"
-                << endl;
+                << '\n';
     scope_down(out);
-    indent(out) << "action(callback)" << endl;
-    indent(out) << "return deferred.await()" << endl;
+    indent(out) << "action(callback)" << '\n';
+    indent(out) << "return deferred.await()" << '\n';
     scope_down(out);
 
-    indent(out) << "sealed interface ProcessCall {" << endl;
+    indent(out) << "sealed interface ProcessCall {" << '\n';
     indent_up();
     for (auto tfunc : tservice->get_functions()) {
       generate_client_call(out, tservice, tfunc);
@@ -1507,7 +1505,7 @@
     scope_down(out);
   }
   scope_down(out);
-  out << endl << endl;
+  out << '\n' << '\n';
   out.close();
 }
 
@@ -1518,74 +1516,74 @@
   string funclassname = funname + "Call";
   string rtype = type_name(tfunc->get_returntype(), true);
 
-  indent(out) << "class " + funclassname + "(" << endl;
+  indent(out) << "class " + funclassname + "(" << '\n';
   indent_up();
   string args_name = tservice->get_name() + "FunctionArgs." + tfunc->get_name() + "_args";
-  indent(out) << "val args: " << args_name << "," << endl;
-  indent(out) << "val seqId: kotlin.Int," << endl;
-  indent(out) << "client: org.apache.thrift.async.TAsyncClient," << endl;
-  indent(out) << "protocolFactory: org.apache.thrift.protocol.TProtocolFactory," << endl;
-  indent(out) << "transport: org.apache.thrift.transport.TNonblockingTransport," << endl;
+  indent(out) << "val args: " << args_name << "," << '\n';
+  indent(out) << "val seqId: kotlin.Int," << '\n';
+  indent(out) << "client: org.apache.thrift.async.TAsyncClient," << '\n';
+  indent(out) << "protocolFactory: org.apache.thrift.protocol.TProtocolFactory," << '\n';
+  indent(out) << "transport: org.apache.thrift.transport.TNonblockingTransport," << '\n';
   indent(out) << "resultHandler: org.apache.thrift.async.AsyncMethodCallback<" << rtype << ">,"
-              << endl;
+              << '\n';
   indent_down();
   indent(out) << ") : org.apache.thrift.async.TAsyncMethodCall<" << rtype
               << ">(client, protocolFactory, transport, resultHandler, "
-              << (tfunc->is_oneway() ? "true" : "false") << "), ProcessCall {" << endl;
+              << (tfunc->is_oneway() ? "true" : "false") << "), ProcessCall {" << '\n';
 
   indent_up();
   indent(out) << "override fun write_args(protocol: org.apache.thrift.protocol.TProtocol) {"
-              << endl;
+              << '\n';
   indent_up();
   indent(out) << "val marker = org.apache.thrift.protocol.TMessage(\"" << tfunc->get_name()
-              << "\", org.apache.thrift.protocol.TMessageType.CALL, seqId)" << endl;
-  indent(out) << "protocol.writeMessage(marker) { args.write(protocol) }" << endl;
+              << "\", org.apache.thrift.protocol.TMessageType.CALL, seqId)" << '\n';
+  indent(out) << "protocol.writeMessage(marker) { args.write(protocol) }" << '\n';
   scope_down(out);
 
-  indent(out) << "override fun getResult(): " << rtype << " {" << endl;
+  indent(out) << "override fun getResult(): " << rtype << " {" << '\n';
   indent_up();
   indent(out) << "check(state == org.apache.thrift.async.TAsyncMethodCall.State.RESPONSE_READ) { "
                  "\"Method call not finished!\" }"
-              << endl;
+              << '\n';
   indent(out) << "val memoryTransport = "
                  "org.apache.thrift.transport.TMemoryInputTransport(frameBuffer.array())"
-              << endl;
-  indent(out) << "val protocol = client.protocolFactory.getProtocol(memoryTransport)" << endl;
+              << '\n';
+  indent(out) << "val protocol = client.protocolFactory.getProtocol(memoryTransport)" << '\n';
 
   if (tfunc->is_oneway()) {
-    indent(out) << "// one way function, nothing to read" << endl;
+    indent(out) << "// one way function, nothing to read" << '\n';
   } else {
-    indent(out) << "return protocol.readMessage {" << endl;
+    indent(out) << "return protocol.readMessage {" << '\n';
     indent_up();
     {
-      indent(out) << "if (it.type == org.apache.thrift.protocol.TMessageType.EXCEPTION) {" << endl;
+      indent(out) << "if (it.type == org.apache.thrift.protocol.TMessageType.EXCEPTION) {" << '\n';
       indent_up();
       indent(out) << "val ex = org.apache.thrift.TApplicationException().apply { read(protocol) }"
-                  << endl;
-      indent(out) << "throw ex" << endl;
+                  << '\n';
+      indent(out) << "throw ex" << '\n';
       scope_down(out);
-      indent(out) << "if (it.seqid != seqId) {" << endl;
+      indent(out) << "if (it.seqid != seqId) {" << '\n';
       indent_up();
-      indent(out) << "throw org.apache.thrift.TApplicationException(" << endl;
+      indent(out) << "throw org.apache.thrift.TApplicationException(" << '\n';
       indent_up();
-      indent(out) << "org.apache.thrift.TApplicationException.BAD_SEQUENCE_ID," << endl;
+      indent(out) << "org.apache.thrift.TApplicationException.BAD_SEQUENCE_ID," << '\n';
       indent(out) << "\"" << funname
                   << " failed: out of sequence response: expected $seqId but got ${it.seqid}\""
-                  << endl;
+                  << '\n';
       indent_down();
-      indent(out) << ")" << endl;
+      indent(out) << ")" << '\n';
       scope_down(out);
       string result_name = tservice->get_name() + "FunctionResult." + tfunc->get_name() + "_result";
-      indent(out) << "val result = " << result_name << "().apply { read(protocol) }" << endl;
+      indent(out) << "val result = " << result_name << "().apply { read(protocol) }" << '\n';
       for (auto xception : tfunc->get_xceptions()->get_members()) {
-        indent(out) << "result." << xception->get_name() << "?.let { throw it }" << endl;
+        indent(out) << "result." << xception->get_name() << "?.let { throw it }" << '\n';
       }
       if (!tfunc->get_returntype()->is_void()) {
         indent(out)
             << "result.success ?: throw "
                "org.apache.thrift.TApplicationException(org.apache.thrift.TApplicationException."
                "MISSING_RESULT, \"returnString failed: unknown result\")"
-            << endl;
+            << '\n';
       }
     }
     scope_down(out);
@@ -1601,43 +1599,43 @@
   out << autogen_comment() << warning_surpressions() << kotlin_package();
   auto service_imports = {"import kotlinx.coroutines.future.future"};
   for (auto service_import : service_imports) {
-    out << service_import << endl;
+    out << service_import << '\n';
   }
-  out << endl;
+  out << '\n';
 
   generate_docstring_comment(out, "/**\n", " * ",
                              "server implementation for [" + tservice->get_name() + "]", " */\n");
-  indent(out) << "class " << tservice->get_name() << "Processor(" << endl;
+  indent(out) << "class " << tservice->get_name() << "Processor(" << '\n';
   indent_up();
-  indent(out) << "handler: " << tservice->get_name() << "," << endl;
-  indent(out) << "private val scope: kotlinx.coroutines.CoroutineScope," << endl;
+  indent(out) << "handler: " << tservice->get_name() << "," << '\n';
+  indent(out) << "private val scope: kotlinx.coroutines.CoroutineScope," << '\n';
   indent(out) << "private val processMap: kotlin.collections.Map<kotlin.String, "
                  "org.apache.thrift.AsyncProcessFunction<"
               << tservice->get_name()
               << ", out org.apache.thrift.TBase<*, "
-                 "*>, out kotlin.Any>> = mapOf("
-              << endl;
+                 "*>, out kotlin.Any, out org.apache.thrift.TBase<*, *>>> = mapOf("
+              << '\n';
   indent_up();
   {
     for (auto tfunc : tservice->get_functions()) {
       indent(out) << '"' << tfunc->get_name() << '"' << " to ProcessFunction." << tfunc->get_name()
-                  << "(scope)," << endl;
+                  << "(scope)," << '\n';
     }
   }
   indent_down();
-  indent(out) << ")" << endl;
+  indent(out) << ")" << '\n';
   indent_down();
   out << "): org.apache.thrift.TBaseAsyncProcessor<" << tservice->get_name()
-      << ">(handler, processMap) {" << endl;
+      << ">(handler, processMap) {" << '\n';
   indent_up();
-  indent(out) << "companion object {" << endl;
+  indent(out) << "companion object {" << '\n';
   indent_up();
   indent(out) << "internal val logger: org.slf4j.Logger = "
                  "org.slf4j.LoggerFactory.getLogger("
-              << tservice->get_name() << "Processor::class.java)" << endl;
+              << tservice->get_name() << "Processor::class.java)" << '\n';
   scope_down(out);
 
-  indent(out) << "sealed interface ProcessFunction {" << endl;
+  indent(out) << "sealed interface ProcessFunction {" << '\n';
   indent_up();
 
   {
@@ -1647,7 +1645,7 @@
   }
   scope_down(out);
   scope_down(out);
-  out << endl << endl;
+  out << '\n' << '\n';
   out.close();
 }
 
@@ -1656,21 +1654,32 @@
                                                            t_function* tfunc) {
   string args_name = tservice->get_name() + "FunctionArgs." + tfunc->get_name() + "_args";
   string rtype = type_name(tfunc->get_returntype(), true);
+  string resultname = tservice->get_name() + "FunctionResult." + tfunc->get_name() + "_result";
 
   indent(out) << "class " << tfunc->get_name() << "<I : " << tservice->get_name()
               << ">(private val scope: kotlinx.coroutines.CoroutineScope) : "
                  "org.apache.thrift.AsyncProcessFunction<I, "
-              << args_name << ", " << rtype << ">(\"" << tfunc->get_name()
-              << "\"), ProcessFunction {" << endl;
+              << args_name << ", " << rtype << ", "
+              << (tfunc->is_oneway() ? "org.apache.thrift.TBase<*, *>" : resultname)
+              << ">(\"" << tfunc->get_name() << "\"), ProcessFunction {"
+              << '\n';
   indent_up();
   {
-    indent(out) << "override fun isOneway() = " << (tfunc->is_oneway() ? "true" : "false") << endl;
-    indent(out) << "override fun getEmptyArgsInstance() = " << args_name << "()" << endl;
+    indent(out) << "override fun isOneway() = " << (tfunc->is_oneway() ? "true" : "false") << '\n';
+    indent(out) << "override fun getEmptyArgsInstance() = " << args_name << "()" << '\n';
+    indent(out) << "override fun getEmptyResultInstance() = ";
+    if (tfunc->is_oneway()) {
+      out << "null" << '\n';
+    }
+    else {
+      out << resultname << "()" << '\n';
+    }
+    indent(out) << '\n';
     indent(out) << "override fun start(iface: I, args: " << args_name
                 << ", resultHandler: org.apache.thrift.async.AsyncMethodCallback<" << rtype
-                << ">) {" << endl;
+                << ">) {" << '\n';
     indent_up();
-    indent(out) << "scope.future {" << endl;
+    indent(out) << "scope.future {" << '\n';
     indent_up();
     indent(out) << "iface." << tfunc->get_name() << "(";
     {
@@ -1685,18 +1694,18 @@
         out << "args." << tfield->get_name() << "!!";
       }
     }
-    out << ")" << endl;
+    out << ")" << '\n';
     indent_down();
-    indent(out) << "}.whenComplete { r, t ->" << endl;
+    indent(out) << "}.whenComplete { r, t ->" << '\n';
     {
       indent_up();
-      indent(out) << "if (t != null) {" << endl;
+      indent(out) << "if (t != null) {" << '\n';
       indent_up();
-      indent(out) << "resultHandler.onError(t as java.lang.Exception)" << endl;
+      indent(out) << "resultHandler.onError(t as java.lang.Exception)" << '\n';
       indent_down();
-      indent(out) << "} else {" << endl;
+      indent(out) << "} else {" << '\n';
       indent_up();
-      indent(out) << "resultHandler.onComplete(r)" << endl;
+      indent(out) << "resultHandler.onComplete(r)" << '\n';
     }
     scope_down(out);
     scope_down(out);
@@ -1705,106 +1714,106 @@
     indent(out) << "override fun getResultHandler(fb: "
                    "org.apache.thrift.server.AbstractNonblockingServer.AsyncFrameBuffer, seqid: "
                    "Int) ="
-                << endl;
+                << '\n';
     indent_up();
     {
       indent(out) << "object : org.apache.thrift.async.AsyncMethodCallback<" << rtype << ">{"
-                  << endl;
+                  << '\n';
       indent_up();
       {
-        indent(out) << "override fun onComplete(response: " << rtype << ") {" << endl;
+        indent(out) << "override fun onComplete(response: " << rtype << ") {" << '\n';
         indent_up();
         if (tfunc->is_oneway()) {
-          indent(out) << "// one way function, no result handling" << endl;
+          indent(out) << "// one way function, no result handling" << '\n';
         } else {
           string result_name
               = tservice->get_name() + "FunctionResult." + tfunc->get_name() + "_result";
-          indent(out) << "val result = " << result_name << "()" << endl;
+          indent(out) << "val result = " << result_name << "()" << '\n';
           if (!tfunc->get_returntype()->is_void()) {
-            indent(out) << "result.success = response" << endl;
+            indent(out) << "result.success = response" << '\n';
           }
-          indent(out) << "try {" << endl;
+          indent(out) << "try {" << '\n';
           indent_up();
           indent(out)
               << "sendResponse(fb, result, org.apache.thrift.protocol.TMessageType.REPLY, seqid)"
-              << endl;
+              << '\n';
           indent_down();
-          indent(out) << "} catch (e: org.apache.thrift.transport.TTransportException) {" << endl;
+          indent(out) << "} catch (e: org.apache.thrift.transport.TTransportException) {" << '\n';
           indent_up();
           indent(out) << "logger.error(\"TTransportException writing to internal frame buffer\", e)"
-                      << endl;
-          indent(out) << "fb.close()" << endl;
+                      << '\n';
+          indent(out) << "fb.close()" << '\n';
           indent_down();
-          indent(out) << "} catch (e: Exception) {" << endl;
+          indent(out) << "} catch (e: Exception) {" << '\n';
           indent_up();
-          indent(out) << "logger.error(\"Exception writing to internal frame buffer\", e)" << endl;
-          indent(out) << "onError(e)" << endl;
+          indent(out) << "logger.error(\"Exception writing to internal frame buffer\", e)" << '\n';
+          indent(out) << "onError(e)" << '\n';
           scope_down(out);
         }
         scope_down(out);
       }
       {
-        indent(out) << "override fun onError(exception: kotlin.Exception) {" << endl;
+        indent(out) << "override fun onError(exception: kotlin.Exception) {" << '\n';
         indent_up();
         if (tfunc->is_oneway()) {
           indent(out) << "if (exception is org.apache.thrift.transport.TTransportException) {"
-                      << endl;
+                      << '\n';
           indent_up();
-          indent(out) << "logger.error(\"TTransportException inside handler\", exception)" << endl;
-          indent(out) << "fb.close()" << endl;
+          indent(out) << "logger.error(\"TTransportException inside handler\", exception)" << '\n';
+          indent(out) << "fb.close()" << '\n';
           indent_down();
-          indent(out) << "} else {" << endl;
+          indent(out) << "} else {" << '\n';
           indent_up();
-          indent(out) << "logger.error(\"Exception inside oneway handler\", exception)" << endl;
+          indent(out) << "logger.error(\"Exception inside oneway handler\", exception)" << '\n';
           scope_down(out);
         } else {
-          indent(out) << "val (msgType, msg) = when (exception) {" << endl;
+          indent(out) << "val (msgType, msg) = when (exception) {" << '\n';
           indent_up();
 
           auto xceptions = tfunc->get_xceptions()->get_members();
           for (auto xception : xceptions) {
-            indent(out) << "is " << type_name(xception->get_type()) << " -> {" << endl;
+            indent(out) << "is " << type_name(xception->get_type()) << " -> {" << '\n';
             indent_up();
             string result_name
                 = tservice->get_name() + "FunctionResult." + tfunc->get_name() + "_result";
-            indent(out) << "val result = " << result_name << "()" << endl;
-            indent(out) << "result." << xception->get_name() << " = exception" << endl;
-            indent(out) << "org.apache.thrift.protocol.TMessageType.REPLY to result" << endl;
+            indent(out) << "val result = " << result_name << "()" << '\n';
+            indent(out) << "result." << xception->get_name() << " = exception" << '\n';
+            indent(out) << "org.apache.thrift.protocol.TMessageType.REPLY to result" << '\n';
             scope_down(out);
           }
 
-          indent(out) << "is org.apache.thrift.transport.TTransportException -> {" << endl;
+          indent(out) << "is org.apache.thrift.transport.TTransportException -> {" << '\n';
           indent_up();
-          indent(out) << "logger.error(\"TTransportException inside handler\", exception)" << endl;
-          indent(out) << "fb.close()" << endl;
-          indent(out) << "return" << endl;
+          indent(out) << "logger.error(\"TTransportException inside handler\", exception)" << '\n';
+          indent(out) << "fb.close()" << '\n';
+          indent(out) << "return" << '\n';
           scope_down(out);
 
-          indent(out) << "is org.apache.thrift.TApplicationException -> {" << endl;
+          indent(out) << "is org.apache.thrift.TApplicationException -> {" << '\n';
           indent_up();
           indent(out) << "logger.error(\"TApplicationException inside handler\", exception)"
-                      << endl;
-          indent(out) << "org.apache.thrift.protocol.TMessageType.EXCEPTION to exception" << endl;
+                      << '\n';
+          indent(out) << "org.apache.thrift.protocol.TMessageType.EXCEPTION to exception" << '\n';
           scope_down(out);
 
-          indent(out) << "else -> {" << endl;
+          indent(out) << "else -> {" << '\n';
           indent_up();
-          indent(out) << "logger.error(\"Exception inside handler\", exception)" << endl;
+          indent(out) << "logger.error(\"Exception inside handler\", exception)" << '\n';
           indent(out) << "org.apache.thrift.protocol.TMessageType.EXCEPTION to "
                          "org.apache.thrift.TApplicationException(org.apache.thrift."
                          "TApplicationException.INTERNAL_ERROR, exception.message)"
-                      << endl;
+                      << '\n';
           scope_down(out);
           scope_down(out);
 
-          indent(out) << "try {" << endl;
+          indent(out) << "try {" << '\n';
           indent_up();
-          indent(out) << "sendResponse(fb, msg, msgType, seqid)" << endl;
+          indent(out) << "sendResponse(fb, msg, msgType, seqid)" << '\n';
           indent_down();
-          indent(out) << "} catch (ex: java.lang.Exception) {" << endl;
+          indent(out) << "} catch (ex: java.lang.Exception) {" << '\n';
           indent_up();
-          indent(out) << "logger.error(\"Exception writing to internal frame buffer\", ex)" << endl;
-          indent(out) << "fb.close()" << endl;
+          indent(out) << "logger.error(\"Exception writing to internal frame buffer\", ex)" << '\n';
+          indent(out) << "fb.close()" << '\n';
           scope_down(out);
         }
 
@@ -1825,7 +1834,7 @@
 
   generate_docstring_comment(out, "/**\n", " * ",
                              "function result for [" + tservice->get_name() + "]", " */\n");
-  indent(out) << "sealed interface " << tservice->get_name() << "FunctionResult {" << endl;
+  indent(out) << "sealed interface " << tservice->get_name() << "FunctionResult {" << '\n';
   indent_up();
   for (auto func : tservice->get_functions()) {
     if (func->is_oneway()) {
@@ -1852,12 +1861,12 @@
   out << autogen_comment() << warning_surpressions() << kotlin_package();
   generate_docstring_comment(out, "/**\n", " * ",
                              "function arguments for [" + tservice->get_name() + "]", " */\n");
-  indent(out) << "sealed interface " << tservice->get_name() << "FunctionArgs {" << endl;
+  indent(out) << "sealed interface " << tservice->get_name() << "FunctionArgs {" << '\n';
   indent_up();
   for (auto func : tservice->get_functions()) {
     t_struct* ts = func->get_arglist();
     generate_struct_definition(out, ts, false, tservice->get_name() + "FunctionArgs");
-    out << endl;
+    out << '\n';
   }
   scope_down(out);
   out.close();
@@ -1961,7 +1970,7 @@
  */
 string t_kotlin_generator::kotlin_package() {
   if (!package_name_.empty()) {
-    return string("package ") + package_name_ + endl + endl;
+    return string("package ") + package_name_ + "\n" + "\n";
   }
   return "";
 }
@@ -1969,8 +1978,7 @@
 string t_kotlin_generator::warning_surpressions() {
   return "@file:Suppress(\"ClassName\", \"PropertyName\", \"RedundantUnitReturnType\", "
          "\"NestedLambdaShadowedImplicitParameter\", "
-         "\"RemoveRedundantQualifierName\")"
-         + endl;
+         "\"RemoveRedundantQualifierName\")\n";
 }
 
 string t_kotlin_generator::constant_name(string name) {
diff --git a/compiler/cpp/src/thrift/generate/t_lua_generator.cc b/compiler/cpp/src/thrift/generate/t_lua_generator.cc
index 0dc7743..642dd9c 100644
--- a/compiler/cpp/src/thrift/generate/t_lua_generator.cc
+++ b/compiler/cpp/src/thrift/generate/t_lua_generator.cc
@@ -26,8 +26,6 @@
 using std::vector;
 using std::map;
 
-static const string endl = "\n"; // avoid ostream << std::endl flushes
-
 /**
  * LUA code generator.
  *
@@ -190,7 +188,7 @@
   f_consts_ << autogen_comment() << lua_includes();
   f_types_ << autogen_comment() << lua_includes();
   if (gen_requires_) {
-    f_types_ << endl << "require '" << cur_namespace << "constants'";
+    f_types_ << '\n' << "require '" << cur_namespace << "constants'";
   }
 }
 
@@ -207,7 +205,7 @@
   if (ttypedef->get_type()->get_name().empty()) {
     return;
   }
-  f_types_ << endl << endl << indent() << ttypedef->get_symbolic() << " = "
+  f_types_ << '\n' << '\n' << indent() << ttypedef->get_symbolic() << " = "
            << ttypedef->get_type()->get_name();
 }
 
@@ -215,7 +213,7 @@
  * Generates code for an enumerated type (table)
  */
 void t_lua_generator::generate_enum(t_enum* tenum) {
-  f_types_ << endl << endl << tenum->get_name() << " = {" << endl;
+  f_types_ << '\n' << '\n' << tenum->get_name() << " = {" << '\n';
 
   vector<t_enum_value*> constants = tenum->get_constants();
   vector<t_enum_value*>::iterator c_iter;
@@ -227,7 +225,7 @@
     if (c_iter != constants.end()) {
       f_types_ << ",";
     }
-    f_types_ << endl;
+    f_types_ << '\n';
   }
   f_types_ << "}";
 }
@@ -240,7 +238,7 @@
   string name = tconst->get_name();
   t_const_value* value = tconst->get_value();
 
-  f_consts_ << endl << endl << name << " = ";
+  f_consts_ << '\n' << '\n' << name << " = ";
   f_consts_ << render_const_value(type, value);
 }
 
@@ -281,7 +279,7 @@
   } else if (type->is_enum()) {
     out << value->get_integer();
   } else if (type->is_struct() || type->is_xception()) {
-    out << type->get_name() << " = {" << endl;
+    out << type->get_name() << " = {" << '\n';
     indent_up();
 
     const vector<t_field*>& fields = ((t_struct*)type)->get_members();
@@ -312,7 +310,7 @@
     out << "}";
     indent_down();
   } else if (type->is_map()) {
-    out << type->get_name() << "{" << endl;
+    out << type->get_name() << "{" << '\n';
     indent_up();
 
     t_type* ktype = ((t_map*)type)->get_key_type();
@@ -327,7 +325,7 @@
       if (v_iter != val.end()) {
         out << ",";
       }
-      out << endl;
+      out << '\n';
     }
     indent_down();
     indent(out) << "}";
@@ -338,7 +336,7 @@
     } else {
       etype = ((t_set*)type)->get_elem_type();
     }
-    out << type->get_name() << " = {" << endl;
+    out << type->get_name() << " = {" << '\n';
     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();) {
@@ -351,7 +349,7 @@
       }
       ++v_iter;
       if (v_iter != val.end()) {
-        out << "," << endl;
+        out << "," << '\n';
       }
     }
     out << "}";
@@ -382,15 +380,15 @@
   vector<t_field*>::const_iterator m_iter;
   const vector<t_field*>& members = tstruct->get_members();
 
-  indent(out) << endl << endl << tstruct->get_name();
+  indent(out) << '\n' << '\n' << tstruct->get_name();
   if (is_exception) {
-    out << " = TException:new{" << endl << indent() << "  __type = '" << tstruct->get_name() << "'";
+    out << " = TException:new{" << '\n' << indent() << "  __type = '" << tstruct->get_name() << "'";
     if (members.size() > 0) {
       out << ",";
     }
-    out << endl;
+    out << '\n';
   } else {
-    out << " = __TObject:new{" << endl;
+    out << " = __TObject:new{" << '\n';
   }
   indent_up();
   for (m_iter = members.begin(); m_iter != members.end();) {
@@ -398,12 +396,12 @@
     out << (*m_iter)->get_name();
     ++m_iter;
     if (m_iter != members.end()) {
-      out << "," << endl;
+      out << "," << '\n';
     }
   }
   indent_down();
   indent(out);
-  out << endl << "}";
+  out << '\n' << "}";
 
   generate_lua_struct_reader(out, tstruct);
   generate_lua_struct_writer(out, tstruct);
@@ -417,48 +415,48 @@
   vector<t_field*>::const_iterator f_iter;
 
   // function
-  indent(out) << endl << endl << "function " << tstruct->get_name() << ":read(iprot)" << endl;
+  indent(out) << '\n' << '\n' << "function " << tstruct->get_name() << ":read(iprot)" << '\n';
   indent_up();
 
-  indent(out) << "iprot:readStructBegin()" << endl;
+  indent(out) << "iprot:readStructBegin()" << '\n';
 
   // while: Read in fields
-  indent(out) << "while true do" << endl;
+  indent(out) << "while true do" << '\n';
   indent_up();
 
   // if: Check what to read
-  indent(out) << "local fname, ftype, fid = iprot:readFieldBegin()" << endl;
-  indent(out) << "if ftype == TType.STOP then" << endl;
+  indent(out) << "local fname, ftype, fid = iprot:readFieldBegin()" << '\n';
+  indent(out) << "if ftype == TType.STOP then" << '\n';
   indent_up();
-  indent(out) << "break" << endl;
+  indent(out) << "break" << '\n';
 
   for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
     indent_down();
-    indent(out) << "elseif fid == " << (*f_iter)->get_key() << " then" << endl;
+    indent(out) << "elseif fid == " << (*f_iter)->get_key() << " then" << '\n';
     indent_up();
-    indent(out) << "if ftype == " << type_to_enum((*f_iter)->get_type()) << " then" << endl;
+    indent(out) << "if ftype == " << type_to_enum((*f_iter)->get_type()) << " then" << '\n';
     indent_up();
 
     // Read field contents
     generate_deserialize_field(out, *f_iter, false, "self.");
 
     indent_down();
-    indent(out) << "else" << endl;
-    indent(out) << "  iprot:skip(ftype)" << endl;
-    indent(out) << "end" << endl;
+    indent(out) << "else" << '\n';
+    indent(out) << "  iprot:skip(ftype)" << '\n';
+    indent(out) << "end" << '\n';
   }
 
   // end if
   indent_down();
-  indent(out) << "else" << endl;
-  indent(out) << "  iprot:skip(ftype)" << endl;
-  indent(out) << "end" << endl;
-  indent(out) << "iprot:readFieldEnd()" << endl;
+  indent(out) << "else" << '\n';
+  indent(out) << "  iprot:skip(ftype)" << '\n';
+  indent(out) << "end" << '\n';
+  indent(out) << "iprot:readFieldEnd()" << '\n';
 
   // end while
   indent_down();
-  indent(out) << "end" << endl;
-  indent(out) << "iprot:readStructEnd()" << endl;
+  indent(out) << "end" << '\n';
+  indent(out) << "iprot:readStructEnd()" << '\n';
 
   // end function
   indent_down();
@@ -474,28 +472,28 @@
   vector<t_field*>::const_iterator f_iter;
 
   // function
-  indent(out) << endl << endl << "function " << tstruct->get_name() << ":write(oprot)" << endl;
+  indent(out) << '\n' << '\n' << "function " << tstruct->get_name() << ":write(oprot)" << '\n';
   indent_up();
 
-  indent(out) << "oprot:writeStructBegin('" << tstruct->get_name() << "')" << endl;
+  indent(out) << "oprot:writeStructBegin('" << tstruct->get_name() << "')" << '\n';
   for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
     // To check element of self whether nil or not.
     // avoid the value(false) of BOOL is lost.
-    indent(out) << "if self." << (*f_iter)->get_name() << " ~= nil then" << endl;
+    indent(out) << "if self." << (*f_iter)->get_name() << " ~= nil then" << '\n';
     indent_up();
     indent(out) << "oprot:writeFieldBegin('" << (*f_iter)->get_name() << "', "
                 << type_to_enum((*f_iter)->get_type()) << ", " << (*f_iter)->get_key() << ")"
-                << endl;
+                << '\n';
 
     // Write field contents
     generate_serialize_field(out, *f_iter, "self.");
 
-    indent(out) << "oprot:writeFieldEnd()" << endl;
+    indent(out) << "oprot:writeFieldEnd()" << '\n';
     indent_down();
-    indent(out) << "end" << endl;
+    indent(out) << "end" << '\n';
   }
-  indent(out) << "oprot:writeFieldStop()" << endl;
-  indent(out) << "oprot:writeStructEnd()" << endl;
+  indent(out) << "oprot:writeFieldStop()" << '\n';
+  indent(out) << "oprot:writeStructEnd()" << '\n';
 
   // end function
   indent_down();
@@ -518,15 +516,15 @@
   // Headers
   f_service_ << autogen_comment() << lua_includes();
   if (gen_requires_) {
-    f_service_ << endl << "require '" << cur_ns << "ttypes'" << endl;
+    f_service_ << '\n' << "require '" << cur_ns << "ttypes'" << '\n';
 
     if (tservice->get_extends() != nullptr) {
       f_service_ << "require '" << get_namespace(tservice->get_extends()->get_program())
-                 << tservice->get_extends()->get_name() << "'" << endl;
+                 << tservice->get_extends()->get_name() << "'" << '\n';
     }
   }
 
-  f_service_ << endl;
+  f_service_ << '\n';
 
   generate_service_client(f_service_, tservice);
   generate_service_interface(f_service_, tservice);
@@ -544,11 +542,11 @@
   // Interface object definition
   out << classname << " = ";
   if (extends_s) {
-    out << extends_s->get_name() << "Iface:new{" << endl;
+    out << extends_s->get_name() << "Iface:new{" << '\n';
   } else {
-    out << "__TObject:new{" << endl;
+    out << "__TObject:new{" << '\n';
   }
-  out << "  __type = '" << classname << "'" << endl << "}" << endl << endl;
+  out << "  __type = '" << classname << "'" << '\n' << "}" << '\n' << '\n';
 }
 
 void t_lua_generator::generate_service_client(ostream& out, t_service* tservice) {
@@ -562,7 +560,7 @@
   } else {
     out << "__TClient";
   }
-  out << ", {" << endl << "  __type = '" << classname << "'" << endl << "})" << endl;
+  out << ", {" << '\n' << "  __type = '" << classname << "'" << '\n' << "})" << '\n';
 
   // Send/Recv functions
   vector<t_function*> functions = tservice->get_functions();
@@ -572,28 +570,28 @@
     string funcname = (*f_iter)->get_name();
 
     // Wrapper function
-    indent(out) << endl << "function " << classname << ":" << sig << endl;
+    indent(out) << '\n' << "function " << classname << ":" << sig << '\n';
     indent_up();
 
-    indent(out) << "self:send_" << sig << endl << indent();
+    indent(out) << "self:send_" << sig << '\n' << indent();
     if (!(*f_iter)->is_oneway()) {
       if (!(*f_iter)->get_returntype()->is_void()) {
         out << "return ";
       }
-      out << "self:recv_" << sig << endl;
+      out << "self:recv_" << sig << '\n';
     }
 
     indent_down();
-    indent(out) << "end" << endl;
+    indent(out) << "end" << '\n';
 
     // Send function
-    indent(out) << endl << "function " << classname << ":send_" << sig << endl;
+    indent(out) << '\n' << "function " << classname << ":send_" << sig << '\n';
     indent_up();
 
     indent(out) << "self.oprot:writeMessageBegin('" << funcname << "', "
                 << ((*f_iter)->is_oneway() ? "TMessageType.ONEWAY" : "TMessageType.CALL")
-                << ", self._seqid)" << endl;
-    indent(out) << "local args = " << funcname << "_args:new{}" << endl;
+                << ", self._seqid)" << '\n';
+    indent(out) << "local args = " << funcname << "_args:new{}" << '\n';
 
     // Set the args
     const vector<t_field*>& args = (*f_iter)->get_arglist()->get_members();
@@ -603,60 +601,60 @@
       if ((*fld_iter)->get_value() != nullptr) {
         // Insert default value for nil arguments
         t_type* type = get_true_type((*fld_iter)->get_type());
-        indent(out) << "if " << argname << " ~= nil then" << endl;
+        indent(out) << "if " << argname << " ~= nil then" << '\n';
         indent_up();
-        indent(out) << "args." << argname << " = " << argname << endl;
+        indent(out) << "args." << argname << " = " << argname << '\n';
         indent_down();
-        indent(out) << "else" << endl;
+        indent(out) << "else" << '\n';
         indent_up();
-        indent(out) << "args." << argname << " = " << render_const_value(type, (*fld_iter)->get_value()) << endl;
+        indent(out) << "args." << argname << " = " << render_const_value(type, (*fld_iter)->get_value()) << '\n';
         indent_down();
-        indent(out) << "end" << endl;
+        indent(out) << "end" << '\n';
       } else {
-        indent(out) << "args." << argname << " = " << argname << endl;
+        indent(out) << "args." << argname << " = " << argname << '\n';
       }
     }
 
-    indent(out) << "args:write(self.oprot)" << endl;
-    indent(out) << "self.oprot:writeMessageEnd()" << endl;
-    indent(out) << "self.oprot.trans:flush()" << endl;
+    indent(out) << "args:write(self.oprot)" << '\n';
+    indent(out) << "self.oprot:writeMessageEnd()" << '\n';
+    indent(out) << "self.oprot.trans:flush()" << '\n';
 
     indent_down();
-    indent(out) << "end" << endl;
+    indent(out) << "end" << '\n';
 
     // Recv function
     if (!(*f_iter)->is_oneway()) {
-      indent(out) << endl << "function " << classname << ":recv_" << sig << endl;
+      indent(out) << '\n' << "function " << classname << ":recv_" << sig << '\n';
       indent_up();
 
       out << indent() << "local fname, mtype, rseqid = self.iprot:"
-          << "readMessageBegin()" << endl << indent() << "if mtype == TMessageType.EXCEPTION then"
-          << endl << indent() << "  local x = TApplicationException:new{}" << endl << indent()
-          << "  x:read(self.iprot)" << endl << indent() << "  self.iprot:readMessageEnd()" << endl
-          << indent() << "  error(x)" << endl << indent() << "end" << endl << indent()
-          << "local result = " << funcname << "_result:new{}" << endl << indent()
-          << "result:read(self.iprot)" << endl << indent() << "self.iprot:readMessageEnd()" << endl;
+          << "readMessageBegin()" << '\n' << indent() << "if mtype == TMessageType.EXCEPTION then"
+          << '\n' << indent() << "  local x = TApplicationException:new{}" << '\n' << indent()
+          << "  x:read(self.iprot)" << '\n' << indent() << "  self.iprot:readMessageEnd()" << '\n'
+          << indent() << "  error(x)" << '\n' << indent() << "end" << '\n' << indent()
+          << "local result = " << funcname << "_result:new{}" << '\n' << indent()
+          << "result:read(self.iprot)" << '\n' << indent() << "self.iprot:readMessageEnd()" << '\n';
 
       // Return the result if it's not a void function
       if (!(*f_iter)->get_returntype()->is_void()) {
-        out << indent() << "if result.success ~= nil then" << endl << indent() << "  return result.success"
-            << endl;
+        out << indent() << "if result.success ~= nil then" << '\n' << indent() << "  return result.success"
+            << '\n';
 
         // Throw custom exceptions
         const std::vector<t_field*>& xf = (*f_iter)->get_xceptions()->get_members();
         vector<t_field*>::const_iterator x_iter;
         for (x_iter = xf.begin(); x_iter != xf.end(); ++x_iter) {
-          out << indent() << "elseif result." << (*x_iter)->get_name() << " then" << endl
-              << indent() << "  error(result." << (*x_iter)->get_name() << ")" << endl;
+          out << indent() << "elseif result." << (*x_iter)->get_name() << " then" << '\n'
+              << indent() << "  error(result." << (*x_iter)->get_name() << ")" << '\n';
         }
 
-        out << indent() << "end" << endl << indent()
+        out << indent() << "end" << '\n' << indent()
             << "error(TApplicationException:new{errorCode = "
-            << "TApplicationException.MISSING_RESULT})" << endl;
+            << "TApplicationException.MISSING_RESULT})" << '\n';
       }
 
       indent_down();
-      indent(out) << "end" << endl;
+      indent(out) << "end" << '\n';
     }
   }
 }
@@ -666,40 +664,40 @@
   t_service* extends_s = tservice->get_extends();
 
   // Define processor table
-  out << endl << classname << " = __TObject.new(";
+  out << '\n' << classname << " = __TObject.new(";
   if (extends_s != nullptr) {
-    out << extends_s->get_name() << "Processor" << endl;
+    out << extends_s->get_name() << "Processor" << '\n';
   } else {
-    out << "__TProcessor" << endl;
+    out << "__TProcessor" << '\n';
   }
-  out << ", {" << endl << " __type = '" << classname << "'" << endl << "})" << endl;
+  out << ", {" << '\n' << " __type = '" << classname << "'" << '\n' << "})" << '\n';
 
   // Process function
-  indent(out) << endl << "function " << classname << ":process(iprot, oprot, server_ctx)" << endl;
+  indent(out) << '\n' << "function " << classname << ":process(iprot, oprot, server_ctx)" << '\n';
   indent_up();
 
-  indent(out) << "local name, mtype, seqid = iprot:readMessageBegin()" << endl;
-  indent(out) << "local func_name = 'process_' .. name" << endl;
-  indent(out) << "if not self[func_name] or ttype(self[func_name]) ~= 'function' then" << endl;
+  indent(out) << "local name, mtype, seqid = iprot:readMessageBegin()" << '\n';
+  indent(out) << "local func_name = 'process_' .. name" << '\n';
+  indent(out) << "if not self[func_name] or ttype(self[func_name]) ~= 'function' then" << '\n';
   indent_up();
   indent(out) << "if oprot ~= nil then";
   indent_up();
-  out << endl << indent() << "iprot:skip(TType.STRUCT)" << endl << indent()
-      << "iprot:readMessageEnd()" << endl << indent() << "x = TApplicationException:new{" << endl
-      << indent() << "  errorCode = TApplicationException.UNKNOWN_METHOD" << endl << indent() << "}"
-      << endl << indent() << "oprot:writeMessageBegin(name, TMessageType.EXCEPTION, "
-      << "seqid)" << endl << indent() << "x:write(oprot)" << endl << indent()
-      << "oprot:writeMessageEnd()" << endl << indent() << "oprot.trans:flush()" << endl;
+  out << '\n' << indent() << "iprot:skip(TType.STRUCT)" << '\n' << indent()
+      << "iprot:readMessageEnd()" << '\n' << indent() << "x = TApplicationException:new{" << '\n'
+      << indent() << "  errorCode = TApplicationException.UNKNOWN_METHOD" << '\n' << indent() << "}"
+      << '\n' << indent() << "oprot:writeMessageBegin(name, TMessageType.EXCEPTION, "
+      << "seqid)" << '\n' << indent() << "x:write(oprot)" << '\n' << indent()
+      << "oprot:writeMessageEnd()" << '\n' << indent() << "oprot.trans:flush()" << '\n';
   indent_down();
-  out << indent() << "end" << endl << indent()
-      << "return false, 'Unknown function '..name" << endl;
+  out << indent() << "end" << '\n' << indent()
+      << "return false, 'Unknown function '..name" << '\n';
   indent_down();
-  indent(out) << "else" << endl << indent()
-              << "  return self[func_name](self, seqid, iprot, oprot, server_ctx)" << endl << indent()
-              << "end" << endl;
+  indent(out) << "else" << '\n' << indent()
+              << "  return self[func_name](self, seqid, iprot, oprot, server_ctx)" << '\n' << indent()
+              << "end" << '\n';
 
   indent_down();
-  indent(out) << "end" << endl;
+  indent(out) << "end" << '\n';
 
   // Generate the process subfunctions
   vector<t_function*> functions = tservice->get_functions();
@@ -717,18 +715,18 @@
   string resultname = tfunction->get_name() + "_result";
   string fn_name = tfunction->get_name();
 
-  indent(out) << endl << "function " << classname << ":process_" << fn_name
-              << "(seqid, iprot, oprot, server_ctx)" << endl;
+  indent(out) << '\n' << "function " << classname << ":process_" << fn_name
+              << "(seqid, iprot, oprot, server_ctx)" << '\n';
   indent_up();
 
   // Read the request
-  out << indent() << "local args = " << argsname << ":new{}" << endl << indent()
-      << "local reply_type = TMessageType.REPLY" << endl << indent() << "args:read(iprot)" << endl
-      << indent() << "iprot:readMessageEnd()" << endl;
+  out << indent() << "local args = " << argsname << ":new{}" << '\n' << indent()
+      << "local reply_type = TMessageType.REPLY" << '\n' << indent() << "args:read(iprot)" << '\n'
+      << indent() << "iprot:readMessageEnd()" << '\n';
 
   if (!tfunction->is_oneway()) {
       out << indent() << "local result = " << resultname
-          << ":new{}" << endl;
+          << ":new{}" << '\n';
   }
 
   out <<  indent() << "local status, res = pcall(self.handler." << fn_name
@@ -738,13 +736,13 @@
   if (args->get_members().size() > 0) {
     out << ", " << argument_list(args, "args.");
   }
-  out << ")" << endl;
+  out << ")" << '\n';
 
   if (!tfunction->is_oneway()) {
       // Check for errors
-      out << indent() << "if not status then" << endl << indent()
-          << "  reply_type = TMessageType.EXCEPTION" << endl << indent()
-          << "  result = TApplicationException:new{message = res}" << endl;
+      out << indent() << "if not status then" << '\n' << indent()
+          << "  reply_type = TMessageType.EXCEPTION" << '\n' << indent()
+          << "  result = TApplicationException:new{message = res}" << '\n';
 
       // Handle custom exceptions
       const std::vector<t_field*>& xf = tfunction->get_xceptions()->get_members();
@@ -752,19 +750,19 @@
           vector<t_field*>::const_iterator x_iter;
           for (x_iter = xf.begin(); x_iter != xf.end(); ++x_iter) {
               out << indent() << "elseif ttype(res) == '" << (*x_iter)->get_type()->get_name() << "' then"
-                  << endl << indent() << "  result." << (*x_iter)->get_name() << " = res" << endl;
+                  << '\n' << indent() << "  result." << (*x_iter)->get_name() << " = res" << '\n';
           }
       }
 
       // Set the result and write the reply
-      out << indent() << "else" << endl << indent() << "  result.success = res" << endl << indent()
-          << "end" << endl << indent() << "oprot:writeMessageBegin('" << fn_name << "', reply_type, "
-          << "seqid)" << endl << indent() << "result:write(oprot)" << endl << indent()
-          << "oprot:writeMessageEnd()" << endl << indent() << "oprot.trans:flush()" << endl;
+      out << indent() << "else" << '\n' << indent() << "  result.success = res" << '\n' << indent()
+          << "end" << '\n' << indent() << "oprot:writeMessageBegin('" << fn_name << "', reply_type, "
+          << "seqid)" << '\n' << indent() << "result:write(oprot)" << '\n' << indent()
+          << "oprot:writeMessageEnd()" << '\n' << indent() << "oprot.trans:flush()" << '\n';
   }
-  out << indent() << "return status, res" << endl;
+  out << indent() << "return status, res" << '\n';
   indent_down();
-  indent(out) << "end" << endl;
+  indent(out) << "end" << '\n';
 }
 
 // Service helpers
@@ -772,7 +770,7 @@
   vector<t_function*> functions = tservice->get_functions();
   vector<t_function*>::iterator f_iter;
 
-  out << endl << "-- HELPER FUNCTIONS AND STRUCTURES";
+  out << '\n' << "-- HELPER FUNCTIONS AND STRUCTURES";
   for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
     t_struct* ts = (*f_iter)->get_arglist();
     generate_lua_struct_definition(out, ts, false);
@@ -853,7 +851,7 @@
     } else if (type->is_enum()) {
       out << "readI32()";
     }
-    out << endl;
+    out << '\n';
 
   } else {
     printf("DO NOT KNOW HOW TO DESERIALIZE FIELD '%s' TYPE '%s'\n",
@@ -867,7 +865,7 @@
                                                   bool local,
                                                   string prefix) {
   indent(out) << (local ? "local " : "") << prefix << " = " << tstruct->get_name() << ":new{}"
-              << endl << indent() << prefix << ":read(iprot)" << endl;
+              << '\n' << indent() << prefix << ":read(iprot)" << '\n';
 }
 
 void t_lua_generator::generate_deserialize_container(ostream& out,
@@ -885,18 +883,18 @@
   t_field fetype(g_type_i8, etype);
 
   // Declare variables, read header
-  indent(out) << (local ? "local " : "") << prefix << " = {}" << endl;
+  indent(out) << (local ? "local " : "") << prefix << " = {}" << '\n';
   if (ttype->is_map()) {
     indent(out) << "local " << ktype << ", " << vtype << ", " << size << " = iprot:readMapBegin() "
-                << endl;
+                << '\n';
   } else if (ttype->is_set()) {
-    indent(out) << "local " << etype << ", " << size << " = iprot:readSetBegin()" << endl;
+    indent(out) << "local " << etype << ", " << size << " = iprot:readSetBegin()" << '\n';
   } else if (ttype->is_list()) {
-    indent(out) << "local " << etype << ", " << size << " = iprot:readListBegin()" << endl;
+    indent(out) << "local " << etype << ", " << size << " = iprot:readListBegin()" << '\n';
   }
 
   // Deserialize
-  indent(out) << "for _i=1," << size << " do" << endl;
+  indent(out) << "for _i=1," << size << " do" << '\n';
   indent_up();
 
   if (ttype->is_map()) {
@@ -908,15 +906,15 @@
   }
 
   indent_down();
-  indent(out) << "end" << endl;
+  indent(out) << "end" << '\n';
 
   // Read container end
   if (ttype->is_map()) {
-    indent(out) << "iprot:readMapEnd()" << endl;
+    indent(out) << "iprot:readMapEnd()" << '\n';
   } else if (ttype->is_set()) {
-    indent(out) << "iprot:readSetEnd()" << endl;
+    indent(out) << "iprot:readSetEnd()" << '\n';
   } else if (ttype->is_list()) {
-    indent(out) << "iprot:readListEnd()" << endl;
+    indent(out) << "iprot:readListEnd()" << '\n';
   }
 }
 
@@ -930,7 +928,7 @@
   generate_deserialize_field(out, &fkey, true);
   generate_deserialize_field(out, &fval, true);
 
-  indent(out) << prefix << "[" << key << "] = " << val << endl;
+  indent(out) << prefix << "[" << key << "] = " << val << '\n';
 }
 
 void t_lua_generator::generate_deserialize_set_element(ostream& out, t_set* tset, string prefix) {
@@ -940,7 +938,7 @@
 
   generate_deserialize_field(out, &felem, true);
 
-  indent(out) << prefix << "[" << elem << "] = " << elem << endl;
+  indent(out) << prefix << "[" << elem << "] = " << elem << '\n';
 }
 
 void t_lua_generator::generate_deserialize_list_element(ostream& out,
@@ -953,7 +951,7 @@
 
   generate_deserialize_field(out, &felem, true);
 
-  indent(out) << "table.insert(" << prefix << ", " << elem << ")" << endl;
+  indent(out) << "table.insert(" << prefix << ", " << elem << ")" << '\n';
 }
 
 /**
@@ -1008,7 +1006,7 @@
     } else if (type->is_enum()) {
       out << "writeI32(" << name << ")";
     }
-    out << endl;
+    out << '\n';
   } else {
     printf("DO NOT KNOW HOW TO SERIALIZE FIELD '%s' TYPE '%s'\n",
            name.c_str(),
@@ -1018,7 +1016,7 @@
 
 void t_lua_generator::generate_serialize_struct(ostream& out, t_struct* tstruct, string prefix) {
   (void)tstruct;
-  indent(out) << prefix << ":write(oprot)" << endl;
+  indent(out) << prefix << ":write(oprot)" << '\n';
 }
 
 void t_lua_generator::generate_serialize_container(ostream& out, t_type* ttype, string prefix) {
@@ -1026,48 +1024,48 @@
   if (ttype->is_map()) {
     indent(out) << "oprot:writeMapBegin(" << type_to_enum(((t_map*)ttype)->get_key_type()) << ", "
                 << type_to_enum(((t_map*)ttype)->get_val_type()) << ", "
-                << "ttable_size(" << prefix << "))" << endl;
+                << "ttable_size(" << prefix << "))" << '\n';
   } else if (ttype->is_set()) {
     indent(out) << "oprot:writeSetBegin(" << type_to_enum(((t_set*)ttype)->get_elem_type()) << ", "
-                << "ttable_size(" << prefix << "))" << endl;
+                << "ttable_size(" << prefix << "))" << '\n';
   } else if (ttype->is_list()) {
     indent(out) << "oprot:writeListBegin(" << type_to_enum(((t_list*)ttype)->get_elem_type())
                 << ", "
-                << "#" << prefix << ")" << endl;
+                << "#" << prefix << ")" << '\n';
   }
 
   // Serialize
   if (ttype->is_map()) {
     string kiter = tmp("kiter");
     string viter = tmp("viter");
-    indent(out) << "for " << kiter << "," << viter << " in pairs(" << prefix << ") do" << endl;
+    indent(out) << "for " << kiter << "," << viter << " in pairs(" << prefix << ") do" << '\n';
     indent_up();
     generate_serialize_map_element(out, (t_map*)ttype, kiter, viter);
     indent_down();
-    indent(out) << "end" << endl;
+    indent(out) << "end" << '\n';
   } else if (ttype->is_set()) {
     string iter = tmp("iter");
-    indent(out) << "for " << iter << ",_ in pairs(" << prefix << ") do" << endl;
+    indent(out) << "for " << iter << ",_ in pairs(" << prefix << ") do" << '\n';
     indent_up();
     generate_serialize_set_element(out, (t_set*)ttype, iter);
     indent_down();
-    indent(out) << "end" << endl;
+    indent(out) << "end" << '\n';
   } else if (ttype->is_list()) {
     string iter = tmp("iter");
-    indent(out) << "for _," << iter << " in ipairs(" << prefix << ") do" << endl;
+    indent(out) << "for _," << iter << " in ipairs(" << prefix << ") do" << '\n';
     indent_up();
     generate_serialize_list_element(out, (t_list*)ttype, iter);
     indent_down();
-    indent(out) << "end" << endl;
+    indent(out) << "end" << '\n';
   }
 
   // Finish writing
   if (ttype->is_map()) {
-    indent(out) << "oprot:writeMapEnd()" << endl;
+    indent(out) << "oprot:writeMapEnd()" << '\n';
   } else if (ttype->is_set()) {
-    indent(out) << "oprot:writeSetEnd()" << endl;
+    indent(out) << "oprot:writeSetEnd()" << '\n';
   } else if (ttype->is_list()) {
-    indent(out) << "oprot:writeListEnd()" << endl;
+    indent(out) << "oprot:writeListEnd()" << '\n';
   }
 }
 
diff --git a/compiler/cpp/src/thrift/generate/t_markdown_generator.cc b/compiler/cpp/src/thrift/generate/t_markdown_generator.cc
index 76fe98b..fbcaccc 100644
--- a/compiler/cpp/src/thrift/generate/t_markdown_generator.cc
+++ b/compiler/cpp/src/thrift/generate/t_markdown_generator.cc
@@ -38,9 +38,6 @@
 using std::stringstream;
 using std::vector;
 
-static const char endl = '\n'; // avoid ostream << std::endl flushes
-
-
 /**
  * MARKDOWN code generator
  *
@@ -55,7 +52,7 @@
                        const std::map<std::string, std::string>& parsed_options,
                        const std::string& option_string)
     : t_generator(program) {
-      
+
     (void)option_string;
     std::map<std::string, std::string>::const_iterator iter;
 
@@ -128,14 +125,14 @@
 
 
 /**
- * string to markdown-id link reference 
+ * string to markdown-id link reference
  */
 std::string t_markdown_generator::str_to_id(const std::string& s) {
   std::string id;
   for(auto chr=s.begin();chr<=s.end(); ++chr) {
     if(*chr == '.' || *chr == 0)
       continue;
-    id += tolower(*chr); 
+    id += tolower(*chr);
   }
   return id;
 }
@@ -144,10 +141,10 @@
  * Emits the Table of Contents links at the top of the module's page
  */
 void t_markdown_generator::generate_program_toc() {
-  f_out_ << "| Module | Services & Functions | Data types | Constants |" << endl 
-         << "| --- | --- | --- | --- |" << endl;
+  f_out_ << "| Module | Services & Functions | Data types | Constants |" << '\n'
+         << "| --- | --- | --- | --- |" << '\n';
   generate_program_toc_row(program_);
-  f_out_ << endl;
+  f_out_ << '\n';
 }
 
 /**
@@ -191,24 +188,24 @@
         fill = &filling.back();
       }
       string name = get_service_name(*sv_iter);
-      (*fill)[1] = "[" + name + "](" 
-        + make_file_link(fname) 
+      (*fill)[1] = "[" + name + "]("
+        + make_file_link(fname)
         + "#service-" + str_to_id(name) + ")";
-  
+
       vector<t_function*> functions = (*sv_iter)->get_functions();
       vector<t_function*>::iterator fn_iter;
-      for (fn_iter = functions.begin(); fn_iter != functions.end(); ++fn_iter) {   
-        string fn_name = (*fn_iter)->get_name(); 
+      for (fn_iter = functions.begin(); fn_iter != functions.end(); ++fn_iter) {
+        string fn_name = (*fn_iter)->get_name();
         filling.emplace_back();
         fill = &filling.back();
-        (*fill)[1] = "    [ &bull; " + fn_name + "](" 
-          + make_file_link(fname) 
+        (*fill)[1] = "    [ &bull; " + fn_name + "]("
+          + make_file_link(fname)
           + "#function-" + str_to_id(name + fn_name) + ")";
       }
     }
   }
-  
-  // Data Types Column 
+
+  // Data Types Column
   auto it_fill = filling.begin();
 
   if (!tprog->get_enums().empty()) {
@@ -224,8 +221,8 @@
         ++it_fill;
       }
       string name = (*en_iter)->get_name();
-      (*fill)[2] = "[" + name + "](" 
-        + make_file_link(fname) 
+      (*fill)[2] = "[" + name + "]("
+        + make_file_link(fname)
         + "#enumeration-" + str_to_id(name) + ")";
     }
   }
@@ -242,15 +239,15 @@
         ++it_fill;
       }
       string name = (*td_iter)->get_symbolic();
-      (*fill)[2] = "[" + name + "](" 
-        + make_file_link(fname) 
+      (*fill)[2] = "[" + name + "]("
+        + make_file_link(fname)
         + "#typedef-" + str_to_id(name) + ")";
     }
   }
   if (!tprog->get_objects().empty()) {
     vector<t_struct*> objects = tprog->get_objects();
     vector<t_struct*>::iterator o_iter;
-    for (o_iter = objects.begin(); o_iter != objects.end(); ++o_iter) {      
+    for (o_iter = objects.begin(); o_iter != objects.end(); ++o_iter) {
       if(it_fill == filling.end()) {
         filling.emplace_back();
         fill = &filling.back();
@@ -261,7 +258,7 @@
       }
       string name = (*o_iter)->get_name();
       (*fill)[2] = "[" + name + "](" + make_file_link(fname);
-      
+
       if ((*o_iter)->is_xception()) {
         (*fill)[2] += "#exception-";
       } else if ((*o_iter)->is_struct() && (*o_iter)->is_union()) {
@@ -270,11 +267,11 @@
         (*fill)[2] += "#struct-";
       }
       (*fill)[2] += str_to_id(name) + ")";
-      
+
     }
   }
-  
-  // Constants Column 
+
+  // Constants Column
   it_fill = filling.begin();
 
   if (!tprog->get_consts().empty()) {
@@ -291,19 +288,19 @@
         ++it_fill;
       }
       string name = (*con_iter)->get_name();
-      (*fill)[3] = "[" + name + "](" 
-        + make_file_link(fname) 
+      (*fill)[3] = "[" + name + "]("
+        + make_file_link(fname)
         + "#constant-" + str_to_id(name) + ")";
     }
-    
+
   }
-  
+
   for(auto& fill : filling) {
     for(auto& c : fill)
-      f_out_ << '|' << c;  
-    f_out_ << '|' << endl;
+      f_out_ << '|' << c;
+    f_out_ << '|' << '\n';
   }
-  f_out_ << endl;
+  f_out_ << '\n';
 }
 
 /**
@@ -318,24 +315,24 @@
   current_file_ = make_file_name(pname);
   string fname = get_out_dir() + current_file_;
   f_out_.open(fname.c_str());
-  f_out_ << "# Thrift module: " << pname << endl << endl;
+  f_out_ << "# Thrift module: " << pname << '\n' << '\n';
 
   print_doc(program_);
-  f_out_ << endl << endl;
+  f_out_ << '\n' << '\n';
 
   generate_program_toc();
 
   if (!program_->get_consts().empty()) {
-    f_out_ << "***" << endl << "## Constants" << endl << endl;
+    f_out_ << "***" << '\n' << "## Constants" << '\n' << '\n';
     vector<t_const*> consts = program_->get_consts();
-    f_out_ << "|Constant|Type|Value||" << endl
-           << "|---|---|---|---|" << endl;
+    f_out_ << "|Constant|Type|Value||" << '\n'
+           << "|---|---|---|---|" << '\n';
     generate_consts(consts);
-    f_out_ << endl;
+    f_out_ << '\n';
   }
 
   if (!program_->get_enums().empty()) {
-    f_out_ << "***" << endl << "## Enumerations" << endl << endl;
+    f_out_ << "***" << '\n' << "## Enumerations" << '\n' << '\n';
     // Generate enums
     vector<t_enum*> enums = program_->get_enums();
     vector<t_enum*>::iterator en_iter;
@@ -345,7 +342,7 @@
   }
 
   if (!program_->get_typedefs().empty()) {
-    f_out_ << "***" << endl << "## Type declarations" << endl << endl;
+    f_out_ << "***" << '\n' << "## Type declarations" << '\n' << '\n';
     // Generate typedefs
     vector<t_typedef*> typedefs = program_->get_typedefs();
     vector<t_typedef*>::iterator td_iter;
@@ -355,7 +352,7 @@
   }
 
   if (!program_->get_objects().empty()) {
-    f_out_ << "***" << endl << "## Data structures" << endl << endl;
+    f_out_ << "***" << '\n' << "## Data structures" << '\n' << '\n';
     // Generate structs and exceptions in declared order
     vector<t_struct*> objects = program_->get_objects();
     vector<t_struct*>::iterator o_iter;
@@ -369,7 +366,7 @@
   }
 
   if (!program_->get_services().empty()) {
-    f_out_ << "***" << endl << "## Services" << endl << endl;
+    f_out_ << "***" << '\n' << "## Services" << '\n' << '\n';
     // Generate services
     vector<t_service*> services = program_->get_services();
     vector<t_service*>::iterator sv_iter;
@@ -379,7 +376,7 @@
     }
   }
 
-  f_out_ << endl;
+  f_out_ << '\n';
   f_out_.close();
 
   generate_index();
@@ -392,15 +389,15 @@
   current_file_ = make_file_name("index");
   string index_fname = get_out_dir() + current_file_;
   f_out_.open(index_fname.c_str());
-  
-  f_out_ << "# Thrift declarations" << endl;
-  f_out_ << "| Module | Services & Functions | Data types | Constants |" 
-         << endl 
-         << "| --- | --- | --- | --- |" 
-         << endl;
+
+  f_out_ << "# Thrift declarations" << '\n';
+  f_out_ << "| Module | Services & Functions | Data types | Constants |"
+         << '\n'
+         << "| --- | --- | --- | --- |"
+         << '\n';
   vector<t_program*> programs;
   generate_program_toc_rows(program_, programs);
-  f_out_ << endl;
+  f_out_ << '\n';
   f_out_.close();
 }
 
@@ -716,13 +713,13 @@
       f_out_ << "&gt;";
     }
   } else if (ttype->is_base_type()) {
-    f_out_ << "```" << (ttype->is_binary() ? "binary" : ttype->get_name()) 
+    f_out_ << "```" << (ttype->is_binary() ? "binary" : ttype->get_name())
            << "```";
     len = ttype->get_name().size();
   } else {
     string prog_name = ttype->get_program()->get_name();
     string type_name = ttype->get_name();
-    f_out_ << "[```" << type_name << "```](" 
+    f_out_ << "[```" << type_name << "```]("
            << make_file_link(make_file_name(prog_name)) << "#";
     if (ttype->is_typedef()) {
       f_out_ << "typedef-";
@@ -740,7 +737,7 @@
     }
     len = type_name.size();
     if (ttype->get_program() != program_) {
-      f_out_ << str_to_id(prog_name); 
+      f_out_ << str_to_id(prog_name);
       len += prog_name.size() + 1;
     }
     f_out_ <<  str_to_id(type_name) << ')';
@@ -757,8 +754,8 @@
   if (tvalue->get_type() == t_const_value::CV_IDENTIFIER) {
     string fname = make_file_name(program_->get_name());
     string name = escape_html(tvalue->get_identifier());
-    f_out_ << "[```" << name << "```](" 
-      + make_file_link(fname) 
+    f_out_ << "[```" << name << "```]("
+      + make_file_link(fname)
       + "#constant-" + str_to_id(name) + ")";
     return;
   }
@@ -773,7 +770,7 @@
     t_base_type::t_base tbase = ((t_base_type*)truetype)->get_base();
     f_out_ << "```";
     switch (tbase) {
-    case t_base_type::TYPE_STRING: 
+    case t_base_type::TYPE_STRING:
       f_out_ << escape_html(get_escaped_string(tvalue));
       break;
     case t_base_type::TYPE_BOOL:
@@ -893,17 +890,17 @@
     }
     if (has_docs) {
       arg_iter = args.begin();
-      f_out_ << endl << "* parameters:" << endl;
+      f_out_ << '\n' << "* parameters:" << '\n';
       for (int n = 1; arg_iter != args.end(); ++arg_iter, ++n ) {
         f_out_ << n << ". " << (*arg_iter)->get_name();
         f_out_ << " - " << escape_html((*arg_iter)->get_doc());
-        f_out_ << endl;
+        f_out_ << '\n';
       }
-      f_out_ << endl;
+      f_out_ << '\n';
     }
   }
-  if(!has_docs) 
-    f_out_ << endl;
+  if(!has_docs)
+    f_out_ << '\n';
 
   has_docs = false;
   vector<t_field*> excepts = tfunction->get_xceptions()->get_members();
@@ -917,14 +914,14 @@
     }
     if (has_docs) {
       ex_iter = excepts.begin();
-      f_out_ << "* exceptions:" << endl;
+      f_out_ << "* exceptions:" << '\n';
       for (; ex_iter != excepts.end(); ex_iter++) {
         f_out_ << "  * " << (*ex_iter)->get_type()->get_name();
         f_out_ << " - ";
         f_out_ << escape_html((*ex_iter)->get_doc());
-        f_out_ << endl;
+        f_out_ << '\n';
       }
-      f_out_ << endl;
+      f_out_ << '\n';
     }
   }
 }
@@ -936,13 +933,13 @@
  */
 void t_markdown_generator::generate_typedef(t_typedef* ttypedef) {
   string name = ttypedef->get_name();
-  f_out_ << "### Typedef: " << name  << endl;
+  f_out_ << "### Typedef: " << name  << '\n';
   print_doc(ttypedef);
-  f_out_ << endl << endl;
+  f_out_ << '\n' << '\n';
   f_out_ << "_Base type_: **";
   print_type(ttypedef->get_type());
-  f_out_ << "**" << endl << endl;
-  f_out_ << endl;
+  f_out_ << "**" << '\n' << '\n';
+  f_out_ << '\n';
 }
 
 /**
@@ -952,10 +949,10 @@
  */
 void t_markdown_generator::generate_enum(t_enum* tenum) {
   string name = tenum->get_name();
-  f_out_ << "### Enumeration: " << name << endl;
+  f_out_ << "### Enumeration: " << name << '\n';
   print_doc(tenum);
-  f_out_  << endl << endl << "|Name|Value|Description|" << endl 
-          << "|---|---|---|" << endl;
+  f_out_  << '\n' << '\n' << "|Name|Value|Description|" << '\n'
+          << "|---|---|---|" << '\n';
   vector<t_enum_value*> values = tenum->get_constants();
   vector<t_enum_value*>::iterator val_iter;
   for (val_iter = values.begin(); val_iter != values.end(); ++val_iter) {
@@ -965,9 +962,9 @@
     f_out_ << (*val_iter)->get_value();
     f_out_ << "```|";
     print_doc((*val_iter));
-    f_out_ << "|" << endl;
+    f_out_ << "|" << '\n';
   }
-  f_out_ << endl;
+  f_out_ << '\n';
 }
 
 /**
@@ -984,7 +981,7 @@
   if (tconst->has_doc()) {
     print_doc(tconst);
   }
-  f_out_ << '|' << endl;
+  f_out_ << '|' << '\n';
 }
 
 /**
@@ -1002,14 +999,14 @@
   } else {
     f_out_ << "Struct: ";
   }
-  f_out_ << name << endl;
+  f_out_ << name << '\n';
   print_doc(tstruct);
-  f_out_ << endl << endl;
+  f_out_ << '\n' << '\n';
   vector<t_field*> members = tstruct->get_members();
   vector<t_field*>::iterator mem_iter = members.begin();
   f_out_ << "| Key | Field | Type | Description | Requiredness "
-            "| Default value |" << endl
-         << "| --- | --- | --- | --- | --- | --- |" << endl;
+            "| Default value |" << '\n'
+         << "| --- | --- | --- | --- | --- | --- |" << '\n';
   for (; mem_iter != members.end(); mem_iter++) {
     f_out_ << '|' << (*mem_iter)->get_key();
     f_out_ << '|' << (*mem_iter)->get_name();
@@ -1030,9 +1027,9 @@
       print_const_value((*mem_iter)->get_type(), default_val);
       f_out_ << "```";
     }
-    f_out_ << '|' << endl;
+    f_out_ << '|' << '\n';
   }
-  f_out_ << endl;
+  f_out_ << '\n';
 }
 
 /**
@@ -1050,32 +1047,32 @@
  * @param tservice The service definition
  */
 void t_markdown_generator::generate_service(t_service* tservice) {
-  f_out_ << "### Service: " << service_name_ << endl;
+  f_out_ << "### Service: " << service_name_ << '\n';
 
   if (tservice->get_extends()) {
     f_out_ << "**extends ** _";
     print_type(tservice->get_extends());
-    f_out_ << "_" << endl;
+    f_out_ << "_" << '\n';
   }
 
   print_doc(tservice);
-  f_out_ << endl;
+  f_out_ << '\n';
 
   vector<t_function*> functions = tservice->get_functions();
   vector<t_function*>::iterator fn_iter = functions.begin();
   for (; fn_iter != functions.end(); fn_iter++) {
     string fn_name = (*fn_iter)->get_name();
-    f_out_ << "#### Function: " << service_name_ << "." << fn_name << endl;
+    f_out_ << "#### Function: " << service_name_ << "." << fn_name << '\n';
     print_doc(*fn_iter);
-    f_out_ << endl << endl;
+    f_out_ << '\n' << '\n';
     print_type((*fn_iter)->get_returntype());
     bool first = true;
-    f_out_ << endl << " _" << fn_name << "_(";
+    f_out_ << '\n' << " _" << fn_name << "_(";
     vector<t_field*> args = (*fn_iter)->get_arglist()->get_members();
     vector<t_field*>::iterator arg_iter = args.begin();
     for (; arg_iter != args.end(); arg_iter++) {
       if (!first) {
-        f_out_ << "," << endl;
+        f_out_ << "," << '\n';
       }
       first = false;
       print_type((*arg_iter)->get_type());
@@ -1085,7 +1082,7 @@
         print_const_value((*arg_iter)->get_type(), (*arg_iter)->get_value());
       }
     }
-    f_out_ << ")" << endl;
+    f_out_ << ")" << '\n';
     first = true;
     vector<t_field*> excepts = (*fn_iter)->get_xceptions()->get_members();
     vector<t_field*>::iterator ex_iter = excepts.begin();
@@ -1098,10 +1095,10 @@
         first = false;
         print_type((*ex_iter)->get_type());
       }
-      f_out_ << endl;
+      f_out_ << '\n';
     }
     print_fn_args_doc(*fn_iter);
-    f_out_ << endl;
+    f_out_ << '\n';
   }
 }
 
diff --git a/compiler/cpp/src/thrift/generate/t_netstd_generator.cc b/compiler/cpp/src/thrift/generate/t_netstd_generator.cc
index 1a27c0c..95c9118 100644
--- a/compiler/cpp/src/thrift/generate/t_netstd_generator.cc
+++ b/compiler/cpp/src/thrift/generate/t_netstd_generator.cc
@@ -202,27 +202,125 @@
 
 void t_netstd_generator::pragmas_and_directives(ostream& out)
 {
+    if( target_net_version >= 8) {
+        out << "// targeting net 8" << '\n';
+        out << "#if( !NET8_0_OR_GREATER)" << '\n';
+    } else if( target_net_version >= 6) {
+        out << "// targeting net 6" << '\n';
+        out << "#if( NET8_0_OR_GREATER || !NET6_0_OR_GREATER)" << '\n';
+    } else {
+        out << "// targeting netstandard 2.x" << '\n';
+        out << "#if(! NETSTANDARD2_0_OR_GREATER)" << '\n';
+    }
+    out << "#error Unexpected target platform. See 'thrift --help' for details." << '\n';
+    out << "#endif" << '\n';
+    out << '\n';
+
     if( target_net_version >= 6) {
-      out << "// Thrift code generated for net" << target_net_version << endl;
-      out << "#nullable enable                 // requires C# 8.0" << endl;
+      out << "// Thrift code generated for net" << target_net_version << '\n';
+      out << "#nullable enable                 // requires C# 8.0" << '\n';
     }
 
     // this one must be first
-    out << "#pragma warning disable IDE0079  // remove unnecessary pragmas" << endl;
+    out << "#pragma warning disable IDE0079  // remove unnecessary pragmas" << '\n';
 
     if( target_net_version >= 8) {
-      out << "#pragma warning disable IDE0290  // use primary CTOR" << endl;
+      out << "#pragma warning disable IDE0290  // use primary CTOR" << '\n';
     } else {
-      out << "#pragma warning disable IDE0017  // object init can be simplified" << endl;
-      out << "#pragma warning disable IDE0028  // collection init can be simplified" << endl;
+      out << "#pragma warning disable IDE0017  // object init can be simplified" << '\n';
+      out << "#pragma warning disable IDE0028  // collection init can be simplified" << '\n';
     }
-    out << "#pragma warning disable IDE1006  // parts of the code use IDL spelling" << endl;
-    out << "#pragma warning disable CA1822   // empty " << DEEP_COPY_METHOD_NAME << "() methods still non-static" << endl;
+    out << "#pragma warning disable IDE1006  // parts of the code use IDL spelling" << '\n';
+    out << "#pragma warning disable CA1822   // empty " << DEEP_COPY_METHOD_NAME << "() methods still non-static" << '\n';
+
+    if( any_deprecations()) {
+      out << "#pragma warning disable CS0618   // silence our own deprecation warnings" << '\n';
+    }
 
     if( target_net_version < 6) {
-        out << "#pragma warning disable IDE0083  // pattern matching \"that is not SomeType\" requires net5.0 but we still support earlier versions" << endl;
+        out << "#pragma warning disable IDE0083  // pattern matching \"that is not SomeType\" requires net5.0 but we still support earlier versions" << '\n';
     }
-    out << endl;
+    out << '\n';
+}
+
+
+bool t_netstd_generator::any_deprecations()
+{
+  // enums
+  vector<t_enum*> enums = program_->get_enums();
+  vector<t_enum*>::iterator en_iter;
+  for (en_iter = enums.begin(); en_iter != enums.end(); ++en_iter) {
+    if( is_deprecated((*en_iter)->annotations_)) {
+      return true;
+    }
+
+    // enum values
+    vector<t_enum_value*> evals = (*en_iter)->get_constants();
+    vector<t_enum_value*>::iterator ev_iter;
+    for (ev_iter = evals.begin(); ev_iter != evals.end(); ++ev_iter) {
+      if( is_deprecated((*ev_iter)->annotations_)) {
+        return true;
+      }
+    }
+  }
+
+  // typedefs
+  vector<t_typedef*> typedefs = program_->get_typedefs();
+  vector<t_typedef*>::iterator td_iter;
+  for (td_iter = typedefs.begin(); td_iter != typedefs.end(); ++td_iter) {
+    if( is_deprecated((*td_iter)->annotations_)) {
+        return true;
+    }
+  }
+
+  // structs, exceptions, unions
+  vector<t_struct*> objects = program_->get_objects();
+  vector<t_struct*>::iterator o_iter;
+  for (o_iter = objects.begin(); o_iter != objects.end(); ++o_iter) {
+    if( is_deprecated((*o_iter)->annotations_)) {
+      return true;
+    }
+
+    // struct members
+    const vector<t_field*>& members = (*o_iter)->get_members();
+    vector<t_field*>::const_iterator m_iter;
+    for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
+      if( is_deprecated((*m_iter)->annotations_)) {
+        return true;
+      }
+    }
+  }
+
+  /* not yet
+  // constants
+  vector<t_const*> consts = program_->get_consts();
+  vector<t_const*>::iterator c_iter;
+  for (c_iter = consts.begin(); c_iter != consts.end(); ++c_iter) {
+    if( is_deprecated((*c_iter)->annotations_)) {
+      return true;
+    }
+  }
+  */
+
+  // services
+  vector<t_service*> services = program_->get_services();
+  vector<t_service*>::iterator sv_iter;
+  for (sv_iter = services.begin(); sv_iter != services.end(); ++sv_iter) {
+    if( is_deprecated((*sv_iter)->annotations_)) {
+      return true;
+    }
+
+    // service methods
+    vector<t_function*> functions = (*sv_iter)->get_functions();
+    vector<t_function*>::iterator f_iter;
+    for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
+      if( is_deprecated((*f_iter)->annotations_)) {
+        return true;
+      }
+    }
+  }
+
+  return false;
 }
 
 
@@ -230,7 +328,20 @@
 {
     if (!namespace_name_.empty())
     {
-        out << "namespace " << namespace_name_ << endl;
+        std::string normalized;
+        
+        const char* delim = ".";
+        char* str = strdup(namespace_name_.c_str());
+        char* next = strtok(str, delim);
+        while( next != NULL) {
+            if( normalized.length() > 0) {
+                normalized += ".";
+            }
+            normalized += normalize_name(next,false);
+            next = strtok(NULL, delim);
+        }
+        
+        out << "namespace " << normalized << '\n';
         scope_up(out);
     }
 }
@@ -261,6 +372,9 @@
     if (is_wcf_enabled())
     {
         namespaces += "using System.ServiceModel;\n";
+    }
+    if (is_wcf_enabled() || is_serialize_enabled())
+    {
         namespaces += "using System.Runtime.Serialization;\n";
     }
 
@@ -309,13 +423,15 @@
 void t_netstd_generator::generate_enum(ostream& out, t_enum* tenum)
 {
     reset_indent();
-    out << autogen_comment() << endl;
+    out << autogen_comment();
+    out << "using System;" << '\n' << '\n';  // needed for Obsolete() attribute
 
     pragmas_and_directives(out);
     start_netstd_namespace(out);
     generate_netstd_doc(out, tenum);
 
-    out << indent() << "public enum " << type_name(tenum,false) << endl;
+    generate_deprecation_attribute(out, tenum->annotations_);
+    out << indent() << "public enum " << type_name(tenum,false) << '\n';
     scope_up(out);
 
     vector<t_enum_value*> constants = tenum->get_constants();
@@ -325,7 +441,8 @@
     {
         generate_netstd_doc(out, *c_iter);
         int value = (*c_iter)->get_value();
-        out << indent() << normalize_name((*c_iter)->get_name()) << " = " << value << "," << endl;
+        generate_deprecation_attribute(out, (*c_iter)->annotations_);
+        out << indent() << normalize_name((*c_iter)->get_name()) << " = " << value << "," << '\n';
     }
 
     scope_down(out);
@@ -356,12 +473,12 @@
     }
 
     reset_indent();
-    out << autogen_comment() << netstd_type_usings() << endl << endl;
+    out << autogen_comment() << netstd_type_usings() << '\n' << '\n';
 
     pragmas_and_directives(out);
     start_netstd_namespace(out);
 
-    out << indent() << "public static class " << make_valid_csharp_identifier(program_name_) << "Constants" << endl;
+    out << indent() << "public static class " << make_valid_csharp_identifier(program_name_) << "Constants" << '\n';
 
     scope_up(out);
 
@@ -416,7 +533,7 @@
             t_type* field_type = field->get_type();
 
             string val = render_const_value(out, name, field_type, v_iter->second);
-            out << indent() << name << "." << prop_name(field) << " = " << val << ";" << endl;
+            out << indent() << name << "." << prop_name(field) << " = " << val << ";" << '\n';
         }
 
         cleanup_member_name_mapping(static_cast<t_struct*>(type));
@@ -431,7 +548,7 @@
         {
             string key = render_const_value(out, name, ktype, v_iter->first);
             string val = render_const_value(out, name, vtype, v_iter->second);
-            out << indent() << name << "[" << key << "]" << " = " << val << ";" << endl;
+            out << indent() << name << "[" << key << "]" << " = " << val << ";" << '\n';
         }
     }
     else if (type->is_list() || type->is_set())
@@ -451,14 +568,14 @@
         for (v_iter = val.begin(); v_iter != val.end(); ++v_iter)
         {
             string val = render_const_value(out, name, etype, *v_iter);
-            out << indent() << name << ".Add(" << val << ");" << endl;
+            out << indent() << name << ".Add(" << val << ");" << '\n';
         }
     }
 }
 
 void t_netstd_generator::print_const_constructor(ostream& out, vector<t_const*> consts)
 {
-    out << indent() << "static " << make_valid_csharp_identifier(program_name_).c_str() << "Constants()" << endl;
+    out << indent() << "static " << make_valid_csharp_identifier(program_name_).c_str() << "Constants()" << '\n';
     scope_up(out);
 
     vector<t_const*>::iterator c_iter;
@@ -494,30 +611,30 @@
     if (type->is_base_type())
     {
         string v2 = render_const_value(out, name, type, value);
-        out << name << " = " << v2 << ";" << endl;
+        out << name << " = " << v2 << ";" << '\n';
         need_static_construction = false;
     }
     else if (type->is_enum())
     {
-        out << name << " = " << type_name(type) << "." << value->get_identifier_name() << ";" << endl;
+        out << name << " = " << type_name(type) << "." << value->get_identifier_name() << ";" << '\n';
         need_static_construction = false;
     }
     else if (type->is_struct() || type->is_xception())
     {
         if(target_net_version >= 6) {
-          out << name << " = new();" << endl;
+          out << name << " = new();" << '\n';
         } else {
-          out << name << " = new " << type_name(type) << "();" << endl;
+          out << name << " = new " << type_name(type) << "();" << '\n';
         }
     }
     else if (type->is_map() || type->is_list() || type->is_set())
     {
         if(target_net_version >= 8) {
-          out << name << " = [];" << endl;
+          out << name << " = [];" << '\n';
         } else if(target_net_version >= 6) {
-          out << name << " = new();" << endl;
+          out << name << " = new();" << '\n';
         } else {
-          out << name << " = new " << type_name(type) << "();" << endl;
+          out << name << " = new " << type_name(type) << "();" << '\n';
         }
     }
 
@@ -672,49 +789,53 @@
 
     reset_indent();
     out << autogen_comment() << netstd_type_usings()
-        << "using Thrift.Protocol;" << endl
-        << endl << endl;
+        << "using Thrift.Protocol;" << '\n'
+        << '\n' << '\n';
 
     pragmas_and_directives(out);
     start_netstd_namespace(out);
 
-    out << indent() << "public static class " << make_valid_csharp_identifier(program_name_) << "Extensions" << endl;
+    out << indent() << "public static class " << make_valid_csharp_identifier(program_name_) << "Extensions" << '\n';
     scope_up(out);
 
     bool needs_typecast = false;
     std::map<string,t_type*>::const_iterator iter;
     for( iter = types.begin(); iter != types.end(); ++iter)
     {
-        out << indent() << "public static bool Equals(this " << iter->first << " instance, object that)" << endl;
+        out << indent() << "public static bool Equals(this " << iter->first << " instance, object that)" << '\n';
         scope_up(out);
         if( target_net_version >= 6) {
-            out << indent() << "if (that is not " << iter->first << " other) return false;" << endl;
+            out << indent() << "if (that is not " << iter->first << " other) return false;" << '\n';
         } else {
-            out << indent() << "if (!(that is " << iter->first << " other)) return false;" << endl;
+            out << indent() << "if (!(that is " << iter->first << " other)) return false;" << '\n';
         }
-        out << indent() << "if (ReferenceEquals(instance, other)) return true;" << endl;
-        out << endl;
-        out << indent() << "return TCollections.Equals(instance, other);" << endl;
+        out << indent() << "if (ReferenceEquals(instance, other)) return true;" << '\n';
+        out << '\n';
+        out << indent() << "return TCollections.Equals(instance, other);" << '\n';
         scope_down(out);
-        out << endl << endl;
+        out << '\n' << '\n';
 
-        out << indent() << "public static int GetHashCode(this " << iter->first << " instance)" << endl;
+        out << indent() << "public static int GetHashCode(this " << iter->first << " instance)" << '\n';
         scope_up(out);
-        out << indent() << "return TCollections.GetHashCode(instance);" << endl;
+        out << indent() << "return TCollections.GetHashCode(instance);" << '\n';
         scope_down(out);
-        out << endl << endl;
+        out << '\n' << '\n';
 
         if(! suppress_deepcopy) {
-            out << indent() << "public static " << iter->first << nullable_field_suffix(iter->second) << " " << DEEP_COPY_METHOD_NAME << "(this " << iter->first << nullable_field_suffix(iter->second) << " source)" << endl;
+            out << indent() << "public static " << iter->first << nullable_field_suffix(iter->second) << " " << DEEP_COPY_METHOD_NAME << "(this " << iter->first << nullable_field_suffix(iter->second) << " source)" << '\n';
             scope_up(out);
-            out << indent() << "if (source == null)" << endl;
+            out << indent() << "if (source == null)" << '\n';
             indent_up();
-            out << indent() << "return null;" << endl << endl;
+            out << indent() << "return null;" << '\n' << '\n';
             indent_down();
 
             string suffix("");
             string tmp_instance = tmp("tmp");
-            out << indent() << "var " << tmp_instance << " = new " << iter->first << "(source.Count);" << endl;
+            if( (target_net_version < 5) && iter->second->is_set()) {
+                out << indent() << "var " << tmp_instance << " = new " << iter->first << "();" << '\n';
+            } else {
+                out << indent() << "var " << tmp_instance << " = new " << iter->first << "(source.Count);" << '\n';                
+            }
             if( iter->second->is_map())
             {
                 t_map* tmap = static_cast<t_map*>(iter->second);
@@ -723,7 +844,7 @@
                 bool null_key = type_can_be_null(tmap->get_key_type());
                 bool null_val = type_can_be_null(tmap->get_val_type());
 
-                out << indent() << "foreach (var pair in source)" << endl;
+                out << indent() << "foreach (var pair in source)" << '\n';
                 indent_up();
                 if( target_net_version >= 6) {
                     out << indent() << tmp_instance << ".Add(pair.Key" << copy_key;
@@ -742,7 +863,7 @@
                         out << "pair.Value" << copy_val;
                     }
                 }
-                out << ");" << endl;
+                out << ");" << '\n';
                 indent_down();
 
             } else if( iter->second->is_set() || iter->second->is_list()) {
@@ -761,7 +882,7 @@
                     null_elm = type_can_be_null(tlist->get_elem_type());
                 }
 
-                out << indent() << "foreach (var elem in source)" << endl;
+                out << indent() << "foreach (var elem in source)" << '\n';
                 indent_up();
                 if( target_net_version >= 6) {
                     out << indent() << tmp_instance << ".Add(elem" << copy_elm;
@@ -774,13 +895,13 @@
                         out << "elem" << copy_elm;
                     }
                 }
-                out << ");" << endl;
+                out << ");" << '\n';
                 indent_down();
             }
 
-            out << indent() << "return " << tmp_instance << ";" << endl;
+            out << indent() << "return " << tmp_instance << ";" << '\n';
             scope_down(out);
-            out << endl << endl;
+            out << '\n' << '\n';
         }
     }
 
@@ -818,7 +939,7 @@
     f_struct.open(f_struct_name.c_str());
 
     reset_indent();
-    f_struct << autogen_comment() << netstd_type_usings() << netstd_thrift_usings() << endl << endl;
+    f_struct << autogen_comment() << netstd_type_usings() << netstd_thrift_usings() << '\n' << '\n';
 
     pragmas_and_directives(f_struct);
     generate_netstd_struct_definition(f_struct, tstruct, is_exception);
@@ -835,7 +956,7 @@
         start_netstd_namespace(out);
     }
 
-    out << endl;
+    out << '\n';
 
     generate_netstd_doc(out, tstruct);
     collect_extensions_types(tstruct);
@@ -843,13 +964,14 @@
 
     if ((is_serialize_enabled() || is_wcf_enabled()) && !is_exception)
     {
-        out << indent() << "[DataContract(Namespace=\"" << wcf_namespace_ << "\")]" << endl;
+        out << indent() << "[DataContract(Namespace=\"" << wcf_namespace_ << "\")]" << '\n';
     }
 
     bool is_final = tstruct->annotations_.find("final") != tstruct->annotations_.end();
 
     string sharp_struct_name = type_name(tstruct, false);
 
+    generate_deprecation_attribute(out, tstruct->annotations_);
     out << indent() << "public " << (is_final ? "sealed " : "") << "partial class " << sharp_struct_name << " : ";
 
     if (is_exception)
@@ -857,8 +979,8 @@
         out << "TException, ";
     }
 
-    out << "TBase" << endl
-        << indent() << "{" << endl;
+    out << "TBase" << '\n'
+        << indent() << "{" << '\n';
     indent_up();
 
     const vector<t_field*>& members = tstruct->get_members();
@@ -870,10 +992,10 @@
         // if the field is required, then we use auto-properties
         if (!field_is_required((*m_iter)))
         {
-            out << indent() << "private " << declare_field(*m_iter, false, true, "_") << endl;
+            out << indent() << "private " << declare_field(*m_iter, false, true, "_") << '\n';
         }
     }
-    out << endl;
+    out << '\n';
 
     bool has_non_required_fields = false;
     bool has_required_fields = false;
@@ -895,19 +1017,19 @@
     bool generate_isset = has_non_required_fields;
     if (generate_isset)
     {
-        out << endl;
+        out << '\n';
         if (is_serialize_enabled() || is_wcf_enabled())
         {
-            out << indent() << "[DataMember(Order = 1)]" << endl;
+            out << indent() << "[DataMember(Order = 1)]" << '\n';
         }
-        out << indent() << "public Isset __isset;" << endl;
+        out << indent() << "public Isset __isset;" << '\n';
         if (is_serialize_enabled() || is_wcf_enabled())
         {
-            out << indent() << "[DataContract]" << endl;
+            out << indent() << "[DataContract]" << '\n';
         }
 
-        out << indent() << "public struct Isset" << endl
-            << indent() << "{" << endl;
+        out << indent() << "public struct Isset" << '\n'
+            << indent() << "{" << '\n';
         indent_up();
 
         for (m_iter = members.begin(); m_iter != members.end(); ++m_iter)
@@ -919,18 +1041,18 @@
             {
                 if (is_serialize_enabled() || is_wcf_enabled())
                 {
-                    out << indent() << "[DataMember]" << endl;
+                    out << indent() << "[DataMember]" << '\n';
                 }
-                out << indent() << "public bool " << get_isset_name(normalize_name((*m_iter)->get_name())) << ";" << endl;
+                out << indent() << "public bool " << get_isset_name(normalize_name((*m_iter)->get_name())) << ";" << '\n';
             }
         }
 
         indent_down();
-        out << indent() << "}" << endl << endl;
+        out << indent() << "}" << '\n' << '\n';
 
         if (generate_isset && (is_serialize_enabled() || is_wcf_enabled()))
         {
-            out << indent() << "#region XmlSerializer support" << endl << endl;
+            out << indent() << "#region XmlSerializer support" << '\n' << '\n';
 
             for (m_iter = members.begin(); m_iter != members.end(); ++m_iter)
             {
@@ -939,22 +1061,22 @@
                 // if it is not required, if it has a default value, we need to generate Isset
                 if (!is_required)
                 {
-                    out << indent() << "public bool ShouldSerialize" << prop_name(*m_iter) << "()" << endl
-                        << indent() << "{" << endl;
+                    out << indent() << "public bool ShouldSerialize" << prop_name(*m_iter) << "()" << '\n'
+                        << indent() << "{" << '\n';
                     indent_up();
-                    out << indent() << "return __isset." << get_isset_name(normalize_name((*m_iter)->get_name())) << ";" << endl;
+                    out << indent() << "return __isset." << get_isset_name(normalize_name((*m_iter)->get_name())) << ";" << '\n';
                     indent_down();
-                    out << indent() << "}" << endl << endl;
+                    out << indent() << "}" << '\n' << '\n';
                 }
             }
 
-            out << indent() << "#endregion XmlSerializer support" << endl << endl;
+            out << indent() << "#endregion XmlSerializer support" << '\n' << '\n';
         }
     }
 
     // We always want a default, no argument constructor for Reading
-    out << indent() << "public " << sharp_struct_name << "()" << endl
-        << indent() << "{" << endl;
+    out << indent() << "public " << sharp_struct_name << "()" << '\n'
+        << indent() << "{" << '\n';
     indent_up();
 
     for (m_iter = members.begin(); m_iter != members.end(); ++m_iter)
@@ -972,12 +1094,12 @@
             {
                 print_const_value(out, "this._" + (*m_iter)->get_name(), t, (*m_iter)->get_value(), true, true);
                 // Optionals with defaults are marked set
-                out << indent() << "this.__isset." << get_isset_name(normalize_name((*m_iter)->get_name())) << " = true;" << endl;
+                out << indent() << "this.__isset." << get_isset_name(normalize_name((*m_iter)->get_name())) << " = true;" << '\n';
             }
         }
     }
     indent_down();
-    out << indent() << "}" << endl << endl;
+    out << indent() << "}" << '\n' << '\n';
 
     // if we have required fields, we add that CTOR too
     if (has_required_fields)
@@ -999,20 +1121,20 @@
                 out << type_name((*m_iter)->get_type()) << nullable_field_suffix(*m_iter) << " " << normalize_name((*m_iter)->get_name());
             }
         }
-        out << ") : this()" << endl
-            << indent() << "{" << endl;
+        out << ") : this()" << '\n'
+            << indent() << "{" << '\n';
         indent_up();
 
         for (m_iter = members.begin(); m_iter != members.end(); ++m_iter)
         {
             if (field_is_required(*m_iter))
             {
-                out << indent() << "this." << prop_name(*m_iter) << " = " << normalize_name((*m_iter)->get_name()) << ";" << endl;
+                out << indent() << "this." << prop_name(*m_iter) << " = " << normalize_name((*m_iter)->get_name()) << ";" << '\n';
             }
         }
 
         indent_down();
-        out << indent() << "}" << endl << endl;
+        out << indent() << "}" << '\n' << '\n';
     }
 
     // DeepCopy()
@@ -1032,7 +1154,7 @@
     generate_netstd_struct_tostring(out, tstruct);
 
     indent_down();
-    out << indent() << "}" << endl << endl;
+    out << indent() << "}" << '\n' << '\n';
 
     // generate a corresponding WCF fault to wrap the exception
     if ((is_serialize_enabled() || is_wcf_enabled()) && is_exception)
@@ -1050,13 +1172,14 @@
 
 void t_netstd_generator::generate_netstd_wcffault(ostream& out, t_struct* tstruct)
 {
-    out << endl;
-    out << indent() << "[DataContract]" << endl;
+    out << '\n';
+    out << indent() << "[DataContract]" << '\n';
 
     bool is_final = tstruct->annotations_.find("final") != tstruct->annotations_.end();
 
-    out << indent() << "public " << (is_final ? "sealed " : "") << "partial class " << type_name(tstruct,false) << "Fault" << endl
-        << indent() << "{" << endl;
+    generate_deprecation_attribute(out, tstruct->annotations_);
+    out << indent() << "public " << (is_final ? "sealed " : "") << "partial class " << type_name(tstruct,false) << "Fault" << '\n'
+        << indent() << "{" << '\n';
     indent_up();
 
     const vector<t_field*>& members = tstruct->get_members();
@@ -1068,10 +1191,10 @@
         // if the field is required, then we use auto-properties
         if (!field_is_required((*m_iter)))
         {
-            out << indent() << "private " << declare_field(*m_iter, false, true, "_") << endl;
+            out << indent() << "private " << declare_field(*m_iter, false, true, "_") << '\n';
         }
     }
-    out << endl;
+    out << '\n';
 
     for (m_iter = members.begin(); m_iter != members.end(); ++m_iter)
     {
@@ -1079,7 +1202,7 @@
     }
 
     indent_down();
-    out << indent() << "}" << endl << endl;
+    out << indent() << "}" << '\n' << '\n';
 }
 
 void t_netstd_generator::generate_netstd_deepcopy_method(ostream& out, t_struct* tstruct, std::string sharp_struct_name)
@@ -1091,8 +1214,8 @@
     const vector<t_field*>& members = tstruct->get_members();
     vector<t_field*>::const_iterator m_iter;
 
-    out << indent() << "public " << sharp_struct_name << " " << DEEP_COPY_METHOD_NAME << "()" << endl;
-    out << indent() << "{" << endl;
+    out << indent() << "public " << sharp_struct_name << " " << DEEP_COPY_METHOD_NAME << "()" << '\n';
+    out << indent() << "{" << '\n';
     indent_up();
 
     // return directly if there are only required fields
@@ -1100,10 +1223,10 @@
     out << indent() << "var " << tmp_instance << " = new " << sharp_struct_name << "()";
     bool inline_assignment = (target_net_version >= 6);
     if(inline_assignment) {
-      out << endl << indent() << "{" << endl;
+      out << '\n' << indent() << "{" << '\n';
       indent_up();
     } else {
-      out << endl;
+      out << ";\n";
     }
 
     for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
@@ -1118,7 +1241,7 @@
         if(inline_assignment) {
           if( null_allowed || (!is_required)) {  // = has isset
             indent_down();
-            out << indent() << "};" << endl;
+            out << indent() << "};" << '\n';
             inline_assignment = false;
           }
         }
@@ -1134,7 +1257,7 @@
             out << "(" << type_name(ttype) << ")";
         }
         out << "this." << prop_name(*m_iter) << copy_op;
-        out << (inline_assignment ? "," : ";") << endl;
+        out << (inline_assignment ? "," : ";") << '\n';
 
         generate_null_check_end( out, *m_iter);
         if( !is_required) {
@@ -1144,29 +1267,29 @@
             }
             out << "__isset." << get_isset_name(normalize_name((*m_iter)->get_name()));
             out << " = this.__isset." << get_isset_name(normalize_name((*m_iter)->get_name()));
-            out << (inline_assignment ? "," : ";") << endl;
+            out << (inline_assignment ? "," : ";") << '\n';
         }
     }
 
     if(inline_assignment) {
       indent_down();
-      out << indent() << "};" << endl;
+      out << indent() << "};" << '\n';
     }
 
-    out << indent() << "return " << tmp_instance << ";" << endl;
+    out << indent() << "return " << tmp_instance << ";" << '\n';
 
     indent_down();
-    out << indent() << "}" << endl << endl;
+    out << indent() << "}" << '\n' << '\n';
 }
 
 void t_netstd_generator::generate_netstd_struct_reader(ostream& out, t_struct* tstruct)
 {
-    out << indent() << "public async global::System.Threading.Tasks.Task ReadAsync(TProtocol iprot, CancellationToken " << CANCELLATION_TOKEN_NAME << ")" << endl
-        << indent() << "{" << endl;
+    out << indent() << "public async global::System.Threading.Tasks.Task ReadAsync(TProtocol iprot, CancellationToken " << CANCELLATION_TOKEN_NAME << ")" << '\n'
+        << indent() << "{" << '\n';
     indent_up();
-    out << indent() << "iprot.IncrementRecursionDepth();" << endl
-        << indent() << "try" << endl
-        << indent() << "{" << endl;
+    out << indent() << "iprot.IncrementRecursionDepth();" << '\n'
+        << indent() << "try" << '\n'
+        << indent() << "{" << '\n';
     indent_up();
 
     const vector<t_field*>& fields = tstruct->get_members();
@@ -1177,90 +1300,90 @@
     {
         if (field_is_required(*f_iter))
         {
-            out << indent() << "bool isset_" << (*f_iter)->get_name() << " = false;" << endl;
+            out << indent() << "bool isset_" << (*f_iter)->get_name() << " = false;" << '\n';
         }
     }
 
-    out << indent() << "TField field;" << endl
-        << indent() << "await iprot.ReadStructBeginAsync(" << CANCELLATION_TOKEN_NAME << ");" << endl
-        << indent() << "while (true)" << endl
-        << indent() << "{" << endl;
+    out << indent() << "TField field;" << '\n'
+        << indent() << "await iprot.ReadStructBeginAsync(" << CANCELLATION_TOKEN_NAME << ");" << '\n'
+        << indent() << "while (true)" << '\n'
+        << indent() << "{" << '\n';
     indent_up();
-    out << indent() << "field = await iprot.ReadFieldBeginAsync(" << CANCELLATION_TOKEN_NAME << ");" << endl
-        << indent() << "if (field.Type == TType.Stop)" << endl
-        << indent() << "{" << endl;
+    out << indent() << "field = await iprot.ReadFieldBeginAsync(" << CANCELLATION_TOKEN_NAME << ");" << '\n'
+        << indent() << "if (field.Type == TType.Stop)" << '\n'
+        << indent() << "{" << '\n';
     indent_up();
-    out << indent() << "break;" << endl;
+    out << indent() << "break;" << '\n';
     indent_down();
-    out << indent() << "}" << endl << endl
-        << indent() << "switch (field.ID)" << endl
-        << indent() << "{" << endl;
+    out << indent() << "}" << '\n' << '\n'
+        << indent() << "switch (field.ID)" << '\n'
+        << indent() << "{" << '\n';
     indent_up();
 
     for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter)
     {
         bool is_required = field_is_required(*f_iter);
-        out << indent() << "case " << (*f_iter)->get_key() << ":" << endl;
+        out << indent() << "case " << (*f_iter)->get_key() << ":" << '\n';
         indent_up();
-        out << indent() << "if (field.Type == " << type_to_enum((*f_iter)->get_type()) << ")" << endl
-            << indent() << "{" << endl;
+        out << indent() << "if (field.Type == " << type_to_enum((*f_iter)->get_type()) << ")" << '\n'
+            << indent() << "{" << '\n';
         indent_up();
 
         generate_deserialize_field(out, *f_iter);
         if (is_required)
         {
-            out << indent() << "isset_" << (*f_iter)->get_name() << " = true;" << endl;
+            out << indent() << "isset_" << (*f_iter)->get_name() << " = true;" << '\n';
         }
 
         indent_down();
-        out << indent() << "}" << endl
-            << indent() << "else" << endl
-            << indent() << "{" << endl;
+        out << indent() << "}" << '\n'
+            << indent() << "else" << '\n'
+            << indent() << "{" << '\n';
         indent_up();
-        out << indent() << "await TProtocolUtil.SkipAsync(iprot, field.Type, " << CANCELLATION_TOKEN_NAME << ");" << endl;
+        out << indent() << "await TProtocolUtil.SkipAsync(iprot, field.Type, " << CANCELLATION_TOKEN_NAME << ");" << '\n';
         indent_down();
-        out << indent() << "}" << endl
-            << indent() << "break;" << endl;
+        out << indent() << "}" << '\n'
+            << indent() << "break;" << '\n';
         indent_down();
     }
 
-    out << indent() << "default: " << endl;
+    out << indent() << "default: " << '\n';
     indent_up();
-    out << indent() << "await TProtocolUtil.SkipAsync(iprot, field.Type, " << CANCELLATION_TOKEN_NAME << ");" << endl
-        << indent() << "break;" << endl;
+    out << indent() << "await TProtocolUtil.SkipAsync(iprot, field.Type, " << CANCELLATION_TOKEN_NAME << ");" << '\n'
+        << indent() << "break;" << '\n';
     indent_down();
     indent_down();
-    out << indent() << "}" << endl
-        << endl
-        << indent() << "await iprot.ReadFieldEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << endl;
+    out << indent() << "}" << '\n'
+        << '\n'
+        << indent() << "await iprot.ReadFieldEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << '\n';
     indent_down();
-    out << indent() << "}" << endl
-        << endl
-        << indent() << "await iprot.ReadStructEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << endl;
+    out << indent() << "}" << '\n'
+        << '\n'
+        << indent() << "await iprot.ReadStructEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << '\n';
 
     for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter)
     {
         if (field_is_required((*f_iter)))
         {
-            out << indent() << "if (!isset_" << (*f_iter)->get_name() << ")" << endl
-                << indent() << "{" << endl;
+            out << indent() << "if (!isset_" << (*f_iter)->get_name() << ")" << '\n'
+                << indent() << "{" << '\n';
             indent_up();
-            out << indent() << "throw new TProtocolException(TProtocolException.INVALID_DATA);" << endl;
+            out << indent() << "throw new TProtocolException(TProtocolException.INVALID_DATA);" << '\n';
             indent_down();
-            out << indent() << "}" << endl;
+            out << indent() << "}" << '\n';
         }
     }
 
     indent_down();
-    out << indent() << "}" << endl;
-    out << indent() << "finally" << endl
-        << indent() << "{" << endl;
+    out << indent() << "}" << '\n';
+    out << indent() << "finally" << '\n'
+        << indent() << "{" << '\n';
     indent_up();
-    out << indent() << "iprot.DecrementRecursionDepth();" << endl;
+    out << indent() << "iprot.DecrementRecursionDepth();" << '\n';
     indent_down();
-    out << indent() << "}" << endl;
+    out << indent() << "}" << '\n';
     indent_down();
-    out << indent() << "}" << endl << endl;
+    out << indent() << "}" << '\n' << '\n';
 }
 
 
@@ -1284,8 +1407,8 @@
             out << "__isset." << get_isset_name(normalize_name(tfield->get_name()));
         }
 
-        out << ")" << endl
-            << indent() << "{" << endl;
+        out << ")" << '\n'
+            << indent() << "{" << '\n';
         indent_up();
     }
 }
@@ -1297,19 +1420,19 @@
 
     if( null_allowed || (!is_required)) {
         indent_down();
-        out << indent() << "}" << endl;
+        out << indent() << "}" << '\n';
     }
 }
 
 void t_netstd_generator::generate_netstd_struct_writer(ostream& out, t_struct* tstruct)
 {
-    out << indent() << "public async global::System.Threading.Tasks.Task WriteAsync(TProtocol oprot, CancellationToken " << CANCELLATION_TOKEN_NAME << ")" << endl
-        << indent() << "{" << endl;
+    out << indent() << "public async global::System.Threading.Tasks.Task WriteAsync(TProtocol oprot, CancellationToken " << CANCELLATION_TOKEN_NAME << ")" << '\n'
+        << indent() << "{" << '\n';
     indent_up();
 
-    out << indent() << "oprot.IncrementRecursionDepth();" << endl
-        << indent() << "try" << endl
-        << indent() << "{" << endl;
+    out << indent() << "oprot.IncrementRecursionDepth();" << '\n'
+        << indent() << "try" << '\n'
+        << indent() << "{" << '\n';
     indent_up();
 
     string name = tstruct->get_name();
@@ -1317,57 +1440,57 @@
     vector<t_field*>::const_iterator f_iter;
 
     string tmpvar = tmp("tmp");
-    out << indent() << "var " << tmpvar << " = new TStruct(\"" << name << "\");" << endl
-        << indent() << "await oprot.WriteStructBeginAsync(" << tmpvar << ", " << CANCELLATION_TOKEN_NAME << ");" << endl;
+    out << indent() << "var " << tmpvar << " = new TStruct(\"" << name << "\");" << '\n'
+        << indent() << "await oprot.WriteStructBeginAsync(" << tmpvar << ", " << CANCELLATION_TOKEN_NAME << ");" << '\n';
 
     if (fields.size() > 0)
     {
         tmpvar = tmp("tmp");
         if(target_net_version >= 8) {
-          out << indent() << "#pragma warning disable IDE0017  // simplified init" << endl;
+          out << indent() << "#pragma warning disable IDE0017  // simplified init" << '\n';
         }
-        out << indent() << "var " << tmpvar << " = new TField();" << endl;
+        out << indent() << "var " << tmpvar << " = new TField();" << '\n';
         for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter)
         {
             generate_null_check_begin( out, *f_iter);
-            out << indent() << tmpvar << ".Name = \"" << (*f_iter)->get_name() << "\";" << endl
-                << indent() << tmpvar << ".Type = " << type_to_enum((*f_iter)->get_type()) << ";" << endl
-                << indent() << tmpvar << ".ID = " << (*f_iter)->get_key() << ";" << endl
-                << indent() << "await oprot.WriteFieldBeginAsync(" << tmpvar << ", " << CANCELLATION_TOKEN_NAME << ");" << endl;
+            out << indent() << tmpvar << ".Name = \"" << (*f_iter)->get_name() << "\";" << '\n'
+                << indent() << tmpvar << ".Type = " << type_to_enum((*f_iter)->get_type()) << ";" << '\n'
+                << indent() << tmpvar << ".ID = " << (*f_iter)->get_key() << ";" << '\n'
+                << indent() << "await oprot.WriteFieldBeginAsync(" << tmpvar << ", " << CANCELLATION_TOKEN_NAME << ");" << '\n';
 
             generate_serialize_field(out, *f_iter);
 
-            out << indent() << "await oprot.WriteFieldEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << endl;
+            out << indent() << "await oprot.WriteFieldEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << '\n';
             generate_null_check_end(out, *f_iter);
         }
         if(target_net_version >= 8) {
-          out << indent() << "#pragma warning restore IDE0017  // simplified init" << endl;
+          out << indent() << "#pragma warning restore IDE0017  // simplified init" << '\n';
         }
     }
 
-    out << indent() << "await oprot.WriteFieldStopAsync(" << CANCELLATION_TOKEN_NAME << ");" << endl
-        << indent() << "await oprot.WriteStructEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << endl;
+    out << indent() << "await oprot.WriteFieldStopAsync(" << CANCELLATION_TOKEN_NAME << ");" << '\n'
+        << indent() << "await oprot.WriteStructEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << '\n';
     indent_down();
-    out << indent() << "}" << endl
-        << indent() << "finally" << endl
-        << indent() << "{" << endl;
+    out << indent() << "}" << '\n'
+        << indent() << "finally" << '\n'
+        << indent() << "{" << '\n';
     indent_up();
-    out << indent() << "oprot.DecrementRecursionDepth();" << endl;
+    out << indent() << "oprot.DecrementRecursionDepth();" << '\n';
     indent_down();
-    out << indent() << "}" << endl;
+    out << indent() << "}" << '\n';
     indent_down();
-    out << indent() << "}" << endl << endl;
+    out << indent() << "}" << '\n' << '\n';
 }
 
 void t_netstd_generator::generate_netstd_struct_result_writer(ostream& out, t_struct* tstruct)
 {
-    out << indent() << "public async global::System.Threading.Tasks.Task WriteAsync(TProtocol oprot, CancellationToken " << CANCELLATION_TOKEN_NAME << ")" << endl
-        << indent() << "{" << endl;
+    out << indent() << "public async global::System.Threading.Tasks.Task WriteAsync(TProtocol oprot, CancellationToken " << CANCELLATION_TOKEN_NAME << ")" << '\n'
+        << indent() << "{" << '\n';
     indent_up();
 
-    out << indent() << "oprot.IncrementRecursionDepth();" << endl
-        << indent() << "try" << endl
-        << indent() << "{" << endl;
+    out << indent() << "oprot.IncrementRecursionDepth();" << '\n'
+        << indent() << "try" << '\n'
+        << indent() << "{" << '\n';
     indent_up();
 
     string name = tstruct->get_name();
@@ -1375,85 +1498,85 @@
     vector<t_field*>::const_iterator f_iter;
 
     string tmpvar = tmp("tmp");
-    out << indent() << "var " << tmpvar << " = new TStruct(\"" << name << "\");" << endl
-        << indent() << "await oprot.WriteStructBeginAsync(" << tmpvar << ", " << CANCELLATION_TOKEN_NAME << ");" << endl;
+    out << indent() << "var " << tmpvar << " = new TStruct(\"" << name << "\");" << '\n'
+        << indent() << "await oprot.WriteStructBeginAsync(" << tmpvar << ", " << CANCELLATION_TOKEN_NAME << ");" << '\n';
 
     if (fields.size() > 0)
     {
         tmpvar = tmp("tmp");
         if(target_net_version >= 8) {
-          out << indent() << "#pragma warning disable IDE0017  // simplified init" << endl;
+          out << indent() << "#pragma warning disable IDE0017  // simplified init" << '\n';
         }
-        out << indent() << "var " << tmpvar << " = new TField();" << endl;
+        out << indent() << "var " << tmpvar << " = new TField();" << '\n';
         bool first = true;
         for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter)
         {
             if (first)
             {
                 first = false;
-                out << endl << indent() << "if";
+                out << '\n' << indent() << "if";
             }
             else
             {
                 out << indent() << "else if";
             }
 
-            out << "(this.__isset." << get_isset_name(normalize_name((*f_iter)->get_name())) << ")" << endl
-                << indent() << "{" << endl;
+            out << "(this.__isset." << get_isset_name(normalize_name((*f_iter)->get_name())) << ")" << '\n'
+                << indent() << "{" << '\n';
             indent_up();
 
             bool null_allowed = type_can_be_null((*f_iter)->get_type());
             if (null_allowed)
             {
-                out << indent() << "if (" << prop_name(*f_iter) << " != null)" << endl
-                    << indent() << "{" << endl;
+                out << indent() << "if (" << prop_name(*f_iter) << " != null)" << '\n'
+                    << indent() << "{" << '\n';
                 indent_up();
             }
 
-            out << indent() << tmpvar << ".Name = \"" << prop_name(*f_iter) << "\";" << endl
-                << indent() << tmpvar << ".Type = " << type_to_enum((*f_iter)->get_type()) << ";" << endl
-                << indent() << tmpvar << ".ID = " << (*f_iter)->get_key() << ";" << endl
-                << indent() << "await oprot.WriteFieldBeginAsync(" << tmpvar << ", " << CANCELLATION_TOKEN_NAME << ");" << endl;
+            out << indent() << tmpvar << ".Name = \"" << prop_name(*f_iter) << "\";" << '\n'
+                << indent() << tmpvar << ".Type = " << type_to_enum((*f_iter)->get_type()) << ";" << '\n'
+                << indent() << tmpvar << ".ID = " << (*f_iter)->get_key() << ";" << '\n'
+                << indent() << "await oprot.WriteFieldBeginAsync(" << tmpvar << ", " << CANCELLATION_TOKEN_NAME << ");" << '\n';
 
             generate_serialize_field(out, *f_iter);
 
-            out << indent() << "await oprot.WriteFieldEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << endl;
+            out << indent() << "await oprot.WriteFieldEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << '\n';
 
             if (null_allowed)
             {
                 indent_down();
-                out << indent() << "}" << endl;
+                out << indent() << "}" << '\n';
             }
 
             indent_down();
-            out << indent() << "}" << endl;
+            out << indent() << "}" << '\n';
         }
         if(target_net_version >= 8) {
-          out << indent() << "#pragma warning restore IDE0017  // simplified init" << endl;
+          out << indent() << "#pragma warning restore IDE0017  // simplified init" << '\n';
         }
     }
 
-    out << indent() << "await oprot.WriteFieldStopAsync(" << CANCELLATION_TOKEN_NAME << ");" << endl
-        << indent() << "await oprot.WriteStructEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << endl;
+    out << indent() << "await oprot.WriteFieldStopAsync(" << CANCELLATION_TOKEN_NAME << ");" << '\n'
+        << indent() << "await oprot.WriteStructEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << '\n';
     indent_down();
-    out << indent() << "}" << endl
-        << indent() << "finally" << endl
-        << indent() << "{" << endl;
+    out << indent() << "}" << '\n'
+        << indent() << "finally" << '\n'
+        << indent() << "{" << '\n';
     indent_up();
-    out << indent() << "oprot.DecrementRecursionDepth();" << endl;
+    out << indent() << "oprot.DecrementRecursionDepth();" << '\n';
     indent_down();
-    out << indent() << "}" << endl;
+    out << indent() << "}" << '\n';
     indent_down();
-    out << indent() << "}" << endl << endl;
+    out << indent() << "}" << '\n' << '\n';
 }
 
 void t_netstd_generator::generate_netstd_struct_tostring(ostream& out, t_struct* tstruct)
 {
     string tmpvar = tmp("tmp");
-    out << indent() << "public override string ToString()" << endl
-        << indent() << "{" << endl;
+    out << indent() << "public override string ToString()" << '\n'
+        << indent() << "{" << '\n';
     indent_up();
-    out << indent() << "var " << tmpvar << " = new StringBuilder(\"" << tstruct->get_name() << "(\");" << endl;
+    out << indent() << "var " << tmpvar << " = new StringBuilder(\"" << tstruct->get_name() << "(\");" << '\n';
 
     const vector<t_field*>& fields = tstruct->get_members();
     vector<t_field*>::const_iterator f_iter;
@@ -1464,7 +1587,7 @@
     {
         if (!field_is_required((*f_iter)))
         {
-            out << indent() << "int " << tmp_count.c_str() << " = 0;" << endl;
+            out << indent() << "int " << tmp_count.c_str() << " = 0;" << '\n';
             useFirstFlag = true;
         }
         break;
@@ -1479,15 +1602,15 @@
 
         if (useFirstFlag && (!had_required))
         {
-            out << indent() << "if(0 < " << tmp_count.c_str() << (is_required ? "" : "++") << ") { " << tmpvar << ".Append(\", \"); }" << endl;
-            out << indent() << tmpvar << ".Append(\"" << prop_name(*f_iter) << ": \");" << endl;
+            out << indent() << "if(0 < " << tmp_count.c_str() << (is_required ? "" : "++") << ") { " << tmpvar << ".Append(\", \"); }" << '\n';
+            out << indent() << tmpvar << ".Append(\"" << prop_name(*f_iter) << ": \");" << '\n';
         }
         else
         {
-            out << indent() << tmpvar << ".Append(\", " << prop_name(*f_iter) << ": \");" << endl;
+            out << indent() << tmpvar << ".Append(\", " << prop_name(*f_iter) << ": \");" << '\n';
         }
 
-        out << indent() << prop_name(*f_iter) << ".ToString(" << tmpvar << ");" << endl;
+        out << indent() << prop_name(*f_iter) << ".ToString(" << tmpvar << ");" << '\n';
 
         generate_null_check_end(out, *f_iter);
         if (is_required) {
@@ -1495,10 +1618,10 @@
         }
     }
 
-    out << indent() << tmpvar << ".Append(')');" << endl
-        << indent() << "return " << tmpvar << ".ToString();" << endl;
+    out << indent() << tmpvar << ".Append(')');" << '\n'
+        << indent() << "return " << tmpvar << ".ToString();" << '\n';
     indent_down();
-    out << indent() << "}" << endl;
+    out << indent() << "}" << '\n';
 }
 
 void t_netstd_generator::generate_netstd_union(t_struct* tunion)
@@ -1511,7 +1634,7 @@
     f_union.open(f_union_name.c_str());
 
     reset_indent();
-    f_union << autogen_comment() << netstd_type_usings() << netstd_thrift_usings() << endl << endl;
+    f_union << autogen_comment() << netstd_type_usings() << netstd_thrift_usings() << '\n' << '\n';
 
     pragmas_and_directives(f_union);
     generate_netstd_union_definition(f_union, tunion);
@@ -1526,75 +1649,76 @@
     // Let's define the class first
     start_netstd_namespace(out);
 
-    out << indent() << "public abstract partial class " << normalize_name(tunion->get_name()) << " : TUnionBase" << endl;
-    out << indent() << "{" << endl;
+    generate_deprecation_attribute(out, tunion->annotations_);
+    out << indent() << "public abstract partial class " << normalize_name(tunion->get_name()) << " : TUnionBase" << '\n';
+    out << indent() << "{" << '\n';
     indent_up();
 
-    out << indent() << "public abstract global::System.Threading.Tasks.Task WriteAsync(TProtocol tProtocol, CancellationToken " << CANCELLATION_TOKEN_NAME << ");" << endl
-        << indent() << "public readonly int Isset;" << endl
-        << indent() << "public abstract object" << nullable_suffix() <<" Data { get; }" << endl
-        << indent() << "protected " << normalize_name(tunion->get_name()) << "(int isset)" << endl
-        << indent() << "{" << endl;
+    out << indent() << "public abstract global::System.Threading.Tasks.Task WriteAsync(TProtocol tProtocol, CancellationToken " << CANCELLATION_TOKEN_NAME << ");" << '\n'
+        << indent() << "public readonly int Isset;" << '\n'
+        << indent() << "public abstract object" << nullable_suffix() <<" Data { get; }" << '\n'
+        << indent() << "protected " << normalize_name(tunion->get_name()) << "(int isset)" << '\n'
+        << indent() << "{" << '\n';
     indent_up();
-    out << indent() << "Isset = isset;" << endl;
+    out << indent() << "Isset = isset;" << '\n';
     indent_down();
-    out << indent() << "}" << endl << endl;
+    out << indent() << "}" << '\n' << '\n';
 
     const vector<t_field*>& fields = tunion->get_members();
     vector<t_field*>::const_iterator f_iter;
 
-    out << indent() << "public override bool Equals(object" << nullable_suffix() << " that)" << endl;
+    out << indent() << "public override bool Equals(object" << nullable_suffix() << " that)" << '\n';
     scope_up(out);
     if( target_net_version >= 6) {
-        out << indent() << "if (that is not " << tunion->get_name() << " other) return false;" << endl;
+        out << indent() << "if (that is not " << tunion->get_name() << " other) return false;" << '\n';
     } else {
-        out << indent() << "if (!(that is " << tunion->get_name() << " other)) return false;" << endl;
+        out << indent() << "if (!(that is " << tunion->get_name() << " other)) return false;" << '\n';
     }
-    out << indent() << "if (ReferenceEquals(this, other)) return true;" << endl;
-    out << endl;
-    out << indent() << "if(this.Isset != other.Isset) return false;" << endl;
-    out << endl;
+    out << indent() << "if (ReferenceEquals(this, other)) return true;" << '\n';
+    out << '\n';
+    out << indent() << "if(this.Isset != other.Isset) return false;" << '\n';
+    out << '\n';
     if(target_net_version >= 6) {
-        out << indent() << "return Isset switch" << endl;
+        out << indent() << "return Isset switch" << '\n';
         scope_up(out);
         for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter)
         {
             bool needs_typecast = false;
             string suffix("");
             get_deep_copy_method_call((*f_iter)->get_type(), false, needs_typecast, suffix);
-            out << indent() << (*f_iter)->get_key() << " => Equals(As_" << (*f_iter)->get_name() << ", other.As_" << (*f_iter)->get_name() << ")," << endl;
+            out << indent() << (*f_iter)->get_key() << " => Equals(As_" << (*f_iter)->get_name() << ", other.As_" << (*f_iter)->get_name() << ")," << '\n';
         }
-        out << indent() << "_ => true," << endl;
+        out << indent() << "_ => true," << '\n';
         indent_down();
-        out << indent() << "};" << endl;
+        out << indent() << "};" << '\n';
     } else {
-        out << indent() << "switch (Isset)" << endl;
+        out << indent() << "switch (Isset)" << '\n';
         scope_up(out);
         for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter)
         {
             bool needs_typecast = false;
             string suffix("");
             get_deep_copy_method_call((*f_iter)->get_type(), false, needs_typecast, suffix);
-            out << indent() << "case " << (*f_iter)->get_key() << ":" << endl;
+            out << indent() << "case " << (*f_iter)->get_key() << ":" << '\n';
             indent_up();
-            out << indent() << "return Equals(As_" << (*f_iter)->get_name() << ", other.As_" << (*f_iter)->get_name() << ");" << endl;
+            out << indent() << "return Equals(As_" << (*f_iter)->get_name() << ", other.As_" << (*f_iter)->get_name() << ");" << '\n';
             indent_down();
         }
-        out << indent() << "default:" << endl;
+        out << indent() << "default:" << '\n';
         indent_up();
-        out << indent() << "return true;" << endl;
+        out << indent() << "return true;" << '\n';
         indent_down();
         scope_down(out);
     }
     scope_down(out);
-    out << endl;
+    out << '\n';
 
-    out << indent() << "public override int GetHashCode()" << endl;
-    out << indent() << "{" << endl;
+    out << indent() << "public override int GetHashCode()" << '\n';
+    out << indent() << "{" << '\n';
     indent_up();
     if(target_net_version >= 6) {
-        out << indent() << "return Isset switch" << endl;
-        out << indent() << "{" << endl;
+        out << indent() << "return Isset switch" << '\n';
+        out << indent() << "{" << '\n';
         indent_up();
         for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter)
         {
@@ -1603,108 +1727,108 @@
             if( null_coalesce.size() > 0) {
               out << " ?? 0";
             }
-            out << "," << endl;
+            out << "," << '\n';
         }
-        out << indent() << "_ =>  (new ___undefined()).GetHashCode()" << endl;
+        out << indent() << "_ =>  (new ___undefined()).GetHashCode()" << '\n';
         indent_down();
-        out << indent() << "};" << endl;
+        out << indent() << "};" << '\n';
     } else {
-        out << indent() << "switch (Isset)" << endl;
-        out << indent() << "{" << endl;
+        out << indent() << "switch (Isset)" << '\n';
+        out << indent() << "{" << '\n';
         indent_up();
         for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter)
         {
             string null_coalesce(is_nullable_type((*f_iter)->get_type()) ? "?" : "");
-            out << indent() << "case " << (*f_iter)->get_key() << ":" << endl;
+            out << indent() << "case " << (*f_iter)->get_key() << ":" << '\n';
             indent_up();
             out << indent() << "return As_" << (*f_iter)->get_name() << null_coalesce << ".GetHashCode()";
             if( null_coalesce.size() > 0) {
               out << " ?? 0";
             }
-            out << ";" << endl;
+            out << ";" << '\n';
             indent_down();
         }
-        out << indent() << "default:" << endl;
+        out << indent() << "default:" << '\n';
         indent_up();
-        out << indent() << "return (new ___undefined()).GetHashCode();" << endl;
+        out << indent() << "return (new ___undefined()).GetHashCode();" << '\n';
         indent_down();
         indent_down();
-        out << indent() << "}" << endl;
+        out << indent() << "}" << '\n';
     }
     indent_down();
-    out << indent() << "}" << endl << endl;
+    out << indent() << "}" << '\n' << '\n';
 
     if( ! suppress_deepcopy) {
-        out << indent() << "public " << tunion->get_name() << " " << DEEP_COPY_METHOD_NAME << "()" << endl;
-        out << indent() << "{" << endl;
+        out << indent() << "public " << tunion->get_name() << " " << DEEP_COPY_METHOD_NAME << "()" << '\n';
+        out << indent() << "{" << '\n';
         indent_up();
         if(target_net_version >= 6) {
-            out << indent() << "return Isset switch" << endl;
-            out << indent() << "{" << endl;
+            out << indent() << "return Isset switch" << '\n';
+            out << indent() << "{" << '\n';
             indent_up();
             for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter)
             {
                 bool needs_typecast = false;
                 string suffix("");
                 string copy_op = get_deep_copy_method_call((*f_iter)->get_type(), false, needs_typecast, suffix);
-                out << indent() << (*f_iter)->get_key() << " => new " << (*f_iter)->get_name() << "(As_" << (*f_iter)->get_name() << suffix << copy_op << ")," << endl;
+                out << indent() << (*f_iter)->get_key() << " => new " << (*f_iter)->get_name() << "(As_" << (*f_iter)->get_name() << suffix << copy_op << ")," << '\n';
             }
-            out << indent() << "_ => new ___undefined()" << endl;
+            out << indent() << "_ => new ___undefined()" << '\n';
             indent_down();
-            out << indent() << "};" << endl;
+            out << indent() << "};" << '\n';
         } else {
-            out << indent() << "switch (Isset)" << endl;
-            out << indent() << "{" << endl;
+            out << indent() << "switch (Isset)" << '\n';
+            out << indent() << "{" << '\n';
             indent_up();
             for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter)
             {
                 bool needs_typecast = false;
                 string suffix("");
                 string copy_op = get_deep_copy_method_call((*f_iter)->get_type(), false, needs_typecast, suffix);
-                out << indent() << "case " << (*f_iter)->get_key() << ":" << endl;
+                out << indent() << "case " << (*f_iter)->get_key() << ":" << '\n';
                 indent_up();
-                out << indent() << "return new " << (*f_iter)->get_name() << "(As_" << (*f_iter)->get_name() << suffix << copy_op << ");" << endl;
+                out << indent() << "return new " << (*f_iter)->get_name() << "(As_" << (*f_iter)->get_name() << suffix << copy_op << ");" << '\n';
                 indent_down();
             }
-            out << indent() << "default:" << endl;
+            out << indent() << "default:" << '\n';
             indent_up();
-            out << indent() << "return new ___undefined();" << endl;
+            out << indent() << "return new ___undefined();" << '\n';
             indent_down();
             indent_down();
-            out << indent() << "}" << endl;
+            out << indent() << "}" << '\n';
         }
         indent_down();
-        out << indent() << "}" << endl << endl;
+        out << indent() << "}" << '\n' << '\n';
     }
 
-    out << indent() << "public class ___undefined : " << tunion->get_name() << endl;
-    out << indent() << "{" << endl;
+    out << indent() << "public class ___undefined : " << tunion->get_name() << '\n';
+    out << indent() << "{" << '\n';
     indent_up();
 
-    out << indent() << "public override object" << nullable_suffix() <<" Data { get { return null; } }" << endl
-        << indent() << "public ___undefined() : base(0) {}" << endl << endl;
+    out << indent() << "public override object" << nullable_suffix() <<" Data { get { return null; } }" << '\n'
+        << indent() << "public ___undefined() : base(0) {}" << '\n' << '\n';
 
     if( ! suppress_deepcopy) {
-        out << indent() << "public new ___undefined " << DEEP_COPY_METHOD_NAME << "()" << endl;
-        out << indent() << "{" << endl;
+        out << indent() << "public new ___undefined " << DEEP_COPY_METHOD_NAME << "()" << '\n';
+        out << indent() << "{" << '\n';
         indent_up();
-        out << indent() << "return new ___undefined();" << endl;
+        out << indent() << "return new ___undefined();" << '\n';
         indent_down();
-        out << indent() << "}" << endl << endl;
+        out << indent() << "}" << '\n' << '\n';
     }
 
     t_struct undefined_struct(program_,"___undefined");
     generate_netstd_struct_equals(out, &undefined_struct);
     generate_netstd_struct_hashcode(out, &undefined_struct);
 
-    out << indent() << "public override global::System.Threading.Tasks.Task WriteAsync(TProtocol oprot, CancellationToken " << CANCELLATION_TOKEN_NAME << ")" << endl
-        << indent() << "{" << endl;
+    out << indent() << "public override global::System.Threading.Tasks.Task WriteAsync(TProtocol oprot, CancellationToken " << CANCELLATION_TOKEN_NAME << ")" << '\n'
+        << indent() << "{" << '\n';
     indent_up();
-    out << indent() << "throw new TProtocolException( TProtocolException.INVALID_DATA, \"Cannot persist an union type which is not set.\");" << endl;
+    out << indent() << "throw new TProtocolException( TProtocolException.INVALID_DATA, \"Cannot persist an union type which is not set.\");" << '\n';
     indent_down();
-    out << indent() << "}" << endl << endl;
+    out << indent() << "}" << '\n' << '\n';
     indent_down();
-    out << indent() << "}" << endl << endl;
+    out << indent() << "}" << '\n' << '\n';
 
     for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter)
     {
@@ -1714,128 +1838,128 @@
     generate_netstd_union_reader(out, tunion);
 
     indent_down();
-    out << indent() << "}" << endl << endl;
+    out << indent() << "}" << '\n' << '\n';
 
     end_netstd_namespace(out);
 }
 
 void t_netstd_generator::generate_netstd_union_class(ostream& out, t_struct* tunion, t_field* tfield)
 {
-    out << indent() << "public " << type_name(tfield->get_type()) << nullable_field_suffix(tfield) << " As_" << tfield->get_name() << endl;
-    out << indent() << "{" << endl;
+    out << indent() << "public " << type_name(tfield->get_type()) << nullable_field_suffix(tfield) << " As_" << tfield->get_name() << '\n';
+    out << indent() << "{" << '\n';
     indent_up();
-    out << indent() << "get" << endl;
-    out << indent() << "{" << endl;
+    out << indent() << "get" << '\n';
+    out << indent() << "{" << '\n';
     indent_up();
     out << indent() << "return (" << tfield->get_key() << " == Isset) && (Data != null)"
         << " ? (" << type_name(tfield->get_type()) << nullable_field_suffix(tfield) << ")Data"
         << " : default"
         << (target_net_version >= 6 ? "" : ("(" + type_name(tfield->get_type()) + ")"))
-        << ";" << endl;
+        << ";" << '\n';
     indent_down();
-    out << indent() << "}" << endl;
+    out << indent() << "}" << '\n';
     indent_down();
-    out << indent() << "}" << endl
-        << endl;
+    out << indent() << "}" << '\n'
+        << '\n';
 
 
-    out << indent() << "public class " << normalize_name(tfield->get_name()) << " : " << normalize_name(tunion->get_name()) << endl;
-    out << indent() << "{" << endl;
+    out << indent() << "public class " << normalize_name(tfield->get_name()) << " : " << normalize_name(tunion->get_name()) << '\n';
+    out << indent() << "{" << '\n';
     indent_up();
 
-    out << indent() << "private readonly " << type_name(tfield->get_type()) << " _data;" << endl
-        << indent() << "public override object" << nullable_suffix() <<" Data { get { return _data; } }" << endl
-        << indent() << "public " << normalize_name(tfield->get_name()) << "(" << type_name(tfield->get_type()) << " data) : base("<< tfield->get_key() <<")" << endl
-        << indent() << "{" << endl;
+    out << indent() << "private readonly " << type_name(tfield->get_type()) << " _data;" << '\n'
+        << indent() << "public override object" << nullable_suffix() <<" Data { get { return _data; } }" << '\n'
+        << indent() << "public " << normalize_name(tfield->get_name()) << "(" << type_name(tfield->get_type()) << " data) : base("<< tfield->get_key() <<")" << '\n'
+        << indent() << "{" << '\n';
     indent_up();
-    out << indent() << "this._data = data;" << endl;
+    out << indent() << "this._data = data;" << '\n';
     indent_down();
-    out << indent() << "}" << endl;
+    out << indent() << "}" << '\n';
 
     if( ! suppress_deepcopy) {
-        out << indent() << "public new " << normalize_name(tfield->get_name()) << " " << DEEP_COPY_METHOD_NAME << "()" << endl;
-        out << indent() << "{" << endl;
+        out << indent() << "public new " << normalize_name(tfield->get_name()) << " " << DEEP_COPY_METHOD_NAME << "()" << '\n';
+        out << indent() << "{" << '\n';
         indent_up();
         bool needs_typecast = false;
         string suffix("");
         string copy_op = get_deep_copy_method_call(tfield->get_type(), true, needs_typecast, suffix);
-        out << indent() << "return new " << normalize_name(tfield->get_name()) << "(_data" << copy_op << ");" << endl;
+        out << indent() << "return new " << normalize_name(tfield->get_name()) << "(_data" << copy_op << ");" << '\n';
         indent_down();
-        out << indent() << "}" << endl << endl;
+        out << indent() << "}" << '\n' << '\n';
     }
 
-    out << indent() << "public override bool Equals(object" << nullable_suffix() << " that)" << endl;
-    out << indent() << "{" << endl;
+    out << indent() << "public override bool Equals(object" << nullable_suffix() << " that)" << '\n';
+    out << indent() << "{" << '\n';
     indent_up();
     if(target_net_version >= 6) {
-        out << indent() << "if (that is not " << tunion->get_name() << " other) return false;" << endl;
+        out << indent() << "if (that is not " << tunion->get_name() << " other) return false;" << '\n';
     } else {
-        out << indent() << "if (!(that is " << tunion->get_name() << " other)) return false;" << endl;
+        out << indent() << "if (!(that is " << tunion->get_name() << " other)) return false;" << '\n';
     }
-    out << indent() << "if (ReferenceEquals(this, other)) return true;" << endl;
-    out << endl;
-    out << indent() << "return Equals( _data, other.As_" << tfield->get_name() << ");" << endl;
+    out << indent() << "if (ReferenceEquals(this, other)) return true;" << '\n';
+    out << '\n';
+    out << indent() << "return Equals( _data, other.As_" << tfield->get_name() << ");" << '\n';
     indent_down();
-    out << indent() << "}" << endl << endl;
+    out << indent() << "}" << '\n' << '\n';
 
-    out << indent() << "public override int GetHashCode()" << endl;
-    out << indent() << "{" << endl;
+    out << indent() << "public override int GetHashCode()" << '\n';
+    out << indent() << "{" << '\n';
     indent_up();
-    out << indent() << "return _data.GetHashCode();" << endl;
+    out << indent() << "return _data.GetHashCode();" << '\n';
     indent_down();
-    out << indent() << "}" << endl << endl;
+    out << indent() << "}" << '\n' << '\n';
 
-    out << indent() << "public override async global::System.Threading.Tasks.Task WriteAsync(TProtocol oprot, CancellationToken " << CANCELLATION_TOKEN_NAME << ") {" << endl;
+    out << indent() << "public override async global::System.Threading.Tasks.Task WriteAsync(TProtocol oprot, CancellationToken " << CANCELLATION_TOKEN_NAME << ") {" << '\n';
     indent_up();
 
-    out << indent() << "oprot.IncrementRecursionDepth();" << endl
-        << indent() << "try" << endl
-        << indent() << "{" << endl;
+    out << indent() << "oprot.IncrementRecursionDepth();" << '\n'
+        << indent() << "try" << '\n'
+        << indent() << "{" << '\n';
     indent_up();
 
-    out << indent() << "var struc = new TStruct(\"" << tunion->get_name() << "\");" << endl
-        << indent() << "await oprot.WriteStructBeginAsync(struc, " << CANCELLATION_TOKEN_NAME << ");" << endl;
+    out << indent() << "var struc = new TStruct(\"" << tunion->get_name() << "\");" << '\n'
+        << indent() << "await oprot.WriteStructBeginAsync(struc, " << CANCELLATION_TOKEN_NAME << ");" << '\n';
 
-    out << indent() << "var field = new TField()" << endl;
-    out << indent() << "{" << endl;
+    out << indent() << "var field = new TField()" << '\n';
+    out << indent() << "{" << '\n';
     indent_up();
-    out << indent() << "Name = \"" << tfield->get_name() << "\"," << endl
-        << indent() << "Type = " << type_to_enum(tfield->get_type()) << "," << endl
-        << indent() << "ID = " << tfield->get_key() << endl;
+    out << indent() << "Name = \"" << tfield->get_name() << "\"," << '\n'
+        << indent() << "Type = " << type_to_enum(tfield->get_type()) << "," << '\n'
+        << indent() << "ID = " << tfield->get_key() << '\n';
     indent_down();
-    out << indent() << "};" << endl;
-    out << indent() << "await oprot.WriteFieldBeginAsync(field, " << CANCELLATION_TOKEN_NAME << ");" << endl;
+    out << indent() << "};" << '\n';
+    out << indent() << "await oprot.WriteFieldBeginAsync(field, " << CANCELLATION_TOKEN_NAME << ");" << '\n';
 
     generate_serialize_field(out, tfield, "_data", true, false);
 
-    out << indent() << "await oprot.WriteFieldEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << endl
-        << indent() << "await oprot.WriteFieldStopAsync(" << CANCELLATION_TOKEN_NAME << ");" << endl
-        << indent() << "await oprot.WriteStructEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << endl;
+    out << indent() << "await oprot.WriteFieldEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << '\n'
+        << indent() << "await oprot.WriteFieldStopAsync(" << CANCELLATION_TOKEN_NAME << ");" << '\n'
+        << indent() << "await oprot.WriteStructEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << '\n';
     indent_down();
-    out << indent() << "}" << endl
-        << indent() << "finally" << endl
-        << indent() << "{" << endl;
+    out << indent() << "}" << '\n'
+        << indent() << "finally" << '\n'
+        << indent() << "{" << '\n';
     indent_up();
-    out << indent() << "oprot.DecrementRecursionDepth();" << endl;
+    out << indent() << "oprot.DecrementRecursionDepth();" << '\n';
     indent_down();
-    out << indent() << "}" << endl;
+    out << indent() << "}" << '\n';
     indent_down();
-    out << indent() << "}" << endl;
+    out << indent() << "}" << '\n';
     indent_down();
-    out << indent() << "}" << endl << endl;
+    out << indent() << "}" << '\n' << '\n';
 }
 
 void t_netstd_generator::generate_netstd_struct_equals(ostream& out, t_struct* tstruct)
 {
-    out << indent() << "public override bool Equals(object" << nullable_suffix() << " that)" << endl
-        << indent() << "{" << endl;
+    out << indent() << "public override bool Equals(object" << nullable_suffix() << " that)" << '\n'
+        << indent() << "{" << '\n';
     indent_up();
     if(target_net_version >= 6) {
-        out << indent() << "if (that is not " << type_name(tstruct,false) << " other) return false;" << endl;
+        out << indent() << "if (that is not " << type_name(tstruct,false) << " other) return false;" << '\n';
     } else {
-        out << indent() << "if (!(that is " << type_name(tstruct,false) << " other)) return false;" << endl;
+        out << indent() << "if (!(that is " << type_name(tstruct,false) << " other)) return false;" << '\n';
     }
-    out << indent() << "if (ReferenceEquals(this, other)) return true;" << endl;
+    out << indent() << "if (ReferenceEquals(this, other)) return true;" << '\n';
 
 
     const vector<t_field*>& fields = tstruct->get_members();
@@ -1853,7 +1977,7 @@
         }
         else
         {
-            out << endl;
+            out << '\n';
             out << indent() << "&& ";
         }
         if (!field_is_required((*f_iter)))
@@ -1879,25 +2003,25 @@
     }
     if (first)
     {
-        out << indent() << "return true;" << endl;
+        out << indent() << "return true;" << '\n';
     }
     else
     {
-        out << ";" << endl;
+        out << ";" << '\n';
         indent_down();
     }
 
     indent_down();
-    out << indent() << "}" << endl << endl;
+    out << indent() << "}" << '\n' << '\n';
 }
 
 void t_netstd_generator::generate_netstd_struct_hashcode(ostream& out, t_struct* tstruct)
 {
-    out << indent() << "public override int GetHashCode() {" << endl;
+    out << indent() << "public override int GetHashCode() {" << '\n';
     indent_up();
 
-    out << indent() << "int hashcode = 157;" << endl;
-    out << indent() << "unchecked {" << endl;
+    out << indent() << "int hashcode = 157;" << '\n';
+    out << indent() << "unchecked {" << '\n';
     indent_up();
 
     const vector<t_field*>& fields = tstruct->get_members();
@@ -1915,17 +2039,17 @@
         else {
             out << prop_name(*f_iter) << ".GetHashCode()";
         }
-        out << ";" << endl;
+        out << ";" << '\n';
 
         generate_null_check_end(out, *f_iter);
     }
 
     indent_down();
-    out << indent() << "}" << endl;
-    out << indent() << "return hashcode;" << endl;
+    out << indent() << "}" << '\n';
+    out << indent() << "return hashcode;" << '\n';
 
     indent_down();
-    out << indent() << "}" << endl << endl;
+    out << indent() << "}" << '\n' << '\n';
 }
 
 void t_netstd_generator::generate_service(t_service* tservice)
@@ -1937,13 +2061,13 @@
     f_service.open(f_service_name.c_str());
 
     reset_indent();
-    f_service << autogen_comment() << netstd_type_usings() << netstd_thrift_usings() << endl << endl;
+    f_service << autogen_comment() << netstd_type_usings() << netstd_thrift_usings() << '\n' << '\n';
 
     pragmas_and_directives(f_service);
     start_netstd_namespace(f_service);
 
-    f_service << indent() << "public partial class " << normalize_name(service_name_) << endl
-              << indent() << "{" << endl;
+    f_service << indent() << "public partial class " << normalize_name(service_name_) << '\n'
+              << indent() << "{" << '\n';
     indent_up();
 
     generate_service_interface(f_service, tservice);
@@ -1952,7 +2076,7 @@
     generate_service_helpers(f_service, tservice);
 
     indent_down();
-    f_service << indent() << "}" << endl;
+    f_service << indent() << "}" << '\n';
 
     end_netstd_namespace(f_service);
     f_service.close();
@@ -1970,18 +2094,19 @@
         extends_iface = " : " + extends + ".IAsync";
     }
 
-    //out << endl << endl;
+    //out << '\n' << '\n';
 
     generate_netstd_doc(out, tservice);
 
     if (is_wcf_enabled())
     {
-        out << indent() << "[ServiceContract(Namespace=\"" << wcf_namespace_ << "\")]" << endl;
+        out << indent() << "[ServiceContract(Namespace=\"" << wcf_namespace_ << "\")]" << '\n';
     }
 
+    generate_deprecation_attribute(out, tservice->annotations_);
     prepare_member_name_mapping(tservice);
-    out << indent() << "public interface IAsync" << extends_iface << endl
-        << indent() << "{" << endl;
+    out << indent() << "public interface IAsync" << extends_iface << '\n'
+        << indent() << "{" << '\n';
 
     indent_up();
     vector<t_function*> functions = tservice->get_functions();
@@ -1993,34 +2118,42 @@
         // if we're using WCF, add the corresponding attributes
         if (is_wcf_enabled())
         {
-            out << indent() << "[OperationContract]" << endl;
+            out << indent() << "[OperationContract]" << '\n';
 
             const 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)
             {
-                out << indent() << "[FaultContract(typeof(" + type_name((*x_iter)->get_type()) + "Fault))]" << endl;
+                out << indent() << "[FaultContract(typeof(" + type_name((*x_iter)->get_type()) + "Fault))]" << '\n';
             }
         }
 
-        generate_deprecation_attribute(out, *f_iter);
-        out << indent() << function_signature_async(*f_iter) << ";" << endl << endl;
+        generate_deprecation_attribute(out, (*f_iter)->annotations_);
+        out << indent() << function_signature_async(*f_iter) << ";" << '\n' << '\n';
     }
     indent_down();
-    out << indent() << "}" << endl << endl;
+    out << indent() << "}" << '\n' << '\n';
     cleanup_member_name_mapping(tservice);
 }
 
-void t_netstd_generator::generate_deprecation_attribute(ostream& out, t_function* func)
+bool t_netstd_generator::is_deprecated(std::map<std::string, std::vector<std::string>>& annotations)
 {
-  auto iter = func->annotations_.find("deprecated");
-  if( func->annotations_.end() != iter) {
+  auto iter = annotations.find("deprecated");
+  return (annotations.end() != iter);
+}
+
+void t_netstd_generator::generate_deprecation_attribute(ostream& out, std::map<std::string, std::vector<std::string>>& annotations)
+{
+  auto iter = annotations.find("deprecated");
+  if( annotations.end() != iter) {
     out << indent() << "[Obsolete";
     // empty annotation values end up with "1" somewhere, ignore these as well
     if ((iter->second.back().length() > 0) && (iter->second.back() != "1")) {
       out << "(" << make_csharp_string_literal(iter->second.back()) << ")";
+    } else {
+      out << "(" << make_csharp_string_literal("This code is deprecated.") << ")";  // generic message to prevent CA1041
     }
-    out << "]" << endl;
+    out << "]" << '\n';
   }
 }
 
@@ -2030,8 +2163,8 @@
     vector<t_function*>::iterator f_iter;
 
     prepare_member_name_mapping(tservice);
-    out << indent() << "public class InternalStructs" << endl;
-    out << indent() << "{" << endl;
+    out << indent() << "public class InternalStructs" << '\n';
+    out << indent() << "{" << '\n';
     indent_up();
 
     for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter)
@@ -2043,7 +2176,7 @@
     }
 
     indent_down();
-    out << indent() << "}" << endl << endl;
+    out << indent() << "}" << '\n' << '\n';
     cleanup_member_name_mapping(tservice);
 }
 
@@ -2061,22 +2194,23 @@
         extends_client = "TBaseClient, IDisposable, ";
     }
 
-    out << endl;
+    out << '\n';
 
     generate_netstd_doc(out, tservice);
+    generate_deprecation_attribute(out, tservice->annotations_);
     prepare_member_name_mapping(tservice);
-    out << indent() << "public class Client : " << extends_client << "IAsync" << endl
-        << indent() << "{" << endl;
+    out << indent() << "public class Client : " << extends_client << "IAsync" << '\n'
+        << indent() << "{" << '\n';
     indent_up();
 
-    out << indent() << "public Client(TProtocol protocol) : this(protocol, protocol)" << endl
-        << indent() << "{" << endl
-        << indent() << "}" << endl
-        << endl
-        << indent() << "public Client(TProtocol inputProtocol, TProtocol outputProtocol) : base(inputProtocol, outputProtocol)" << endl
-        << indent() << "{" << endl
-        << indent() << "}" << endl
-        << endl;
+    out << indent() << "public Client(TProtocol protocol) : this(protocol, protocol)" << '\n'
+        << indent() << "{" << '\n'
+        << indent() << "}" << '\n'
+        << '\n'
+        << indent() << "public Client(TProtocol inputProtocol, TProtocol outputProtocol) : base(inputProtocol, outputProtocol)" << '\n'
+        << indent() << "{" << '\n'
+        << indent() << "}" << '\n'
+        << '\n';
 
     vector<t_function*> functions = tservice->get_functions();
     vector<t_function*>::const_iterator functions_iterator;
@@ -2087,27 +2221,27 @@
         string function_name = raw_func_name + (add_async_postfix ? "Async" : "");
 
         // async
-        generate_deprecation_attribute(out, *functions_iterator);
-        out << indent() << "public async " << function_signature_async(*functions_iterator, "") << endl
-            << indent() << "{" << endl;
+        generate_deprecation_attribute(out, (*functions_iterator)->annotations_);
+        out << indent() << "public async " << function_signature_async(*functions_iterator, "") << '\n'
+            << indent() << "{" << '\n';
         indent_up();
         out << indent() << "await send_" << function_name << "(";
         string call_args = argument_list((*functions_iterator)->get_arglist(),false);
         if(! call_args.empty()) {
             out << call_args << ", ";
         }
-        out << CANCELLATION_TOKEN_NAME << ");" << endl;
+        out << CANCELLATION_TOKEN_NAME << ");" << '\n';
         if(! (*functions_iterator)->is_oneway()) {
             out << indent() << ((*functions_iterator)->get_returntype()->is_void() ? "" : "return ")
-                            << "await recv_" << function_name << "(" << CANCELLATION_TOKEN_NAME << ");" << endl;
+                            << "await recv_" << function_name << "(" << CANCELLATION_TOKEN_NAME << ");" << '\n';
         }
         indent_down();
-        out << indent() << "}" << endl << endl;
+        out << indent() << "}" << '\n' << '\n';
 
         // async send
-        generate_deprecation_attribute(out, *functions_iterator);
-        out << indent() << "public async " << function_signature_async(*functions_iterator, "send_", MODE_NO_RETURN) << endl
-            << indent() << "{" << endl;
+        generate_deprecation_attribute(out, (*functions_iterator)->annotations_);
+        out << indent() << "public async " << function_signature_async(*functions_iterator, "send_", MODE_NO_RETURN) << '\n'
+            << indent() << "{" << '\n';
         indent_up();
 
         string tmpvar = tmp("tmp");
@@ -2115,9 +2249,9 @@
 
         out << indent() << "await OutputProtocol.WriteMessageBeginAsync(new TMessage(\"" << raw_func_name
             << "\", TMessageType." << ((*functions_iterator)->is_oneway() ? "Oneway" : "Call")
-            << ", SeqId), " << CANCELLATION_TOKEN_NAME << ");" << endl
-            << indent() << endl
-            << indent() << "var " << tmpvar << " = new InternalStructs." << argsname << "() {" << endl;
+            << ", SeqId), " << CANCELLATION_TOKEN_NAME << ");" << '\n'
+            << indent() << '\n'
+            << indent() << "var " << tmpvar << " = new InternalStructs." << argsname << "() {" << '\n';
         indent_up();
 
         t_struct* arg_struct = (*functions_iterator)->get_arglist();
@@ -2128,27 +2262,27 @@
 
         for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter)
         {
-            out << indent() << prop_name(*fld_iter) << " = " << normalize_name((*fld_iter)->get_name(),true) << "," << endl;
+            out << indent() << prop_name(*fld_iter) << " = " << normalize_name((*fld_iter)->get_name(),true) << "," << '\n';
         }
 
         indent_down();
-        out << indent() << "};" << endl;
+        out << indent() << "};" << '\n';
 
 
-        out << indent() << endl
-            << indent() << "await " << tmpvar << ".WriteAsync(OutputProtocol, " << CANCELLATION_TOKEN_NAME << ");" << endl
-            << indent() << "await OutputProtocol.WriteMessageEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << endl
-            << indent() << "await OutputProtocol.Transport.FlushAsync(" << CANCELLATION_TOKEN_NAME << ");" << endl;
+        out << indent() << '\n'
+            << indent() << "await " << tmpvar << ".WriteAsync(OutputProtocol, " << CANCELLATION_TOKEN_NAME << ");" << '\n'
+            << indent() << "await OutputProtocol.WriteMessageEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << '\n'
+            << indent() << "await OutputProtocol.Transport.FlushAsync(" << CANCELLATION_TOKEN_NAME << ");" << '\n';
 
         indent_down();
-        out << indent() << "}" << endl << endl;
+        out << indent() << "}" << '\n' << '\n';
 
         if (!(*functions_iterator)->is_oneway())
         {
             // async recv
-            generate_deprecation_attribute(out, *functions_iterator);
-            out << indent() << "public async " << function_signature_async(*functions_iterator, "recv_", MODE_NO_ARGS) << endl
-                << indent() << "{" << endl;
+            generate_deprecation_attribute(out, (*functions_iterator)->annotations_);
+            out << indent() << "public async " << function_signature_async(*functions_iterator, "recv_", MODE_NO_ARGS) << '\n'
+                << indent() << "{" << '\n';
             indent_up();
 
             string resultname = (*functions_iterator)->get_name() + "_result";
@@ -2158,64 +2292,64 @@
             prepare_member_name_mapping(xs, xs->get_members(), resultname);
 
             tmpvar = tmp("tmp");
-            out << indent() << endl
-                << indent() << "var " << tmpvar << " = await InputProtocol.ReadMessageBeginAsync(" << CANCELLATION_TOKEN_NAME << ");" << endl
-                << indent() << "if (" << tmpvar << ".Type == TMessageType.Exception)" << endl
-                << indent() << "{" << endl;
+            out << indent() << '\n'
+                << indent() << "var " << tmpvar << " = await InputProtocol.ReadMessageBeginAsync(" << CANCELLATION_TOKEN_NAME << ");" << '\n'
+                << indent() << "if (" << tmpvar << ".Type == TMessageType.Exception)" << '\n'
+                << indent() << "{" << '\n';
             indent_up();
 
             tmpvar = tmp("tmp");
-            out << indent() << "var " << tmpvar << " = await TApplicationException.ReadAsync(InputProtocol, " << CANCELLATION_TOKEN_NAME << ");" << endl
-                << indent() << "await InputProtocol.ReadMessageEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << endl
-                << indent() << "throw " << tmpvar << ";" << endl;
+            out << indent() << "var " << tmpvar << " = await TApplicationException.ReadAsync(InputProtocol, " << CANCELLATION_TOKEN_NAME << ");" << '\n'
+                << indent() << "await InputProtocol.ReadMessageEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << '\n'
+                << indent() << "throw " << tmpvar << ";" << '\n';
             indent_down();
 
             tmpvar = tmp("tmp");
-            out << indent() << "}" << endl
-                << endl
-                << indent() << "var " << tmpvar << " = new InternalStructs." << resultname << "();" << endl
-                << indent() << "await " << tmpvar << ".ReadAsync(InputProtocol, " << CANCELLATION_TOKEN_NAME << ");" << endl
-                << indent() << "await InputProtocol.ReadMessageEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << endl;
+            out << indent() << "}" << '\n'
+                << '\n'
+                << indent() << "var " << tmpvar << " = new InternalStructs." << resultname << "();" << '\n'
+                << indent() << "await " << tmpvar << ".ReadAsync(InputProtocol, " << CANCELLATION_TOKEN_NAME << ");" << '\n'
+                << indent() << "await InputProtocol.ReadMessageEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << '\n';
 
             if (!(*functions_iterator)->get_returntype()->is_void())
             {
-                out << indent() << "if (" << tmpvar << ".__isset.success)" << endl
-                    << indent() << "{" << endl;
+                out << indent() << "if (" << tmpvar << ".__isset.success)" << '\n'
+                    << indent() << "{" << '\n';
                 indent_up();
                 string nullable_value = nullable_value_access((*functions_iterator)->get_returntype());
-                out << indent() << "return " << tmpvar << ".Success" << nullable_value << ";" << endl;
+                out << indent() << "return " << tmpvar << ".Success" << nullable_value << ";" << '\n';
                 indent_down();
-                out << indent() << "}" << endl;
+                out << indent() << "}" << '\n';
             }
 
             const 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)
             {
-                out << indent() << "if (" << tmpvar << ".__isset." << get_isset_name(normalize_name((*x_iter)->get_name())) << ")" << endl
-                    << indent() << "{" << endl;
+                out << indent() << "if (" << tmpvar << ".__isset." << get_isset_name(normalize_name((*x_iter)->get_name())) << ")" << '\n'
+                    << indent() << "{" << '\n';
                 indent_up();
-                out << indent() << "throw " << tmpvar << "." << prop_name(*x_iter) << nullable_value_access((*x_iter)->get_type()) << ";" << endl;
+                out << indent() << "throw " << tmpvar << "." << prop_name(*x_iter) << nullable_value_access((*x_iter)->get_type()) << ";" << '\n';
                 indent_down();
-                out << indent() << "}" << endl;
+                out << indent() << "}" << '\n';
             }
 
             if (!(*functions_iterator)->get_returntype()->is_void())
             {
                 out << indent() << "throw new TApplicationException(TApplicationException.ExceptionType.MissingResult, \""
-                    << function_name << " failed: unknown result\");" << endl;
+                    << function_name << " failed: unknown result\");" << '\n';
             }
 
             cleanup_member_name_mapping(xs);
             indent_down();
-            out << indent() << "}" << endl << endl;
+            out << indent() << "}" << '\n' << '\n';
         }
 
         cleanup_member_name_mapping(arg_struct);
     }
 
     indent_down();
-    out << indent() << "}" << endl << endl;
+    out << indent() << "}" << '\n' << '\n';
     cleanup_member_name_mapping(tservice);
 }
 
@@ -2233,14 +2367,14 @@
     }
 
     prepare_member_name_mapping(tservice);
-    out << indent() << "public class AsyncProcessor : " << extends_processor << "ITAsyncProcessor" << endl
-        << indent() << "{" << endl;
+    out << indent() << "public class AsyncProcessor : " << extends_processor << "ITAsyncProcessor" << '\n'
+        << indent() << "{" << '\n';
 
     indent_up();
 
-    out << indent() << "private readonly IAsync _iAsync;" << endl
-        << indent() << "private readonly ILogger<AsyncProcessor>" << nullable_suffix() << " _logger;" << endl
-        << endl
+    out << indent() << "private readonly IAsync _iAsync;" << '\n'
+        << indent() << "private readonly ILogger<AsyncProcessor>" << nullable_suffix() << " _logger;" << '\n'
+        << '\n'
         << indent() << "public AsyncProcessor(IAsync iAsync, ILogger<AsyncProcessor>" << nullable_suffix() << " logger = default)";
 
     if (!extends.empty())
@@ -2248,101 +2382,101 @@
         out << " : base(iAsync)";
     }
 
-    out << endl
-        << indent() << "{" << endl;
+    out << '\n'
+        << indent() << "{" << '\n';
     indent_up();
 
-    out << indent() << "_iAsync = iAsync ?? throw new ArgumentNullException(nameof(iAsync));" << endl;
-    out << indent() << "_logger = logger;" << endl;
+    out << indent() << "_iAsync = iAsync ?? throw new ArgumentNullException(nameof(iAsync));" << '\n';
+    out << indent() << "_logger = logger;" << '\n';
     for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter)
     {
         string raw_func_name = (*f_iter)->get_name();
-        out << indent() << "processMap_[\"" << raw_func_name << "\"] = " << raw_func_name << "_ProcessAsync;" << endl;
+        out << indent() << "processMap_[\"" << raw_func_name << "\"] = " << raw_func_name << "_ProcessAsync;" << '\n';
     }
 
     indent_down();
-    out << indent() << "}" << endl
-        << endl;
+    out << indent() << "}" << '\n'
+        << '\n';
 
     if (extends.empty())
     {
-        out << indent() << "protected delegate global::System.Threading.Tasks.Task ProcessFunction(int seqid, TProtocol iprot, TProtocol oprot, CancellationToken " << CANCELLATION_TOKEN_NAME << ");" << endl;
+        out << indent() << "protected delegate global::System.Threading.Tasks.Task ProcessFunction(int seqid, TProtocol iprot, TProtocol oprot, CancellationToken " << CANCELLATION_TOKEN_NAME << ");" << '\n';
     }
 
     if (extends.empty())
     {
         out << indent() << "protected Dictionary<string, ProcessFunction> processMap_ = ";
         if(target_net_version >= 8) {
-          out << "[];" << endl;
+          out << "[];" << '\n';
         } else if(target_net_version >= 6) {
-          out << "new();" << endl;
+          out << "new();" << '\n';
         } else {
-          out << "new Dictionary<string, ProcessFunction>();" << endl;
+          out << "new Dictionary<string, ProcessFunction>();" << '\n';
         }
     }
 
-    out << endl;
+    out << '\n';
 
     if (extends.empty())
     {
-        out << indent() << "public async Task<bool> ProcessAsync(TProtocol iprot, TProtocol oprot)" << endl
-            << indent() << "{" << endl;
+        out << indent() << "public async Task<bool> ProcessAsync(TProtocol iprot, TProtocol oprot)" << '\n'
+            << indent() << "{" << '\n';
         indent_up();
-        out << indent() << "return await ProcessAsync(iprot, oprot, CancellationToken.None);" << endl;
+        out << indent() << "return await ProcessAsync(iprot, oprot, CancellationToken.None);" << '\n';
         indent_down();
-        out << indent() << "}" << endl << endl;
+        out << indent() << "}" << '\n' << '\n';
 
-        out << indent() << "public async Task<bool> ProcessAsync(TProtocol iprot, TProtocol oprot, CancellationToken " << CANCELLATION_TOKEN_NAME << ")" << endl;
+        out << indent() << "public async Task<bool> ProcessAsync(TProtocol iprot, TProtocol oprot, CancellationToken " << CANCELLATION_TOKEN_NAME << ")" << '\n';
     }
     else
     {
-        out << indent() << "public new async Task<bool> ProcessAsync(TProtocol iprot, TProtocol oprot)" << endl
-            << indent() << "{" << endl;
+        out << indent() << "public new async Task<bool> ProcessAsync(TProtocol iprot, TProtocol oprot)" << '\n'
+            << indent() << "{" << '\n';
         indent_up();
-        out << indent() << "return await ProcessAsync(iprot, oprot, CancellationToken.None);" << endl;
+        out << indent() << "return await ProcessAsync(iprot, oprot, CancellationToken.None);" << '\n';
         indent_down();
-        out << indent() << "}" << endl << endl;
+        out << indent() << "}" << '\n' << '\n';
 
-        out << indent() << "public new async Task<bool> ProcessAsync(TProtocol iprot, TProtocol oprot, CancellationToken " << CANCELLATION_TOKEN_NAME << ")" << endl;
+        out << indent() << "public new async Task<bool> ProcessAsync(TProtocol iprot, TProtocol oprot, CancellationToken " << CANCELLATION_TOKEN_NAME << ")" << '\n';
     }
 
-    out << indent() << "{" << endl;
+    out << indent() << "{" << '\n';
     indent_up();
-    out << indent() << "try" << endl
-        << indent() << "{" << endl;
+    out << indent() << "try" << '\n'
+        << indent() << "{" << '\n';
     indent_up();
-    out << indent() << "var msg = await iprot.ReadMessageBeginAsync(" << CANCELLATION_TOKEN_NAME << ");" << endl
-        << endl
-        << indent() << "processMap_.TryGetValue(msg.Name, out var fn);" << endl
-        << endl
-        << indent() << "if (fn == null)" << endl
-        << indent() << "{" << endl;
+    out << indent() << "var msg = await iprot.ReadMessageBeginAsync(" << CANCELLATION_TOKEN_NAME << ");" << '\n'
+        << '\n'
+        << indent() << "processMap_.TryGetValue(msg.Name, out var fn);" << '\n'
+        << '\n'
+        << indent() << "if (fn == null)" << '\n'
+        << indent() << "{" << '\n';
     indent_up();
-    out << indent() << "await TProtocolUtil.SkipAsync(iprot, TType.Struct, " << CANCELLATION_TOKEN_NAME << ");" << endl
-        << indent() << "await iprot.ReadMessageEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << endl
-        << indent() << "var x = new TApplicationException (TApplicationException.ExceptionType.UnknownMethod, \"Invalid method name: '\" + msg.Name + \"'\");" << endl
-        << indent() << "await oprot.WriteMessageBeginAsync(new TMessage(msg.Name, TMessageType.Exception, msg.SeqID), " << CANCELLATION_TOKEN_NAME << ");" << endl
-        << indent() << "await x.WriteAsync(oprot, " << CANCELLATION_TOKEN_NAME << ");" << endl
-        << indent() << "await oprot.WriteMessageEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << endl
-        << indent() << "await oprot.Transport.FlushAsync(" << CANCELLATION_TOKEN_NAME << ");" << endl
-        << indent() << "return true;" << endl;
+    out << indent() << "await TProtocolUtil.SkipAsync(iprot, TType.Struct, " << CANCELLATION_TOKEN_NAME << ");" << '\n'
+        << indent() << "await iprot.ReadMessageEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << '\n'
+        << indent() << "var x = new TApplicationException (TApplicationException.ExceptionType.UnknownMethod, \"Invalid method name: '\" + msg.Name + \"'\");" << '\n'
+        << indent() << "await oprot.WriteMessageBeginAsync(new TMessage(msg.Name, TMessageType.Exception, msg.SeqID), " << CANCELLATION_TOKEN_NAME << ");" << '\n'
+        << indent() << "await x.WriteAsync(oprot, " << CANCELLATION_TOKEN_NAME << ");" << '\n'
+        << indent() << "await oprot.WriteMessageEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << '\n'
+        << indent() << "await oprot.Transport.FlushAsync(" << CANCELLATION_TOKEN_NAME << ");" << '\n'
+        << indent() << "return true;" << '\n';
     indent_down();
-    out << indent() << "}" << endl
-        << endl
-        << indent() << "await fn(msg.SeqID, iprot, oprot, " << CANCELLATION_TOKEN_NAME << ");" << endl
-        << endl;
+    out << indent() << "}" << '\n'
+        << '\n'
+        << indent() << "await fn(msg.SeqID, iprot, oprot, " << CANCELLATION_TOKEN_NAME << ");" << '\n'
+        << '\n';
     indent_down();
-    out << indent() << "}" << endl;
-    out << indent() << "catch (IOException)" << endl
-        << indent() << "{" << endl;
+    out << indent() << "}" << '\n';
+    out << indent() << "catch (IOException)" << '\n'
+        << indent() << "{" << '\n';
     indent_up();
-    out << indent() << "return false;" << endl;
+    out << indent() << "return false;" << '\n';
     indent_down();
-    out << indent() << "}" << endl
-        << endl
-        << indent() << "return true;" << endl;
+    out << indent() << "}" << '\n'
+        << '\n'
+        << indent() << "return true;" << '\n';
     indent_down();
-    out << indent() << "}" << endl << endl;
+    out << indent() << "}" << '\n' << '\n';
 
     for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter)
     {
@@ -2350,7 +2484,7 @@
     }
 
     indent_down();
-    out << indent() << "}" << endl << endl;
+    out << indent() << "}" << '\n' << '\n';
     cleanup_member_name_mapping(tservice);
 }
 
@@ -2384,26 +2518,26 @@
 {
     (void)tservice;
     out << indent() << "public async global::System.Threading.Tasks.Task " << tfunction->get_name()
-        << "_ProcessAsync(int seqid, TProtocol iprot, TProtocol oprot, CancellationToken " << CANCELLATION_TOKEN_NAME << ")" << endl
-        << indent() << "{" << endl;
+        << "_ProcessAsync(int seqid, TProtocol iprot, TProtocol oprot, CancellationToken " << CANCELLATION_TOKEN_NAME << ")" << '\n'
+        << indent() << "{" << '\n';
     indent_up();
 
     string argsname = tfunction->get_name() + "_args";
     string resultname = tfunction->get_name() + "_result";
 
     string args = tmp("tmp");
-    out << indent() << "var " << args << " = new InternalStructs." << argsname << "();" << endl
-        << indent() << "await " << args << ".ReadAsync(iprot, " << CANCELLATION_TOKEN_NAME << ");" << endl
-        << indent() << "await iprot.ReadMessageEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << endl;
+    out << indent() << "var " << args << " = new InternalStructs." << argsname << "();" << '\n'
+        << indent() << "await " << args << ".ReadAsync(iprot, " << CANCELLATION_TOKEN_NAME << ");" << '\n'
+        << indent() << "await iprot.ReadMessageEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << '\n';
 
     string tmpResult = tmp("tmp");
     if (!tfunction->is_oneway())
     {
-        out << indent() << "var " << tmpResult << " = new InternalStructs." << resultname << "();" << endl;
+        out << indent() << "var " << tmpResult << " = new InternalStructs." << resultname << "();" << '\n';
     }
 
-    out << indent() << "try" << endl
-        << indent() << "{" << endl;
+    out << indent() << "try" << '\n'
+        << indent() << "{" << '\n';
     indent_up();
 
     t_struct* xs = tfunction->get_xceptions();
@@ -2411,8 +2545,8 @@
 
     if (xceptions.size() > 0)
     {
-        out << indent() << "try" << endl
-            << indent() << "{" << endl;
+        out << indent() << "try" << '\n'
+            << indent() << "{" << '\n';
         indent_up();
     }
 
@@ -2420,9 +2554,8 @@
     const vector<t_field*>& fields = arg_struct->get_members();
     vector<t_field*>::const_iterator f_iter;
 
-    bool is_deprecated = (tfunction->annotations_.end() != tfunction->annotations_.find("deprecated"));
-    if( is_deprecated) {
-      out << indent() << "#pragma warning disable CS0618,CS0612" << endl;
+    if( is_deprecated(tfunction->annotations_)) {
+      out << indent() << "#pragma warning disable CS0618,CS0612" << '\n';
     }
 
     out << indent();
@@ -2457,10 +2590,10 @@
         out << ", ";
     }
 
-    out << "" << CANCELLATION_TOKEN_NAME << ");" << endl;
+    out << "" << CANCELLATION_TOKEN_NAME << ");" << '\n';
 
-    if( is_deprecated) {
-      out << indent() << "#pragma warning restore CS0618,CS0612" << endl;
+    if( is_deprecated(tfunction->annotations_)) {
+      out << indent() << "#pragma warning restore CS0618,CS0612" << '\n';
     }
 
     vector<t_field*>::const_iterator x_iter;
@@ -2470,76 +2603,76 @@
     if (xceptions.size() > 0)
     {
         indent_down();
-        out << indent() << "}" << endl;
+        out << indent() << "}" << '\n';
 
         for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter)
         {
             string tmpex = tmp("tmp");
-            out << indent() << "catch (" << type_name((*x_iter)->get_type()) << " " << tmpex << ")" << endl
-                << indent() << "{" << endl;
+            out << indent() << "catch (" << type_name((*x_iter)->get_type()) << " " << tmpex << ")" << '\n'
+                << indent() << "{" << '\n';
 
             if (!tfunction->is_oneway())
             {
                 indent_up();
-                out << indent() << tmpResult << "." << prop_name(*x_iter) << " = " << tmpex << ";" << endl;
+                out << indent() << tmpResult << "." << prop_name(*x_iter) << " = " << tmpex << ";" << '\n';
                 indent_down();
             }
-            out << indent() << "}" << endl;
+            out << indent() << "}" << '\n';
         }
     }
 
     if (!tfunction->is_oneway())
     {
         out << indent() << "await oprot.WriteMessageBeginAsync(new TMessage(\""
-                << tfunction->get_name() << "\", TMessageType.Reply, seqid), " << CANCELLATION_TOKEN_NAME << "); " << endl
-            << indent() << "await " << tmpResult << ".WriteAsync(oprot, " << CANCELLATION_TOKEN_NAME << ");" << endl;
+                << tfunction->get_name() << "\", TMessageType.Reply, seqid), " << CANCELLATION_TOKEN_NAME << "); " << '\n'
+            << indent() << "await " << tmpResult << ".WriteAsync(oprot, " << CANCELLATION_TOKEN_NAME << ");" << '\n';
     }
     indent_down();
 
     cleanup_member_name_mapping(xs);
 
     string tmpex = tmp("tmp");
-    out << indent() << "}" << endl
-        << indent() << "catch (TTransportException)" << endl
-        << indent() << "{" << endl
-        << indent() << "  throw;" << endl
-        << indent() << "}" << endl
-        << indent() << "catch (Exception " << tmpex << ")" << endl
-        << indent() << "{" << endl;
+    out << indent() << "}" << '\n'
+        << indent() << "catch (TTransportException)" << '\n'
+        << indent() << "{" << '\n'
+        << indent() << "  throw;" << '\n'
+        << indent() << "}" << '\n'
+        << indent() << "catch (Exception " << tmpex << ")" << '\n'
+        << indent() << "{" << '\n';
     indent_up();
 
     string tmpvar = tmp("tmp");
-    out << indent() << "var " << tmpvar << " = $\"Error occurred in {GetType().FullName}: {" << tmpex << ".Message}\";" << endl;
-    out << indent() << "if(_logger != null)" << endl;
+    out << indent() << "var " << tmpvar << " = $\"Error occurred in {GetType().FullName}: {" << tmpex << ".Message}\";" << '\n';
+    out << indent() << "if(_logger != null)" << '\n';
     indent_up();
-    out << indent() << "_logger.LogError(\"{Exception}, {Message}\", " << tmpex << ", " << tmpvar << ");" << endl;
+    out << indent() << "_logger.LogError(\"{Exception}, {Message}\", " << tmpex << ", " << tmpvar << ");" << '\n';
     indent_down();
-    out << indent() << "else" << endl;
+    out << indent() << "else" << '\n';
     indent_up();
-    out << indent() << "Console.Error.WriteLine(" << tmpvar << ");" << endl;
+    out << indent() << "Console.Error.WriteLine(" << tmpvar << ");" << '\n';
     indent_down();
 
     if (tfunction->is_oneway())
     {
         indent_down();
-        out << indent() << "}" << endl;
+        out << indent() << "}" << '\n';
     }
     else
     {
         tmpvar = tmp("tmp");
-        out << indent() << "var " << tmpvar << " = new TApplicationException(TApplicationException.ExceptionType.InternalError,\" Internal error.\");" << endl
+        out << indent() << "var " << tmpvar << " = new TApplicationException(TApplicationException.ExceptionType.InternalError,\" Internal error.\");" << '\n'
             << indent() << "await oprot.WriteMessageBeginAsync(new TMessage(\"" << tfunction->get_name()
-            << "\", TMessageType.Exception, seqid), " << CANCELLATION_TOKEN_NAME << ");" << endl
-            << indent() << "await " << tmpvar << ".WriteAsync(oprot, " << CANCELLATION_TOKEN_NAME << ");" << endl;
+            << "\", TMessageType.Exception, seqid), " << CANCELLATION_TOKEN_NAME << ");" << '\n'
+            << indent() << "await " << tmpvar << ".WriteAsync(oprot, " << CANCELLATION_TOKEN_NAME << ");" << '\n';
         indent_down();
 
-        out << indent() << "}" << endl
-            << indent() << "await oprot.WriteMessageEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << endl
-            << indent() << "await oprot.Transport.FlushAsync(" << CANCELLATION_TOKEN_NAME << ");" << endl;
+        out << indent() << "}" << '\n'
+            << indent() << "await oprot.WriteMessageEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << '\n'
+            << indent() << "await oprot.Transport.FlushAsync(" << CANCELLATION_TOKEN_NAME << ");" << '\n';
     }
 
     indent_down();
-    out << indent() << "}" << endl << endl;
+    out << indent() << "}" << '\n' << '\n';
 }
 
 void t_netstd_generator::generate_netstd_union_reader(ostream& out, t_struct* tunion)
@@ -2548,76 +2681,76 @@
     const vector<t_field*>& fields = tunion->get_members();
     vector<t_field*>::const_iterator f_iter;
 
-    out << indent() << "public static async Task<" << tunion->get_name() << "> ReadAsync(TProtocol iprot, CancellationToken " << CANCELLATION_TOKEN_NAME << ")" << endl;
+    out << indent() << "public static async Task<" << tunion->get_name() << "> ReadAsync(TProtocol iprot, CancellationToken " << CANCELLATION_TOKEN_NAME << ")" << '\n';
     scope_up(out);
 
-    out << indent() << "iprot.IncrementRecursionDepth();" << endl;
-    out << indent() << "try" << endl;
+    out << indent() << "iprot.IncrementRecursionDepth();" << '\n';
+    out << indent() << "try" << '\n';
     scope_up(out);
 
     string tmpRetval = tmp("tmp");
-    out << indent() << tunion->get_name() << " " << tmpRetval << ";" << endl;
-    out << indent() << "await iprot.ReadStructBeginAsync(" << CANCELLATION_TOKEN_NAME << ");" << endl;
-    out << indent() << "TField field = await iprot.ReadFieldBeginAsync(" << CANCELLATION_TOKEN_NAME << ");" << endl;
+    out << indent() << tunion->get_name() << " " << tmpRetval << ";" << '\n';
+    out << indent() << "await iprot.ReadStructBeginAsync(" << CANCELLATION_TOKEN_NAME << ");" << '\n';
+    out << indent() << "TField field = await iprot.ReadFieldBeginAsync(" << CANCELLATION_TOKEN_NAME << ");" << '\n';
     // we cannot have the first field be a stop -- we must have a single field defined
-    out << indent() << "if (field.Type == TType.Stop)" << endl;
+    out << indent() << "if (field.Type == TType.Stop)" << '\n';
     scope_up(out);
-    out << indent() << "await iprot.ReadFieldEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << endl;
-    out << indent() << "" << tmpRetval << " = new ___undefined();" << endl;
+    out << indent() << "await iprot.ReadFieldEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << '\n';
+    out << indent() << "" << tmpRetval << " = new ___undefined();" << '\n';
     scope_down(out);
-    out << indent() << "else" << endl;
+    out << indent() << "else" << '\n';
     scope_up(out);
-    out << indent() << "switch (field.ID)" << endl;
+    out << indent() << "switch (field.ID)" << '\n';
     scope_up(out);
 
     for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter)
     {
-        out << indent() << "case " << (*f_iter)->get_key() << ":" << endl;
+        out << indent() << "case " << (*f_iter)->get_key() << ":" << '\n';
         indent_up();
-        out << indent() << "if (field.Type == " << type_to_enum((*f_iter)->get_type()) << ") {" << endl;
+        out << indent() << "if (field.Type == " << type_to_enum((*f_iter)->get_type()) << ") {" << '\n';
         indent_up();
 
         string tmpvar = tmp("tmp");
-        out << indent() << type_name((*f_iter)->get_type()) << " " << tmpvar << ";" << endl;
+        out << indent() << type_name((*f_iter)->get_type()) << " " << tmpvar << ";" << '\n';
         generate_deserialize_field(out, (*f_iter), tmpvar, true);
-        out << indent() << tmpRetval << " = new " << (*f_iter)->get_name() << "(" << tmpvar << ");" << endl;
+        out << indent() << tmpRetval << " = new " << (*f_iter)->get_name() << "(" << tmpvar << ");" << '\n';
 
         indent_down();
-        out << indent() << "} else { " << endl << indent() << " await TProtocolUtil.SkipAsync(iprot, field.Type, " << CANCELLATION_TOKEN_NAME << ");"
-            << endl << indent() << "  " << tmpRetval << " = new ___undefined();" << endl << indent() << "}" << endl
-            << indent() << "break;" << endl;
+        out << indent() << "} else { " << '\n' << indent() << " await TProtocolUtil.SkipAsync(iprot, field.Type, " << CANCELLATION_TOKEN_NAME << ");"
+            << '\n' << indent() << "  " << tmpRetval << " = new ___undefined();" << '\n' << indent() << "}" << '\n'
+            << indent() << "break;" << '\n';
         indent_down();
     }
 
-    out << indent() << "default: " << endl;
+    out << indent() << "default: " << '\n';
     indent_up();
-    out << indent() << "await TProtocolUtil.SkipAsync(iprot, field.Type, " << CANCELLATION_TOKEN_NAME << ");" << endl << indent()
-        << tmpRetval << " = new ___undefined();" << endl;
-    out << indent() << "break;" << endl;
+    out << indent() << "await TProtocolUtil.SkipAsync(iprot, field.Type, " << CANCELLATION_TOKEN_NAME << ");" << '\n' << indent()
+        << tmpRetval << " = new ___undefined();" << '\n';
+    out << indent() << "break;" << '\n';
     indent_down();
 
     scope_down(out);
 
-    out << indent() << "await iprot.ReadFieldEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << endl;
+    out << indent() << "await iprot.ReadFieldEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << '\n';
 
-    out << indent() << "if ((await iprot.ReadFieldBeginAsync(" << CANCELLATION_TOKEN_NAME << ")).Type != TType.Stop)" << endl;
+    out << indent() << "if ((await iprot.ReadFieldBeginAsync(" << CANCELLATION_TOKEN_NAME << ")).Type != TType.Stop)" << '\n';
     scope_up(out);
-    out << indent() << "throw new TProtocolException(TProtocolException.INVALID_DATA);" << endl;
+    out << indent() << "throw new TProtocolException(TProtocolException.INVALID_DATA);" << '\n';
     scope_down(out);
 
     // end of else for TStop
     scope_down(out);
-    out << indent() << "await iprot.ReadStructEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << endl;
-    out << indent() << "return " << tmpRetval << ";" << endl;
+    out << indent() << "await iprot.ReadStructEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << '\n';
+    out << indent() << "return " << tmpRetval << ";" << '\n';
     indent_down();
 
     scope_down(out);
-    out << indent() << "finally" << endl;
+    out << indent() << "finally" << '\n';
     scope_up(out);
-    out << indent() << "iprot.DecrementRecursionDepth();" << endl;
+    out << indent() << "iprot.DecrementRecursionDepth();" << '\n';
     scope_down(out);
 
-    out << indent() << "}" << endl << endl;
+    out << indent() << "}" << '\n' << '\n';
 }
 
 void t_netstd_generator::generate_deserialize_field(ostream& out, t_field* tfield, string prefix, bool is_propertyless)
@@ -2698,7 +2831,7 @@
         {
             out << "ReadI32Async(" << CANCELLATION_TOKEN_NAME << ");";
         }
-        out << endl;
+        out << '\n';
     }
     else
     {
@@ -2710,18 +2843,18 @@
 {
     if (is_union_enabled() && tstruct->is_union())
     {
-        out << indent() << prefix << " = await " << type_name(tstruct) << ".ReadAsync(iprot, " << CANCELLATION_TOKEN_NAME << ");" << endl;
+        out << indent() << prefix << " = await " << type_name(tstruct) << ".ReadAsync(iprot, " << CANCELLATION_TOKEN_NAME << ");" << '\n';
     }
     else
     {
-        out << indent() << prefix << " = new " << type_name(tstruct) << "();" << endl
-            << indent() << "await " << prefix << ".ReadAsync(iprot, " << CANCELLATION_TOKEN_NAME << ");" << endl;
+        out << indent() << prefix << " = new " << type_name(tstruct) << "();" << '\n'
+            << indent() << "await " << prefix << ".ReadAsync(iprot, " << CANCELLATION_TOKEN_NAME << ");" << '\n';
     }
 }
 
 void t_netstd_generator::generate_deserialize_container(ostream& out, t_type* ttype, string prefix)
 {
-    out << indent() << "{" << endl;
+    out << indent() << "{" << '\n';
     indent_up();
 
     string obj;
@@ -2741,21 +2874,25 @@
 
     if (ttype->is_map())
     {
-        out << indent() << "var " << obj << " = await iprot.ReadMapBeginAsync(" << CANCELLATION_TOKEN_NAME << ");" << endl;
+        out << indent() << "var " << obj << " = await iprot.ReadMapBeginAsync(" << CANCELLATION_TOKEN_NAME << ");" << '\n';
     }
     else if (ttype->is_set())
     {
-        out << indent() << "var " << obj << " = await iprot.ReadSetBeginAsync(" << CANCELLATION_TOKEN_NAME << ");" << endl;
+        out << indent() << "var " << obj << " = await iprot.ReadSetBeginAsync(" << CANCELLATION_TOKEN_NAME << ");" << '\n';
     }
     else if (ttype->is_list())
     {
-        out << indent() << "var " << obj << " = await iprot.ReadListBeginAsync(" << CANCELLATION_TOKEN_NAME << ");" << endl;
+        out << indent() << "var " << obj << " = await iprot.ReadListBeginAsync(" << CANCELLATION_TOKEN_NAME << ");" << '\n';
     }
 
-    out << indent() << prefix << " = new " << type_name(ttype) << "(" << obj << ".Count);" << endl;
+    if( (target_net_version < 5) && ttype->is_set()) {
+        out << indent() << prefix << " = new " << type_name(ttype) << "();" << '\n';
+    } else {
+        out << indent() << prefix << " = new " << type_name(ttype) << "(" << obj << ".Count);" << '\n';
+    }
     string i = tmp("_i");
-    out << indent() << "for(int " << i << " = 0; " << i << " < " << obj << ".Count; ++" << i << ")" << endl
-        << indent() << "{" << endl;
+    out << indent() << "for(int " << i << " = 0; " << i << " < " << obj << ".Count; ++" << i << ")" << '\n'
+        << indent() << "{" << '\n';
     indent_up();
 
     if (ttype->is_map())
@@ -2772,23 +2909,23 @@
     }
 
     indent_down();
-    out << indent() << "}" << endl;
+    out << indent() << "}" << '\n';
 
     if (ttype->is_map())
     {
-        out << indent() << "await iprot.ReadMapEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << endl;
+        out << indent() << "await iprot.ReadMapEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << '\n';
     }
     else if (ttype->is_set())
     {
-        out << indent() << "await iprot.ReadSetEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << endl;
+        out << indent() << "await iprot.ReadSetEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << '\n';
     }
     else if (ttype->is_list())
     {
-        out << indent() << "await iprot.ReadListEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << endl;
+        out << indent() << "await iprot.ReadListEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << '\n';
     }
 
     indent_down();
-    out << indent() << "}" << endl;
+    out << indent() << "}" << '\n';
 }
 
 void t_netstd_generator::generate_deserialize_map_element(ostream& out, t_map* tmap, string prefix)
@@ -2799,13 +2936,13 @@
     t_field fkey(tmap->get_key_type(), key);
     t_field fval(tmap->get_val_type(), val);
 
-    out << indent() << declare_field(&fkey, false, false) << endl;
-    out << indent() << declare_field(&fval, false, false) << endl;
+    out << indent() << declare_field(&fkey, false, false) << '\n';
+    out << indent() << declare_field(&fval, false, false) << '\n';
 
     generate_deserialize_field(out, &fkey);
     generate_deserialize_field(out, &fval);
 
-    out << indent() << prefix << "[" << key << "] = " << val << ";" << endl;
+    out << indent() << prefix << "[" << key << "] = " << val << ";" << '\n';
 }
 
 void t_netstd_generator::generate_deserialize_set_element(ostream& out, t_set* tset, string prefix)
@@ -2813,11 +2950,11 @@
     string elem = tmp("_elem");
     t_field felem(tset->get_elem_type(), elem);
 
-    out << indent() << declare_field(&felem, false, false) << endl;
+    out << indent() << declare_field(&felem, false, false) << '\n';
 
     generate_deserialize_field(out, &felem);
 
-    out << indent() << prefix << ".Add(" << elem << ");" << endl;
+    out << indent() << prefix << ".Add(" << elem << ");" << '\n';
 }
 
 void t_netstd_generator::generate_deserialize_list_element(ostream& out, t_list* tlist, string prefix)
@@ -2825,11 +2962,11 @@
     string elem = tmp("_elem");
     t_field felem(tlist->get_elem_type(), elem);
 
-    out << indent() << declare_field(&felem, false, false) << endl;
+    out << indent() << declare_field(&felem, false, false) << '\n';
 
     generate_deserialize_field(out, &felem);
 
-    out << indent() << prefix << ".Add(" << elem << ");" << endl;
+    out << indent() << prefix << ".Add(" << elem << ");" << '\n';
 }
 
 void t_netstd_generator::generate_serialize_field(ostream& out, t_field* tfield, string prefix, bool is_propertyless, bool allow_nullable)
@@ -2904,7 +3041,7 @@
         {
             out << "WriteI32Async((int)" << name << ", " << CANCELLATION_TOKEN_NAME << ");";
         }
-        out << endl;
+        out << '\n';
     }
     else
     {
@@ -2915,7 +3052,7 @@
 void t_netstd_generator::generate_serialize_struct(ostream& out, t_struct* tstruct, string prefix)
 {
     (void)tstruct;
-    out << indent() << "await " << prefix << ".WriteAsync(oprot, " << CANCELLATION_TOKEN_NAME << ");" << endl;
+    out << indent() << "await " << prefix << ".WriteAsync(oprot, " << CANCELLATION_TOKEN_NAME << ");" << '\n';
 }
 
 void t_netstd_generator::generate_serialize_container(ostream& out, t_type* ttype, string prefix)
@@ -2924,18 +3061,18 @@
     {
         out << indent() << "await oprot.WriteMapBeginAsync(new TMap(" << type_to_enum(static_cast<t_map*>(ttype)->get_key_type())
             << ", " << type_to_enum(static_cast<t_map*>(ttype)->get_val_type()) << ", " << prefix
-            << ".Count), " << CANCELLATION_TOKEN_NAME << ");" << endl;
+            << ".Count), " << CANCELLATION_TOKEN_NAME << ");" << '\n';
     }
     else if (ttype->is_set())
     {
         out << indent() << "await oprot.WriteSetBeginAsync(new TSet(" << type_to_enum(static_cast<t_set*>(ttype)->get_elem_type())
-            << ", " << prefix << ".Count), " << CANCELLATION_TOKEN_NAME << ");" << endl;
+            << ", " << prefix << ".Count), " << CANCELLATION_TOKEN_NAME << ");" << '\n';
     }
     else if (ttype->is_list())
     {
         out << indent() << "await oprot.WriteListBeginAsync(new TList("
             << type_to_enum(static_cast<t_list*>(ttype)->get_elem_type()) << ", " << prefix << ".Count), " << CANCELLATION_TOKEN_NAME << ");"
-            << endl;
+            << '\n';
     }
 
     string iter = tmp("_iter");
@@ -2955,8 +3092,8 @@
             << " in " << prefix << ")";
     }
 
-    out << endl;
-    out << indent() << "{" << endl;
+    out << '\n';
+    out << indent() << "{" << '\n';
     indent_up();
 
     if (ttype->is_map())
@@ -2973,19 +3110,19 @@
     }
 
     indent_down();
-    out << indent() << "}" << endl;
+    out << indent() << "}" << '\n';
 
     if (ttype->is_map())
     {
-        out << indent() << "await oprot.WriteMapEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << endl;
+        out << indent() << "await oprot.WriteMapEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << '\n';
     }
     else if (ttype->is_set())
     {
-        out << indent() << "await oprot.WriteSetEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << endl;
+        out << indent() << "await oprot.WriteSetEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << '\n';
     }
     else if (ttype->is_list())
     {
-        out << indent() << "await oprot.WriteListEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << endl;
+        out << indent() << "await oprot.WriteListEndAsync(" << CANCELLATION_TOKEN_NAME << ");" << '\n';
     }
 }
 
@@ -3018,8 +3155,9 @@
 {
     if ((is_serialize_enabled() || is_wcf_enabled()) && isPublic)
     {
-        out << indent() << "[DataMember(Order = 0)]" << endl;
+        out << indent() << "[DataMember(Order = 0)]" << '\n';
     }
+    generate_deprecation_attribute(out, tfield->annotations_);
 
     out << indent()
         << (isPublic ? "public " : "private ")
@@ -3036,37 +3174,37 @@
         if( (target_net_version >= 6) && (!force_member_nullable(tfield))) {
             out << initialize_field(tfield) << ";";
         }
-        out << endl;
+        out << '\n';
     }
     else
     {
-        out << endl
-            << indent() << "{" << endl;
+        out << '\n'
+            << indent() << "{" << '\n';
         indent_up();
 
-        out << indent() << "get" << endl
-            << indent() << "{" << endl;
+        out << indent() << "get" << '\n'
+            << indent() << "{" << '\n';
         indent_up();
 
-        out << indent() << "return " << fieldPrefix + tfield->get_name() << ";" << endl;
+        out << indent() << "return " << fieldPrefix + tfield->get_name() << ";" << '\n';
         indent_down();
-        out << indent() << "}" << endl
-            << indent() << "set" << endl
-            << indent() << "{" << endl;
+        out << indent() << "}" << '\n'
+            << indent() << "set" << '\n'
+            << indent() << "{" << '\n';
         indent_up();
 
         if (generateIsset)
         {
-            out << indent() << "__isset." << get_isset_name(normalize_name(tfield->get_name())) << " = true;" << endl;
+            out << indent() << "__isset." << get_isset_name(normalize_name(tfield->get_name())) << " = true;" << '\n';
         }
-        out << indent() << "this." << fieldPrefix + tfield->get_name() << " = value;" << endl;
+        out << indent() << "this." << fieldPrefix + tfield->get_name() << " = value;" << '\n';
 
         indent_down();
-        out << indent() << "}" << endl;
+        out << indent() << "}" << '\n';
         indent_down();
-        out << indent() << "}" << endl;
+        out << indent() << "}" << '\n';
     }
-    out << endl;
+    out << '\n';
 }
 
 string t_netstd_generator::make_csharp_string_literal( string const& value)
@@ -3749,14 +3887,14 @@
 
 void t_netstd_generator::generate_netstd_docstring_comment(ostream& out, string contents)
 {
-    docstring_comment(out, "/// <summary>" + endl, "/// ", contents, "/// </summary>" + endl);
+    docstring_comment(out, "/// <summary>" + string("\n"), "/// ", contents, "/// </summary>" + string("\n"));
 }
 
 void t_netstd_generator::generate_netstd_doc(ostream& out, t_field* field)
 {
     if (field->get_type()->is_enum())
     {
-        string combined_message = field->get_doc() + endl + "<seealso cref=\"" + get_enum_class_name(field->get_type()) + "\"/>";
+        string combined_message = field->get_doc() + "\n" + "<seealso cref=\"" + get_enum_class_name(field->get_type()) + "\"/>";
         generate_netstd_docstring_comment(out, combined_message);
     }
     else
@@ -3783,7 +3921,7 @@
         for (p_iter = fields.begin(); p_iter != fields.end(); ++p_iter)
         {
             t_field* p = *p_iter;
-            ps << endl << "<param name=\"" << p->get_name() << "\">";
+            ps << '\n' << "<param name=\"" << p->get_name() << "\">";
             if (p->has_doc())
             {
                 string str = p->get_doc();
@@ -3796,7 +3934,7 @@
         docstring_comment(out,
                                    "",
                                    "/// ",
-                                   "<summary>" + endl + tfunction->get_doc() + "</summary>" + ps.str(),
+                                   "<summary>" + string("\n") + tfunction->get_doc() + "</summary>" + ps.str(),
                                    "");
     }
 }
@@ -3818,11 +3956,11 @@
         // Just prnt a newline when the line & prefix are empty.
         if (strlen(line) == 0 && line_prefix == "" && !docs.eof())
         {
-            out << endl;
+            out << '\n';
         }
         else if (strlen(line) > 0 || !docs.eof())
         { // skip the empty last line
-            out << indent() << line_prefix << line << endl;
+            out << indent() << line_prefix << line << '\n';
         }
     }
     if (comment_end != "")
diff --git a/compiler/cpp/src/thrift/generate/t_netstd_generator.h b/compiler/cpp/src/thrift/generate/t_netstd_generator.h
index ff3cfb1..c65414a 100644
--- a/compiler/cpp/src/thrift/generate/t_netstd_generator.h
+++ b/compiler/cpp/src/thrift/generate/t_netstd_generator.h
@@ -44,8 +44,6 @@
 using std::stringstream;
 using std::vector;
 
-static const string endl = "\n"; // avoid ostream << std::endl flushes
-
 static const string DEEP_COPY_METHOD_NAME = "DeepCopy";
 static const string CANCELLATION_TOKEN_NAME = "cancellationToken";
 
@@ -106,7 +104,7 @@
   void generate_netstd_union_reader(ostream& out, t_struct* tunion);
   void generate_function_helpers(ostream& out, t_function* tfunction);
   void generate_service_interface(ostream& out, t_service* tservice);
-  void generate_deprecation_attribute(ostream& out, t_function* func);
+  void generate_deprecation_attribute(ostream& out, std::map<std::string, std::vector<std::string>>& annotations);
   void generate_service_helpers(ostream& out, t_service* tservice);
   void generate_service_client(ostream& out, t_service* tservice);
   void generate_service_server(ostream& out, t_service* tservice);
@@ -165,7 +163,7 @@
     comment += " */\n";
     return comment;
   }
-  
+
 
 private:
   string namespace_name_;
@@ -182,15 +180,15 @@
 
   const std::string CSHARP_KEYWORDS[101] = {
     // C# keywords
-    "abstract", "as", "base", "bool", "break", "byte", "case", "catch", "char", "checked", "class", "const", "continue", 
-    "decimal", "default", "delegate", "do", "double", "else", "enum", "event", "explicit", "extern", "false", "finally", 
-    "fixed", "float", "for", "foreach", "goto", "if", "implicit", "in", "int", "interface", "internal", "is", "lock", 
-    "long", "namespace", "new", "null", "object", "operator", "out", "override", "params", "private", "protected", 
-    "public", "readonly", "ref", "return", "sbyte", "sealed", "short", "sizeof", "stackalloc", "static", "string", 
-    "struct", "switch", "this", "throw", "true", "try", "typeof", "uint", "ulong", "unchecked", "unsafe", "ushort", 
-    "using", "virtual", "void", "volatile", "while", 
+    "abstract", "as", "base", "bool", "break", "byte", "case", "catch", "char", "checked", "class", "const", "continue",
+    "decimal", "default", "delegate", "do", "double", "else", "enum", "event", "explicit", "extern", "false", "finally",
+    "fixed", "float", "for", "foreach", "goto", "if", "implicit", "in", "int", "interface", "internal", "is", "lock",
+    "long", "namespace", "new", "null", "object", "operator", "out", "override", "params", "private", "protected",
+    "public", "readonly", "ref", "return", "sbyte", "sealed", "short", "sizeof", "stackalloc", "static", "string",
+    "struct", "switch", "this", "throw", "true", "try", "typeof", "uint", "ulong", "unchecked", "unsafe", "ushort",
+    "using", "virtual", "void", "volatile", "while",
     // C# contextual keywords
-    "add", "alias", "ascending", "async", "await", "descending", "dynamic", "from", "get", "global", "group", "into", 
+    "add", "alias", "ascending", "async", "await", "descending", "dynamic", "from", "get", "global", "group", "into",
     "join", "let", "orderby", "partial", "remove", "select", "set", "value", "var", "when", "where", "yield"
   };
 
@@ -199,7 +197,7 @@
   vector<member_mapping_scope> member_mapping_scopes;
   map<string, t_type*> collected_extension_types;
   map<string, t_type*> checked_extension_types;
-  
+
   string normalize_name(string name, bool is_arg_name = false);
   string make_valid_csharp_identifier(string const& fromName);
   string make_csharp_string_literal( string const& value);
@@ -220,6 +218,8 @@
   string initialize_field(t_field* tfield);
 
   void pragmas_and_directives(ostream& out);
+  bool any_deprecations();
+  bool is_deprecated(std::map<std::string, std::vector<std::string>>& annotations);
   bool is_nullable_type(t_type* ttype);
   bool force_member_nullable(t_field* tfield);  // see there
   string nullable_suffix();                     // unconditionally
diff --git a/compiler/cpp/src/thrift/generate/t_ocaml_generator.cc b/compiler/cpp/src/thrift/generate/t_ocaml_generator.cc
index 5f9b80c..34dda40 100644
--- a/compiler/cpp/src/thrift/generate/t_ocaml_generator.cc
+++ b/compiler/cpp/src/thrift/generate/t_ocaml_generator.cc
@@ -38,8 +38,6 @@
 using std::stringstream;
 using std::vector;
 
-static const string endl = "\n"; // avoid ostream << std::endl flushes
-
 /**
  * OCaml code generator.
  *
@@ -241,10 +239,10 @@
   f_consts_.open(f_consts_name.c_str());
 
   // Print header
-  f_types_ << ocaml_autogen_comment() << endl << ocaml_imports() << endl;
-  f_types_i_ << ocaml_autogen_comment() << endl << ocaml_imports() << endl;
-  f_consts_ << ocaml_autogen_comment() << endl << ocaml_imports() << endl << "open "
-            << capitalize(program_name_) << "_types" << endl;
+  f_types_ << ocaml_autogen_comment() << '\n' << ocaml_imports() << '\n';
+  f_types_i_ << ocaml_autogen_comment() << '\n' << ocaml_imports() << '\n';
+  f_consts_ << ocaml_autogen_comment() << '\n' << ocaml_imports() << '\n' << "open "
+            << capitalize(program_name_) << "_types" << '\n';
 }
 
 /**
@@ -277,9 +275,9 @@
  */
 void t_ocaml_generator::generate_typedef(t_typedef* ttypedef) {
   f_types_ << indent() << "type " << decapitalize(ttypedef->get_symbolic()) << " = "
-           << render_ocaml_type(ttypedef->get_type()) << endl << endl;
+           << render_ocaml_type(ttypedef->get_type()) << '\n' << '\n';
   f_types_i_ << indent() << "type " << decapitalize(ttypedef->get_symbolic()) << " = "
-             << render_ocaml_type(ttypedef->get_type()) << endl << endl;
+             << render_ocaml_type(ttypedef->get_type()) << '\n' << '\n';
 }
 
 /**
@@ -289,46 +287,46 @@
  * @param tenum The enumeration
  */
 void t_ocaml_generator::generate_enum(t_enum* tenum) {
-  indent(f_types_) << "module " << capitalize(tenum->get_name()) << " = " << endl << "struct"
-                   << endl;
-  indent(f_types_i_) << "module " << capitalize(tenum->get_name()) << " : " << endl << "sig"
-                     << endl;
+  indent(f_types_) << "module " << capitalize(tenum->get_name()) << " = " << '\n' << "struct"
+                   << '\n';
+  indent(f_types_i_) << "module " << capitalize(tenum->get_name()) << " : " << '\n' << "sig"
+                     << '\n';
   indent_up();
-  indent(f_types_) << "type t = " << endl;
-  indent(f_types_i_) << "type t = " << endl;
+  indent(f_types_) << "type t = " << '\n';
+  indent(f_types_i_) << "type t = " << '\n';
   indent_up();
   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) {
     string name = capitalize((*c_iter)->get_name());
-    indent(f_types_) << "| " << name << endl;
-    indent(f_types_i_) << "| " << name << endl;
+    indent(f_types_) << "| " << name << '\n';
+    indent(f_types_i_) << "| " << name << '\n';
   }
   indent_down();
 
-  indent(f_types_) << "let to_i = function" << endl;
-  indent(f_types_i_) << "val to_i : t -> Int32.t" << endl;
+  indent(f_types_) << "let to_i = function" << '\n';
+  indent(f_types_i_) << "val to_i : t -> Int32.t" << '\n';
   indent_up();
   for (c_iter = constants.begin(); c_iter != constants.end(); ++c_iter) {
     int value = (*c_iter)->get_value();
     string name = capitalize((*c_iter)->get_name());
-    indent(f_types_) << "| " << name << " -> " << value << "l" << endl;
+    indent(f_types_) << "| " << name << " -> " << value << "l" << '\n';
   }
   indent_down();
 
-  indent(f_types_) << "let of_i = function" << endl;
-  indent(f_types_i_) << "val of_i : Int32.t -> t" << endl;
+  indent(f_types_) << "let of_i = function" << '\n';
+  indent(f_types_i_) << "val of_i : Int32.t -> t" << '\n';
   indent_up();
   for (c_iter = constants.begin(); c_iter != constants.end(); ++c_iter) {
     int value = (*c_iter)->get_value();
     string name = capitalize((*c_iter)->get_name());
-    indent(f_types_) << "| " << value << "l -> " << name << endl;
+    indent(f_types_) << "| " << value << "l -> " << name << '\n';
   }
-  indent(f_types_) << "| _ -> raise Thrift_error" << endl;
+  indent(f_types_) << "| _ -> raise Thrift_error" << '\n';
   indent_down();
   indent_down();
-  indent(f_types_) << "end" << endl;
-  indent(f_types_i_) << "end" << endl;
+  indent(f_types_) << "end" << '\n';
+  indent(f_types_i_) << "end" << '\n';
 }
 
 /**
@@ -339,7 +337,7 @@
   string name = decapitalize(tconst->get_name());
   t_const_value* value = tconst->get_value();
 
-  indent(f_consts_) << "let " << name << " = " << render_const_value(type, value) << endl << endl;
+  indent(f_consts_) << "let " << name << " = " << render_const_value(type, value) << '\n' << '\n';
 }
 
 /**
@@ -395,9 +393,9 @@
   } else if (type->is_struct() || type->is_xception()) {
     string cname = type_name(type);
     string ct = tmp("_c");
-    out << endl;
+    out << '\n';
     indent_up();
-    indent(out) << "(let " << ct << " = new " << cname << " in" << endl;
+    indent(out) << "(let " << ct << " = new " << cname << " in" << '\n';
     indent_up();
     const vector<t_field*>& fields = ((t_struct*)type)->get_members();
     vector<t_field*>::const_iterator f_iter;
@@ -417,7 +415,7 @@
       out << indent();
       out << ct << "#set_" << fname << " ";
       out << render_const_value(field_type, v_iter->second);
-      out << ";" << endl;
+      out << ";" << '\n';
     }
     indent(out) << ct << ")";
     indent_down();
@@ -428,14 +426,14 @@
     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;
     string hm = tmp("_hm");
-    out << endl;
+    out << '\n';
     indent_up();
-    indent(out) << "(let " << hm << " = Hashtbl.create " << val.size() << " in" << endl;
+    indent(out) << "(let " << hm << " = Hashtbl.create " << val.size() << " in" << '\n';
     indent_up();
     for (v_iter = val.begin(); v_iter != val.end(); ++v_iter) {
       string key = render_const_value(ktype, v_iter->first);
       string val = render_const_value(vtype, v_iter->second);
-      indent(out) << "Hashtbl.add " << hm << " " << key << " " << val << ";" << endl;
+      indent(out) << "Hashtbl.add " << hm << " " << key << " " << val << ";" << '\n';
     }
     indent(out) << hm << ")";
     indent_down();
@@ -443,14 +441,14 @@
   } else if (type->is_list()) {
     t_type* etype;
     etype = ((t_list*)type)->get_elem_type();
-    out << "[" << endl;
+    out << "[" << '\n';
     indent_up();
     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) {
       out << indent();
       out << render_const_value(etype, *v_iter);
-      out << ";" << endl;
+      out << ";" << '\n';
     }
     indent_down();
     indent(out) << "]";
@@ -459,15 +457,15 @@
     const vector<t_const_value*>& val = value->get_list();
     vector<t_const_value*>::const_iterator v_iter;
     string hm = tmp("_hm");
-    indent(out) << "(let " << hm << " = Hashtbl.create " << val.size() << " in" << endl;
+    indent(out) << "(let " << hm << " = Hashtbl.create " << val.size() << " in" << '\n';
     indent_up();
     for (v_iter = val.begin(); v_iter != val.end(); ++v_iter) {
       string val = render_const_value(etype, *v_iter);
-      indent(out) << "Hashtbl.add " << hm << " " << val << " true;" << endl;
+      indent(out) << "Hashtbl.add " << hm << " " << val << " true;" << '\n';
     }
-    indent(out) << hm << ")" << endl;
+    indent(out) << hm << ")" << '\n';
     indent_down();
-    out << endl;
+    out << '\n';
   } else {
     throw "CANNOT GENERATE CONSTANT FOR TYPE: " + type->get_name();
   }
@@ -503,15 +501,15 @@
   vector<t_field*>::const_iterator m_iter;
 
   /* Create a copy of the current object */
-  indent(out) << "method copy =" << endl;
+  indent(out) << "method copy =" << '\n';
   indent_up();
   indent_up();
-  indent(out) << "let _new = Oo.copy self in" << endl;
+  indent(out) << "let _new = Oo.copy self in" << '\n';
   for (m_iter = members.begin(); m_iter != members.end(); ++m_iter)
     generate_ocaml_member_copy(out, *m_iter);
 
   indent_down();
-  indent(out) << "_new" << endl;
+  indent(out) << "_new" << '\n';
   indent_down();
 }
 
@@ -564,10 +562,10 @@
   if (copy_of != grab_field) {
     indent(out);
     if (!struct_member_persistent(tmember)) {
-      out << "if _" << mname << " <> None then" << endl;
+      out << "if _" << mname << " <> None then" << '\n';
       indent(out) << "  ";
     }
-    out << "_new#set_" << mname << " " << copy_of << ";" << endl;
+    out << "_new#set_" << mname << " " << copy_of << ";" << '\n';
   }
 }
 
@@ -582,24 +580,24 @@
   const vector<t_field*>& members = tstruct->get_members();
   vector<t_field*>::const_iterator m_iter;
   string tname = type_name(tstruct);
-  indent(out) << "class " << tname << " =" << endl;
-  indent(out) << "object (self)" << endl;
+  indent(out) << "class " << tname << " =" << '\n';
+  indent(out) << "object (self)" << '\n';
 
   indent_up();
 
   if (members.size() > 0) {
     for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
       generate_ocaml_struct_member(out, tname, (*m_iter));
-      out << endl;
+      out << '\n';
     }
   }
   generate_ocaml_method_copy(out, members);
   generate_ocaml_struct_writer(out, tstruct);
   indent_down();
-  indent(out) << "end" << endl;
+  indent(out) << "end" << '\n';
 
   if (is_exception) {
-    indent(out) << "exception " << capitalize(tname) << " of " << tname << endl;
+    indent(out) << "exception " << capitalize(tname) << " of " << tname << '\n';
   }
 
   generate_ocaml_struct_reader(out, tstruct);
@@ -621,37 +619,37 @@
   t_const_value* val = tmember->get_value();
   if (val) {
     if (struct_member_persistent(tmember))
-      out << " = " << render_const_value(tmember->get_type(), tmember->get_value()) << endl;
+      out << " = " << render_const_value(tmember->get_type(), tmember->get_value()) << '\n';
     else
       out << " option = Some " << render_const_value(tmember->get_type(), tmember->get_value())
-          << endl;
+          << '\n';
   } else {
     // assert(!struct_member_persistent(tmember))
-    out << " option = None" << endl;
+    out << " option = None" << '\n';
   }
 
   if (struct_member_persistent(tmember)) {
-    indent(out) << "method get_" << mname << " = Some _" << mname << endl;
-    indent(out) << "method grab_" << mname << " = _" << mname << endl;
-    indent(out) << "method set_" << mname << " " << x << " = _" << mname << " <- " << x << endl;
+    indent(out) << "method get_" << mname << " = Some _" << mname << '\n';
+    indent(out) << "method grab_" << mname << " = _" << mname << '\n';
+    indent(out) << "method set_" << mname << " " << x << " = _" << mname << " <- " << x << '\n';
   } else {
-    indent(out) << "method get_" << mname << " = _" << mname << endl;
+    indent(out) << "method get_" << mname << " = _" << mname << '\n';
     indent(out) << "method grab_" << mname << " = match _" << mname
                 << " with None->raise (Field_empty \"" << tname << "." << mname << "\") | Some "
-                << x << " -> " << x << endl;
+                << x << " -> " << x << '\n';
     indent(out) << "method set_" << mname << " " << x << " = _" << mname << " <- Some " << x
-                << endl;
-    indent(out) << "method unset_" << mname << " = _" << mname << " <- None" << endl;
+                << '\n';
+    indent(out) << "method unset_" << mname << " = _" << mname << " <- None" << '\n';
   }
 
   indent(out) << "method reset_" << mname << " = _" << mname << " <- ";
   if (val) {
     if (struct_member_persistent(tmember))
-      out << render_const_value(tmember->get_type(), tmember->get_value()) << endl;
+      out << render_const_value(tmember->get_type(), tmember->get_value()) << '\n';
     else
-      out << "Some " << render_const_value(tmember->get_type(), tmember->get_value()) << endl;
+      out << "Some " << render_const_value(tmember->get_type(), tmember->get_value()) << '\n';
   } else {
-    out << "None" << endl;
+    out << "None" << '\n';
   }
 }
 
@@ -719,8 +717,8 @@
   const vector<t_field*>& members = tstruct->get_members();
   vector<t_field*>::const_iterator m_iter;
   string tname = type_name(tstruct);
-  indent(out) << "class " << tname << " :" << endl;
-  indent(out) << "object ('a)" << endl;
+  indent(out) << "class " << tname << " :" << '\n';
+  indent(out) << "object ('a)" << '\n';
 
   indent_up();
 
@@ -729,24 +727,24 @@
     for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
       string mname = decapitalize((*m_iter)->get_name());
       string type = render_ocaml_type((*m_iter)->get_type());
-      indent(out) << "method get_" << mname << " : " << type << " option" << endl;
-      indent(out) << "method grab_" << mname << " : " << type << endl;
-      indent(out) << "method set_" << mname << " : " << type << " -> unit" << endl;
+      indent(out) << "method get_" << mname << " : " << type << " option" << '\n';
+      indent(out) << "method grab_" << mname << " : " << type << '\n';
+      indent(out) << "method set_" << mname << " : " << type << " -> unit" << '\n';
       if (!struct_member_persistent(*m_iter))
-        indent(out) << "method unset_" << mname << " : unit" << endl;
-      indent(out) << "method reset_" << mname << " : unit" << endl;
+        indent(out) << "method unset_" << mname << " : unit" << '\n';
+      indent(out) << "method reset_" << mname << " : unit" << '\n';
     }
   }
-  indent(out) << "method copy : 'a" << endl;
-  indent(out) << "method write : Protocol.t -> unit" << endl;
+  indent(out) << "method copy : 'a" << '\n';
+  indent(out) << "method write : Protocol.t -> unit" << '\n';
   indent_down();
-  indent(out) << "end" << endl;
+  indent(out) << "end" << '\n';
 
   if (is_exception) {
-    indent(out) << "exception " << capitalize(tname) << " of " << tname << endl;
+    indent(out) << "exception " << capitalize(tname) << " of " << tname << '\n';
   }
 
-  indent(out) << "val read_" << tname << " : Protocol.t -> " << tname << endl;
+  indent(out) << "val read_" << tname << " : Protocol.t -> " << tname << '\n';
 }
 
 /**
@@ -759,55 +757,55 @@
   string str = tmp("_str");
   string t = tmp("_t");
   string id = tmp("_id");
-  indent(out) << "let rec read_" << sname << " (iprot : Protocol.t) =" << endl;
+  indent(out) << "let rec read_" << sname << " (iprot : Protocol.t) =" << '\n';
   indent_up();
-  indent(out) << "let " << str << " = new " << sname << " in" << endl;
+  indent(out) << "let " << str << " = new " << sname << " in" << '\n';
   indent_up();
-  indent(out) << "ignore(iprot#readStructBegin);" << endl;
+  indent(out) << "ignore(iprot#readStructBegin);" << '\n';
 
   // Loop over reading in fields
-  indent(out) << "(try while true do" << endl;
+  indent(out) << "(try while true do" << '\n';
   indent_up();
   indent_up();
 
   // Read beginning field marker
-  indent(out) << "let (_," << t << "," << id << ") = iprot#readFieldBegin in" << endl;
+  indent(out) << "let (_," << t << "," << id << ") = iprot#readFieldBegin in" << '\n';
 
   // Check for field STOP marker and break
-  indent(out) << "if " << t << " = Protocol.T_STOP then" << endl;
+  indent(out) << "if " << t << " = Protocol.T_STOP then" << '\n';
   indent_up();
-  indent(out) << "raise Break" << endl;
+  indent(out) << "raise Break" << '\n';
   indent_down();
-  indent(out) << "else ();" << endl;
+  indent(out) << "else ();" << '\n';
 
-  indent(out) << "(match " << id << " with " << endl;
+  indent(out) << "(match " << id << " with " << '\n';
   indent_up();
   // Generate deserialization code for known cases
   for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
     indent(out) << "| " << (*f_iter)->get_key() << " -> (";
-    out << "if " << t << " = " << type_to_enum((*f_iter)->get_type()) << " then" << endl;
+    out << "if " << t << " = " << type_to_enum((*f_iter)->get_type()) << " then" << '\n';
     indent_up();
     indent_up();
     generate_deserialize_field(out, *f_iter, str);
     indent_down();
-    out << indent() << "else" << endl << indent() << "  iprot#skip " << t << ")" << endl;
+    out << indent() << "else" << '\n' << indent() << "  iprot#skip " << t << ")" << '\n';
     indent_down();
   }
 
   // In the default case we skip the field
   out << indent() << "| _ -> "
-      << "iprot#skip " << t << ");" << endl;
+      << "iprot#skip " << t << ");" << '\n';
   indent_down();
   // Read field end marker
-  indent(out) << "iprot#readFieldEnd;" << endl;
+  indent(out) << "iprot#readFieldEnd;" << '\n';
   indent_down();
-  indent(out) << "done; ()" << endl;
+  indent(out) << "done; ()" << '\n';
   indent_down();
-  indent(out) << "with Break -> ());" << endl;
+  indent(out) << "with Break -> ());" << '\n';
 
-  indent(out) << "iprot#readStructEnd;" << endl;
+  indent(out) << "iprot#readStructEnd;" << '\n';
 
-  indent(out) << str << endl << endl;
+  indent(out) << str << '\n' << '\n';
   indent_down();
   indent_down();
 }
@@ -819,9 +817,9 @@
   string str = tmp("_str");
   string f = tmp("_f");
 
-  indent(out) << "method write (oprot : Protocol.t) =" << endl;
+  indent(out) << "method write (oprot : Protocol.t) =" << '\n';
   indent_up();
-  indent(out) << "oprot#writeStructBegin \"" << name << "\";" << endl;
+  indent(out) << "oprot#writeStructBegin \"" << name << "\";" << '\n';
 
   for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
     t_field* tmember = (*f_iter);
@@ -835,10 +833,10 @@
         // Avoid redundant encoding of members having default values.
         indent(out) << "(match " << mname << " with "
                     << render_const_value(tmember->get_type(), tmember->get_value()) << " -> () | "
-                    << _v << " -> " << endl;
+                    << _v << " -> " << '\n';
       } else {
         _v = mname;
-        indent(out) << "(" << endl;
+        indent(out) << "(" << '\n';
       }
 
     } else {
@@ -853,12 +851,12 @@
           out << " | Some " << render_const_value(tmember->get_type(), tmember->get_value())
               << " -> ()";
         }
-        out << " | Some _v -> " << endl;
+        out << " | Some _v -> " << '\n';
       } else {
-        out << endl;
+        out << '\n';
         indent(out) << "| None -> raise (Field_empty \"" << type_name(tstruct) << "." << mname
-                    << "\")" << endl;
-        indent(out) << "| Some _v -> " << endl;
+                    << "\")" << '\n';
+        indent(out) << "| Some _v -> " << '\n';
       }
 
       _v = "_v";
@@ -866,20 +864,20 @@
     indent_up();
     // Write field header
     indent(out) << "oprot#writeFieldBegin(\"" << tmember->get_name() << "\","
-                << type_to_enum(tmember->get_type()) << "," << tmember->get_key() << ");" << endl;
+                << type_to_enum(tmember->get_type()) << "," << tmember->get_key() << ");" << '\n';
 
     // Write field contents
     generate_serialize_field(out, tmember, _v);
 
     // Write field closer
-    indent(out) << "oprot#writeFieldEnd" << endl;
+    indent(out) << "oprot#writeFieldEnd" << '\n';
 
     indent_down();
-    indent(out) << ");" << endl;
+    indent(out) << ");" << '\n';
   }
 
   // Write the struct map
-  out << indent() << "oprot#writeFieldStop;" << endl << indent() << "oprot#writeStructEnd" << endl;
+  out << indent() << "oprot#writeFieldStop;" << '\n' << indent() << "oprot#writeStructEnd" << '\n';
 
   indent_down();
 }
@@ -895,19 +893,19 @@
   string f_service_i_name = get_out_dir() + capitalize(service_name_) + ".mli";
   f_service_i_.open(f_service_i_name.c_str());
 
-  f_service_ << ocaml_autogen_comment() << endl << ocaml_imports() << endl;
-  f_service_i_ << ocaml_autogen_comment() << endl << ocaml_imports() << endl;
+  f_service_ << ocaml_autogen_comment() << '\n' << ocaml_imports() << '\n';
+  f_service_i_ << ocaml_autogen_comment() << '\n' << ocaml_imports() << '\n';
 
   /* if (tservice->get_extends() != nullptr) {
     f_service_ <<
-      "open " << capitalize(tservice->get_extends()->get_name()) << endl;
+      "open " << capitalize(tservice->get_extends()->get_name()) << '\n';
     f_service_i_ <<
-      "open " << capitalize(tservice->get_extends()->get_name()) << endl;
+      "open " << capitalize(tservice->get_extends()->get_name()) << '\n';
   }
   */
-  f_service_ << "open " << capitalize(program_name_) << "_types" << endl << endl;
+  f_service_ << "open " << capitalize(program_name_) << "_types" << '\n' << '\n';
 
-  f_service_i_ << "open " << capitalize(program_name_) << "_types" << endl << endl;
+  f_service_i_ << "open " << capitalize(program_name_) << "_types" << '\n' << '\n';
 
   // Generate the three main parts of the service
   generate_service_helpers(tservice);
@@ -925,7 +923,7 @@
   vector<t_function*> functions = tservice->get_functions();
   vector<t_function*>::iterator f_iter;
 
-  indent(f_service_) << "(* HELPER FUNCTIONS AND STRUCTURES *)" << endl << endl;
+  indent(f_service_) << "(* HELPER FUNCTIONS AND STRUCTURES *)" << '\n' << '\n';
 
   for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
     t_struct* ts = (*f_iter)->get_arglist();
@@ -961,15 +959,15 @@
  * @param tservice The service to generate a header definition for
  */
 void t_ocaml_generator::generate_service_interface(t_service* tservice) {
-  f_service_ << indent() << "class virtual iface =" << endl << "object (self)" << endl;
-  f_service_i_ << indent() << "class virtual iface :" << endl << "object" << endl;
+  f_service_ << indent() << "class virtual iface =" << '\n' << "object (self)" << '\n';
+  f_service_i_ << indent() << "class virtual iface :" << '\n' << "object" << '\n';
 
   indent_up();
 
   if (tservice->get_extends() != nullptr) {
     string extends = type_name(tservice->get_extends());
-    indent(f_service_) << "inherit " << extends << ".iface" << endl;
-    indent(f_service_i_) << "inherit " << extends << ".iface" << endl;
+    indent(f_service_) << "inherit " << extends << ".iface" << '\n';
+    indent(f_service_i_) << "inherit " << extends << ".iface" << '\n';
   }
 
   vector<t_function*> functions = tservice->get_functions();
@@ -977,13 +975,13 @@
   for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
     string ft = function_type(*f_iter, true, true);
     f_service_ << indent() << "method virtual " << decapitalize((*f_iter)->get_name()) << " : "
-               << ft << endl;
+               << ft << '\n';
     f_service_i_ << indent() << "method virtual " << decapitalize((*f_iter)->get_name()) << " : "
-                 << ft << endl;
+                 << ft << '\n';
   }
   indent_down();
-  indent(f_service_) << "end" << endl << endl;
-  indent(f_service_i_) << "end" << endl << endl;
+  indent(f_service_) << "end" << '\n' << '\n';
+  indent(f_service_i_) << "end" << '\n' << '\n';
 }
 
 /**
@@ -995,17 +993,17 @@
  */
 void t_ocaml_generator::generate_service_client(t_service* tservice) {
   string extends = "";
-  indent(f_service_) << "class client (iprot : Protocol.t) (oprot : Protocol.t) =" << endl
-                     << "object (self)" << endl;
-  indent(f_service_i_) << "class client : Protocol.t -> Protocol.t -> " << endl << "object" << endl;
+  indent(f_service_) << "class client (iprot : Protocol.t) (oprot : Protocol.t) =" << '\n'
+                     << "object (self)" << '\n';
+  indent(f_service_i_) << "class client : Protocol.t -> Protocol.t -> " << '\n' << "object" << '\n';
   indent_up();
 
   if (tservice->get_extends() != nullptr) {
     extends = type_name(tservice->get_extends());
-    indent(f_service_) << "inherit " << extends << ".client iprot oprot as super" << endl;
-    indent(f_service_i_) << "inherit " << extends << ".client" << endl;
+    indent(f_service_) << "inherit " << extends << ".client iprot oprot as super" << '\n';
+    indent(f_service_i_) << "inherit " << extends << ".client" << '\n';
   }
-  indent(f_service_) << "val mutable seqid = 0" << endl;
+  indent(f_service_) << "val mutable seqid = 0" << '\n';
 
   // Generate client method implementations
   vector<t_function*> functions = tservice->get_functions();
@@ -1017,24 +1015,24 @@
     string funname = (*f_iter)->get_name();
 
     // Open function
-    indent(f_service_) << "method " << function_signature(*f_iter) << " = " << endl;
+    indent(f_service_) << "method " << function_signature(*f_iter) << " = " << '\n';
     indent(f_service_i_) << "method " << decapitalize((*f_iter)->get_name()) << " : "
-                         << function_type(*f_iter, true, false) << endl;
+                         << function_type(*f_iter, true, false) << '\n';
     indent_up();
     indent(f_service_) << "self#send_" << funname;
 
     for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) {
       f_service_ << " " << decapitalize((*fld_iter)->get_name());
     }
-    f_service_ << ";" << endl;
+    f_service_ << ";" << '\n';
 
     if (!(*f_iter)->is_oneway()) {
       f_service_ << indent();
-      f_service_ << "self#recv_" << funname << endl;
+      f_service_ << "self#recv_" << funname << '\n';
     }
     indent_down();
 
-    indent(f_service_) << "method private send_" << function_signature(*f_iter) << " = " << endl;
+    indent(f_service_) << "method private send_" << function_signature(*f_iter) << " = " << '\n';
     indent_up();
 
     std::string argsname = decapitalize((*f_iter)->get_name() + "_args");
@@ -1042,19 +1040,19 @@
     // Serialize the request header
     f_service_ << indent() << "oprot#writeMessageBegin (\"" << (*f_iter)->get_name() << "\", "
                << ((*f_iter)->is_oneway() ? "Protocol.ONEWAY" : "Protocol.CALL") << ", seqid);"
-               << endl;
+               << '\n';
 
-    f_service_ << indent() << "let args = new " << argsname << " in" << endl;
+    f_service_ << indent() << "let args = new " << argsname << " in" << '\n';
     indent_up();
 
     for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) {
       f_service_ << indent() << "args#set_" << (*fld_iter)->get_name() << " "
-                 << (*fld_iter)->get_name() << ";" << endl;
+                 << (*fld_iter)->get_name() << ";" << '\n';
     }
 
     // Write to the stream
-    f_service_ << indent() << "args#write oprot;" << endl << indent() << "oprot#writeMessageEnd;"
-               << endl << indent() << "oprot#getTransport#flush" << endl;
+    f_service_ << indent() << "args#write oprot;" << '\n' << indent() << "oprot#writeMessageEnd;"
+               << '\n' << indent() << "oprot#getTransport#flush" << '\n';
 
     indent_down();
     indent_down();
@@ -1068,20 +1066,20 @@
                                &noargs);
       // Open function
       f_service_ << indent() << "method private " << function_signature(&recv_function) << " ="
-                 << endl;
+                 << '\n';
       indent_up();
 
       // TODO(mcslee): Validate message reply here, seq ids etc.
 
-      f_service_ << indent() << "let (fname, mtype, rseqid) = iprot#readMessageBegin in" << endl;
+      f_service_ << indent() << "let (fname, mtype, rseqid) = iprot#readMessageBegin in" << '\n';
       indent_up();
-      f_service_ << indent() << "(if mtype = Protocol.EXCEPTION then" << endl << indent()
-                 << "  let x = Application_Exn.read iprot in" << endl;
+      f_service_ << indent() << "(if mtype = Protocol.EXCEPTION then" << '\n' << indent()
+                 << "  let x = Application_Exn.read iprot in" << '\n';
       indent_up();
       f_service_ << indent() << "  (iprot#readMessageEnd;" << indent()
-                 << "   raise (Application_Exn.E x))" << endl;
+                 << "   raise (Application_Exn.E x))" << '\n';
       indent_down();
-      f_service_ << indent() << "else ());" << endl;
+      f_service_ << indent() << "else ());" << '\n';
       string res = "_";
 
       t_struct* xs = (*f_iter)->get_xceptions();
@@ -1090,32 +1088,32 @@
       if (!(*f_iter)->get_returntype()->is_void() || xceptions.size() > 0) {
         res = "result";
       }
-      f_service_ << indent() << "let " << res << " = read_" << resultname << " iprot in" << endl;
+      f_service_ << indent() << "let " << res << " = read_" << resultname << " iprot in" << '\n';
       indent_up();
-      f_service_ << indent() << "iprot#readMessageEnd;" << endl;
+      f_service_ << indent() << "iprot#readMessageEnd;" << '\n';
 
       // Careful, only return _result if not a void function
       if (!(*f_iter)->get_returntype()->is_void()) {
-        f_service_ << indent() << "match result#get_success with Some v -> v | None -> (" << endl;
+        f_service_ << indent() << "match result#get_success with Some v -> v | None -> (" << '\n';
         indent_up();
       }
 
       vector<t_field*>::const_iterator x_iter;
       for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) {
         f_service_ << indent() << "(match result#get_" << (*x_iter)->get_name()
-                   << " with None -> () | Some _v ->" << endl;
+                   << " with None -> () | Some _v ->" << '\n';
         indent(f_service_) << "  raise (" << capitalize(exception_ctor((*x_iter)->get_type()))
-                           << " _v));" << endl;
+                           << " _v));" << '\n';
       }
 
       // Careful, only return _result if not a void function
       if ((*f_iter)->get_returntype()->is_void()) {
-        indent(f_service_) << "()" << endl;
+        indent(f_service_) << "()" << '\n';
       } else {
         f_service_
             << indent()
             << "raise (Application_Exn.E (Application_Exn.create Application_Exn.MISSING_RESULT \""
-            << (*f_iter)->get_name() << " failed: unknown result\")))" << endl;
+            << (*f_iter)->get_name() << " failed: unknown result\")))" << '\n';
         indent_down();
       }
 
@@ -1127,8 +1125,8 @@
   }
 
   indent_down();
-  indent(f_service_) << "end" << endl << endl;
-  indent(f_service_i_) << "end" << endl << endl;
+  indent(f_service_) << "end" << '\n' << '\n';
+  indent(f_service_i_) << "end" << '\n' << '\n';
 }
 
 /**
@@ -1142,50 +1140,50 @@
   vector<t_function*>::iterator f_iter;
 
   // Generate the header portion
-  indent(f_service_) << "class processor (handler : iface) =" << endl << indent() << "object (self)"
-                     << endl;
-  indent(f_service_i_) << "class processor : iface ->" << endl << indent() << "object" << endl;
+  indent(f_service_) << "class processor (handler : iface) =" << '\n' << indent() << "object (self)"
+                     << '\n';
+  indent(f_service_i_) << "class processor : iface ->" << '\n' << indent() << "object" << '\n';
   indent_up();
 
-  f_service_ << indent() << "inherit Processor.t" << endl << endl;
-  f_service_i_ << indent() << "inherit Processor.t" << endl << endl;
+  f_service_ << indent() << "inherit Processor.t" << '\n' << '\n';
+  f_service_i_ << indent() << "inherit Processor.t" << '\n' << '\n';
   string extends = "";
 
   if (tservice->get_extends() != nullptr) {
     extends = type_name(tservice->get_extends());
     indent(f_service_) << "inherit " + extends + ".processor (handler :> " + extends + ".iface)"
-                       << endl;
-    indent(f_service_i_) << "inherit " + extends + ".processor" << endl;
+                       << '\n';
+    indent(f_service_i_) << "inherit " + extends + ".processor" << '\n';
   }
 
   if (extends.empty()) {
-    indent(f_service_) << "val processMap = Hashtbl.create " << functions.size() << endl;
+    indent(f_service_) << "val processMap = Hashtbl.create " << functions.size() << '\n';
   }
   indent(f_service_i_)
-      << "val processMap : (string, int * Protocol.t * Protocol.t -> unit) Hashtbl.t" << endl;
+      << "val processMap : (string, int * Protocol.t * Protocol.t -> unit) Hashtbl.t" << '\n';
 
   // Generate the server implementation
-  indent(f_service_) << "method process iprot oprot =" << endl;
-  indent(f_service_i_) << "method process : Protocol.t -> Protocol.t -> bool" << endl;
+  indent(f_service_) << "method process iprot oprot =" << '\n';
+  indent(f_service_i_) << "method process : Protocol.t -> Protocol.t -> bool" << '\n';
   indent_up();
 
-  f_service_ << indent() << "let (name, typ, seqid)  = iprot#readMessageBegin in" << endl;
+  f_service_ << indent() << "let (name, typ, seqid)  = iprot#readMessageBegin in" << '\n';
   indent_up();
   // TODO(mcslee): validate message
 
   // HOT: dictionary function lookup
-  f_service_ << indent() << "if Hashtbl.mem processMap name then" << endl << indent()
-             << "  (Hashtbl.find processMap name) (seqid, iprot, oprot)" << endl << indent()
-             << "else (" << endl << indent() << "  iprot#skip(Protocol.T_STRUCT);" << endl
-             << indent() << "  iprot#readMessageEnd;" << endl << indent()
+  f_service_ << indent() << "if Hashtbl.mem processMap name then" << '\n' << indent()
+             << "  (Hashtbl.find processMap name) (seqid, iprot, oprot)" << '\n' << indent()
+             << "else (" << '\n' << indent() << "  iprot#skip(Protocol.T_STRUCT);" << '\n'
+             << indent() << "  iprot#readMessageEnd;" << '\n' << indent()
              << "  let x = Application_Exn.create Application_Exn.UNKNOWN_METHOD (\"Unknown "
-                "function \"^name) in" << endl << indent()
-             << "    oprot#writeMessageBegin(name, Protocol.EXCEPTION, seqid);" << endl << indent()
-             << "    x#write oprot;" << endl << indent() << "    oprot#writeMessageEnd;" << endl
-             << indent() << "    oprot#getTransport#flush" << endl << indent() << ");" << endl;
+                "function \"^name) in" << '\n' << indent()
+             << "    oprot#writeMessageBegin(name, Protocol.EXCEPTION, seqid);" << '\n' << indent()
+             << "    x#write oprot;" << '\n' << indent() << "    oprot#writeMessageEnd;" << '\n'
+             << indent() << "    oprot#getTransport#flush" << '\n' << indent() << ");" << '\n';
 
   // Read end of args field, the T_STOP, and the struct close
-  f_service_ << indent() << "true" << endl;
+  f_service_ << indent() << "true" << '\n';
   indent_down();
   indent_down();
   // Generate the process subfunctions
@@ -1193,17 +1191,17 @@
     generate_process_function(tservice, *f_iter);
   }
 
-  indent(f_service_) << "initializer" << endl;
+  indent(f_service_) << "initializer" << '\n';
   indent_up();
   for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
     f_service_ << indent() << "Hashtbl.add processMap \"" << (*f_iter)->get_name()
-               << "\" self#process_" << (*f_iter)->get_name() << ";" << endl;
+               << "\" self#process_" << (*f_iter)->get_name() << ";" << '\n';
   }
   indent_down();
 
   indent_down();
-  indent(f_service_) << "end" << endl << endl;
-  indent(f_service_i_) << "end" << endl << endl;
+  indent(f_service_) << "end" << '\n' << '\n';
+  indent(f_service_i_) << "end" << '\n' << '\n';
 }
 
 /**
@@ -1215,7 +1213,7 @@
   (void)tservice;
   // Open function
   indent(f_service_) << "method private process_" << tfunction->get_name()
-                     << " (seqid, iprot, oprot) =" << endl;
+                     << " (seqid, iprot, oprot) =" << '\n';
   indent_up();
 
   string argsname = decapitalize(tfunction->get_name()) + "_args";
@@ -1231,9 +1229,9 @@
     args = "_";
   }
 
-  f_service_ << indent() << "let " << args << " = read_" << argsname << " iprot in" << endl;
+  f_service_ << indent() << "let " << args << " = read_" << argsname << " iprot in" << '\n';
   indent_up();
-  f_service_ << indent() << "iprot#readMessageEnd;" << endl;
+  f_service_ << indent() << "iprot#readMessageEnd;" << '\n';
 
   t_struct* xs = tfunction->get_xceptions();
   const std::vector<t_field*>& xceptions = xs->get_members();
@@ -1241,13 +1239,13 @@
 
   // Declare result for non oneway function
   if (!tfunction->is_oneway()) {
-    f_service_ << indent() << "let result = new " << resultname << " in" << endl;
+    f_service_ << indent() << "let result = new " << resultname << " in" << '\n';
     indent_up();
   }
 
   // Try block for a function with exceptions
   if (xceptions.size() > 0) {
-    f_service_ << indent() << "(try" << endl;
+    f_service_ << indent() << "(try" << '\n';
     indent_up();
   }
 
@@ -1259,20 +1257,20 @@
   for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
     f_service_ << " args#get_" << (*f_iter)->get_name();
   }
-  f_service_ << ");" << endl;
+  f_service_ << ");" << '\n';
 
   if (xceptions.size() > 0) {
     indent_down();
-    indent(f_service_) << "with" << endl;
+    indent(f_service_) << "with" << '\n';
     indent_up();
     for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) {
       f_service_ << indent() << "| " << capitalize(exception_ctor((*x_iter)->get_type())) << " "
-                 << (*x_iter)->get_name() << " -> " << endl;
+                 << (*x_iter)->get_name() << " -> " << '\n';
       indent_up();
       indent_up();
       if (!tfunction->is_oneway()) {
         f_service_ << indent() << "result#set_" << (*x_iter)->get_name() << " "
-                   << (*x_iter)->get_name() << endl;
+                   << (*x_iter)->get_name() << '\n';
       } else {
         indent(f_service_) << "()";
       }
@@ -1280,21 +1278,21 @@
       indent_down();
     }
     indent_down();
-    f_service_ << indent() << ");" << endl;
+    f_service_ << indent() << ");" << '\n';
   }
 
   // Shortcut out here for oneway functions
   if (tfunction->is_oneway()) {
-    f_service_ << indent() << "()" << endl;
+    f_service_ << indent() << "()" << '\n';
     indent_down();
     indent_down();
     return;
   }
 
   f_service_ << indent() << "oprot#writeMessageBegin (\"" << tfunction->get_name()
-             << "\", Protocol.REPLY, seqid);" << endl << indent() << "result#write oprot;" << endl
-             << indent() << "oprot#writeMessageEnd;" << endl << indent()
-             << "oprot#getTransport#flush" << endl;
+             << "\", Protocol.REPLY, seqid);" << '\n' << indent() << "result#write oprot;" << '\n'
+             << indent() << "oprot#writeMessageEnd;" << '\n' << indent()
+             << "oprot#getTransport#flush" << '\n';
 
   // Close function
   indent_down();
@@ -1311,7 +1309,7 @@
   string name = decapitalize(tfield->get_name());
   indent(out) << prefix << "#set_" << name << " ";
   generate_deserialize_type(out, type);
-  out << endl;
+  out << '\n';
 }
 
 /**
@@ -1396,46 +1394,46 @@
   t_field fvtype(g_type_i8, vtype);
   t_field fetype(g_type_i8, etype);
 
-  out << endl;
+  out << '\n';
   indent_up();
   // Declare variables, read header
   if (ttype->is_map()) {
     indent(out) << "(let (" << ktype << "," << vtype << "," << size << ") = iprot#readMapBegin in"
-                << endl;
-    indent(out) << "let " << con << " = Hashtbl.create " << size << " in" << endl;
+                << '\n';
+    indent(out) << "let " << con << " = Hashtbl.create " << size << " in" << '\n';
     indent_up();
-    indent(out) << "for i = 1 to " << size << " do" << endl;
+    indent(out) << "for i = 1 to " << size << " do" << '\n';
     indent_up();
     indent(out) << "let _k = ";
     generate_deserialize_type(out, ((t_map*)ttype)->get_key_type());
-    out << " in" << endl;
+    out << " in" << '\n';
     indent(out) << "let _v = ";
     generate_deserialize_type(out, ((t_map*)ttype)->get_val_type());
-    out << " in" << endl;
+    out << " in" << '\n';
     indent_up();
-    indent(out) << "Hashtbl.add " << con << " _k _v" << endl;
+    indent(out) << "Hashtbl.add " << con << " _k _v" << '\n';
     indent_down();
     indent_down();
     indent(out) << "done; iprot#readMapEnd; " << con << ")";
     indent_down();
   } else if (ttype->is_set()) {
-    indent(out) << "(let (" << etype << "," << size << ") = iprot#readSetBegin in" << endl;
-    indent(out) << "let " << con << " = Hashtbl.create " << size << " in" << endl;
+    indent(out) << "(let (" << etype << "," << size << ") = iprot#readSetBegin in" << '\n';
+    indent(out) << "let " << con << " = Hashtbl.create " << size << " in" << '\n';
     indent_up();
-    indent(out) << "for i = 1 to " << size << " do" << endl;
+    indent(out) << "for i = 1 to " << size << " do" << '\n';
     indent_up();
     indent(out) << "Hashtbl.add " << con << " ";
     generate_deserialize_type(out, ((t_set*)ttype)->get_elem_type());
-    out << " true" << endl;
+    out << " true" << '\n';
     indent_down();
     indent(out) << "done; iprot#readSetEnd; " << con << ")";
     indent_down();
   } else if (ttype->is_list()) {
-    indent(out) << "(let (" << etype << "," << size << ") = iprot#readListBegin in" << endl;
+    indent(out) << "(let (" << etype << "," << size << ") = iprot#readListBegin in" << '\n';
     indent_up();
     indent(out) << "let " << con << " = (Array.to_list (Array.init " << size << " (fun _ -> ";
     generate_deserialize_type(out, ((t_list*)ttype)->get_elem_type());
-    out << "))) in" << endl;
+    out << "))) in" << '\n';
     indent_up();
     indent(out) << "iprot#readListEnd; " << con << ")";
     indent_down();
@@ -1510,7 +1508,7 @@
            tfield->get_name().c_str(),
            type->get_name().c_str());
   }
-  out << ";" << endl;
+  out << ";" << '\n';
 }
 
 /**
@@ -1528,38 +1526,38 @@
   if (ttype->is_map()) {
     indent(out) << "oprot#writeMapBegin(" << type_to_enum(((t_map*)ttype)->get_key_type()) << ",";
     out << type_to_enum(((t_map*)ttype)->get_val_type()) << ",";
-    out << "Hashtbl.length " << prefix << ");" << endl;
+    out << "Hashtbl.length " << prefix << ");" << '\n';
   } else if (ttype->is_set()) {
     indent(out) << "oprot#writeSetBegin(" << type_to_enum(((t_set*)ttype)->get_elem_type()) << ",";
-    out << "Hashtbl.length " << prefix << ");" << endl;
+    out << "Hashtbl.length " << prefix << ");" << '\n';
   } else if (ttype->is_list()) {
     indent(out) << "oprot#writeListBegin(" << type_to_enum(((t_list*)ttype)->get_elem_type())
                 << ",";
-    out << "List.length " << prefix << ");" << endl;
+    out << "List.length " << prefix << ");" << '\n';
   }
 
   if (ttype->is_map()) {
     string kiter = tmp("_kiter");
     string viter = tmp("_viter");
-    indent(out) << "Hashtbl.iter (fun " << kiter << " -> fun " << viter << " -> " << endl;
+    indent(out) << "Hashtbl.iter (fun " << kiter << " -> fun " << viter << " -> " << '\n';
     indent_up();
     generate_serialize_map_element(out, (t_map*)ttype, kiter, viter);
     indent_down();
-    indent(out) << ") " << prefix << ";" << endl;
+    indent(out) << ") " << prefix << ";" << '\n';
   } else if (ttype->is_set()) {
     string iter = tmp("_iter");
     indent(out) << "Hashtbl.iter (fun " << iter << " -> fun _ -> ";
     indent_up();
     generate_serialize_set_element(out, (t_set*)ttype, iter);
     indent_down();
-    indent(out) << ") " << prefix << ";" << endl;
+    indent(out) << ") " << prefix << ";" << '\n';
   } else if (ttype->is_list()) {
     string iter = tmp("_iter");
     indent(out) << "List.iter (fun " << iter << " -> ";
     indent_up();
     generate_serialize_list_element(out, (t_list*)ttype, iter);
     indent_down();
-    indent(out) << ") " << prefix << ";" << endl;
+    indent(out) << ") " << prefix << ";" << '\n';
   }
 
   if (ttype->is_map()) {
diff --git a/compiler/cpp/src/thrift/generate/t_oop_generator.h b/compiler/cpp/src/thrift/generate/t_oop_generator.h
index 8841962..07b6216 100644
--- a/compiler/cpp/src/thrift/generate/t_oop_generator.h
+++ b/compiler/cpp/src/thrift/generate/t_oop_generator.h
@@ -42,13 +42,13 @@
    */
 
   void scope_up(std::ostream& out) {
-    indent(out) << "{" << std::endl;
+    indent(out) << "{" << '\n';
     indent_up();
   }
 
   void scope_down(std::ostream& out) {
     indent_down();
-    indent(out) << "}" << std::endl;
+    indent(out) << "}" << '\n';
   }
 
   std::string upcase_string(std::string original) {
diff --git a/compiler/cpp/src/thrift/generate/t_perl_generator.cc b/compiler/cpp/src/thrift/generate/t_perl_generator.cc
index d133b24..8e533ca 100644
--- a/compiler/cpp/src/thrift/generate/t_perl_generator.cc
+++ b/compiler/cpp/src/thrift/generate/t_perl_generator.cc
@@ -37,8 +37,6 @@
 using std::stringstream;
 using std::vector;
 
-static const string endl = "\n"; // avoid ostream << std::endl flushes
-
 /**
  * PERL code generator.
  *
@@ -246,8 +244,8 @@
   f_types_ << autogen_comment() << perl_includes();
 
   // Print header
-  f_consts_ << autogen_comment() << "package " << perl_namespace(program_) << "Constants;" << endl
-            << perl_includes() << endl;
+  f_consts_ << autogen_comment() << "package " << perl_namespace(program_) << "Constants;" << '\n'
+            << perl_includes() << '\n';
 }
 
 /**
@@ -271,10 +269,10 @@
  */
 void t_perl_generator::close_generator() {
   // Close types file
-  f_types_ << "1;" << endl;
+  f_types_ << "1;" << '\n';
   f_types_.close();
 
-  f_consts_ << "1;" << endl;
+  f_consts_ << "1;" << '\n';
   f_consts_.close();
 }
 
@@ -294,13 +292,13 @@
  * @param tenum The enumeration
  */
 void t_perl_generator::generate_enum(t_enum* tenum) {
-  f_types_ << "package " << perl_namespace(program_) << tenum->get_name() << ";" << endl;
+  f_types_ << "package " << perl_namespace(program_) << tenum->get_name() << ";" << '\n';
 
   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) {
     int value = (*c_iter)->get_value();
-    f_types_ << "use constant " << (*c_iter)->get_name() << " => " << value << ";" << endl;
+    f_types_ << "use constant " << (*c_iter)->get_name() << " => " << value << ";" << '\n';
   }
 }
 
@@ -314,7 +312,7 @@
 
   f_consts_ << "use constant " << name << " => ";
   f_consts_ << render_const_value(type, value);
-  f_consts_ << ";" << endl << endl;
+  f_consts_ << ";" << '\n' << '\n';
 }
 
 /**
@@ -355,7 +353,7 @@
   } else if (type->is_enum()) {
     out << value->get_integer();
   } else if (type->is_struct() || type->is_xception()) {
-    out << perl_namespace(type->get_program()) << type->get_name() << "->new({" << endl;
+    out << perl_namespace(type->get_program()) << type->get_name() << "->new({" << '\n';
     indent_up();
 
     const vector<t_field*>& fields = ((t_struct*)type)->get_members();
@@ -376,14 +374,14 @@
       out << " => ";
       out << render_const_value(field_type, v_iter->second);
       out << ",";
-      out << endl;
+      out << '\n';
     }
     indent_down();
     indent(out) << "})";
   } else if (type->is_map()) {
     t_type* ktype = ((t_map*)type)->get_key_type();
     t_type* vtype = ((t_map*)type)->get_val_type();
-    out << "{" << endl;
+    out << "{" << '\n';
     indent_up();
 
     const map<t_const_value*, t_const_value*, t_const_value::value_compare>& val = value->get_map();
@@ -392,7 +390,7 @@
       indent(out) << render_const_value(ktype, v_iter->first);
       out << " => ";
       out << render_const_value(vtype, v_iter->second);
-      out << "," << endl;
+      out << "," << '\n';
     }
     indent_down();
     indent(out) << "}";
@@ -403,7 +401,7 @@
     } else {
       etype = ((t_set*)type)->get_elem_type();
     }
-    out << "[" << endl;
+    out << "[" << '\n';
     indent_up();
 
     const vector<t_const_value*>& val = value->get_list();
@@ -414,7 +412,7 @@
       if (type->is_set()) {
         out << " => 1";
       }
-      out << "," << endl;
+      out << "," << '\n';
     }
     indent_down();
     indent(out) << "]";
@@ -480,12 +478,12 @@
     out << ") );\n";
   }
 
-  out << endl;
+  out << '\n';
 
   // new()
   indent_up();
-  out << "sub new {" << endl << indent() << "my $classname = shift;" << endl << indent()
-      << "my $self      = {};" << endl << indent() << "my $vals      = shift || {};" << endl;
+  out << "sub new {" << '\n' << indent() << "my $classname = shift;" << '\n' << indent()
+      << "my $self      = {};" << '\n' << indent() << "my $vals      = shift || {};" << '\n';
 
   for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
     string dval = "undef";
@@ -493,7 +491,7 @@
     if ((*m_iter)->get_value() != nullptr && !(t->is_struct() || t->is_xception())) {
       dval = render_const_value((*m_iter)->get_type(), (*m_iter)->get_value());
     }
-    out << indent() << "$self->{" << (*m_iter)->get_name() << "} = " << dval << ";" << endl;
+    out << indent() << "$self->{" << (*m_iter)->get_name() << "} = " << dval << ";" << '\n';
   }
 
   // Generate constructor from array
@@ -503,27 +501,27 @@
       t_type* t = get_true_type((*m_iter)->get_type());
       if ((*m_iter)->get_value() != nullptr && (t->is_struct() || t->is_xception())) {
         indent(out) << "$self->{" << (*m_iter)->get_name()
-                    << "} = " << render_const_value(t, (*m_iter)->get_value()) << ";" << endl;
+                    << "} = " << render_const_value(t, (*m_iter)->get_value()) << ";" << '\n';
       }
     }
 
-    out << indent() << "if (UNIVERSAL::isa($vals,'HASH')) {" << endl;
+    out << indent() << "if (UNIVERSAL::isa($vals,'HASH')) {" << '\n';
     indent_up();
     for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
-      out << indent() << "if (defined $vals->{" << (*m_iter)->get_name() << "}) {" << endl
+      out << indent() << "if (defined $vals->{" << (*m_iter)->get_name() << "}) {" << '\n'
           << indent() << "  $self->{" << (*m_iter)->get_name() << "} = $vals->{"
-          << (*m_iter)->get_name() << "};" << endl << indent() << "}" << endl;
+          << (*m_iter)->get_name() << "};" << '\n' << indent() << "}" << '\n';
     }
     indent_down();
-    out << indent() << "}" << endl;
+    out << indent() << "}" << '\n';
   }
 
-  out << indent() << "return bless ($self, $classname);" << endl;
+  out << indent() << "return bless ($self, $classname);" << '\n';
   indent_down();
   out << "}\n\n";
 
-  out << "sub getName {" << endl << indent() << "  return '" << tstruct->get_name() << "';" << endl
-      << indent() << "}" << endl << endl;
+  out << "sub getName {" << '\n' << indent() << "  return '" << tstruct->get_name() << "';" << '\n'
+      << indent() << "}" << '\n' << '\n';
 
   generate_perl_struct_reader(out, tstruct);
   generate_perl_struct_writer(out, tstruct);
@@ -536,32 +534,32 @@
   const vector<t_field*>& fields = tstruct->get_members();
   vector<t_field*>::const_iterator f_iter;
 
-  out << "sub read {" << endl;
+  out << "sub read {" << '\n';
 
   indent_up();
 
-  out << indent() << "my ($self, $input) = @_;" << endl << indent() << "my $xfer  = 0;" << endl
-      << indent() << "my $fname;" << endl << indent() << "my $ftype = 0;" << endl << indent()
-      << "my $fid   = 0;" << endl;
+  out << indent() << "my ($self, $input) = @_;" << '\n' << indent() << "my $xfer  = 0;" << '\n'
+      << indent() << "my $fname;" << '\n' << indent() << "my $ftype = 0;" << '\n' << indent()
+      << "my $fid   = 0;" << '\n';
 
-  indent(out) << "$xfer += $input->readStructBegin(\\$fname);" << endl;
+  indent(out) << "$xfer += $input->readStructBegin(\\$fname);" << '\n';
 
   // Loop over reading in fields
-  indent(out) << "while (1)" << endl;
+  indent(out) << "while (1)" << '\n';
 
   scope_up(out);
 
-  indent(out) << "$xfer += $input->readFieldBegin(\\$fname, \\$ftype, \\$fid);" << endl;
+  indent(out) << "$xfer += $input->readFieldBegin(\\$fname, \\$ftype, \\$fid);" << '\n';
 
   // Check for field STOP marker and break
-  indent(out) << "if ($ftype == Thrift::TType::STOP) {" << endl;
+  indent(out) << "if ($ftype == Thrift::TType::STOP) {" << '\n';
   indent_up();
-  indent(out) << "last;" << endl;
+  indent(out) << "last;" << '\n';
   indent_down();
-  indent(out) << "}" << endl;
+  indent(out) << "}" << '\n';
 
   // Switch statement on the field we are reading
-  indent(out) << "SWITCH: for($fid)" << endl;
+  indent(out) << "SWITCH: for($fid)" << '\n';
 
   scope_up(out);
 
@@ -569,34 +567,34 @@
   for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
 
     indent(out) << "/^" << (*f_iter)->get_key() << "$/ && do{";
-    indent(out) << "if ($ftype == " << type_to_enum((*f_iter)->get_type()) << ") {" << endl;
+    indent(out) << "if ($ftype == " << type_to_enum((*f_iter)->get_type()) << ") {" << '\n';
 
     indent_up();
     generate_deserialize_field(out, *f_iter, "self->");
     indent_down();
 
-    indent(out) << "} else {" << endl;
+    indent(out) << "} else {" << '\n';
 
-    indent(out) << "  $xfer += $input->skip($ftype);" << endl;
+    indent(out) << "  $xfer += $input->skip($ftype);" << '\n';
 
-    out << indent() << "}" << endl << indent() << "last; };" << endl;
+    out << indent() << "}" << '\n' << indent() << "last; };" << '\n';
   }
   // In the default case we skip the field
 
-  indent(out) << "  $xfer += $input->skip($ftype);" << endl;
+  indent(out) << "  $xfer += $input->skip($ftype);" << '\n';
 
   scope_down(out);
 
-  indent(out) << "$xfer += $input->readFieldEnd();" << endl;
+  indent(out) << "$xfer += $input->readFieldEnd();" << '\n';
 
   scope_down(out);
 
-  indent(out) << "$xfer += $input->readStructEnd();" << endl;
+  indent(out) << "$xfer += $input->readStructEnd();" << '\n';
 
-  indent(out) << "return $xfer;" << endl;
+  indent(out) << "return $xfer;" << '\n';
 
   indent_down();
-  out << indent() << "}" << endl << endl;
+  out << indent() << "}" << '\n' << '\n';
 }
 
 /**
@@ -607,38 +605,38 @@
   const vector<t_field*>& fields = tstruct->get_sorted_members();
   vector<t_field*>::const_iterator f_iter;
 
-  out << "sub write {" << endl;
+  out << "sub write {" << '\n';
 
   indent_up();
-  indent(out) << "my ($self, $output) = @_;" << endl;
-  indent(out) << "my $xfer   = 0;" << endl;
+  indent(out) << "my ($self, $output) = @_;" << '\n';
+  indent(out) << "my $xfer   = 0;" << '\n';
 
-  indent(out) << "$xfer += $output->writeStructBegin('" << name << "');" << endl;
+  indent(out) << "$xfer += $output->writeStructBegin('" << name << "');" << '\n';
 
   for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
-    out << indent() << "if (defined $self->{" << (*f_iter)->get_name() << "}) {" << endl;
+    out << indent() << "if (defined $self->{" << (*f_iter)->get_name() << "}) {" << '\n';
     indent_up();
 
     indent(out) << "$xfer += $output->writeFieldBegin("
                 << "'" << (*f_iter)->get_name() << "', " << type_to_enum((*f_iter)->get_type())
-                << ", " << (*f_iter)->get_key() << ");" << endl;
+                << ", " << (*f_iter)->get_key() << ");" << '\n';
 
     // Write field contents
     generate_serialize_field(out, *f_iter, "self->");
 
-    indent(out) << "$xfer += $output->writeFieldEnd();" << endl;
+    indent(out) << "$xfer += $output->writeFieldEnd();" << '\n';
 
     indent_down();
-    indent(out) << "}" << endl;
+    indent(out) << "}" << '\n';
   }
 
-  out << indent() << "$xfer += $output->writeFieldStop();" << endl << indent()
-      << "$xfer += $output->writeStructEnd();" << endl;
+  out << indent() << "$xfer += $output->writeFieldStop();" << '\n' << indent()
+      << "$xfer += $output->writeStructEnd();" << '\n';
 
-  out << indent() << "return $xfer;" << endl;
+  out << indent() << "return $xfer;" << '\n';
 
   indent_down();
-  out << indent() << "}" << endl << endl;
+  out << indent() << "}" << '\n' << '\n';
 }
 
 /**
@@ -655,13 +653,13 @@
     std::vector<t_program*>& currInc = current->get_includes();
     std::vector<t_program*>::size_type numInc = currInc.size();
     if (selfish) {
-      os << "use " << perl_namespace(current) << "Types;" << endl;
+      os << "use " << perl_namespace(current) << "Types;" << '\n';
     }
     for (std::vector<t_program*>::size_type i = 0; i < numInc; ++i) {
       t_program* incProgram = currInc.at(i);
-      os << "use " << perl_namespace(incProgram) << "Types;" << endl;
+      os << "use " << perl_namespace(incProgram) << "Types;" << '\n';
     }
-    os << endl;
+    os << '\n';
     done = true;
   }
 }
@@ -683,10 +681,10 @@
   t_service* extends_s = tservice->get_extends();
   if (extends_s != nullptr) {
     f_service_ << "use " << perl_namespace(extends_s->get_program()) << extends_s->get_name() << ";"
-               << endl;
+               << '\n';
   }
 
-  f_service_ << endl;
+  f_service_ << '\n';
 
   // Generate the three main parts of the service (well, two for now in PERL)
   generate_service_helpers(tservice);
@@ -696,7 +694,7 @@
   generate_service_processor(tservice);
 
   // Close service file
-  f_service_ << "1;" << endl;
+  f_service_ << "1;" << '\n';
   f_service_.close();
 }
 
@@ -721,59 +719,59 @@
   indent_up();
 
   // Generate the header portion
-  f_service_ << "package " << perl_namespace(program_) << service_name_ << "Processor;" << endl
-             << endl << "use strict;" << endl << extends_processor << endl << endl;
+  f_service_ << "package " << perl_namespace(program_) << service_name_ << "Processor;" << '\n'
+             << '\n' << "use strict;" << '\n' << extends_processor << '\n' << '\n';
 
   if (extends.empty()) {
-    f_service_ << "sub new {" << endl;
+    f_service_ << "sub new {" << '\n';
 
     indent_up();
 
-    f_service_ << indent() << "my ($classname, $handler) = @_;" << endl << indent()
-               << "my $self      = {};" << endl;
+    f_service_ << indent() << "my ($classname, $handler) = @_;" << '\n' << indent()
+               << "my $self      = {};" << '\n';
 
-    f_service_ << indent() << "$self->{handler} = $handler;" << endl;
+    f_service_ << indent() << "$self->{handler} = $handler;" << '\n';
 
-    f_service_ << indent() << "return bless ($self, $classname);" << endl;
+    f_service_ << indent() << "return bless ($self, $classname);" << '\n';
 
     indent_down();
 
-    f_service_ << "}" << endl << endl;
+    f_service_ << "}" << '\n' << '\n';
   }
 
   // Generate the server implementation
-  f_service_ << "sub process {" << endl;
+  f_service_ << "sub process {" << '\n';
   indent_up();
 
-  f_service_ << indent() << "my ($self, $input, $output) = @_;" << endl;
+  f_service_ << indent() << "my ($self, $input, $output) = @_;" << '\n';
 
-  f_service_ << indent() << "my $rseqid = 0;" << endl << indent() << "my $fname  = undef;" << endl
-             << indent() << "my $mtype  = 0;" << endl << endl;
+  f_service_ << indent() << "my $rseqid = 0;" << '\n' << indent() << "my $fname  = undef;" << '\n'
+             << indent() << "my $mtype  = 0;" << '\n' << '\n';
 
-  f_service_ << indent() << "$input->readMessageBegin(\\$fname, \\$mtype, \\$rseqid);" << endl;
+  f_service_ << indent() << "$input->readMessageBegin(\\$fname, \\$mtype, \\$rseqid);" << '\n';
 
   // HOT: check for method implementation
-  f_service_ << indent() << "my $methodname = 'process_'.$fname;" << endl << indent()
-             << "if (!$self->can($methodname)) {" << endl;
+  f_service_ << indent() << "my $methodname = 'process_'.$fname;" << '\n' << indent()
+             << "if (!$self->can($methodname)) {" << '\n';
   indent_up();
 
-  f_service_ << indent() << "$input->skip(Thrift::TType::STRUCT);" << endl << indent()
-             << "$input->readMessageEnd();" << endl << indent()
+  f_service_ << indent() << "$input->skip(Thrift::TType::STRUCT);" << '\n' << indent()
+             << "$input->readMessageEnd();" << '\n' << indent()
              << "my $x = Thrift::TApplicationException->new('Function '.$fname.' not implemented.', "
-                "Thrift::TApplicationException::UNKNOWN_METHOD);" << endl << indent()
-             << "$output->writeMessageBegin($fname, Thrift::TMessageType::EXCEPTION, $rseqid);" << endl
-             << indent() << "$x->write($output);" << endl << indent()
-             << "$output->writeMessageEnd();" << endl << indent()
-             << "$output->getTransport()->flush();" << endl << indent() << "return;" << endl;
+                "Thrift::TApplicationException::UNKNOWN_METHOD);" << '\n' << indent()
+             << "$output->writeMessageBegin($fname, Thrift::TMessageType::EXCEPTION, $rseqid);" << '\n'
+             << indent() << "$x->write($output);" << '\n' << indent()
+             << "$output->writeMessageEnd();" << '\n' << indent()
+             << "$output->getTransport()->flush();" << '\n' << indent() << "return;" << '\n';
 
   indent_down();
-  f_service_ << indent() << "}" << endl << indent()
-             << "$self->$methodname($rseqid, $input, $output);" << endl << indent() << "return 1;"
-             << endl;
+  f_service_ << indent() << "}" << '\n' << indent()
+             << "$self->$methodname($rseqid, $input, $output);" << '\n' << indent() << "return 1;"
+             << '\n';
 
   indent_down();
 
-  f_service_ << "}" << endl << endl;
+  f_service_ << "}" << '\n' << '\n';
 
   // Generate the process subfunctions
   for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
@@ -788,21 +786,21 @@
  */
 void t_perl_generator::generate_process_function(t_service* tservice, t_function* tfunction) {
   // Open function
-  f_service_ << "sub process_" << tfunction->get_name() << " {" << endl;
+  f_service_ << "sub process_" << tfunction->get_name() << " {" << '\n';
 
   indent_up();
 
-  f_service_ << indent() << "my ($self, $seqid, $input, $output) = @_;" << endl;
+  f_service_ << indent() << "my ($self, $seqid, $input, $output) = @_;" << '\n';
 
   string argsname = perl_namespace(tservice->get_program()) + service_name_ + "_"
                     + tfunction->get_name() + "_args";
   string resultname = perl_namespace(tservice->get_program()) + service_name_ + "_"
                       + tfunction->get_name() + "_result";
 
-  f_service_ << indent() << "my $args = " << argsname << "->new();" << endl << indent()
-             << "$args->read($input);" << endl;
+  f_service_ << indent() << "my $args = " << argsname << "->new();" << '\n' << indent()
+             << "$args->read($input);" << '\n';
 
-  f_service_ << indent() << "$input->readMessageEnd();" << endl;
+  f_service_ << indent() << "$input->readMessageEnd();" << '\n';
 
   t_struct* xs = tfunction->get_xceptions();
   const std::vector<t_field*>& xceptions = xs->get_members();
@@ -810,12 +808,12 @@
 
   // Declare result for non oneway function
   if (!tfunction->is_oneway()) {
-    f_service_ << indent() << "my $result = " << resultname << "->new();" << endl;
+    f_service_ << indent() << "my $result = " << resultname << "->new();" << '\n';
   }
 
   // Try block for a function with exceptions
   if (xceptions.size() > 0) {
-    f_service_ << indent() << "eval {" << endl;
+    f_service_ << indent() << "eval {" << '\n';
     indent_up();
   }
 
@@ -838,55 +836,55 @@
     }
     f_service_ << "$args->" << (*f_iter)->get_name();
   }
-  f_service_ << ");" << endl;
+  f_service_ << ");" << '\n';
 
   if (!tfunction->is_oneway() && xceptions.size() > 0) {
     indent_down();
     for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) {
       f_service_ << indent() << "}; if( UNIVERSAL::isa($@,'"
                  << perl_namespace((*x_iter)->get_type()->get_program())
-                 << (*x_iter)->get_type()->get_name() << "') ){ " << endl;
+                 << (*x_iter)->get_type()->get_name() << "') ){ " << '\n';
 
       indent_up();
-      f_service_ << indent() << "$result->{" << (*x_iter)->get_name() << "} = $@;" << endl;
-      f_service_ << indent() << "$@ = undef;" << endl;
+      f_service_ << indent() << "$result->{" << (*x_iter)->get_name() << "} = $@;" << '\n';
+      f_service_ << indent() << "$@ = undef;" << '\n';
       indent_down();
       f_service_ << indent();
     }
-    f_service_ << "}" << endl;
+    f_service_ << "}" << '\n';
 
     // catch-all for unexpected exceptions (THRIFT-3191)
-    f_service_ << indent() << "if ($@) {" << endl;
+    f_service_ << indent() << "if ($@) {" << '\n';
     indent_up();
-    f_service_ << indent() << "$@ =~ s/^\\s+|\\s+$//g;" << endl
-               << indent() << "my $err = Thrift::TApplicationException->new(\"Unexpected Exception: \" . $@, Thrift::TApplicationException::INTERNAL_ERROR);" << endl
-               << indent() << "$output->writeMessageBegin('" << tfunction->get_name() << "', Thrift::TMessageType::EXCEPTION, $seqid);" << endl
-               << indent() << "$err->write($output);" << endl
-               << indent() << "$output->writeMessageEnd();" << endl
-               << indent() << "$output->getTransport()->flush();" << endl
-               << indent() << "$@ = undef;" << endl
-               << indent() << "return;" << endl;
+    f_service_ << indent() << "$@ =~ s/^\\s+|\\s+$//g;" << '\n'
+               << indent() << "my $err = Thrift::TApplicationException->new(\"Unexpected Exception: \" . $@, Thrift::TApplicationException::INTERNAL_ERROR);" << '\n'
+               << indent() << "$output->writeMessageBegin('" << tfunction->get_name() << "', Thrift::TMessageType::EXCEPTION, $seqid);" << '\n'
+               << indent() << "$err->write($output);" << '\n'
+               << indent() << "$output->writeMessageEnd();" << '\n'
+               << indent() << "$output->getTransport()->flush();" << '\n'
+               << indent() << "$@ = undef;" << '\n'
+               << indent() << "return;" << '\n';
     indent_down();
-    f_service_ << indent() << "}" << endl;
+    f_service_ << indent() << "}" << '\n';
   }
 
   // Shortcut out here for oneway functions
   if (tfunction->is_oneway()) {
-    f_service_ << indent() << "return;" << endl;
+    f_service_ << indent() << "return;" << '\n';
     indent_down();
-    f_service_ << "}" << endl;
+    f_service_ << "}" << '\n';
     return;
   }
 
   // Serialize the reply
-  f_service_ << indent() << "$output->writeMessageBegin('" << tfunction->get_name() << "', Thrift::TMessageType::REPLY, $seqid);" << endl
-             << indent() << "$result->write($output);" << endl
-             << indent() << "$output->writeMessageEnd();" << endl
-             << indent() << "$output->getTransport()->flush();" << endl;
+  f_service_ << indent() << "$output->writeMessageBegin('" << tfunction->get_name() << "', Thrift::TMessageType::REPLY, $seqid);" << '\n'
+             << indent() << "$result->write($output);" << '\n'
+             << indent() << "$output->writeMessageEnd();" << '\n'
+             << indent() << "$output->getTransport()->flush();" << '\n';
 
   // Close function
   indent_down();
-  f_service_ << "}" << endl << endl;
+  f_service_ << "}" << '\n' << '\n';
 }
 
 /**
@@ -898,7 +896,7 @@
   vector<t_function*> functions = tservice->get_functions();
   vector<t_function*>::iterator f_iter;
 
-  f_service_ << "# HELPER FUNCTIONS AND STRUCTURES" << endl << endl;
+  f_service_ << "# HELPER FUNCTIONS AND STRUCTURES" << '\n' << '\n';
 
   for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
     t_struct* ts = (*f_iter)->get_arglist();
@@ -945,15 +943,15 @@
                  + "If);";
   }
 
-  f_service_ << "package " << perl_namespace(program_) << service_name_ << "If;" << endl << endl
-             << "use strict;" << endl << extends_if << endl << endl;
+  f_service_ << "package " << perl_namespace(program_) << service_name_ << "If;" << '\n' << '\n'
+             << "use strict;" << '\n' << extends_if << '\n' << '\n';
 
   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) {
-    f_service_ << "sub " << function_signature(*f_iter) << endl << "  die 'implement interface';\n}"
-               << endl << endl;
+    f_service_ << "sub " << function_signature(*f_iter) << '\n' << "  die 'implement interface';\n}"
+               << '\n' << '\n';
   }
   indent_down();
 }
@@ -970,31 +968,31 @@
     extends_if = "use base qw(" + perl_namespace(extends_s->get_program()) + extends_s->get_name()
                  + "Rest);";
   }
-  f_service_ << "package " << perl_namespace(program_) << service_name_ << "Rest;" << endl << endl
-             << "use strict;" << endl << extends_if << endl << endl;
+  f_service_ << "package " << perl_namespace(program_) << service_name_ << "Rest;" << '\n' << '\n'
+             << "use strict;" << '\n' << extends_if << '\n' << '\n';
 
   if (extends.empty()) {
-    f_service_ << "sub new {" << endl;
+    f_service_ << "sub new {" << '\n';
 
     indent_up();
 
-    f_service_ << indent() << "my ($classname, $impl) = @_;" << endl << indent()
-               << "my $self     ={ impl => $impl };" << endl << endl << indent()
-               << "return bless($self,$classname);" << endl;
+    f_service_ << indent() << "my ($classname, $impl) = @_;" << '\n' << indent()
+               << "my $self     ={ impl => $impl };" << '\n' << '\n' << indent()
+               << "return bless($self,$classname);" << '\n';
 
     indent_down();
 
-    f_service_ << "}" << endl << endl;
+    f_service_ << "}" << '\n' << '\n';
   }
 
   vector<t_function*> functions = tservice->get_functions();
   vector<t_function*>::iterator f_iter;
   for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
-    f_service_ << "sub " << (*f_iter)->get_name() << "{" << endl;
+    f_service_ << "sub " << (*f_iter)->get_name() << "{" << '\n';
 
     indent_up();
 
-    f_service_ << indent() << "my ($self, $request) = @_;" << endl << endl;
+    f_service_ << indent() << "my ($self, $request) = @_;" << '\n' << '\n';
 
     const vector<t_field*>& args = (*f_iter)->get_arglist()->get_members();
     vector<t_field*>::const_iterator a_iter;
@@ -1002,19 +1000,19 @@
       //t_type* atype = get_true_type((*a_iter)->get_type());
       string req = "$request->{'" + (*a_iter)->get_name() + "'}";
       f_service_ << indent() << "my $" << (*a_iter)->get_name() << " = (" << req << ") ? " << req
-                 << " : undef;" << endl;
+                 << " : undef;" << '\n';
       /* slist no longer supported
       if (atype->is_string() && ((t_base_type*)atype)->is_string_list()) {
         f_service_ << indent() << "my @" << (*a_iter)->get_name() << " = split(/,/, $"
-                   << (*a_iter)->get_name() << ");" << endl << indent() << "$"
-                   << (*a_iter)->get_name() << " = \\@" << (*a_iter)->get_name() << endl;
+                   << (*a_iter)->get_name() << ");" << '\n' << indent() << "$"
+                   << (*a_iter)->get_name() << " = \\@" << (*a_iter)->get_name() << '\n';
       }
       */
     }
     f_service_ << indent() << "return $self->{impl}->" << (*f_iter)->get_name() << "("
-               << argument_list((*f_iter)->get_arglist()) << ");" << endl;
+               << argument_list((*f_iter)->get_arglist()) << ");" << '\n';
     indent_down();
-    indent(f_service_) << "}" << endl << endl;
+    indent(f_service_) << "}" << '\n' << '\n';
   }
 }
 
@@ -1032,31 +1030,31 @@
     extends_client = "use base qw(" + extends + "Client);";
   }
 
-  f_service_ << "package " << perl_namespace(program_) << service_name_ << "Client;" << endl << endl
-             << extends_client << endl << "use base qw(" << perl_namespace(program_)
-             << service_name_ << "If);" << endl;
+  f_service_ << "package " << perl_namespace(program_) << service_name_ << "Client;" << '\n' << '\n'
+             << extends_client << '\n' << "use base qw(" << perl_namespace(program_)
+             << service_name_ << "If);" << '\n';
 
   // Constructor function
-  f_service_ << "sub new {" << endl;
+  f_service_ << "sub new {" << '\n';
 
   indent_up();
 
-  f_service_ << indent() << "my ($classname, $input, $output) = @_;" << endl << indent()
-             << "my $self      = {};" << endl;
+  f_service_ << indent() << "my ($classname, $input, $output) = @_;" << '\n' << indent()
+             << "my $self      = {};" << '\n';
 
   if (!extends.empty()) {
-    f_service_ << indent() << "$self = $classname->SUPER::new($input, $output);" << endl;
+    f_service_ << indent() << "$self = $classname->SUPER::new($input, $output);" << '\n';
   } else {
-    f_service_ << indent() << "$self->{input}  = $input;" << endl << indent()
-               << "$self->{output} = defined $output ? $output : $input;" << endl << indent()
-               << "$self->{seqid}  = 0;" << endl;
+    f_service_ << indent() << "$self->{input}  = $input;" << '\n' << indent()
+               << "$self->{output} = defined $output ? $output : $input;" << '\n' << indent()
+               << "$self->{seqid}  = 0;" << '\n';
   }
 
-  f_service_ << indent() << "return bless($self,$classname);" << endl;
+  f_service_ << indent() << "return bless($self,$classname);" << '\n';
 
   indent_down();
 
-  f_service_ << "}" << endl << endl;
+  f_service_ << "}" << '\n' << '\n';
 
   // Generate client method implementations
   vector<t_function*> functions = tservice->get_functions();
@@ -1068,7 +1066,7 @@
     string funname = (*f_iter)->get_name();
 
     // Open function
-    f_service_ << "sub " << function_signature(*f_iter) << endl;
+    f_service_ << "sub " << function_signature(*f_iter) << '\n';
 
     indent_up();
 
@@ -1083,21 +1081,21 @@
       }
       f_service_ << "$" << (*fld_iter)->get_name();
     }
-    f_service_ << ");" << endl;
+    f_service_ << ");" << '\n';
 
     if (!(*f_iter)->is_oneway()) {
       f_service_ << indent();
       if (!(*f_iter)->get_returntype()->is_void()) {
         f_service_ << "return ";
       }
-      f_service_ << "$self->recv_" << funname << "();" << endl;
+      f_service_ << "$self->recv_" << funname << "();" << '\n';
     }
 
     indent_down();
 
-    f_service_ << "}" << endl << endl;
+    f_service_ << "}" << '\n' << '\n';
 
-    f_service_ << "sub send_" << function_signature(*f_iter) << endl;
+    f_service_ << "sub send_" << function_signature(*f_iter) << '\n';
 
     indent_up();
 
@@ -1107,23 +1105,23 @@
     // Serialize the request header
     f_service_ << indent() << "$self->{output}->writeMessageBegin('" << (*f_iter)->get_name()
                << "', " << ((*f_iter)->is_oneway() ? "Thrift::TMessageType::ONEWAY" : "Thrift::TMessageType::CALL")
-               << ", $self->{seqid});" << endl;
+               << ", $self->{seqid});" << '\n';
 
-    f_service_ << indent() << "my $args = " << argsname << "->new();" << endl;
+    f_service_ << indent() << "my $args = " << argsname << "->new();" << '\n';
 
     for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) {
       f_service_ << indent() << "$args->{" << (*fld_iter)->get_name() << "} = $"
-                 << (*fld_iter)->get_name() << ";" << endl;
+                 << (*fld_iter)->get_name() << ";" << '\n';
     }
 
     // Write to the stream
-    f_service_ << indent() << "$args->write($self->{output});" << endl << indent()
-               << "$self->{output}->writeMessageEnd();" << endl << indent()
-               << "$self->{output}->getTransport()->flush();" << endl;
+    f_service_ << indent() << "$args->write($self->{output});" << '\n' << indent()
+               << "$self->{output}->writeMessageEnd();" << '\n' << indent()
+               << "$self->{output}->getTransport()->flush();" << '\n';
 
     indent_down();
 
-    f_service_ << "}" << endl;
+    f_service_ << "}" << '\n';
 
     if (!(*f_iter)->is_oneway()) {
       std::string resultname = perl_namespace(tservice->get_program()) + service_name_ + "_"
@@ -1134,29 +1132,29 @@
                                string("recv_") + (*f_iter)->get_name(),
                                &noargs);
       // Open function
-      f_service_ << endl << "sub " << function_signature(&recv_function) << endl;
+      f_service_ << '\n' << "sub " << function_signature(&recv_function) << '\n';
 
       indent_up();
 
-      f_service_ << indent() << "my $rseqid = 0;" << endl << indent() << "my $fname;" << endl
-                 << indent() << "my $mtype = 0;" << endl << endl;
+      f_service_ << indent() << "my $rseqid = 0;" << '\n' << indent() << "my $fname;" << '\n'
+                 << indent() << "my $mtype = 0;" << '\n' << '\n';
 
       f_service_ << indent() << "$self->{input}->readMessageBegin(\\$fname, \\$mtype, \\$rseqid);"
-                 << endl << indent() << "if ($mtype == Thrift::TMessageType::EXCEPTION) {" << endl
-                 << indent() << "  my $x = Thrift::TApplicationException->new();" << endl << indent()
-                 << "  $x->read($self->{input});" << endl << indent()
-                 << "  $self->{input}->readMessageEnd();" << endl << indent() << "  die $x;" << endl
-                 << indent() << "}" << endl;
+                 << '\n' << indent() << "if ($mtype == Thrift::TMessageType::EXCEPTION) {" << '\n'
+                 << indent() << "  my $x = Thrift::TApplicationException->new();" << '\n' << indent()
+                 << "  $x->read($self->{input});" << '\n' << indent()
+                 << "  $self->{input}->readMessageEnd();" << '\n' << indent() << "  die $x;" << '\n'
+                 << indent() << "}" << '\n';
 
-      f_service_ << indent() << "my $result = " << resultname << "->new();" << endl << indent()
-                 << "$result->read($self->{input});" << endl;
+      f_service_ << indent() << "my $result = " << resultname << "->new();" << '\n' << indent()
+                 << "$result->read($self->{input});" << '\n';
 
-      f_service_ << indent() << "$self->{input}->readMessageEnd();" << endl << endl;
+      f_service_ << indent() << "$self->{input}->readMessageEnd();" << '\n' << '\n';
 
       // Careful, only return result if not a void function
       if (!(*f_iter)->get_returntype()->is_void()) {
-        f_service_ << indent() << "if (defined $result->{success} ) {" << endl << indent()
-                   << "  return $result->{success};" << endl << indent() << "}" << endl;
+        f_service_ << indent() << "if (defined $result->{success} ) {" << '\n' << indent()
+                   << "  return $result->{success};" << '\n' << indent() << "}" << '\n';
       }
 
       t_struct* xs = (*f_iter)->get_xceptions();
@@ -1164,21 +1162,21 @@
       vector<t_field*>::const_iterator x_iter;
       for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) {
         f_service_ << indent() << "if (defined $result->{" << (*x_iter)->get_name() << "}) {"
-                   << endl << indent() << "  die $result->{" << (*x_iter)->get_name() << "};"
-                   << endl << indent() << "}" << endl;
+                   << '\n' << indent() << "  die $result->{" << (*x_iter)->get_name() << "};"
+                   << '\n' << indent() << "}" << '\n';
       }
 
       // Careful, only return _result if not a void function
       if ((*f_iter)->get_returntype()->is_void()) {
-        indent(f_service_) << "return;" << endl;
+        indent(f_service_) << "return;" << '\n';
       } else {
         f_service_ << indent() << "die \"" << (*f_iter)->get_name() << " failed: unknown result\";"
-                   << endl;
+                   << '\n';
       }
 
       // Close function
       indent_down();
-      f_service_ << "}" << endl;
+      f_service_ << "}" << '\n';
     }
   }
 }
@@ -1244,7 +1242,7 @@
     } else if (type->is_enum()) {
       out << "readI32(\\$" << name << ");";
     }
-    out << endl;
+    out << '\n';
 
   } else {
     printf("DO NOT KNOW HOW TO DESERIALIZE FIELD '%s' TYPE '%s'\n",
@@ -1263,8 +1261,8 @@
                                                    t_struct* tstruct,
                                                    string prefix) {
   out << indent() << "$" << prefix << " = " << perl_namespace(tstruct->get_program())
-      << tstruct->get_name() << "->new();" << endl << indent() << "$xfer += $" << prefix
-      << "->read($input);" << endl;
+      << tstruct->get_name() << "->new();" << '\n' << indent() << "$xfer += $" << prefix
+      << "->read($input);" << '\n';
 }
 
 void t_perl_generator::generate_deserialize_container(ostream& out, t_type* ttype, string prefix) {
@@ -1280,33 +1278,33 @@
   t_field fvtype(g_type_i8, vtype);
   t_field fetype(g_type_i8, etype);
 
-  out << indent() << "my $" << size << " = 0;" << endl;
+  out << indent() << "my $" << size << " = 0;" << '\n';
 
   // Declare variables, read header
   if (ttype->is_map()) {
-    out << indent() << "$" << prefix << " = {};" << endl << indent() << "my $" << ktype << " = 0;"
-        << endl << indent() << "my $" << vtype << " = 0;" << endl;
+    out << indent() << "$" << prefix << " = {};" << '\n' << indent() << "my $" << ktype << " = 0;"
+        << '\n' << indent() << "my $" << vtype << " = 0;" << '\n';
 
     out << indent() << "$xfer += $input->readMapBegin("
-        << "\\$" << ktype << ", \\$" << vtype << ", \\$" << size << ");" << endl;
+        << "\\$" << ktype << ", \\$" << vtype << ", \\$" << size << ");" << '\n';
 
   } else if (ttype->is_set()) {
 
-    out << indent() << "$" << prefix << " = {};" << endl << indent() << "my $" << etype << " = 0;"
-        << endl << indent() << "$xfer += $input->readSetBegin("
-        << "\\$" << etype << ", \\$" << size << ");" << endl;
+    out << indent() << "$" << prefix << " = {};" << '\n' << indent() << "my $" << etype << " = 0;"
+        << '\n' << indent() << "$xfer += $input->readSetBegin("
+        << "\\$" << etype << ", \\$" << size << ");" << '\n';
 
   } else if (ttype->is_list()) {
 
-    out << indent() << "$" << prefix << " = [];" << endl << indent() << "my $" << etype << " = 0;"
-        << endl << indent() << "$xfer += $input->readListBegin("
-        << "\\$" << etype << ", \\$" << size << ");" << endl;
+    out << indent() << "$" << prefix << " = [];" << '\n' << indent() << "my $" << etype << " = 0;"
+        << '\n' << indent() << "$xfer += $input->readListBegin("
+        << "\\$" << etype << ", \\$" << size << ");" << '\n';
   }
 
   // For loop iterates over elements
   string i = tmp("_i");
   indent(out) << "for (my $" << i << " = 0; $" << i << " < $" << size << "; ++$" << i << ")"
-              << endl;
+              << '\n';
 
   scope_up(out);
 
@@ -1322,11 +1320,11 @@
 
   // Read container end
   if (ttype->is_map()) {
-    indent(out) << "$xfer += $input->readMapEnd();" << endl;
+    indent(out) << "$xfer += $input->readMapEnd();" << '\n';
   } else if (ttype->is_set()) {
-    indent(out) << "$xfer += $input->readSetEnd();" << endl;
+    indent(out) << "$xfer += $input->readSetEnd();" << '\n';
   } else if (ttype->is_list()) {
-    indent(out) << "$xfer += $input->readListEnd();" << endl;
+    indent(out) << "$xfer += $input->readListEnd();" << '\n';
   }
 
   scope_down(out);
@@ -1341,24 +1339,24 @@
   t_field fkey(tmap->get_key_type(), key);
   t_field fval(tmap->get_val_type(), val);
 
-  indent(out) << declare_field(&fkey, true, true) << endl;
-  indent(out) << declare_field(&fval, true, true) << endl;
+  indent(out) << declare_field(&fkey, true, true) << '\n';
+  indent(out) << declare_field(&fval, true, true) << '\n';
 
   generate_deserialize_field(out, &fkey);
   generate_deserialize_field(out, &fval);
 
-  indent(out) << "$" << prefix << "->{$" << key << "} = $" << val << ";" << endl;
+  indent(out) << "$" << prefix << "->{$" << key << "} = $" << val << ";" << '\n';
 }
 
 void t_perl_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) << "my $" << elem << " = undef;" << endl;
+  indent(out) << "my $" << elem << " = undef;" << '\n';
 
   generate_deserialize_field(out, &felem);
 
-  indent(out) << "$" << prefix << "->{$" << elem << "} = 1;" << endl;
+  indent(out) << "$" << prefix << "->{$" << elem << "} = 1;" << '\n';
 }
 
 void t_perl_generator::generate_deserialize_list_element(ostream& out,
@@ -1367,11 +1365,11 @@
   string elem = tmp("elem");
   t_field felem(tlist->get_elem_type(), elem);
 
-  indent(out) << "my $" << elem << " = undef;" << endl;
+  indent(out) << "my $" << elem << " = undef;" << '\n';
 
   generate_deserialize_field(out, &felem);
 
-  indent(out) << "push(@{$" << prefix << "},$" << elem << ");" << endl;
+  indent(out) << "push(@{$" << prefix << "},$" << elem << ");" << '\n';
 }
 
 /**
@@ -1435,7 +1433,7 @@
     } else if (type->is_enum()) {
       out << "writeI32($" << name << ");";
     }
-    out << endl;
+    out << '\n';
 
   } else {
     printf("DO NOT KNOW HOW TO SERIALIZE FIELD '%s%s' TYPE '%s'\n",
@@ -1453,7 +1451,7 @@
  */
 void t_perl_generator::generate_serialize_struct(ostream& out, t_struct* tstruct, string prefix) {
   (void)tstruct;
-  indent(out) << "$xfer += $" << prefix << "->write($output);" << endl;
+  indent(out) << "$xfer += $" << prefix << "->write($output);" << '\n';
 }
 
 /**
@@ -1466,17 +1464,17 @@
     indent(out) << "$xfer += $output->writeMapBegin("
                 << type_to_enum(((t_map*)ttype)->get_key_type()) << ", "
                 << type_to_enum(((t_map*)ttype)->get_val_type()) << ", "
-                << "scalar(keys %{$" << prefix << "}));" << endl;
+                << "scalar(keys %{$" << prefix << "}));" << '\n';
   } else if (ttype->is_set()) {
     indent(out) << "$xfer += $output->writeSetBegin("
                 << type_to_enum(((t_set*)ttype)->get_elem_type()) << ", "
-                << "scalar(@{$" << prefix << "}));" << endl;
+                << "scalar(@{$" << prefix << "}));" << '\n';
 
   } else if (ttype->is_list()) {
 
     indent(out) << "$xfer += $output->writeListBegin("
                 << type_to_enum(((t_list*)ttype)->get_elem_type()) << ", "
-                << "scalar(@{$" << prefix << "}));" << endl;
+                << "scalar(@{$" << prefix << "}));" << '\n';
   }
 
   scope_up(out);
@@ -1485,7 +1483,7 @@
     string kiter = tmp("kiter");
     string viter = tmp("viter");
     indent(out) << "while( my ($" << kiter << ",$" << viter << ") = each %{$" << prefix << "}) "
-                << endl;
+                << '\n';
 
     scope_up(out);
     generate_serialize_map_element(out, (t_map*)ttype, kiter, viter);
@@ -1493,14 +1491,14 @@
 
   } else if (ttype->is_set()) {
     string iter = tmp("iter");
-    indent(out) << "foreach my $" << iter << " (@{$" << prefix << "})" << endl;
+    indent(out) << "foreach my $" << iter << " (@{$" << prefix << "})" << '\n';
     scope_up(out);
     generate_serialize_set_element(out, (t_set*)ttype, iter);
     scope_down(out);
 
   } else if (ttype->is_list()) {
     string iter = tmp("iter");
-    indent(out) << "foreach my $" << iter << " (@{$" << prefix << "}) " << endl;
+    indent(out) << "foreach my $" << iter << " (@{$" << prefix << "}) " << '\n';
     scope_up(out);
     generate_serialize_list_element(out, (t_list*)ttype, iter);
     scope_down(out);
@@ -1509,11 +1507,11 @@
   scope_down(out);
 
   if (ttype->is_map()) {
-    indent(out) << "$xfer += $output->writeMapEnd();" << endl;
+    indent(out) << "$xfer += $output->writeMapEnd();" << '\n';
   } else if (ttype->is_set()) {
-    indent(out) << "$xfer += $output->writeSetEnd();" << endl;
+    indent(out) << "$xfer += $output->writeSetEnd();" << '\n';
   } else if (ttype->is_list()) {
-    indent(out) << "$xfer += $output->writeListEnd();" << endl;
+    indent(out) << "$xfer += $output->writeListEnd();" << '\n';
   }
 
   scope_down(out);
diff --git a/compiler/cpp/src/thrift/generate/t_php_generator.cc b/compiler/cpp/src/thrift/generate/t_php_generator.cc
index 8373858..6879501 100644
--- a/compiler/cpp/src/thrift/generate/t_php_generator.cc
+++ b/compiler/cpp/src/thrift/generate/t_php_generator.cc
@@ -35,8 +35,6 @@
 using std::stringstream;
 using std::vector;
 
-static const string endl = "\n"; // avoid ostream << std::endl flushes
-
 #define NSGLOBAL (nsglobal_.size() ? nsglobal_ : "")
 #define NSGLOBAL_A ("\\" + NSGLOBAL)
 #define NSGLOBAL_B (NSGLOBAL + "\\")
@@ -62,7 +60,7 @@
     validate_ = false;
     json_serializable_ = false;
     getters_setters_ = false;
-        
+
     nsglobal_ = ""; // by default global namespace is empty
     classmap_ = false;
     for (iter = parsed_options.begin(); iter != parsed_options.end(); ++iter) {
@@ -513,28 +511,28 @@
  * Generates service header contains namespace suffix and includes inside file specified
  */
 void t_php_generator::generate_service_header(t_service* tservice, std::ostream& file) {
-  file << "<?php" << endl;
+  file << "<?php" << '\n';
   if (!php_namespace_suffix(tservice->get_program()).empty()) {
-    file << "namespace " << php_namespace_suffix(tservice->get_program()) << ";" << endl
-         << endl;
+    file << "namespace " << php_namespace_suffix(tservice->get_program()) << ";" << '\n'
+         << '\n';
   }
   file << autogen_comment() << php_includes();
 
-  file << endl;
+  file << '\n';
 }
 
 /**
  * Generates program header contains namespace suffix and includes inside file specified
  */
 void t_php_generator::generate_program_header(std::ostream& file) {
-  file << "<?php" << endl;
+  file << "<?php" << '\n';
   if (!php_namespace_suffix(get_program()).empty()) {
-    file << "namespace " << php_namespace_suffix(get_program()) << ";" << endl
-         << endl;
+    file << "namespace " << php_namespace_suffix(get_program()) << ";" << '\n'
+         << '\n';
   }
   file << autogen_comment() << php_includes();
 
-  file << endl;
+  file << '\n';
 }
 
 /**
@@ -558,30 +556,30 @@
   // code but you can't do things like an 'extract' on it, which is a bit of
   // a downer.
   generate_php_doc(f_enum, tenum);
-  f_enum << "final class " << tenum->get_name() << endl
-         << "{" << endl;
+  f_enum << "final class " << tenum->get_name() << '\n'
+         << "{" << '\n';
   indent_up();
 
   for (c_iter = constants.begin(); c_iter != constants.end(); ++c_iter) {
     int value = (*c_iter)->get_value();
     generate_php_doc(f_enum, *c_iter);
-    indent(f_enum) << "const " << (*c_iter)->get_name() << " = " << value << ";" << endl
-                   << endl;
+    indent(f_enum) << "const " << (*c_iter)->get_name() << " = " << value << ";" << '\n'
+                   << '\n';
   }
 
-  indent(f_enum) << "static public $__names = array(" << endl;
+  indent(f_enum) << "static public $__names = array(" << '\n';
 
   indent_up();
   for (c_iter = constants.begin(); c_iter != constants.end(); ++c_iter) {
     int value = (*c_iter)->get_value();
-    indent(f_enum) << value << " => '" << (*c_iter)->get_name() << "'," << endl;
+    indent(f_enum) << value << " => '" << (*c_iter)->get_name() << "'," << '\n';
   }
   indent_down();
-  indent(f_enum) << ");" << endl;
+  indent(f_enum) << ");" << '\n';
 
   indent_down();
 
-  f_enum << "}" << endl << endl;
+  f_enum << "}" << '\n' << '\n';
   if (!classmap_) {
     f_enum.close();
   }
@@ -604,8 +602,8 @@
       f_consts.open(f_consts_name.c_str());
       generate_program_header(f_consts);
     }
-    f_consts << "final class Constant extends \\Thrift\\Type\\TConstant"<< endl
-             << "{" << endl;
+    f_consts << "final class Constant extends \\Thrift\\Type\\TConstant"<< '\n'
+             << "{" << '\n';
 
     indent_up();
 
@@ -613,30 +611,30 @@
     for (c_iter = consts.begin(); c_iter != consts.end(); ++c_iter) {
       string name = (*c_iter)->get_name();
 
-      indent(f_consts) << "static protected $" << name << ";" << endl;
+      indent(f_consts) << "static protected $" << name << ";" << '\n';
     }
 
     // Create init function
     for (c_iter = consts.begin(); c_iter != consts.end(); ++c_iter) {
       string name = (*c_iter)->get_name();
 
-      f_consts << endl;
+      f_consts << '\n';
 
-      f_consts << indent() << "protected static function init_" << name << "()" <<endl
-               << indent() << "{" << endl;
+      f_consts << indent() << "protected static function init_" << name << "()" << '\n'
+               << indent() << "{" << '\n';
       indent_up();
 
       indent(f_consts) << "return ";
       generate_php_doc(f_consts, *c_iter);
       f_consts << render_const_value((*c_iter)->get_type(), (*c_iter)->get_value());
-      f_consts << ";" << endl;
+      f_consts << ";" << '\n';
 
       indent_down();
-      indent(f_consts) << "}" << endl;
+      indent(f_consts) << "}" << '\n';
     }
 
     indent_down();
-    f_consts << "}" << endl;
+    f_consts << "}" << '\n';
     if (!classmap_) {
       f_consts.close();
     }
@@ -679,7 +677,7 @@
   } else if (type->is_enum()) {
     indent(out) << value->get_integer();
   } else if (type->is_struct() || type->is_xception()) {
-    out << "new " << php_namespace(type->get_program()) << type->get_name() << "(array(" << endl;
+    out << "new " << php_namespace(type->get_program()) << type->get_name() << "(array(" << '\n';
     indent_up();
     const vector<t_field*>& fields = ((t_struct*)type)->get_members();
     vector<t_field*>::const_iterator f_iter;
@@ -699,14 +697,14 @@
       out << render_const_value(g_type_string, v_iter->first);
       out << " => ";
       out << render_const_value(field_type, v_iter->second);
-      out << "," << endl;
+      out << "," << '\n';
     }
     indent_down();
     indent(out) << "))";
   } else if (type->is_map()) {
     t_type* ktype = ((t_map*)type)->get_key_type();
     t_type* vtype = ((t_map*)type)->get_val_type();
-    out << "array(" << endl;
+    out << "array(" << '\n';
     indent_up();
     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;
@@ -715,7 +713,7 @@
       out << render_const_value(ktype, v_iter->first);
       out << " => ";
       out << render_const_value(vtype, v_iter->second);
-      out << "," << endl;
+      out << "," << '\n';
     }
     indent_down();
     indent(out) << ")";
@@ -726,7 +724,7 @@
     } else {
       etype = ((t_set*)type)->get_elem_type();
     }
-    out << "array(" << endl;
+    out << "array(" << '\n';
     indent_up();
     const vector<t_const_value*>& val = value->get_list();
     vector<t_const_value*>::const_iterator v_iter;
@@ -736,7 +734,7 @@
       if (type->is_set()) {
         out << " => true";
       }
-      out << "," << endl;
+      out << "," << '\n';
     }
     indent_down();
     indent(out) << ")";
@@ -779,27 +777,27 @@
 
 void t_php_generator::generate_php_type_spec(ostream& out, t_type* t) {
   t = get_true_type(t);
-  indent(out) << "'type' => " << type_to_enum(t) << "," << endl;
+  indent(out) << "'type' => " << type_to_enum(t) << "," << '\n';
 
   if (t->is_base_type()) {
     // Noop, type is all we need
   } else if (t->is_struct() || t->is_xception() || t->is_enum()) {
     indent(out) << "'class' => '" << php_namespace(t->get_program()) << t->get_name() << "',"
-                << endl;
+                << '\n';
   } else if (t->is_map()) {
     t_type* ktype = get_true_type(((t_map*)t)->get_key_type());
     t_type* vtype = get_true_type(((t_map*)t)->get_val_type());
-    indent(out) << "'ktype' => " << type_to_enum(ktype) << "," << endl;
-    indent(out) << "'vtype' => " << type_to_enum(vtype) << "," << endl;
-    indent(out) << "'key' => array(" << endl;
+    indent(out) << "'ktype' => " << type_to_enum(ktype) << "," << '\n';
+    indent(out) << "'vtype' => " << type_to_enum(vtype) << "," << '\n';
+    indent(out) << "'key' => array(" << '\n';
     indent_up();
     generate_php_type_spec(out, ktype);
     indent_down();
-    indent(out) << ")," << endl;
-    indent(out) << "'val' => array(" << endl;
+    indent(out) << ")," << '\n';
+    indent(out) << "'val' => array(" << '\n';
     indent_up();
     generate_php_type_spec(out, vtype);
-    indent(out) << ")," << endl;
+    indent(out) << ")," << '\n';
     indent_down();
   } else if (t->is_list() || t->is_set()) {
     t_type* etype;
@@ -808,11 +806,11 @@
     } else {
       etype = get_true_type(((t_set*)t)->get_elem_type());
     }
-    indent(out) << "'etype' => " << type_to_enum(etype) << "," << endl;
-    indent(out) << "'elem' => array(" << endl;
+    indent(out) << "'etype' => " << type_to_enum(etype) << "," << '\n';
+    indent(out) << "'elem' => array(" << '\n';
     indent_up();
     generate_php_type_spec(out, etype);
-    indent(out) << ")," << endl;
+    indent(out) << ")," << '\n';
     indent_down();
   } else {
     throw "compiler error: no type for php struct spec field";
@@ -824,24 +822,24 @@
  * type information to generalize serialization routines.
  */
 void t_php_generator::generate_php_struct_spec(ostream& out, t_struct* tstruct) {
-  indent(out) << "static public $_TSPEC = array(" << endl;
+  indent(out) << "static public $_TSPEC = array(" << '\n';
   indent_up();
 
   const vector<t_field*>& members = tstruct->get_members();
   vector<t_field*>::const_iterator m_iter;
   for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
     t_type* t = get_true_type((*m_iter)->get_type());
-    indent(out) << (*m_iter)->get_key() << " => array(" << endl;
+    indent(out) << (*m_iter)->get_key() << " => array(" << '\n';
     indent_up();
-    out << indent() << "'var' => '" << (*m_iter)->get_name() << "'," << endl;
-    out << indent() << "'isRequired' => " << ((*m_iter)->get_req() == t_field::T_REQUIRED ? "true" : "false") << "," << endl;
+    out << indent() << "'var' => '" << (*m_iter)->get_name() << "'," << '\n';
+    out << indent() << "'isRequired' => " << ((*m_iter)->get_req() == t_field::T_REQUIRED ? "true" : "false") << "," << '\n';
     generate_php_type_spec(out, t);
     indent_down();
-    indent(out) << ")," << endl;
+    indent(out) << ")," << '\n';
   }
 
   indent_down();
-  indent(out) << ");" << endl << endl;
+  indent(out) << ");" << '\n' << '\n';
 }
 /**
  * Generates necessary accessors and mutators for the fields
@@ -865,10 +863,10 @@
     indent_down();
   }
 
-  indent(out) << endl;
+  indent(out) << '\n';
   out << getter_stream.str();
   out << setter_stream.str();
-  indent(out) << endl;
+  indent(out) << '\n';
 }
 /**
  * Generates a getter for the generated private fields
@@ -878,16 +876,16 @@
                                                    string cap_name) {
 
 
-  out << indent() << "public function " << "get" << cap_name << "()" << endl
-      << indent() << "{" << endl;
+  out << indent() << "public function " << "get" << cap_name << "()" << '\n'
+      << indent() << "{" << '\n';
 
   indent_up();
 
-  out << indent() << "return $this->" << field_name << ";" << endl;
+  out << indent() << "return $this->" << field_name << ";" << '\n';
 
   indent_down();
-  out << indent() << "}" << endl;
-  out << endl;
+  out << indent() << "}" << '\n';
+  out << '\n';
 }
 /**
  * Generates a setter for the generated private fields
@@ -896,17 +894,17 @@
                           string field_name,
                           string cap_name) {
 
-  out << indent() << "public function set" << cap_name << "(" << "$" << field_name << ")" << endl
-      << indent() << "{" << endl;
+  out << indent() << "public function set" << cap_name << "(" << "$" << field_name << ")" << '\n'
+      << indent() << "{" << '\n';
 
   indent_up();
 
-  out << indent() << "$this->" << field_name << " = $" << field_name << ";" << endl;
+  out << indent() << "$this->" << field_name << " = $" << field_name << ";" << '\n';
 
 
   indent_down();
-  out << indent() << "}" << endl;
-  out << endl;
+  out << indent() << "}" << '\n';
+  out << '\n';
 }
 /**
  * Gets the first-letter capitalized name for the field
@@ -943,11 +941,11 @@
   if (json_serializable_) {
     out << " implements JsonSerializable";
   }
-  out << endl
-      << "{" << endl;
+  out << '\n'
+      << "{" << '\n';
   indent_up();
 
-  out << indent() << "static public $isValidate = " << (validate_ ? "true" : "false") << ";" << endl << endl;
+  out << indent() << "static public $isValidate = " << (validate_ ? "true" : "false") << ";" << '\n' << '\n';
 
   generate_php_struct_spec(out, tstruct);
 
@@ -959,15 +957,15 @@
     }
     generate_php_doc(out, *m_iter);
     string access = (getters_setters_) ? "private" : "public";
-    indent(out) << access << " $" << (*m_iter)->get_name() << " = " << dval << ";" << endl;
+    indent(out) << access << " $" << (*m_iter)->get_name() << " = " << dval << ";" << '\n';
   }
 
-  out << endl;
+  out << '\n';
 
   // Generate constructor from array
   string param = (members.size() > 0) ? "$vals = null" : "";
-  out << indent() << "public function __construct(" << param << ")"<< endl
-      << indent() << "{" << endl;
+  out << indent() << "public function __construct(" << param << ")"<< '\n'
+      << indent() << "{" << '\n';
   indent_up();
 
   if (members.size() > 0) {
@@ -975,62 +973,62 @@
       t_type* t = get_true_type((*m_iter)->get_type());
       if ((*m_iter)->get_value() != nullptr && (t->is_struct() || t->is_xception())) {
         indent(out) << "$this->" << (*m_iter)->get_name() << " = "
-                    << render_const_value(t, (*m_iter)->get_value()) << ";" << endl;
+                    << render_const_value(t, (*m_iter)->get_value()) << ";" << '\n';
       }
     }
-    out << indent() << "if (is_array($vals)) {" << endl;
+    out << indent() << "if (is_array($vals)) {" << '\n';
     indent_up();
     if (oop_) {
-      out << indent() << "parent::__construct(self::$_TSPEC, $vals);" << endl;
+      out << indent() << "parent::__construct(self::$_TSPEC, $vals);" << '\n';
     } else {
       for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
-        out << indent() << "if (isset($vals['" << (*m_iter)->get_name() << "'])) {" << endl;
+        out << indent() << "if (isset($vals['" << (*m_iter)->get_name() << "'])) {" << '\n';
 
         indent_up();
         out << indent() << "$this->" << (*m_iter)->get_name() << " = $vals['"
-            << (*m_iter)->get_name() << "'];" << endl;
+            << (*m_iter)->get_name() << "'];" << '\n';
 
         indent_down();
-        out << indent() << "}" << endl;
+        out << indent() << "}" << '\n';
       }
     }
     indent_down();
-    out << indent() << "}" << endl;
+    out << indent() << "}" << '\n';
   }
   scope_down(out);
-  out << endl;
+  out << '\n';
 
-  out << indent() << "public function getName()" << endl
-      << indent() << "{" << endl;
+  out << indent() << "public function getName()" << '\n'
+      << indent() << "{" << '\n';
 
   indent_up();
-  out << indent() << "return '" << tstruct->get_name() << "';" << endl;
+  out << indent() << "return '" << tstruct->get_name() << "';" << '\n';
 
   indent_down();
-  out << indent() << "}" << endl << endl;
+  out << indent() << "}" << '\n' << '\n';
 
-  out << endl;
+  out << '\n';
   if (getters_setters_) {
     generate_generic_field_getters_setters(out, tstruct);
   }
   generate_php_struct_reader(out, tstruct, is_result);
-  out << endl;
+  out << '\n';
   generate_php_struct_writer(out, tstruct, is_result);
   if (needs_php_read_validator(tstruct, is_result)) {
-    out << endl;
+    out << '\n';
     generate_php_struct_read_validator(out, tstruct);
   }
   if (needs_php_write_validator(tstruct, is_result)) {
-    out << endl;
+    out << '\n';
     generate_php_struct_write_validator(out, tstruct);
   }
   if (json_serializable_) {
-    out << endl;
+    out << '\n';
     generate_php_struct_json_serialize(out, tstruct, is_result);
   }
 
   indent_down();
-  out << indent() << "}" << endl;
+  out << indent() << "}" << '\n';
 }
 
 /**
@@ -1040,34 +1038,34 @@
   const vector<t_field*>& fields = tstruct->get_members();
   vector<t_field*>::const_iterator f_iter;
 
-  indent(out) << "public function read($input)" << endl;
+  indent(out) << "public function read($input)" << '\n';
   scope_up(out);
 
   if (oop_) {
     if (needs_php_read_validator(tstruct, is_result)) {
       indent(out) << "$tmp = $this->_read('" << tstruct->get_name() << "', self::$_TSPEC, $input);"
-                  << endl;
-      indent(out) << "$this->_validateForRead();" << endl;
-      indent(out) << "return $tmp;" << endl;
+                  << '\n';
+      indent(out) << "$this->_validateForRead();" << '\n';
+      indent(out) << "return $tmp;" << '\n';
     } else {
       indent(out) << "return $this->_read('" << tstruct->get_name() << "', self::$_TSPEC, $input);"
-                  << endl;
+                  << '\n';
     }
     scope_down(out);
-    out << endl;
+    out << '\n';
     return;
   }
 
-  out << indent() << "$xfer = 0;" << endl << indent() << "$fname = null;" << endl << indent()
-      << "$ftype = 0;" << endl << indent() << "$fid = 0;" << endl;
+  out << indent() << "$xfer = 0;" << '\n' << indent() << "$fname = null;" << '\n' << indent()
+      << "$ftype = 0;" << '\n' << indent() << "$fid = 0;" << '\n';
 
   // Declare stack tmp variables
   if (!binary_inline_) {
-    indent(out) << "$xfer += $input->readStructBegin($fname);" << endl;
+    indent(out) << "$xfer += $input->readStructBegin($fname);" << '\n';
   }
 
   // Loop over reading in fields
-  indent(out) << "while (true) {" << endl;
+  indent(out) << "while (true) {" << '\n';
 
   indent_up();
 
@@ -1077,80 +1075,80 @@
     t_field ffid(g_type_i16, "fid");
     generate_deserialize_field(out, &fftype);
     out << indent() << "if ($ftype == "
-        << "TType::STOP) {" << endl << indent() << "  break;" << endl << indent() << "}" << endl;
+        << "TType::STOP) {" << '\n' << indent() << "  break;" << '\n' << indent() << "}" << '\n';
     generate_deserialize_field(out, &ffid);
   } else {
-    indent(out) << "$xfer += $input->readFieldBegin($fname, $ftype, $fid);" << endl;
+    indent(out) << "$xfer += $input->readFieldBegin($fname, $ftype, $fid);" << '\n';
     // Check for field STOP marker and break
     indent(out) << "if ($ftype == "
-                << "TType::STOP) {" << endl;
+                << "TType::STOP) {" << '\n';
     indent_up();
-    indent(out) << "break;" << endl;
+    indent(out) << "break;" << '\n';
     indent_down();
-    indent(out) << "}" << endl;
+    indent(out) << "}" << '\n';
   }
 
   // Switch statement on the field we are reading
-  indent(out) << "switch ($fid) {" << endl;
+  indent(out) << "switch ($fid) {" << '\n';
 
   indent_up();
 
   // Generate deserialization code for known cases
   for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
-    indent(out) << "case " << (*f_iter)->get_key() << ":" << endl;
+    indent(out) << "case " << (*f_iter)->get_key() << ":" << '\n';
     indent_up();
-    indent(out) << "if ($ftype == " << type_to_enum((*f_iter)->get_type()) << ") {" << endl;
+    indent(out) << "if ($ftype == " << type_to_enum((*f_iter)->get_type()) << ") {" << '\n';
     indent_up();
     generate_deserialize_field(out, *f_iter, "this->");
     indent_down();
-    out << indent() << "} else {" << endl;
+    out << indent() << "} else {" << '\n';
 
     indent_up();
     if (binary_inline_) {
-      indent(out) << "$xfer += TProtocol::skipBinary($input, $ftype);" << endl;
+      indent(out) << "$xfer += TProtocol::skipBinary($input, $ftype);" << '\n';
     } else {
-      indent(out) << "$xfer += $input->skip($ftype);" << endl;
+      indent(out) << "$xfer += $input->skip($ftype);" << '\n';
     }
 
     indent_down();
-    out << indent() << "}" << endl << indent() << "break;" << endl;
+    out << indent() << "}" << '\n' << indent() << "break;" << '\n';
     indent_down();
   }
 
   // In the default case we skip the field
-  indent(out) << "default:" << endl;
+  indent(out) << "default:" << '\n';
 
   indent_up();
   if (binary_inline_) {
     indent(out) << "$xfer += "
-                << "TProtocol::skipBinary($input, $ftype);" << endl;
+                << "TProtocol::skipBinary($input, $ftype);" << '\n';
   } else {
-    indent(out) << "$xfer += $input->skip($ftype);" << endl;
+    indent(out) << "$xfer += $input->skip($ftype);" << '\n';
   }
-  indent(out) << "break;" << endl;
+  indent(out) << "break;" << '\n';
   indent_down();
 
   scope_down(out);
 
   if (!binary_inline_) {
     // Read field end marker
-    indent(out) << "$xfer += $input->readFieldEnd();" << endl;
+    indent(out) << "$xfer += $input->readFieldEnd();" << '\n';
   }
 
   scope_down(out);
 
   if (!binary_inline_) {
-    indent(out) << "$xfer += $input->readStructEnd();" << endl;
+    indent(out) << "$xfer += $input->readStructEnd();" << '\n';
   }
 
   if (needs_php_read_validator(tstruct, is_result)) {
-    indent(out) << "$this->_validateForRead();" << endl;
+    indent(out) << "$this->_validateForRead();" << '\n';
   }
 
-  indent(out) << "return $xfer;" << endl;
+  indent(out) << "return $xfer;" << '\n';
 
   indent_down();
-  out << indent() << "}" << endl;
+  out << indent() << "}" << '\n';
 }
 
 /**
@@ -1162,33 +1160,33 @@
   vector<t_field*>::const_iterator f_iter;
 
   if (binary_inline_) {
-    indent(out) << "public function write(&$output)" << endl;
+    indent(out) << "public function write(&$output)" << '\n';
   } else {
-    indent(out) << "public function write($output)" << endl;
+    indent(out) << "public function write($output)" << '\n';
   }
-  indent(out) << "{" << endl;
+  indent(out) << "{" << '\n';
   indent_up();
 
   if (needs_php_write_validator(tstruct, is_result)) {
-    indent(out) << "$this->_validateForWrite();" << endl;
+    indent(out) << "$this->_validateForWrite();" << '\n';
   }
 
   if (oop_) {
     indent(out) << "return $this->_write('" << tstruct->get_name() << "', self::$_TSPEC, $output);"
-                << endl;
+                << '\n';
     scope_down(out);
-    out << endl;
+    out << '\n';
     return;
   }
 
-  indent(out) << "$xfer = 0;" << endl;
+  indent(out) << "$xfer = 0;" << '\n';
 
   if (!binary_inline_) {
-    indent(out) << "$xfer += $output->writeStructBegin('" << name << "');" << endl;
+    indent(out) << "$xfer += $output->writeStructBegin('" << name << "');" << '\n';
   }
 
   for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
-    out << indent() << "if ($this->" << (*f_iter)->get_name() << " !== null) {" << endl;
+    out << indent() << "if ($this->" << (*f_iter)->get_name() << " !== null) {" << '\n';
     indent_up();
 
     t_type* type = get_true_type((*f_iter)->get_type());
@@ -1200,22 +1198,22 @@
     }
     if (!expect.empty()) {
       out << indent() << "if (!is_" << expect << "($this->" << (*f_iter)->get_name() << ")) {"
-          << endl;
+          << '\n';
       indent_up();
       out << indent() << "throw new "
           << "TProtocolException('Bad type in structure.', "
-          << "TProtocolException::INVALID_DATA);" << endl;
+          << "TProtocolException::INVALID_DATA);" << '\n';
       scope_down(out);
     }
 
     // Write field header
     if (binary_inline_) {
       out << indent() << "$output .= pack('c', " << type_to_enum((*f_iter)->get_type()) << ");"
-          << endl << indent() << "$output .= pack('n', " << (*f_iter)->get_key() << ");" << endl;
+          << '\n' << indent() << "$output .= pack('n', " << (*f_iter)->get_key() << ");" << '\n';
     } else {
       indent(out) << "$xfer += $output->writeFieldBegin("
                   << "'" << (*f_iter)->get_name() << "', " << type_to_enum((*f_iter)->get_type())
-                  << ", " << (*f_iter)->get_key() << ");" << endl;
+                  << ", " << (*f_iter)->get_key() << ");" << '\n';
     }
 
     // Write field contents
@@ -1223,25 +1221,25 @@
 
     // Write field closer
     if (!binary_inline_) {
-      indent(out) << "$xfer += $output->writeFieldEnd();" << endl;
+      indent(out) << "$xfer += $output->writeFieldEnd();" << '\n';
     }
 
     indent_down();
-    indent(out) << "}" << endl;
+    indent(out) << "}" << '\n';
   }
 
   if (binary_inline_) {
     out << indent() << "$output .= pack('c', "
-        << "TType::STOP);" << endl;
+        << "TType::STOP);" << '\n';
   } else {
-    out << indent() << "$xfer += $output->writeFieldStop();" << endl << indent()
-        << "$xfer += $output->writeStructEnd();" << endl;
+    out << indent() << "$xfer += $output->writeFieldStop();" << '\n' << indent()
+        << "$xfer += $output->writeStructEnd();" << '\n';
   }
 
-  out << indent() << "return $xfer;" << endl;
+  out << indent() << "return $xfer;" << '\n';
 
   indent_down();
-  out << indent() << "}" << endl;
+  out << indent() << "}" << '\n';
 }
 
 void t_php_generator::generate_php_struct_read_validator(ostream& out, t_struct* tstruct) {
@@ -1256,7 +1254,7 @@
                                                              t_struct* tstruct,
                                                              std::string method_name,
                                                              bool write_mode) {
-  indent(out) << "private function " << method_name << "() {" << endl;
+  indent(out) << "private function " << method_name << "() {" << '\n';
   indent_up();
 
   const vector<t_field*>& fields = tstruct->get_members();
@@ -1268,32 +1266,32 @@
       t_field* field = (*f_iter);
       if (field->get_req() == t_field::T_REQUIRED
           || (field->get_req() == t_field::T_OPT_IN_REQ_OUT && write_mode)) {
-        indent(out) << "if ($this->" << field->get_name() << " === null) {" << endl;
+        indent(out) << "if ($this->" << field->get_name() << " === null) {" << '\n';
         indent_up();
         indent(out) << "throw new TProtocolException('Required field " << tstruct->get_name() << "."
-                    << field->get_name() << " is unset!');" << endl;
+                    << field->get_name() << " is unset!');" << '\n';
         indent_down();
-        indent(out) << "}" << endl;
+        indent(out) << "}" << '\n';
       }
     }
   }
 
   indent_down();
-  indent(out) << "}" << endl;
+  indent(out) << "}" << '\n';
 }
 
 void t_php_generator::generate_php_struct_json_serialize(ostream& out,
                                                          t_struct* tstruct,
                                                          bool is_result) {
-  indent(out) << "#[\\ReturnTypeWillChange]" << endl;                                                          
-  indent(out) << "public function jsonSerialize() {" << endl;
+  indent(out) << "#[\\ReturnTypeWillChange]" << '\n';
+  indent(out) << "public function jsonSerialize() {" << '\n';
   indent_up();
 
   if (needs_php_write_validator(tstruct, is_result)) {
-    indent(out) << "$this->_validateForWrite();" << endl;
+    indent(out) << "$this->_validateForWrite();" << '\n';
   }
 
-  indent(out) << "$json = new stdClass;" << endl;
+  indent(out) << "$json = new stdClass;" << '\n';
 
   const vector<t_field*>& fields = tstruct->get_members();
 
@@ -1312,7 +1310,7 @@
           continue;
         }
       }
-      indent(out) << "if ($this->" << name << " !== null) {" << endl;
+      indent(out) << "if ($this->" << name << " !== null) {" << '\n';
       indent_up();
       indent(out) << "$json->" << name << " = ";
       if (type->is_map()) {
@@ -1320,16 +1318,16 @@
       } else {
         out << type_to_cast(type);
       }
-      out << "$this->" << name << ";" << endl;
+      out << "$this->" << name << ";" << '\n';
       indent_down();
-      indent(out) << "}" << endl;
+      indent(out) << "}" << '\n';
     }
   }
 
-  indent(out) << "return $json;" << endl;
+  indent(out) << "return $json;" << '\n';
   indent_down();
 
-  indent(out) << "}" << endl;
+  indent(out) << "}" << '\n';
 }
 
 int t_php_generator::get_php_num_required_fields(const vector<t_field*>& fields, bool write_mode) {
@@ -1382,7 +1380,7 @@
 
   if(classmap_) {
     // Close service file
-    f_service_ << endl;
+    f_service_ << '\n';
     f_service_.close();
   }
 }
@@ -1413,34 +1411,34 @@
   }
 
   // Generate the header portion
-  f_service_processor << "class " << service_name_ << "Processor" << extends_processor << endl
-                      << "{" << endl;
+  f_service_processor << "class " << service_name_ << "Processor" << extends_processor << '\n'
+                      << "{" << '\n';
   indent_up();
 
   if (extends.empty()) {
-    f_service_processor << indent() << "protected $handler_ = null;" << endl;
+    f_service_processor << indent() << "protected $handler_ = null;" << '\n';
   }
 
-  f_service_processor << indent() << "public function __construct($handler)"<< endl
-                      << indent() << "{" << endl;
+  f_service_processor << indent() << "public function __construct($handler)"<< '\n'
+                      << indent() << "{" << '\n';
 
   indent_up();
   if (extends.empty()) {
-    f_service_processor << indent() << "$this->handler_ = $handler;" << endl;
+    f_service_processor << indent() << "$this->handler_ = $handler;" << '\n';
   } else {
-    f_service_processor << indent() << "parent::__construct($handler);" << endl;
+    f_service_processor << indent() << "parent::__construct($handler);" << '\n';
   }
 
   indent_down();
-  f_service_processor << indent() << "}" << endl << endl;
+  f_service_processor << indent() << "}" << '\n' << '\n';
 
   // Generate the server implementation
-  f_service_processor << indent() << "public function process($input, $output)" << endl
-                      << indent() << "{" << endl;
+  f_service_processor << indent() << "public function process($input, $output)" << '\n'
+                      << indent() << "{" << '\n';
   indent_up();
 
-  f_service_processor << indent() << "$rseqid = 0;" << endl << indent() << "$fname = null;" << endl
-                      << indent() << "$mtype = 0;" << endl << endl;
+  f_service_processor << indent() << "$rseqid = 0;" << '\n' << indent() << "$fname = null;" << '\n'
+                      << indent() << "$mtype = 0;" << '\n' << '\n';
 
   if (binary_inline_) {
     t_field ffname(g_type_string, "fname");
@@ -1450,36 +1448,36 @@
     generate_deserialize_field(f_service_processor, &fmtype, "", true);
     generate_deserialize_field(f_service_processor, &fseqid, "", true);
   } else {
-    f_service_processor << indent() << "$input->readMessageBegin($fname, $mtype, $rseqid);" << endl;
+    f_service_processor << indent() << "$input->readMessageBegin($fname, $mtype, $rseqid);" << '\n';
   }
 
   // HOT: check for method implementation
-  f_service_processor << indent() << "$methodname = 'process_'.$fname;" << endl
-                      << indent() << "if (!method_exists($this, $methodname)) {" << endl;
+  f_service_processor << indent() << "$methodname = 'process_'.$fname;" << '\n'
+                      << indent() << "if (!method_exists($this, $methodname)) {" << '\n';
 
   indent_up();
   if (binary_inline_) {
-    f_service_processor << indent() << "throw new \\Exception('Function '.$fname.' not implemented.');" << endl;
+    f_service_processor << indent() << "throw new \\Exception('Function '.$fname.' not implemented.');" << '\n';
   } else {
     f_service_processor << indent() << "  $input->skip("
-                        << "TType::STRUCT);" << endl << indent() << "  $input->readMessageEnd();" << endl
+                        << "TType::STRUCT);" << '\n' << indent() << "  $input->readMessageEnd();" << '\n'
                         << indent() << "  $x = new "
                         << "TApplicationException('Function '.$fname.' not implemented.', "
-                        << "TApplicationException::UNKNOWN_METHOD);" << endl << indent()
+                        << "TApplicationException::UNKNOWN_METHOD);" << '\n' << indent()
                         << "  $output->writeMessageBegin($fname, "
-                        << "TMessageType::EXCEPTION, $rseqid);" << endl << indent()
-                        << "  $x->write($output);" << endl << indent() << "  $output->writeMessageEnd();"
-                        << endl << indent() << "  $output->getTransport()->flush();" << endl << indent()
-                        << "  return;" << endl;
+                        << "TMessageType::EXCEPTION, $rseqid);" << '\n' << indent()
+                        << "  $x->write($output);" << '\n' << indent() << "  $output->writeMessageEnd();"
+                        << '\n' << indent() << "  $output->getTransport()->flush();" << '\n' << indent()
+                        << "  return;" << '\n';
   }
 
   indent_down();
-  f_service_processor << indent() << "}" << endl
-                      << indent() << "$this->$methodname($rseqid, $input, $output);" << endl
-                      << indent() << "return true;" << endl;
+  f_service_processor << indent() << "}" << '\n'
+                      << indent() << "$this->$methodname($rseqid, $input, $output);" << '\n'
+                      << indent() << "return true;" << '\n';
 
   indent_down();
-  f_service_processor << indent() << "}" << endl << endl;
+  f_service_processor << indent() << "}" << '\n' << '\n';
 
   // Generate the process subfunctions
   for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
@@ -1487,7 +1485,7 @@
   }
 
   indent_down();
-  f_service_processor << "}" << endl;
+  f_service_processor << "}" << '\n';
 
   if (!classmap_) {
     f_service_processor.close();
@@ -1501,8 +1499,8 @@
  */
 void t_php_generator::generate_process_function(std::ostream& out, t_service* tservice, t_function* tfunction) {
   // Open function
-  out << indent() << "protected function process_" << tfunction->get_name() << "($seqid, $input, $output)" << endl
-      << indent() << "{" << endl;
+  out << indent() << "protected function process_" << tfunction->get_name() << "($seqid, $input, $output)" << '\n'
+      << indent() << "{" << '\n';
   indent_up();
 
   string argsname = php_namespace(tservice->get_program()) + service_name_ + "_"
@@ -1512,32 +1510,32 @@
 
   out << indent() << "$bin_accel = ($input instanceof "
              << "TBinaryProtocolAccelerated) && function_exists('thrift_protocol_read_binary_after_message_begin');"
-             << endl;
-  out << indent() << "if ($bin_accel) {" << endl;
+             << '\n';
+  out << indent() << "if ($bin_accel) {" << '\n';
   indent_up();
 
-  out << indent() << "$args = thrift_protocol_read_binary_after_message_begin(" <<endl;
+  out << indent() << "$args = thrift_protocol_read_binary_after_message_begin(" << '\n';
 
   indent_up();
-  out << indent() << "$input,"<<endl
-      << indent() << "'" << argsname << "'," << endl
-      << indent() << "$input->isStrictRead()" <<endl;
+  out << indent() << "$input," << '\n'
+      << indent() << "'" << argsname << "'," << '\n'
+      << indent() << "$input->isStrictRead()" << '\n';
 
   indent_down();
-  out << indent() <<");" << endl;
+  out << indent() <<");" << '\n';
 
   indent_down();
-  out << indent() << "} else {" << endl;
+  out << indent() << "} else {" << '\n';
 
   indent_up();
-  out << indent() << "$args = new " << argsname << "();" << endl
-      << indent() << "$args->read($input);" << endl;
+  out << indent() << "$args = new " << argsname << "();" << '\n'
+      << indent() << "$args->read($input);" << '\n';
 
   indent_down();
-  out << indent() << "}" << endl;
+  out << indent() << "}" << '\n';
 
   if (!binary_inline_) {
-    out << indent() << "$input->readMessageEnd();" << endl;
+    out << indent() << "$input->readMessageEnd();" << '\n';
   }
 
   t_struct* xs = tfunction->get_xceptions();
@@ -1546,12 +1544,12 @@
 
   // Declare result for non oneway function
   if (!tfunction->is_oneway()) {
-    out << indent() << "$result = new " << resultname << "();" << endl;
+    out << indent() << "$result = new " << resultname << "();" << '\n';
   }
 
   // Try block for a function with exceptions
   if (xceptions.size() > 0) {
-    out << indent() << "try {" << endl;
+    out << indent() << "try {" << '\n';
     indent_up();
   }
 
@@ -1574,7 +1572,7 @@
     }
     out << "$args->" << (*f_iter)->get_name();
   }
-  out << ");" << endl;
+  out << ");" << '\n';
 
   if (!tfunction->is_oneway() && xceptions.size() > 0) {
     indent_down();
@@ -1582,70 +1580,70 @@
       out << indent() << "} catch ("
                  << php_namespace(get_true_type((*x_iter)->get_type())->get_program())
                  << (*x_iter)->get_type()->get_name() << " $" << (*x_iter)->get_name() << ") {"
-                 << endl;
+                 << '\n';
       if (!tfunction->is_oneway()) {
         indent_up();
         out << indent() << "$result->" << (*x_iter)->get_name() << " = $"
-                   << (*x_iter)->get_name() << ";" << endl;
+                   << (*x_iter)->get_name() << ";" << '\n';
         indent_down();
         out << indent();
       }
     }
-    out << "}" << endl;
+    out << "}" << '\n';
   }
 
   // Shortcut out here for oneway functions
   if (tfunction->is_oneway()) {
-    out << indent() << "return;" << endl;
+    out << indent() << "return;" << '\n';
     indent_down();
-    out << indent() << "}" << endl;
+    out << indent() << "}" << '\n';
     return;
   }
 
   out << indent() << "$bin_accel = ($output instanceof "
              << "TBinaryProtocolAccelerated) && function_exists('thrift_protocol_write_binary');"
-             << endl;
+             << '\n';
 
-  out << indent() << "if ($bin_accel) {" << endl;
+  out << indent() << "if ($bin_accel) {" << '\n';
   indent_up();
 
-  out << indent() << "thrift_protocol_write_binary(" << endl;
+  out << indent() << "thrift_protocol_write_binary(" << '\n';
 
   indent_up();
-  out << indent() << "$output,"<<endl
-      << indent() << "'" << tfunction->get_name()<< "'," <<endl
-      << indent() << "TMessageType::REPLY,"<< endl
-      << indent() << "$result," << endl
-      << indent() << "$seqid," << endl
-      << indent() << "$output->isStrictWrite()"<<endl;
+  out << indent() << "$output,"<< '\n'
+      << indent() << "'" << tfunction->get_name()<< "'," << '\n'
+      << indent() << "TMessageType::REPLY,"<< '\n'
+      << indent() << "$result," << '\n'
+      << indent() << "$seqid," << '\n'
+      << indent() << "$output->isStrictWrite()"<< '\n';
 
   indent_down();
-  out << indent() << ");" << endl;
+  out << indent() << ");" << '\n';
 
   indent_down();
-  out << indent() << "} else {" << endl;
+  out << indent() << "} else {" << '\n';
   indent_up();
 
   // Serialize the request header
   if (binary_inline_) {
     out << indent() << "$buff = pack('N', (0x80010000 | "
-        << "TMessageType::REPLY)); " << endl << indent() << "$buff .= pack('N', strlen('"
-        << tfunction->get_name() << "'));" << endl << indent() << "$buff .= '"
-        << tfunction->get_name() << "';" << endl << indent() << "$buff .= pack('N', $seqid);"
-        << endl << indent() << "$result->write($buff);" << endl << indent()
-        << "$output->write($buff);" << endl << indent() << "$output->flush();" << endl;
+        << "TMessageType::REPLY)); " << '\n' << indent() << "$buff .= pack('N', strlen('"
+        << tfunction->get_name() << "'));" << '\n' << indent() << "$buff .= '"
+        << tfunction->get_name() << "';" << '\n' << indent() << "$buff .= pack('N', $seqid);"
+        << '\n' << indent() << "$result->write($buff);" << '\n' << indent()
+        << "$output->write($buff);" << '\n' << indent() << "$output->flush();" << '\n';
   } else {
     out << indent() << "$output->writeMessageBegin('" << tfunction->get_name() << "', "
-        << "TMessageType::REPLY, $seqid);" << endl << indent() << "$result->write($output);"
-        << endl << indent() << "$output->writeMessageEnd();" << endl << indent()
-        << "$output->getTransport()->flush();" << endl;
+        << "TMessageType::REPLY, $seqid);" << '\n' << indent() << "$result->write($output);"
+        << '\n' << indent() << "$output->writeMessageEnd();" << '\n' << indent()
+        << "$output->getTransport()->flush();" << '\n';
   }
 
   scope_down(out);
 
   // Close function
   indent_down();
-  out << indent() << "}" << endl;
+  out << indent() << "}" << '\n';
 }
 
 /**
@@ -1659,7 +1657,7 @@
 
   ofstream_with_content_based_conditional_update& f_struct_definition = f_service_;
   if (classmap_) {
-    f_struct_definition << "// HELPER FUNCTIONS AND STRUCTURES" << endl << endl;
+    f_struct_definition << "// HELPER FUNCTIONS AND STRUCTURES" << '\n' << '\n';
   }
 
   for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
@@ -1738,18 +1736,18 @@
                  + tservice->get_extends()->get_name() + "If";
   }
   generate_php_doc(f_service_interface, tservice);
-  f_service_interface << "interface " << php_namespace_declaration(tservice) << "If" << extends_if << endl
-                      << "{" << endl;
+  f_service_interface << "interface " << php_namespace_declaration(tservice) << "If" << extends_if << '\n'
+                      << "{" << '\n';
 
   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_php_doc(f_service_interface, *f_iter);
-    indent(f_service_interface) << "public function " << function_signature(*f_iter) << ";" << endl;
+    indent(f_service_interface) << "public function " << function_signature(*f_iter) << ";" << '\n';
   }
   indent_down();
-  f_service_interface << "}" << endl;
+  f_service_interface << "}" << '\n';
 
   // Close service interface file
   if (!classmap_) {
@@ -1776,21 +1774,21 @@
     extends_if = " extends " + php_namespace(tservice->get_extends()->get_program())
                  + tservice->get_extends()->get_name() + "Rest";
   }
-  f_service_rest << "class " << service_name_ << "Rest" << extends_if << endl
-                 << "{" << endl;
+  f_service_rest << "class " << service_name_ << "Rest" << extends_if << '\n'
+                 << "{" << '\n';
   indent_up();
 
   if (extends.empty()) {
-    f_service_rest << indent() << "protected $impl_;" << endl << endl;
+    f_service_rest << indent() << "protected $impl_;" << '\n' << '\n';
   }
 
-  f_service_rest << indent() << "public function __construct($impl) {" << endl << indent()
-             << "  $this->impl_ = $impl;" << endl << indent() << "}" << endl << endl;
+  f_service_rest << indent() << "public function __construct($impl) {" << '\n' << indent()
+             << "  $this->impl_ = $impl;" << '\n' << indent() << "}" << '\n' << '\n';
 
   vector<t_function*> functions = tservice->get_functions();
   vector<t_function*>::iterator f_iter;
   for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
-    indent(f_service_rest) << "public function " << (*f_iter)->get_name() << "($request) {" << endl;
+    indent(f_service_rest) << "public function " << (*f_iter)->get_name() << "($request) {" << '\n';
     indent_up();
     const vector<t_field*>& args = (*f_iter)->get_arglist()->get_members();
     vector<t_field*>::const_iterator a_iter;
@@ -1800,39 +1798,39 @@
       string req = "$request['" + (*a_iter)->get_name() + "']";
       if (atype->is_bool()) {
         f_service_rest << indent() << "$" << (*a_iter)->get_name() << " = " << cast << "(!empty(" << req
-                   << ") && (" << req << " !== 'false'));" << endl;
+                   << ") && (" << req << " !== 'false'));" << '\n';
       } else {
         f_service_rest << indent() << "$" << (*a_iter)->get_name() << " = isset(" << req << ") ? "
-                   << cast << req << " : null;" << endl;
+                   << cast << req << " : null;" << '\n';
       }
       /* slist no longer supported
       if (atype->is_string() && ((t_base_type*)atype)->is_string_list()) {
         f_service_rest << indent() << "$" << (*a_iter)->get_name() << " = explode(',', $"
-                       << (*a_iter)->get_name() << ");" << endl;
+                       << (*a_iter)->get_name() << ");" << '\n';
       } else */
       if (atype->is_map() || atype->is_list()) {
         f_service_rest << indent() << "$" << (*a_iter)->get_name() << " = json_decode($"
-                       << (*a_iter)->get_name() << ", true);" << endl;
+                       << (*a_iter)->get_name() << ", true);" << '\n';
       } else if (atype->is_set()) {
         f_service_rest << indent() << "$" << (*a_iter)->get_name() << " = array_fill_keys(json_decode($"
-                       << (*a_iter)->get_name() << ", true), 1);" << endl;
+                       << (*a_iter)->get_name() << ", true), 1);" << '\n';
       } else if (atype->is_struct() || atype->is_xception()) {
-        f_service_rest << indent() << "if ($" << (*a_iter)->get_name() << " !== null) {" << endl
+        f_service_rest << indent() << "if ($" << (*a_iter)->get_name() << " !== null) {" << '\n'
                        << indent() << "  $" << (*a_iter)->get_name() << " = new "
                        << php_namespace(atype->get_program()) << atype->get_name() << "(json_decode($"
-                       << (*a_iter)->get_name() << ", true));" << endl << indent() << "}" << endl;
+                       << (*a_iter)->get_name() << ", true));" << '\n' << indent() << "}" << '\n';
       }
     }
     f_service_rest << indent() << "return $this->impl_->" << (*f_iter)->get_name() << "("
-               << argument_list((*f_iter)->get_arglist(), false) << ");" << endl;
+               << argument_list((*f_iter)->get_arglist(), false) << ");" << '\n';
     indent_down();
-    indent(f_service_rest) << "}" << endl << endl;
+    indent(f_service_rest) << "}" << '\n' << '\n';
   }
   indent_down();
-  f_service_rest << "}" << endl << endl;
+  f_service_rest << "}" << '\n' << '\n';
 
   // Close service rest file
-  f_service_rest << endl;
+  f_service_rest << '\n';
   if (!classmap_) {
     f_service_rest.close();
   }
@@ -1860,31 +1858,31 @@
   }
 
   f_service_client << "class " << php_namespace_declaration(tservice) << "Client" << extends_client
-             << " implements " << php_namespace(tservice->get_program()) << service_name_ << "If" << endl
-             <<"{"<< endl;
+             << " implements " << php_namespace(tservice->get_program()) << service_name_ << "If" << '\n'
+             <<"{"<< '\n';
   indent_up();
 
   // Private members
   if (extends.empty()) {
-    f_service_client << indent() << "protected $input_ = null;" << endl << indent()
-               << "protected $output_ = null;" << endl << endl;
-    f_service_client << indent() << "protected $seqid_ = 0;" << endl << endl;
+    f_service_client << indent() << "protected $input_ = null;" << '\n' << indent()
+               << "protected $output_ = null;" << '\n' << '\n';
+    f_service_client << indent() << "protected $seqid_ = 0;" << '\n' << '\n';
   }
 
   // Constructor function
-  f_service_client << indent() << "public function __construct($input, $output = null)" << endl
-                   << indent() << "{" << endl;
+  f_service_client << indent() << "public function __construct($input, $output = null)" << '\n'
+                   << indent() << "{" << '\n';
 
   indent_up();
   if (!extends.empty()) {
-    f_service_client << indent() << "parent::__construct($input, $output);" << endl;
+    f_service_client << indent() << "parent::__construct($input, $output);" << '\n';
   } else {
-    f_service_client << indent() << "$this->input_ = $input;" << endl
-                     << indent() << "$this->output_ = $output ? $output : $input;" << endl;
+    f_service_client << indent() << "$this->input_ = $input;" << '\n'
+                     << indent() << "$this->output_ = $output ? $output : $input;" << '\n';
   }
 
   indent_down();
-  f_service_client << indent() << "}" << endl << endl;
+  f_service_client << indent() << "}" << '\n' << '\n';
 
   // Generate client method implementations
   vector<t_function*> functions = tservice->get_functions();
@@ -1895,10 +1893,10 @@
     vector<t_field*>::const_iterator fld_iter;
     string funname = (*f_iter)->get_name();
 
-    f_service_client << endl;
+    f_service_client << '\n';
 
     // Open function
-    indent(f_service_client) << "public function " << function_signature(*f_iter) << endl;
+    indent(f_service_client) << "public function " << function_signature(*f_iter) << '\n';
     scope_up(f_service_client);
     indent(f_service_client) << "$this->send_" << funname << "(";
 
@@ -1911,77 +1909,77 @@
       }
       f_service_client << "$" << (*fld_iter)->get_name();
     }
-    f_service_client << ");" << endl;
+    f_service_client << ");" << '\n';
 
     if (!(*f_iter)->is_oneway()) {
       f_service_client << indent();
       if (!(*f_iter)->get_returntype()->is_void()) {
         f_service_client << "return ";
       }
-      f_service_client << "$this->recv_" << funname << "();" << endl;
+      f_service_client << "$this->recv_" << funname << "();" << '\n';
     }
     scope_down(f_service_client);
-    f_service_client << endl;
+    f_service_client << '\n';
 
-    indent(f_service_client) << "public function send_" << function_signature(*f_iter) << endl;
+    indent(f_service_client) << "public function send_" << function_signature(*f_iter) << '\n';
     scope_up(f_service_client);
 
     std::string argsname = php_namespace(tservice->get_program()) + service_name_ + "_"
                            + (*f_iter)->get_name() + "_args";
 
-    f_service_client << indent() << "$args = new " << argsname << "();" << endl;
+    f_service_client << indent() << "$args = new " << argsname << "();" << '\n';
 
     for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) {
       f_service_client << indent() << "$args->" << (*fld_iter)->get_name() << " = $"
-                 << (*fld_iter)->get_name() << ";" << endl;
+                 << (*fld_iter)->get_name() << ";" << '\n';
     }
 
     f_service_client << indent() << "$bin_accel = ($this->output_ instanceof "
                << "TBinaryProtocolAccelerated) && function_exists('thrift_protocol_write_binary');"
-               << endl;
+               << '\n';
 
-    f_service_client << indent() << "if ($bin_accel) {" << endl;
+    f_service_client << indent() << "if ($bin_accel) {" << '\n';
     indent_up();
 
     string messageType = (*f_iter)->is_oneway() ? "TMessageType::ONEWAY" : "TMessageType::CALL";
 
-    f_service_client << indent() << "thrift_protocol_write_binary(" << endl;
+    f_service_client << indent() << "thrift_protocol_write_binary(" << '\n';
 
     indent_up();
-    f_service_client << indent() << "$this->output_," << endl
-               << indent() << "'" << (*f_iter)->get_name() << "'," << endl
-               << indent() << messageType << "," << endl
-               << indent() << "$args," << endl
-               << indent() << "$this->seqid_," << endl
-               << indent() << "$this->output_->isStrictWrite()" << endl;
+    f_service_client << indent() << "$this->output_," << '\n'
+               << indent() << "'" << (*f_iter)->get_name() << "'," << '\n'
+               << indent() << messageType << "," << '\n'
+               << indent() << "$args," << '\n'
+               << indent() << "$this->seqid_," << '\n'
+               << indent() << "$this->output_->isStrictWrite()" << '\n';
 
     indent_down();
-    f_service_client << indent() << ");" << endl;
+    f_service_client << indent() << ");" << '\n';
 
     indent_down();
-    f_service_client << indent() << "} else {" << endl;
+    f_service_client << indent() << "} else {" << '\n';
     indent_up();
 
     // Serialize the request header
     if (binary_inline_) {
-      f_service_client << indent() << "$buff = pack('N', (0x80010000 | " << messageType << "));" << endl
-                       << indent() << "$buff .= pack('N', strlen('" << funname << "'));" << endl
-                       << indent() << "$buff .= '" << funname << "';" << endl << indent()
-                       << "$buff .= pack('N', $this->seqid_);" << endl;
+      f_service_client << indent() << "$buff = pack('N', (0x80010000 | " << messageType << "));" << '\n'
+                       << indent() << "$buff .= pack('N', strlen('" << funname << "'));" << '\n'
+                       << indent() << "$buff .= '" << funname << "';" << '\n' << indent()
+                       << "$buff .= pack('N', $this->seqid_);" << '\n';
     } else {
       f_service_client << indent() << "$this->output_->writeMessageBegin('" << (*f_iter)->get_name()
-                       << "', " << messageType << ", $this->seqid_);" << endl;
+                       << "', " << messageType << ", $this->seqid_);" << '\n';
     }
 
     // Write to the stream
     if (binary_inline_) {
-      f_service_client << indent() << "$args->write($buff);" << endl << indent()
-                       << "$this->output_->write($buff);" << endl << indent()
-                       << "$this->output_->flush();" << endl;
+      f_service_client << indent() << "$args->write($buff);" << '\n' << indent()
+                       << "$this->output_->write($buff);" << '\n' << indent()
+                       << "$this->output_->flush();" << '\n';
     } else {
-      f_service_client << indent() << "$args->write($this->output_);" << endl << indent()
-                       << "$this->output_->writeMessageEnd();" << endl << indent()
-                       << "$this->output_->getTransport()->flush();" << endl;
+      f_service_client << indent() << "$args->write($this->output_);" << '\n' << indent()
+                       << "$this->output_->writeMessageEnd();" << '\n' << indent()
+                       << "$this->output_->getTransport()->flush();" << '\n';
     }
 
     scope_down(f_service_client);
@@ -1997,98 +1995,98 @@
                                string("recv_") + (*f_iter)->get_name(),
                                &noargs);
       // Open function
-      f_service_client << endl << indent() << "public function " << function_signature(&recv_function)
-                       << endl;
+      f_service_client << '\n' << indent() << "public function " << function_signature(&recv_function)
+                       << '\n';
       scope_up(f_service_client);
 
       f_service_client << indent() << "$bin_accel = ($this->input_ instanceof "
                        << "TBinaryProtocolAccelerated)"
-                       << " && function_exists('thrift_protocol_read_binary');" << endl;
+                       << " && function_exists('thrift_protocol_read_binary');" << '\n';
 
-      f_service_client << indent() << "if ($bin_accel) {" << endl;
+      f_service_client << indent() << "if ($bin_accel) {" << '\n';
 
       indent_up();
-      f_service_client << indent() << "$result = thrift_protocol_read_binary(" << endl;
+      f_service_client << indent() << "$result = thrift_protocol_read_binary(" << '\n';
 
       indent_up();
-      f_service_client << indent() << "$this->input_," << endl
-                       << indent() << "'" << resultname << "'," << endl
-                       << indent() << "$this->input_->isStrictRead()" << endl;
+      f_service_client << indent() << "$this->input_," << '\n'
+                       << indent() << "'" << resultname << "'," << '\n'
+                       << indent() << "$this->input_->isStrictRead()" << '\n';
 
       indent_down();
-      f_service_client << indent() << ");" << endl;
+      f_service_client << indent() << ");" << '\n';
 
       indent_down();
-      f_service_client << indent() << "} else {" << endl;
+      f_service_client << indent() << "} else {" << '\n';
 
       indent_up();
-      f_service_client << indent() << "$rseqid = 0;" << endl
-                       << indent() << "$fname = null;" << endl
-                       << indent() << "$mtype = 0;" << endl << endl;
+      f_service_client << indent() << "$rseqid = 0;" << '\n'
+                       << indent() << "$fname = null;" << '\n'
+                       << indent() << "$mtype = 0;" << '\n' << '\n';
 
       if (binary_inline_) {
         t_field ffname(g_type_string, "fname");
         t_field fseqid(g_type_i32, "rseqid");
-        f_service_client << indent() << "$ver = unpack('N', $this->input_->readAll(4));" << endl
-                         << indent() << "$ver = $ver[1];" << endl << indent() << "$mtype = $ver & 0xff;"
-                         << endl << indent() << "$ver = $ver & 0xffff0000;" << endl << indent()
+        f_service_client << indent() << "$ver = unpack('N', $this->input_->readAll(4));" << '\n'
+                         << indent() << "$ver = $ver[1];" << '\n' << indent() << "$mtype = $ver & 0xff;"
+                         << '\n' << indent() << "$ver = $ver & 0xffff0000;" << '\n' << indent()
                          << "if ($ver != 0x80010000) throw new "
                          << "TProtocolException('Bad version identifier: '.$ver, "
-                         << "TProtocolException::BAD_VERSION);" << endl;
+                         << "TProtocolException::BAD_VERSION);" << '\n';
         generate_deserialize_field(f_service_client, &ffname, "", true);
         generate_deserialize_field(f_service_client, &fseqid, "", true);
       } else {
-        f_service_client << indent() << "$this->input_->readMessageBegin($fname, $mtype, $rseqid);" << endl
-                         << indent() << "if ($mtype == TMessageType::EXCEPTION) {" << endl;
+        f_service_client << indent() << "$this->input_->readMessageBegin($fname, $mtype, $rseqid);" << '\n'
+                         << indent() << "if ($mtype == TMessageType::EXCEPTION) {" << '\n';
 
         indent_up();
-        f_service_client << indent() << "$x = new TApplicationException();" << endl
-                         << indent() << "$x->read($this->input_);" << endl
-                         << indent() << "$this->input_->readMessageEnd();" << endl
-                         << indent() << "throw $x;" << endl;
+        f_service_client << indent() << "$x = new TApplicationException();" << '\n'
+                         << indent() << "$x->read($this->input_);" << '\n'
+                         << indent() << "$this->input_->readMessageEnd();" << '\n'
+                         << indent() << "throw $x;" << '\n';
         indent_down();
-        f_service_client << indent() << "}" << endl;
+        f_service_client << indent() << "}" << '\n';
       }
 
-      f_service_client << indent() << "$result = new " << resultname << "();" << endl
-                       << indent() << "$result->read($this->input_);" << endl;
+      f_service_client << indent() << "$result = new " << resultname << "();" << '\n'
+                       << indent() << "$result->read($this->input_);" << '\n';
 
       if (!binary_inline_) {
-        f_service_client << indent() << "$this->input_->readMessageEnd();" << endl;
+        f_service_client << indent() << "$this->input_->readMessageEnd();" << '\n';
       }
 
       scope_down(f_service_client);
 
       // Careful, only return result if not a void function
       if (!(*f_iter)->get_returntype()->is_void()) {
-        f_service_client << indent() << "if ($result->success !== null) {" << endl;
+        f_service_client << indent() << "if ($result->success !== null) {" << '\n';
 
         indent_up();
-        f_service_client << indent() << "return $result->success;" << endl;
+        f_service_client << indent() << "return $result->success;" << '\n';
 
         indent_down();
-        f_service_client << indent() << "}" << endl;
+        f_service_client << indent() << "}" << '\n';
       }
 
       t_struct* xs = (*f_iter)->get_xceptions();
       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) {
-        f_service_client << indent() << "if ($result->" << (*x_iter)->get_name() << " !== null) {" << endl;
+        f_service_client << indent() << "if ($result->" << (*x_iter)->get_name() << " !== null) {" << '\n';
 
         indent_up();
-        f_service_client << indent() << "throw $result->" << (*x_iter)->get_name() << ";" << endl;
+        f_service_client << indent() << "throw $result->" << (*x_iter)->get_name() << ";" << '\n';
 
         indent_down();
-        f_service_client << indent() << "}" << endl;
+        f_service_client << indent() << "}" << '\n';
       }
 
       // Careful, only return _result if not a void function
       if ((*f_iter)->get_returntype()->is_void()) {
-        indent(f_service_client) << "return;" << endl;
+        indent(f_service_client) << "return;" << '\n';
       } else {
         f_service_client << indent() << "throw new \\Exception(\"" << (*f_iter)->get_name()
-                         << " failed: unknown result\");" << endl;
+                         << " failed: unknown result\");" << '\n';
       }
 
       // Close function
@@ -2097,7 +2095,7 @@
   }
 
   indent_down();
-  f_service_client << "}" << endl;
+  f_service_client << "}" << '\n';
 
   // Close service client file
   if (!classmap_) {
@@ -2138,54 +2136,54 @@
             throw "compiler error: cannot serialize void field in a struct: " + name;
             break;
           case t_base_type::TYPE_STRING:
-            out << indent() << "$len = unpack('N', " << itrans << "->readAll(4));" << endl
-                << indent() << "$len = $len[1];" << endl << indent() << "if ($len > 0x7fffffff) {"
-                << endl << indent() << "  $len = 0 - (($len - 1) ^ 0xffffffff);" << endl << indent()
-                << "}" << endl << indent() << "$" << name << " = " << itrans << "->readAll($len);"
-                << endl;
+            out << indent() << "$len = unpack('N', " << itrans << "->readAll(4));" << '\n'
+                << indent() << "$len = $len[1];" << '\n' << indent() << "if ($len > 0x7fffffff) {"
+                << '\n' << indent() << "  $len = 0 - (($len - 1) ^ 0xffffffff);" << '\n' << indent()
+                << "}" << '\n' << indent() << "$" << name << " = " << itrans << "->readAll($len);"
+                << '\n';
             break;
           case t_base_type::TYPE_BOOL:
             out << indent() << "$" << name << " = unpack('c', " << itrans << "->readAll(1));"
-                << endl << indent() << "$" << name << " = (bool)$" << name << "[1];" << endl;
+                << '\n' << indent() << "$" << name << " = (bool)$" << name << "[1];" << '\n';
             break;
           case t_base_type::TYPE_I8:
             out << indent() << "$" << name << " = unpack('c', " << itrans << "->readAll(1));"
-                << endl << indent() << "$" << name << " = $" << name << "[1];" << endl;
+                << '\n' << indent() << "$" << name << " = $" << name << "[1];" << '\n';
             break;
           case t_base_type::TYPE_I16:
-            out << indent() << "$val = unpack('n', " << itrans << "->readAll(2));" << endl
-                << indent() << "$val = $val[1];" << endl << indent() << "if ($val > 0x7fff) {"
-                << endl << indent() << "  $val = 0 - (($val - 1) ^ 0xffff);" << endl << indent()
-                << "}" << endl << indent() << "$" << name << " = $val;" << endl;
+            out << indent() << "$val = unpack('n', " << itrans << "->readAll(2));" << '\n'
+                << indent() << "$val = $val[1];" << '\n' << indent() << "if ($val > 0x7fff) {"
+                << '\n' << indent() << "  $val = 0 - (($val - 1) ^ 0xffff);" << '\n' << indent()
+                << "}" << '\n' << indent() << "$" << name << " = $val;" << '\n';
             break;
           case t_base_type::TYPE_I32:
-            out << indent() << "$val = unpack('N', " << itrans << "->readAll(4));" << endl
-                << indent() << "$val = $val[1];" << endl << indent() << "if ($val > 0x7fffffff) {"
-                << endl << indent() << "  $val = 0 - (($val - 1) ^ 0xffffffff);" << endl << indent()
-                << "}" << endl << indent() << "$" << name << " = $val;" << endl;
+            out << indent() << "$val = unpack('N', " << itrans << "->readAll(4));" << '\n'
+                << indent() << "$val = $val[1];" << '\n' << indent() << "if ($val > 0x7fffffff) {"
+                << '\n' << indent() << "  $val = 0 - (($val - 1) ^ 0xffffffff);" << '\n' << indent()
+                << "}" << '\n' << indent() << "$" << name << " = $val;" << '\n';
             break;
           case t_base_type::TYPE_I64:
-            out << indent() << "$arr = unpack('N2', " << itrans << "->readAll(8));" << endl
-                << indent() << "if ($arr[1] & 0x80000000) {" << endl << indent()
-                << "  $arr[1] = $arr[1] ^ 0xFFFFFFFF;" << endl << indent()
-                << "  $arr[2] = $arr[2] ^ 0xFFFFFFFF;" << endl << indent() << "  $" << name
-                << " = 0 - $arr[1]*4294967296 - $arr[2] - 1;" << endl << indent() << "} else {"
-                << endl << indent() << "  $" << name << " = $arr[1]*4294967296 + $arr[2];" << endl
-                << indent() << "}" << endl;
+            out << indent() << "$arr = unpack('N2', " << itrans << "->readAll(8));" << '\n'
+                << indent() << "if ($arr[1] & 0x80000000) {" << '\n' << indent()
+                << "  $arr[1] = $arr[1] ^ 0xFFFFFFFF;" << '\n' << indent()
+                << "  $arr[2] = $arr[2] ^ 0xFFFFFFFF;" << '\n' << indent() << "  $" << name
+                << " = 0 - $arr[1]*4294967296 - $arr[2] - 1;" << '\n' << indent() << "} else {"
+                << '\n' << indent() << "  $" << name << " = $arr[1]*4294967296 + $arr[2];" << '\n'
+                << indent() << "}" << '\n';
             break;
           case t_base_type::TYPE_DOUBLE:
-            out << indent() << "$arr = unpack('d', strrev(" << itrans << "->readAll(8)));" << endl
-                << indent() << "$" << name << " = $arr[1];" << endl;
+            out << indent() << "$arr = unpack('d', strrev(" << itrans << "->readAll(8)));" << '\n'
+                << indent() << "$" << name << " = $arr[1];" << '\n';
             break;
           default:
             throw "compiler error: no PHP name for base type " + t_base_type::t_base_name(tbase)
                 + tfield->get_name();
           }
         } else if (type->is_enum()) {
-          out << indent() << "$val = unpack('N', " << itrans << "->readAll(4));" << endl << indent()
-              << "$val = $val[1];" << endl << indent() << "if ($val > 0x7fffffff) {" << endl
-              << indent() << "  $val = 0 - (($val - 1) ^ 0xffffffff);" << endl << indent() << "}"
-              << endl << indent() << "$" << name << " = $val;" << endl;
+          out << indent() << "$val = unpack('N', " << itrans << "->readAll(4));" << '\n' << indent()
+              << "$val = $val[1];" << '\n' << indent() << "if ($val > 0x7fffffff) {" << '\n'
+              << indent() << "  $val = 0 - (($val - 1) ^ 0xffffffff);" << '\n' << indent() << "}"
+              << '\n' << indent() << "$" << name << " = $val;" << '\n';
         }
       } else {
 
@@ -2224,7 +2222,7 @@
         } else if (type->is_enum()) {
           out << "readI32($" << name << ");";
         }
-        out << endl;
+        out << '\n';
       }
     } else {
       printf("DO NOT KNOW HOW TO DESERIALIZE FIELD '%s' TYPE '%s'\n",
@@ -2242,8 +2240,8 @@
  */
 void t_php_generator::generate_deserialize_struct(ostream& out, t_struct* tstruct, string prefix) {
   out << indent() << "$" << prefix << " = new " << php_namespace(tstruct->get_program())
-      << tstruct->get_name() << "();" << endl << indent() << "$xfer += $" << prefix
-      << "->read($input);" << endl;
+      << tstruct->get_name() << "();" << '\n' << indent() << "$xfer += $" << prefix
+      << "->read($input);" << '\n';
 }
 
 void t_php_generator::generate_deserialize_container(ostream& out, t_type* ttype, string prefix) {
@@ -2257,44 +2255,44 @@
   t_field fvtype(g_type_i8, vtype);
   t_field fetype(g_type_i8, etype);
 
-  out << indent() << "$" << prefix << " = array();" << endl << indent() << "$" << size << " = 0;"
-      << endl;
+  out << indent() << "$" << prefix << " = array();" << '\n' << indent() << "$" << size << " = 0;"
+      << '\n';
 
   // Declare variables, read header
   if (ttype->is_map()) {
-    out << indent() << "$" << ktype << " = 0;" << endl << indent() << "$" << vtype << " = 0;"
-        << endl;
+    out << indent() << "$" << ktype << " = 0;" << '\n' << indent() << "$" << vtype << " = 0;"
+        << '\n';
     if (binary_inline_) {
       generate_deserialize_field(out, &fktype);
       generate_deserialize_field(out, &fvtype);
       generate_deserialize_field(out, &fsize);
     } else {
       out << indent() << "$xfer += $input->readMapBegin("
-          << "$" << ktype << ", $" << vtype << ", $" << size << ");" << endl;
+          << "$" << ktype << ", $" << vtype << ", $" << size << ");" << '\n';
     }
   } else if (ttype->is_set()) {
     if (binary_inline_) {
       generate_deserialize_field(out, &fetype);
       generate_deserialize_field(out, &fsize);
     } else {
-      out << indent() << "$" << etype << " = 0;" << endl << indent()
+      out << indent() << "$" << etype << " = 0;" << '\n' << indent()
           << "$xfer += $input->readSetBegin("
-          << "$" << etype << ", $" << size << ");" << endl;
+          << "$" << etype << ", $" << size << ");" << '\n';
     }
   } else if (ttype->is_list()) {
     if (binary_inline_) {
       generate_deserialize_field(out, &fetype);
       generate_deserialize_field(out, &fsize);
     } else {
-      out << indent() << "$" << etype << " = 0;" << endl << indent()
+      out << indent() << "$" << etype << " = 0;" << '\n' << indent()
           << "$xfer += $input->readListBegin("
-          << "$" << etype << ", $" << size << ");" << endl;
+          << "$" << etype << ", $" << size << ");" << '\n';
     }
   }
 
   // For loop iterates over elements
   string i = tmp("_i");
-  indent(out) << "for ($" << i << " = 0; $" << i << " < $" << size << "; ++$" << i << ") {" << endl;
+  indent(out) << "for ($" << i << " = 0; $" << i << " < $" << size << "; ++$" << i << ") {" << '\n';
 
   indent_up();
 
@@ -2311,11 +2309,11 @@
   if (!binary_inline_) {
     // Read container end
     if (ttype->is_map()) {
-      indent(out) << "$xfer += $input->readMapEnd();" << endl;
+      indent(out) << "$xfer += $input->readMapEnd();" << '\n';
     } else if (ttype->is_set()) {
-      indent(out) << "$xfer += $input->readSetEnd();" << endl;
+      indent(out) << "$xfer += $input->readSetEnd();" << '\n';
     } else if (ttype->is_list()) {
-      indent(out) << "$xfer += $input->readListEnd();" << endl;
+      indent(out) << "$xfer += $input->readListEnd();" << '\n';
     }
   }
 }
@@ -2329,28 +2327,28 @@
   t_field fkey(tmap->get_key_type(), key);
   t_field fval(tmap->get_val_type(), val);
 
-  indent(out) << declare_field(&fkey, true, true) << endl;
-  indent(out) << declare_field(&fval, true, true) << endl;
+  indent(out) << declare_field(&fkey, true, true) << '\n';
+  indent(out) << declare_field(&fval, true, true) << '\n';
 
   generate_deserialize_field(out, &fkey);
   generate_deserialize_field(out, &fval);
 
-  indent(out) << "$" << prefix << "[$" << key << "] = $" << val << ";" << endl;
+  indent(out) << "$" << prefix << "[$" << key << "] = $" << val << ";" << '\n';
 }
 
 void t_php_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) << "$" << elem << " = null;" << endl;
+  indent(out) << "$" << elem << " = null;" << '\n';
 
   generate_deserialize_field(out, &felem);
 
   t_type* elem_type = tset->get_elem_type();
   if(php_is_scalar(elem_type)) {
-    indent(out) << "$" << prefix << "[$" << elem << "] = true;" << endl;
+    indent(out) << "$" << prefix << "[$" << elem << "] = true;" << '\n';
   } else {
-    indent(out) << "$" << prefix << "[] = $" << elem << ";" << endl;
+    indent(out) << "$" << prefix << "[] = $" << elem << ";" << '\n';
   }
 }
 
@@ -2360,11 +2358,11 @@
   string elem = tmp("elem");
   t_field felem(tlist->get_elem_type(), elem);
 
-  indent(out) << "$" << elem << " = null;" << endl;
+  indent(out) << "$" << elem << " = null;" << '\n';
 
   generate_deserialize_field(out, &felem);
 
-  indent(out) << "$" << prefix << " []= $" << elem << ";" << endl;
+  indent(out) << "$" << prefix << " []= $" << elem << ";" << '\n';
 }
 
 /**
@@ -2397,33 +2395,33 @@
           throw "compiler error: cannot serialize void field in a struct: " + name;
           break;
         case t_base_type::TYPE_STRING:
-          out << indent() << "$output .= pack('N', strlen($" << name << "));" << endl << indent()
-              << "$output .= $" << name << ";" << endl;
+          out << indent() << "$output .= pack('N', strlen($" << name << "));" << '\n' << indent()
+              << "$output .= $" << name << ";" << '\n';
           break;
         case t_base_type::TYPE_BOOL:
-          out << indent() << "$output .= pack('c', $" << name << " ? 1 : 0);" << endl;
+          out << indent() << "$output .= pack('c', $" << name << " ? 1 : 0);" << '\n';
           break;
         case t_base_type::TYPE_I8:
-          out << indent() << "$output .= pack('c', $" << name << ");" << endl;
+          out << indent() << "$output .= pack('c', $" << name << ");" << '\n';
           break;
         case t_base_type::TYPE_I16:
-          out << indent() << "$output .= pack('n', $" << name << ");" << endl;
+          out << indent() << "$output .= pack('n', $" << name << ");" << '\n';
           break;
         case t_base_type::TYPE_I32:
-          out << indent() << "$output .= pack('N', $" << name << ");" << endl;
+          out << indent() << "$output .= pack('N', $" << name << ");" << '\n';
           break;
         case t_base_type::TYPE_I64:
           out << indent() << "$output .= pack('N2', $" << name << " >> 32, $" << name
-              << " & 0xFFFFFFFF);" << endl;
+              << " & 0xFFFFFFFF);" << '\n';
           break;
         case t_base_type::TYPE_DOUBLE:
-          out << indent() << "$output .= strrev(pack('d', $" << name << "));" << endl;
+          out << indent() << "$output .= strrev(pack('d', $" << name << "));" << '\n';
           break;
         default:
           throw "compiler error: no PHP name for base type " + t_base_type::t_base_name(tbase);
         }
       } else if (type->is_enum()) {
-        out << indent() << "$output .= pack('N', $" << name << ");" << endl;
+        out << indent() << "$output .= pack('N', $" << name << ");" << '\n';
       }
     } else {
 
@@ -2462,7 +2460,7 @@
       } else if (type->is_enum()) {
         out << "writeI32($" << name << ");";
       }
-      out << endl;
+      out << '\n';
     }
   } else {
     printf("DO NOT KNOW HOW TO SERIALIZE FIELD '%s%s' TYPE '%s'\n",
@@ -2480,7 +2478,7 @@
  */
 void t_php_generator::generate_serialize_struct(ostream& out, t_struct* tstruct, string prefix) {
   (void)tstruct;
-  indent(out) << "$xfer += $" << prefix << "->write($output);" << endl;
+  indent(out) << "$xfer += $" << prefix << "->write($output);" << '\n';
 }
 
 /**
@@ -2490,35 +2488,35 @@
   if (ttype->is_map()) {
     if (binary_inline_) {
       out << indent() << "$output .= pack('c', " << type_to_enum(((t_map*)ttype)->get_key_type())
-          << ");" << endl << indent() << "$output .= pack('c', "
-          << type_to_enum(((t_map*)ttype)->get_val_type()) << ");" << endl << indent()
-          << "$output .= strrev(pack('l', count($" << prefix << ")));" << endl;
+          << ");" << '\n' << indent() << "$output .= pack('c', "
+          << type_to_enum(((t_map*)ttype)->get_val_type()) << ");" << '\n' << indent()
+          << "$output .= strrev(pack('l', count($" << prefix << ")));" << '\n';
     } else {
       indent(out) << "$output->writeMapBegin(" << type_to_enum(((t_map*)ttype)->get_key_type())
                   << ", " << type_to_enum(((t_map*)ttype)->get_val_type()) << ", "
-                  << "count($" << prefix << "));" << endl;
+                  << "count($" << prefix << "));" << '\n';
     }
   } else if (ttype->is_set()) {
     if (binary_inline_) {
       out << indent() << "$output .= pack('c', " << type_to_enum(((t_set*)ttype)->get_elem_type())
-          << ");" << endl << indent() << "$output .= strrev(pack('l', count($" << prefix << ")));"
-          << endl;
+          << ");" << '\n' << indent() << "$output .= strrev(pack('l', count($" << prefix << ")));"
+          << '\n';
 
     } else {
       indent(out) << "$output->writeSetBegin(" << type_to_enum(((t_set*)ttype)->get_elem_type())
                   << ", "
-                  << "count($" << prefix << "));" << endl;
+                  << "count($" << prefix << "));" << '\n';
     }
   } else if (ttype->is_list()) {
     if (binary_inline_) {
       out << indent() << "$output .= pack('c', " << type_to_enum(((t_list*)ttype)->get_elem_type())
-          << ");" << endl << indent() << "$output .= strrev(pack('l', count($" << prefix << ")));"
-          << endl;
+          << ");" << '\n' << indent() << "$output .= strrev(pack('l', count($" << prefix << ")));"
+          << '\n';
 
     } else {
       indent(out) << "$output->writeListBegin(" << type_to_enum(((t_list*)ttype)->get_elem_type())
                   << ", "
-                  << "count($" << prefix << "));" << endl;
+                  << "count($" << prefix << "));" << '\n';
     }
   }
 
@@ -2526,14 +2524,14 @@
     string kiter = tmp("kiter");
     string viter = tmp("viter");
     indent(out) << "foreach ($" << prefix << " as "
-                << "$" << kiter << " => $" << viter << ") {" << endl;
+                << "$" << kiter << " => $" << viter << ") {" << '\n';
     indent_up();
     generate_serialize_map_element(out, (t_map*)ttype, kiter, viter);
     scope_down(out);
   } else if (ttype->is_set()) {
     string iter = tmp("iter");
     string iter_val = tmp("iter");
-    indent(out) << "foreach ($" << prefix << " as $" << iter << " => $" << iter_val << ") {" << endl;
+    indent(out) << "foreach ($" << prefix << " as $" << iter << " => $" << iter_val << ") {" << '\n';
     indent_up();
 
     t_type* elem_type = ((t_set*)ttype)->get_elem_type();
@@ -2545,7 +2543,7 @@
     scope_down(out);
   } else if (ttype->is_list()) {
     string iter = tmp("iter");
-    indent(out) << "foreach ($" << prefix << " as $" << iter << ") {" << endl;
+    indent(out) << "foreach ($" << prefix << " as $" << iter << ") {" << '\n';
     indent_up();
     generate_serialize_list_element(out, (t_list*)ttype, iter);
     scope_down(out);
@@ -2553,11 +2551,11 @@
 
   if (!binary_inline_) {
     if (ttype->is_map()) {
-      indent(out) << "$output->writeMapEnd();" << endl;
+      indent(out) << "$output->writeMapEnd();" << '\n';
     } else if (ttype->is_set()) {
-      indent(out) << "$output->writeSetEnd();" << endl;
+      indent(out) << "$output->writeSetEnd();" << '\n';
     } else if (ttype->is_list()) {
-      indent(out) << "$output->writeListEnd();" << endl;
+      indent(out) << "$output->writeListEnd();" << '\n';
     }
   }
 }
@@ -2617,12 +2615,12 @@
 
   // prepend free-style doc if available
   if (field->has_doc()) {
-    ss << field->get_doc() << endl;
+    ss << field->get_doc() << '\n';
   }
 
   // append @var tag
   t_type* type = get_true_type(field->get_type());
-  ss << "@var " << type_to_phpdoc(type) << endl;
+  ss << "@var " << type_to_phpdoc(type) << '\n';
 
   generate_php_docstring_comment(out, ss.str());
 }
@@ -2633,7 +2631,7 @@
 void t_php_generator::generate_php_doc(ostream& out, t_function* function) {
   stringstream ss;
   if (function->has_doc()) {
-    ss << function->get_doc() << endl;
+    ss << function->get_doc() << '\n';
   }
 
   // generate parameter types doc
@@ -2645,7 +2643,7 @@
     if (arg->has_doc()) {
       ss << " " << arg->get_doc();
     }
-    ss << endl;
+    ss << '\n';
   }
 
   // generate return type doc
@@ -2655,7 +2653,7 @@
     if (ret_type->has_doc()) {
       ss << " " << ret_type->get_doc();
     }
-    ss << endl;
+    ss << '\n';
   }
 
   // generate exceptions doc
@@ -2667,7 +2665,7 @@
     if (exc->has_doc()) {
       ss << " " << exc->get_doc();
     }
-    ss << endl;
+    ss << '\n';
   }
 
   generate_docstring_comment(out, "/**\n", " * ", ss.str(), " */\n");
diff --git a/compiler/cpp/src/thrift/generate/t_py_generator.cc b/compiler/cpp/src/thrift/generate/t_py_generator.cc
index ffabd56..d3f23b6 100644
--- a/compiler/cpp/src/thrift/generate/t_py_generator.cc
+++ b/compiler/cpp/src/thrift/generate/t_py_generator.cc
@@ -40,8 +40,6 @@
 using std::stringstream;
 using std::vector;
 
-static const string endl = "\n"; // avoid ostream << std::endl flushes
-
 /**
  * Python code generator.
  *
@@ -414,22 +412,22 @@
   for (sv_iter = services.begin(); sv_iter != services.end(); ++sv_iter) {
     f_init << ", '" << (*sv_iter)->get_name() << "'";
   }
-  f_init << "]" << endl;
+  f_init << "]" << '\n';
   f_init.close();
 
   // Print header
-  f_types_ << py_autogen_comment() << endl
-           << py_imports() << endl
-           << render_includes() << endl
-           << "from thrift.transport import TTransport" << endl
+  f_types_ << py_autogen_comment() << '\n'
+           << py_imports() << '\n'
+           << render_includes() << '\n'
+           << "from thrift.transport import TTransport" << '\n'
            << import_dynbase_;
 
-  f_types_ << "all_structs = []" << endl;
+  f_types_ << "all_structs = []" << '\n';
 
   f_consts_ <<
-    py_autogen_comment() << endl <<
-    py_imports() << endl <<
-    "from .ttypes import *" << endl;
+    py_autogen_comment() << '\n' <<
+    py_imports() << '\n' <<
+    "from .ttypes import *" << '\n';
 }
 
 /**
@@ -464,16 +462,16 @@
   ostringstream ss;
   ss << "from thrift.Thrift import TType, TMessageType, TFrozenDict, TException, "
         "TApplicationException"
-     << endl
+     << '\n'
      << "from thrift.protocol.TProtocol import TProtocolException"
-     << endl
+     << '\n'
      << "from thrift.TRecursive import fix_spec"
-     << endl;
+     << '\n';
   if (gen_enum_) {
-    ss << "from enum import IntEnum" << endl;
+    ss << "from enum import IntEnum" << '\n';
   }
   if (gen_utf8strings_) {
-    ss << endl << "import sys";
+    ss << '\n' << "import sys";
   }
   return ss.str();
 }
@@ -484,8 +482,8 @@
 void t_py_generator::close_generator() {
 
   // Fix thrift_spec definitions for recursive structs.
-  f_types_ << "fix_spec(all_structs)" << endl;
-  f_types_ << "del all_structs" << endl;
+  f_types_ << "fix_spec(all_structs)" << '\n';
+  f_types_ << "del all_structs" << '\n';
 
   // Close types file
   f_types_.close();
@@ -519,37 +517,37 @@
     base_class = gen_dynbaseclass_;
   }
 
-  f_types_ << endl
-           << endl
+  f_types_ << '\n'
+           << '\n'
            << "class " << tenum->get_name()
            << (base_class.empty() ? "" : "(" + base_class + ")")
            << ":"
-           << endl;
+           << '\n';
   indent_up();
   generate_python_docstring(f_types_, tenum);
 
-  to_string_mapping << indent() << "_VALUES_TO_NAMES = {" << endl;
-  from_string_mapping << indent() << "_NAMES_TO_VALUES = {" << endl;
+  to_string_mapping << indent() << "_VALUES_TO_NAMES = {" << '\n';
+  from_string_mapping << indent() << "_NAMES_TO_VALUES = {" << '\n';
 
   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) {
     int value = (*c_iter)->get_value();
-    indent(f_types_) << (*c_iter)->get_name() << " = " << value << endl;
+    indent(f_types_) << (*c_iter)->get_name() << " = " << value << '\n';
 
     // Dictionaries to/from string names of enums
     to_string_mapping << indent() << indent() << value << ": \""
-                      << escape_string((*c_iter)->get_name()) << "\"," << endl;
+                      << escape_string((*c_iter)->get_name()) << "\"," << '\n';
     from_string_mapping << indent() << indent() << '"' << escape_string((*c_iter)->get_name())
-                        << "\": " << value << ',' << endl;
+                        << "\": " << value << ',' << '\n';
   }
-  to_string_mapping << indent() << "}" << endl;
-  from_string_mapping << indent() << "}" << endl;
+  to_string_mapping << indent() << "}" << '\n';
+  from_string_mapping << indent() << "}" << '\n';
 
   indent_down();
-  f_types_ << endl;
+  f_types_ << '\n';
   if (!gen_enum_) {
-    f_types_ << to_string_mapping.str() << endl << from_string_mapping.str();
+    f_types_ << to_string_mapping.str() << '\n' << from_string_mapping.str();
   }
 }
 
@@ -562,7 +560,7 @@
   t_const_value* value = tconst->get_value();
 
   indent(f_consts_) << name << " = " << render_const_value(type, value);
-  f_consts_ << endl;
+  f_consts_ << '\n';
 }
 
 /**
@@ -612,7 +610,7 @@
       out << int_val;
     }
   } else if (type->is_struct() || type->is_xception()) {
-    out << type_name(type) << "(**{" << endl;
+    out << type_name(type) << "(**{" << '\n';
     indent_up();
     const vector<t_field*>& fields = ((t_struct*)type)->get_members();
     vector<t_field*>::const_iterator f_iter;
@@ -629,7 +627,7 @@
         throw "type error: " + type->get_name() + " has no field " + v_iter->first->get_string();
       }
       indent(out) << render_const_value(g_type_string, v_iter->first) << ": "
-          << render_const_value(field_type, v_iter->second) << "," << endl;
+          << render_const_value(field_type, v_iter->second) << "," << '\n';
     }
     indent_down();
     indent(out) << "})";
@@ -639,13 +637,13 @@
     if (is_immutable(type)) {
       out << "TFrozenDict(";
     }
-    out << "{" << endl;
+    out << "{" << '\n';
     indent_up();
     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) {
       indent(out) << render_const_value(ktype, v_iter->first) << ": "
-          << render_const_value(vtype, v_iter->second) << "," << endl;
+          << render_const_value(vtype, v_iter->second) << "," << '\n';
     }
     indent_down();
     indent(out) << "}";
@@ -666,15 +664,15 @@
       out << "set(";
     }
     if (is_immutable(type) || type->is_set()) {
-      out << "(" << endl;
+      out << "(" << '\n';
     } else {
-      out << "[" << endl;
+      out << "[" << '\n';
     }
     indent_up();
     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) {
-      indent(out) << render_const_value(etype, *v_iter) << "," << endl;
+      indent(out) << render_const_value(etype, *v_iter) << "," << '\n';
     }
     indent_down();
     if (is_immutable(type) || type->is_set()) {
@@ -743,17 +741,17 @@
   vector<t_field*>::const_iterator m_iter;
 
   // Add struct definition to list so thrift_spec can be fixed for recursive structures.
-  indent(out) << "all_structs.append(" << tstruct->get_name() << ")" << endl;
+  indent(out) << "all_structs.append(" << tstruct->get_name() << ")" << '\n';
 
   if (sorted_members.empty() || (sorted_members[0]->get_key() >= 0)) {
-    indent(out) << tstruct->get_name() << ".thrift_spec = (" << endl;
+    indent(out) << tstruct->get_name() << ".thrift_spec = (" << '\n';
     indent_up();
 
     int sorted_keys_pos = 0;
     for (m_iter = sorted_members.begin(); m_iter != sorted_members.end(); ++m_iter) {
 
       for (; sorted_keys_pos != (*m_iter)->get_key(); sorted_keys_pos++) {
-        indent(out) << "None,  # " << sorted_keys_pos << endl;
+        indent(out) << "None,  # " << sorted_keys_pos << '\n';
       }
 
       indent(out) << "(" << (*m_iter)->get_key() << ", " << type_to_enum((*m_iter)->get_type())
@@ -762,15 +760,15 @@
                   << ", " << type_to_spec_args((*m_iter)->get_type()) << ", "
                   << render_field_default_value(*m_iter) << ", "
                   << "),"
-                  << "  # " << sorted_keys_pos << endl;
+                  << "  # " << sorted_keys_pos << '\n';
 
       sorted_keys_pos++;
     }
 
     indent_down();
-    indent(out) << ")" << endl;
+    indent(out) << ")" << '\n';
   } else {
-    indent(out) << tstruct->get_name() << ".thrift_spec = ()" << endl;
+    indent(out) << tstruct->get_name() << ".thrift_spec = ()" << '\n';
   }
 }
 
@@ -786,7 +784,7 @@
   const vector<t_field*>& sorted_members = tstruct->get_sorted_members();
   vector<t_field*>::const_iterator m_iter;
 
-  out << endl << endl << "class " << tstruct->get_name();
+  out << '\n' << '\n' << "class " << tstruct->get_name();
   if (is_exception) {
     if (gen_dynamic_) {
       if (is_immutable(tstruct)) {
@@ -806,11 +804,11 @@
   } else if (gen_newstyle_) {
     out << "(object)";
   }
-  out << ":" << endl;
+  out << ":" << '\n';
   indent_up();
   generate_python_docstring(out, tstruct);
 
-  out << endl;
+  out << '\n';
 
   /*
      Here we generate the structure specification for the fastbinary codec.
@@ -833,13 +831,13 @@
   */
 
   if (gen_slots_) {
-    indent(out) << "__slots__ = (" << endl;
+    indent(out) << "__slots__ = (" << '\n';
     indent_up();
     for (m_iter = sorted_members.begin(); m_iter != sorted_members.end(); ++m_iter) {
-      indent(out) << "'" << (*m_iter)->get_name() << "'," << endl;
+      indent(out) << "'" << (*m_iter)->get_name() << "'," << '\n';
     }
     indent_down();
-    indent(out) << ")" << endl << endl;
+    indent(out) << ")" << '\n' << '\n';
   }
 
   // TODO(dreiss): Look into generating an empty tuple instead of None
@@ -848,13 +846,13 @@
   // don't have thrift_spec.
 
   if (members.size() > 0) {
-    out << endl;
+    out << '\n';
     out << indent() << "def __init__(self,";
 
     for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
       out << " " << declare_argument(*m_iter) << ",";
     }
-    out << "):" << endl;
+    out << "):" << '\n';
 
     indent_up();
 
@@ -863,10 +861,10 @@
       t_type* type = (*m_iter)->get_type();
       if (!type->is_base_type() && !type->is_enum() && (*m_iter)->get_value() != nullptr) {
         indent(out) << "if " << (*m_iter)->get_name() << " is "
-                    << "self.thrift_spec[" << (*m_iter)->get_key() << "][4]:" << endl;
+                    << "self.thrift_spec[" << (*m_iter)->get_key() << "][4]:" << '\n';
         indent_up();
         indent(out) << (*m_iter)->get_name() << " = " << render_field_default_value(*m_iter)
-                    << endl;
+                    << '\n';
         indent_down();
       }
 
@@ -875,16 +873,16 @@
           indent(out) << "super(" << tstruct->get_name() << ", self).__setattr__('"
                       << (*m_iter)->get_name() << "', " << (*m_iter)->get_name()
                       << " if hasattr("  << (*m_iter)->get_name() << ", 'value') else "
-                      << type_name(type) << ".__members__.get(" << (*m_iter)->get_name() << "))" << endl;
+                      << type_name(type) << ".__members__.get(" << (*m_iter)->get_name() << "))" << '\n';
         } else if (gen_newstyle_ || gen_dynamic_) {
           indent(out) << "super(" << tstruct->get_name() << ", self).__setattr__('"
-                      << (*m_iter)->get_name() << "', " << (*m_iter)->get_name() << ")" << endl;
+                      << (*m_iter)->get_name() << "', " << (*m_iter)->get_name() << ")" << '\n';
         } else {
           indent(out) << "self.__dict__['" << (*m_iter)->get_name()
-                      << "'] = " << (*m_iter)->get_name() << endl;
+                      << "'] = " << (*m_iter)->get_name() << '\n';
         }
       } else {
-        indent(out) << "self." << (*m_iter)->get_name() << " = " << (*m_iter)->get_name() << endl;
+        indent(out) << "self." << (*m_iter)->get_name() << " = " << (*m_iter)->get_name() << '\n';
       }
     }
 
@@ -892,8 +890,8 @@
   }
 
   if (is_immutable(tstruct)) {
-    out << endl;
-    out << indent() << "def __setattr__(self, *args):" << endl;
+    out << '\n';
+    out << indent() << "def __setattr__(self, *args):" << '\n';
     indent_up();
 
     // Not user-provided fields should be editable so that the Python Standard Library can edit
@@ -902,16 +900,16 @@
     // trivial because we know which fields are user-provided, without slots we need to build a
     // way to know which fields are user-provided.
     if (gen_slots_ && !gen_dynamic_) {
-        out << indent() << "if args[0] not in self.__slots__:" << endl;
+        out << indent() << "if args[0] not in self.__slots__:" << '\n';
         indent_up();
-        out << indent() << "super().__setattr__(*args)" << endl
-            << indent() << "return" << endl;
+        out << indent() << "super().__setattr__(*args)" << '\n'
+            << indent() << "return" << '\n';
         indent_down();
     }
-    out << indent() << "raise TypeError(\"can't modify immutable instance\")" << endl;
+    out << indent() << "raise TypeError(\"can't modify immutable instance\")" << '\n';
     indent_down();
-    out << endl;
-    out << indent() << "def __delattr__(self, *args):" << endl;
+    out << '\n';
+    out << indent() << "def __delattr__(self, *args):" << '\n';
     indent_up();
 
     // Not user-provided fields should be editable so that the Python Standard Library can edit
@@ -920,26 +918,26 @@
     // trivial because we know which fields are user-provided, without slots we need to build a
     // way to know which fields are user-provided.
     if (gen_slots_ && !gen_dynamic_) {
-        out << indent() << "if args[0] not in self.__slots__:" << endl;
+        out << indent() << "if args[0] not in self.__slots__:" << '\n';
         indent_up();
-        out << indent() << "super().__delattr__(*args)" << endl
-            << indent() << "return" << endl;
+        out << indent() << "super().__delattr__(*args)" << '\n'
+            << indent() << "return" << '\n';
         indent_down();
     }
-    out << indent() << "raise TypeError(\"can't modify immutable instance\")" << endl;
+    out << indent() << "raise TypeError(\"can't modify immutable instance\")" << '\n';
     indent_down();
-    out << endl;
+    out << '\n';
 
     // Hash all of the members in order, and also hash in the class
     // to avoid collisions for stuff like single-field structures.
-    out << indent() << "def __hash__(self):" << endl
+    out << indent() << "def __hash__(self):" << '\n'
         << indent() << indent_str() << "return hash(self.__class__) ^ hash((";
 
     for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
       out << "self." << (*m_iter)->get_name() << ", ";
     }
 
-    out << "))" << endl;
+    out << "))" << '\n';
   } else if (gen_enum_) {
     bool has_enum = false;
     for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
@@ -951,25 +949,25 @@
     }
 
     if (has_enum) {
-      out << endl;
-      indent(out) << "def __setattr__(self, name, value):" << endl;
+      out << '\n';
+      indent(out) << "def __setattr__(self, name, value):" << '\n';
       indent_up();
       for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
         t_type* type = (*m_iter)->get_type();
         if (type->is_enum()) {
-          out << indent() << "if name == \"" << (*m_iter)->get_name() << "\":" << endl
+          out << indent() << "if name == \"" << (*m_iter)->get_name() << "\":" << '\n'
               << indent() << indent_str() << "super().__setattr__(name, value if hasattr(value, 'value') else "
-              << type_name(type) << ".__members__.get(value))" << endl
-              << indent() << indent_str() << "return" << endl;
+              << type_name(type) << ".__members__.get(value))" << '\n'
+              << indent() << indent_str() << "return" << '\n';
         }
       }
-      indent(out) << "super().__setattr__(name, value)" << endl << endl;
+      indent(out) << "super().__setattr__(name, value)" << '\n' << '\n';
       indent_down();
     }
   }
 
   if (!gen_dynamic_) {
-    out << endl;
+    out << '\n';
     generate_py_struct_reader(out, tstruct);
     generate_py_struct_writer(out, tstruct);
   }
@@ -978,64 +976,64 @@
   // because when raised exceptions are printed to the console, __repr__
   // isn't used. See python bug #5882
   if (is_exception) {
-    out << endl;
-    out << indent() << "def __str__(self):" << endl
-        << indent() << indent_str() << "return repr(self)" << endl;
+    out << '\n';
+    out << indent() << "def __str__(self):" << '\n'
+        << indent() << indent_str() << "return repr(self)" << '\n';
   }
 
   if (!gen_slots_) {
-    out << endl;
+    out << '\n';
     // Printing utilities so that on the command line thrift
     // structs look pretty like dictionaries
-    indent(out) << "def __repr__(self):" << endl;
+    indent(out) << "def __repr__(self):" << '\n';
     indent_up();
-    out << indent() << "L = ['%s=%r' % (key, value)" << endl
-        << indent() << "     for key, value in self.__dict__.items()]" << endl
-        << indent() << "return '%s(%s)' % (self.__class__.__name__, ', '.join(L))" << endl
-        << endl;
+    out << indent() << "L = ['%s=%r' % (key, value)" << '\n'
+        << indent() << "     for key, value in self.__dict__.items()]" << '\n'
+        << indent() << "return '%s(%s)' % (self.__class__.__name__, ', '.join(L))" << '\n'
+        << '\n';
     indent_down();
 
     // Equality and inequality methods that compare by value
-    out << indent() << "def __eq__(self, other):" << endl;
+    out << indent() << "def __eq__(self, other):" << '\n';
     indent_up();
     out << indent() << "return isinstance(other, self.__class__) and "
-                       "self.__dict__ == other.__dict__" << endl;
+                       "self.__dict__ == other.__dict__" << '\n';
     indent_down();
-    out << endl;
+    out << '\n';
 
-    out << indent() << "def __ne__(self, other):" << endl;
+    out << indent() << "def __ne__(self, other):" << '\n';
     indent_up();
 
-    out << indent() << "return not (self == other)" << endl;
+    out << indent() << "return not (self == other)" << '\n';
     indent_down();
   } else if (!gen_dynamic_) {
-    out << endl;
+    out << '\n';
     // no base class available to implement __eq__ and __repr__ and __ne__ for us
     // so we must provide one that uses __slots__
-    indent(out) << "def __repr__(self):" << endl;
+    indent(out) << "def __repr__(self):" << '\n';
     indent_up();
-    out << indent() << "L = ['%s=%r' % (key, getattr(self, key))" << endl
-        << indent() << "     for key in self.__slots__]" << endl
-        << indent() << "return '%s(%s)' % (self.__class__.__name__, ', '.join(L))" << endl
-        << endl;
+    out << indent() << "L = ['%s=%r' % (key, getattr(self, key))" << '\n'
+        << indent() << "     for key in self.__slots__]" << '\n'
+        << indent() << "return '%s(%s)' % (self.__class__.__name__, ', '.join(L))" << '\n'
+        << '\n';
     indent_down();
 
     // Equality method that compares each attribute by value and type, walking __slots__
-    out << indent() << "def __eq__(self, other):" << endl;
+    out << indent() << "def __eq__(self, other):" << '\n';
     indent_up();
-    out << indent() << "if not isinstance(other, self.__class__):" << endl
-        << indent() << indent_str() << "return False" << endl
-        << indent() << "for attr in self.__slots__:" << endl
-        << indent() << indent_str() << "my_val = getattr(self, attr)" << endl
-        << indent() << indent_str() << "other_val = getattr(other, attr)" << endl
-        << indent() << indent_str() << "if my_val != other_val:" << endl
-        << indent() << indent_str() << indent_str() << "return False" << endl
-        << indent() << "return True" << endl
-        << endl;
+    out << indent() << "if not isinstance(other, self.__class__):" << '\n'
+        << indent() << indent_str() << "return False" << '\n'
+        << indent() << "for attr in self.__slots__:" << '\n'
+        << indent() << indent_str() << "my_val = getattr(self, attr)" << '\n'
+        << indent() << indent_str() << "other_val = getattr(other, attr)" << '\n'
+        << indent() << indent_str() << "if my_val != other_val:" << '\n'
+        << indent() << indent_str() << indent_str() << "return False" << '\n'
+        << indent() << "return True" << '\n'
+        << '\n';
     indent_down();
 
-    out << indent() << "def __ne__(self, other):" << endl
-        << indent() << indent_str() << "return not (self == other)" << endl;
+    out << indent() << "def __ne__(self, other):" << '\n'
+        << indent() << indent_str() << "return not (self == other)" << '\n';
   }
   indent_down();
 }
@@ -1048,9 +1046,9 @@
   vector<t_field*>::const_iterator f_iter;
 
   if (is_immutable(tstruct)) {
-    out << indent() << "@classmethod" << endl << indent() << "def read(cls, iprot):" << endl;
+    out << indent() << "@classmethod" << '\n' << indent() << "def read(cls, iprot):" << '\n';
   } else {
-    indent(out) << "def read(self, iprot):" << endl;
+    indent(out) << "def read(self, iprot):" << '\n';
   }
   indent_up();
 
@@ -1059,18 +1057,18 @@
   indent(out) << "if iprot._fast_decode is not None "
                  "and isinstance(iprot.trans, TTransport.CReadableTransport) "
                  "and "
-              << id << ".thrift_spec is not None:" << endl;
+              << id << ".thrift_spec is not None:" << '\n';
   indent_up();
 
   if (is_immutable(tstruct)) {
-    indent(out) << "return iprot._fast_decode(None, iprot, [cls, cls.thrift_spec])" << endl;
+    indent(out) << "return iprot._fast_decode(None, iprot, [cls, cls.thrift_spec])" << '\n';
   } else {
-    indent(out) << "iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec])" << endl;
-    indent(out) << "return" << endl;
+    indent(out) << "iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec])" << '\n';
+    indent(out) << "return" << '\n';
   }
   indent_down();
 
-  indent(out) << "iprot.readStructBegin()" << endl;
+  indent(out) << "iprot.readStructBegin()" << '\n';
 
   if (is_immutable(tstruct)) {
     for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
@@ -1082,21 +1080,21 @@
       } else {
         result << "None";
       }
-      indent(out) << result.str() << endl;
+      indent(out) << result.str() << '\n';
      }
   }
 
   // Loop over reading in fields
-  indent(out) << "while True:" << endl;
+  indent(out) << "while True:" << '\n';
   indent_up();
 
   // Read beginning field marker
-  indent(out) << "(fname, ftype, fid) = iprot.readFieldBegin()" << endl;
+  indent(out) << "(fname, ftype, fid) = iprot.readFieldBegin()" << '\n';
 
   // Check for field STOP marker and break
-  indent(out) << "if ftype == TType.STOP:" << endl;
+  indent(out) << "if ftype == TType.STOP:" << '\n';
   indent_up();
-  indent(out) << "break" << endl;
+  indent(out) << "break" << '\n';
   indent_down();
 
   // Switch statement on the field we are reading
@@ -1110,9 +1108,9 @@
     } else {
       out << indent() << "elif ";
     }
-    out << "fid == " << (*f_iter)->get_key() << ":" << endl;
+    out << "fid == " << (*f_iter)->get_key() << ":" << '\n';
     indent_up();
-    indent(out) << "if ftype == " << type_to_enum((*f_iter)->get_type()) << ":" << endl;
+    indent(out) << "if ftype == " << type_to_enum((*f_iter)->get_type()) << ":" << '\n';
     indent_up();
     if (is_immutable(tstruct)) {
       generate_deserialize_field(out, *f_iter);
@@ -1120,32 +1118,32 @@
       generate_deserialize_field(out, *f_iter, "self.");
     }
     indent_down();
-    out << indent() << "else:" << endl << indent() << indent_str() << "iprot.skip(ftype)" << endl;
+    out << indent() << "else:" << '\n' << indent() << indent_str() << "iprot.skip(ftype)" << '\n';
     indent_down();
   }
 
   // In the default case we skip the field
-  out << indent() << "else:" << endl << indent() << indent_str() << "iprot.skip(ftype)" << endl;
+  out << indent() << "else:" << '\n' << indent() << indent_str() << "iprot.skip(ftype)" << '\n';
 
   // Read field end marker
-  indent(out) << "iprot.readFieldEnd()" << endl;
+  indent(out) << "iprot.readFieldEnd()" << '\n';
 
   indent_down();
 
-  indent(out) << "iprot.readStructEnd()" << endl;
+  indent(out) << "iprot.readStructEnd()" << '\n';
 
   if (is_immutable(tstruct)) {
-    indent(out) << "return cls(" << endl;
+    indent(out) << "return cls(" << '\n';
     indent_up();
     for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
-      indent(out) << (*f_iter)->get_name() << "=" << (*f_iter)->get_name() << "," << endl;
+      indent(out) << (*f_iter)->get_name() << "=" << (*f_iter)->get_name() << "," << '\n';
     }
     indent_down();
-    indent(out) << ")" << endl;
+    indent(out) << ")" << '\n';
   }
 
   indent_down();
-  out << endl;
+  out << '\n';
 }
 
 void t_py_generator::generate_py_struct_writer(ostream& out, t_struct* tstruct) {
@@ -1153,49 +1151,49 @@
   const vector<t_field*>& fields = tstruct->get_sorted_members();
   vector<t_field*>::const_iterator f_iter;
 
-  indent(out) << "def write(self, oprot):" << endl;
+  indent(out) << "def write(self, oprot):" << '\n';
   indent_up();
 
-  indent(out) << "if oprot._fast_encode is not None and self.thrift_spec is not None:" << endl;
+  indent(out) << "if oprot._fast_encode is not None and self.thrift_spec is not None:" << '\n';
   indent_up();
 
   indent(out)
       << "oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))"
-      << endl;
-  indent(out) << "return" << endl;
+      << '\n';
+  indent(out) << "return" << '\n';
   indent_down();
 
-  indent(out) << "oprot.writeStructBegin('" << name << "')" << endl;
+  indent(out) << "oprot.writeStructBegin('" << name << "')" << '\n';
 
   for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
     // Write field header
-    indent(out) << "if self." << (*f_iter)->get_name() << " is not None:" << endl;
+    indent(out) << "if self." << (*f_iter)->get_name() << " is not None:" << '\n';
     indent_up();
     indent(out) << "oprot.writeFieldBegin("
                 << "'" << (*f_iter)->get_name() << "', " << type_to_enum((*f_iter)->get_type())
-                << ", " << (*f_iter)->get_key() << ")" << endl;
+                << ", " << (*f_iter)->get_key() << ")" << '\n';
 
     // Write field contents
     generate_serialize_field(out, *f_iter, "self.");
 
     // Write field closer
-    indent(out) << "oprot.writeFieldEnd()" << endl;
+    indent(out) << "oprot.writeFieldEnd()" << '\n';
 
     indent_down();
   }
 
   // Write the struct map
-  out << indent() << "oprot.writeFieldStop()" << endl << indent() << "oprot.writeStructEnd()"
-      << endl;
+  out << indent() << "oprot.writeFieldStop()" << '\n' << indent() << "oprot.writeStructEnd()"
+      << '\n';
 
-  out << endl;
+  out << '\n';
 
   indent_down();
   generate_py_struct_required_validator(out, tstruct);
 }
 
 void t_py_generator::generate_py_struct_required_validator(ostream& out, t_struct* tstruct) {
-  indent(out) << "def validate(self):" << endl;
+  indent(out) << "def validate(self):" << '\n';
   indent_up();
 
   const vector<t_field*>& fields = tstruct->get_members();
@@ -1206,14 +1204,14 @@
     for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
       t_field* field = (*f_iter);
       if (field->get_req() == t_field::T_REQUIRED) {
-        indent(out) << "if self." << field->get_name() << " is None:" << endl;
+        indent(out) << "if self." << field->get_name() << " is None:" << '\n';
         indent(out) << indent_str() << "raise TProtocolException(message='Required field "
-                    << field->get_name() << " is unset!')" << endl;
+                    << field->get_name() << " is unset!')" << '\n';
       }
     }
   }
 
-  indent(out) << "return" << endl;
+  indent(out) << "return" << '\n';
   indent_down();
 }
 
@@ -1226,32 +1224,32 @@
   string f_service_name = package_dir_ + "/" + service_name_ + ".py";
   f_service_.open(f_service_name.c_str());
 
-  f_service_ << py_autogen_comment() << endl << py_imports() << endl;
+  f_service_ << py_autogen_comment() << '\n' << py_imports() << '\n';
 
   if (tservice->get_extends() != nullptr) {
     f_service_ << "import "
                << get_real_py_module(tservice->get_extends()->get_program(), gen_twisted_, package_prefix_) << "."
-               << tservice->get_extends()->get_name() << endl;
+               << tservice->get_extends()->get_name() << '\n';
   }
 
-  f_service_ << "import logging" << endl
-             << "from .ttypes import *" << endl
-             << "from thrift.Thrift import TProcessor" << endl
-             << "from thrift.transport import TTransport" << endl
+  f_service_ << "import logging" << '\n'
+             << "from .ttypes import *" << '\n'
+             << "from thrift.Thrift import TProcessor" << '\n'
+             << "from thrift.transport import TTransport" << '\n'
              << import_dynbase_;
   if (gen_zope_interface_) {
-    f_service_ << "from zope.interface import Interface, implementer" << endl;
+    f_service_ << "from zope.interface import Interface, implementer" << '\n';
   }
 
   if (gen_twisted_) {
-    f_service_ << "from twisted.internet import defer" << endl
-               << "from thrift.transport import TTwisted" << endl;
+    f_service_ << "from twisted.internet import defer" << '\n'
+               << "from thrift.transport import TTwisted" << '\n';
   } else if (gen_tornado_) {
-    f_service_ << "from tornado import gen" << endl;
-    f_service_ << "from tornado import concurrent" << endl;
+    f_service_ << "from tornado import gen" << '\n';
+    f_service_ << "from tornado import concurrent" << '\n';
   }
 
-  f_service_ << "all_structs = []" << endl;
+  f_service_ << "all_structs = []" << '\n';
 
   // Generate the three main parts of the service
   generate_service_interface(tservice);
@@ -1261,8 +1259,8 @@
   generate_service_remote(tservice);
 
   // Close service file
-  f_service_ << "fix_spec(all_structs)" << endl
-             << "del all_structs" << endl;
+  f_service_ << "fix_spec(all_structs)" << '\n'
+             << "del all_structs" << '\n';
   f_service_.close();
 }
 
@@ -1275,7 +1273,7 @@
   vector<t_function*> functions = tservice->get_functions();
   vector<t_function*>::iterator f_iter;
 
-  f_service_ << endl << "# HELPER FUNCTIONS AND STRUCTURES" << endl;
+  f_service_ << '\n' << "# HELPER FUNCTIONS AND STRUCTURES" << '\n';
 
   for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
     t_struct* ts = (*f_iter)->get_arglist();
@@ -1328,12 +1326,12 @@
     }
   }
 
-  f_service_ << endl << endl << "class Iface" << extends_if << ":" << endl;
+  f_service_ << '\n' << '\n' << "class Iface" << extends_if << ":" << '\n';
   indent_up();
   generate_python_docstring(f_service_, tservice);
   vector<t_function*> functions = tservice->get_functions();
   if (functions.empty()) {
-    f_service_ << indent() << "pass" << endl;
+    f_service_ << indent() << "pass" << '\n';
   } else {
     vector<t_function*>::iterator f_iter;
     bool first = true;
@@ -1341,12 +1339,12 @@
       if (first) {
         first = false;
       } else {
-        f_service_ << endl;
+        f_service_ << '\n';
       }
-      f_service_ << indent() << "def " << function_signature(*f_iter, true) << ":" << endl;
+      f_service_ << indent() << "def " << function_signature(*f_iter, true) << ":" << '\n';
       indent_up();
       generate_python_docstring(f_service_, (*f_iter));
-      f_service_ << indent() << "pass" << endl;
+      f_service_ << indent() << "pass" << '\n';
       indent_down();
     }
   }
@@ -1375,91 +1373,91 @@
     }
   }
 
-  f_service_ << endl << endl;
+  f_service_ << '\n' << '\n';
 
   if (gen_zope_interface_) {
-    f_service_ << "@implementer(Iface)" << endl
-               << "class Client" << extends_client << ":" << endl
-               << endl;
+    f_service_ << "@implementer(Iface)" << '\n'
+               << "class Client" << extends_client << ":" << '\n'
+               << '\n';
   } else {
-    f_service_ << "class Client(" << extends_client << "Iface):" << endl;
+    f_service_ << "class Client(" << extends_client << "Iface):" << '\n';
   }
   indent_up();
   generate_python_docstring(f_service_, tservice);
 
   // Constructor function
   if (gen_twisted_) {
-    f_service_ << indent() << "def __init__(self, transport, oprot_factory):" << endl;
+    f_service_ << indent() << "def __init__(self, transport, oprot_factory):" << '\n';
   } else if (gen_tornado_) {
     f_service_ << indent()
-               << "def __init__(self, transport, iprot_factory, oprot_factory=None):" << endl;
+               << "def __init__(self, transport, iprot_factory, oprot_factory=None):" << '\n';
   } else {
-    f_service_ << indent() << "def __init__(self, iprot, oprot=None):" << endl;
+    f_service_ << indent() << "def __init__(self, iprot, oprot=None):" << '\n';
   }
   indent_up();
   if (extends.empty()) {
     if (gen_twisted_) {
-      f_service_ << indent() << "self._transport = transport" << endl
-                 << indent() << "self._oprot_factory = oprot_factory" << endl
-                 << indent() << "self._seqid = 0" << endl
-                 << indent() << "self._reqs = {}" << endl;
+      f_service_ << indent() << "self._transport = transport" << '\n'
+                 << indent() << "self._oprot_factory = oprot_factory" << '\n'
+                 << indent() << "self._seqid = 0" << '\n'
+                 << indent() << "self._reqs = {}" << '\n';
     } else if (gen_tornado_) {
-      f_service_ << indent() << "self._transport = transport" << endl
-                 << indent() << "self._iprot_factory = iprot_factory" << endl
+      f_service_ << indent() << "self._transport = transport" << '\n'
+                 << indent() << "self._iprot_factory = iprot_factory" << '\n'
                  << indent() << "self._oprot_factory = (oprot_factory if oprot_factory is not None"
-                 << endl
-                 << indent() << "                       else iprot_factory)" << endl
-                 << indent() << "self._seqid = 0" << endl
-                 << indent() << "self._reqs = {}" << endl
+                 << '\n'
+                 << indent() << "                       else iprot_factory)" << '\n'
+                 << indent() << "self._seqid = 0" << '\n'
+                 << indent() << "self._reqs = {}" << '\n'
                  << indent() << "self._transport.io_loop.spawn_callback(self._start_receiving)"
-                 << endl;
+                 << '\n';
     } else {
-      f_service_ << indent() << "self._iprot = self._oprot = iprot" << endl
-                 << indent() << "if oprot is not None:" << endl
-                 << indent() << indent_str() << "self._oprot = oprot" << endl
-                 << indent() << "self._seqid = 0" << endl;
+      f_service_ << indent() << "self._iprot = self._oprot = iprot" << '\n'
+                 << indent() << "if oprot is not None:" << '\n'
+                 << indent() << indent_str() << "self._oprot = oprot" << '\n'
+                 << indent() << "self._seqid = 0" << '\n';
     }
   } else {
     if (gen_twisted_) {
       f_service_ << indent() << extends
-                 << ".Client.__init__(self, transport, oprot_factory)" << endl;
+                 << ".Client.__init__(self, transport, oprot_factory)" << '\n';
     } else if (gen_tornado_) {
       f_service_ << indent() << extends
-                 << ".Client.__init__(self, transport, iprot_factory, oprot_factory)" << endl;
+                 << ".Client.__init__(self, transport, iprot_factory, oprot_factory)" << '\n';
     } else {
-      f_service_ << indent() << extends << ".Client.__init__(self, iprot, oprot)" << endl;
+      f_service_ << indent() << extends << ".Client.__init__(self, iprot, oprot)" << '\n';
     }
   }
   indent_down();
 
   if (gen_tornado_ && extends.empty()) {
-    f_service_ << endl <<
-      indent() << "@gen.engine" << endl <<
-      indent() << "def _start_receiving(self):" << endl;
+    f_service_ << '\n' <<
+      indent() << "@gen.engine" << '\n' <<
+      indent() << "def _start_receiving(self):" << '\n';
     indent_up();
-    indent(f_service_) << "while True:" << endl;
+    indent(f_service_) << "while True:" << '\n';
     indent_up();
-    f_service_ << indent() << "try:" << endl
-               << indent() << indent_str() << "frame = yield self._transport.readFrame()" << endl
-               << indent() << "except TTransport.TTransportException as e:" << endl
-               << indent() << indent_str() << "for future in self._reqs.values():" << endl
-               << indent() << indent_str() << indent_str() << "future.set_exception(e)" << endl
-               << indent() << indent_str() << "self._reqs = {}" << endl
-               << indent() << indent_str() << "return" << endl
-               << indent() << "tr = TTransport.TMemoryBuffer(frame)" << endl
-               << indent() << "iprot = self._iprot_factory.getProtocol(tr)" << endl
-               << indent() << "(fname, mtype, rseqid) = iprot.readMessageBegin()" << endl
-               << indent() << "method = getattr(self, 'recv_' + fname)" << endl
-               << indent() << "future = self._reqs.pop(rseqid, None)" << endl
-               << indent() << "if not future:" << endl
-               << indent() << indent_str() << "# future has already been discarded" << endl
-               << indent() << indent_str() << "continue" << endl
-               << indent() << "try:" << endl
-               << indent() << indent_str() << "result = method(iprot, mtype, rseqid)" << endl
-               << indent() << "except Exception as e:" << endl
-               << indent() << indent_str() << "future.set_exception(e)" << endl
-               << indent() << "else:" << endl
-               << indent() << indent_str() << "future.set_result(result)" << endl;
+    f_service_ << indent() << "try:" << '\n'
+               << indent() << indent_str() << "frame = yield self._transport.readFrame()" << '\n'
+               << indent() << "except TTransport.TTransportException as e:" << '\n'
+               << indent() << indent_str() << "for future in self._reqs.values():" << '\n'
+               << indent() << indent_str() << indent_str() << "future.set_exception(e)" << '\n'
+               << indent() << indent_str() << "self._reqs = {}" << '\n'
+               << indent() << indent_str() << "return" << '\n'
+               << indent() << "tr = TTransport.TMemoryBuffer(frame)" << '\n'
+               << indent() << "iprot = self._iprot_factory.getProtocol(tr)" << '\n'
+               << indent() << "(fname, mtype, rseqid) = iprot.readMessageBegin()" << '\n'
+               << indent() << "method = getattr(self, 'recv_' + fname)" << '\n'
+               << indent() << "future = self._reqs.pop(rseqid, None)" << '\n'
+               << indent() << "if not future:" << '\n'
+               << indent() << indent_str() << "# future has already been discarded" << '\n'
+               << indent() << indent_str() << "continue" << '\n'
+               << indent() << "try:" << '\n'
+               << indent() << indent_str() << "result = method(iprot, mtype, rseqid)" << '\n'
+               << indent() << "except Exception as e:" << '\n'
+               << indent() << indent_str() << "future.set_exception(e)" << '\n'
+               << indent() << "else:" << '\n'
+               << indent() << indent_str() << "future.set_result(result)" << '\n';
     indent_down();
     indent_down();
   }
@@ -1473,20 +1471,20 @@
     vector<t_field*>::const_iterator fld_iter;
     string funname = (*f_iter)->get_name();
 
-    f_service_ << endl;
+    f_service_ << '\n';
     // Open function
-    indent(f_service_) << "def " << function_signature(*f_iter, false) << ":" << endl;
+    indent(f_service_) << "def " << function_signature(*f_iter, false) << ":" << '\n';
     indent_up();
     generate_python_docstring(f_service_, (*f_iter));
     if (gen_twisted_) {
-      indent(f_service_) << "seqid = self._seqid = self._seqid + 1" << endl;
-      indent(f_service_) << "self._reqs[seqid] = defer.Deferred()" << endl << endl;
+      indent(f_service_) << "seqid = self._seqid = self._seqid + 1" << '\n';
+      indent(f_service_) << "self._reqs[seqid] = defer.Deferred()" << '\n' << '\n';
       indent(f_service_) << "d = defer.maybeDeferred(self.send_" << funname;
 
     } else if (gen_tornado_) {
-      indent(f_service_) << "self._seqid += 1" << endl;
+      indent(f_service_) << "self._seqid += 1" << '\n';
       if (!(*f_iter)->is_oneway()) {
-        indent(f_service_) << "future = self._reqs[self._seqid] = concurrent.Future()" << endl;
+        indent(f_service_) << "future = self._reqs[self._seqid] = concurrent.Future()" << '\n';
       }
       indent(f_service_) << "self.send_" << funname << "(";
 
@@ -1509,19 +1507,19 @@
       f_service_ << (*fld_iter)->get_name();
     }
 
-    f_service_ << ")" << endl;
+    f_service_ << ")" << '\n';
 
     if (!(*f_iter)->is_oneway()) {
       if (gen_twisted_) {
         // nothing. See the next block.
       } else if (gen_tornado_) {
-        indent(f_service_) << "return future" << endl;
+        indent(f_service_) << "return future" << '\n';
       } else {
         f_service_ << indent();
         if (!(*f_iter)->get_returntype()->is_void()) {
           f_service_ << "return ";
         }
-        f_service_ << "self.recv_" << funname << "()" << endl;
+        f_service_ << "self.recv_" << funname << "()" << '\n';
       }
     }
     indent_down();
@@ -1529,40 +1527,40 @@
     if (gen_twisted_) {
       // This block injects the body of the send_<> method for twisted (and a cb/eb pair)
       indent_up();
-      indent(f_service_) << "d.addCallbacks(" << endl;
+      indent(f_service_) << "d.addCallbacks(" << '\n';
 
       indent_up();
-      f_service_ << indent() << "callback=self.cb_send_" << funname << "," << endl << indent()
-                 << "callbackArgs=(seqid,)," << endl << indent() << "errback=self.eb_send_"
-                 << funname << "," << endl << indent() << "errbackArgs=(seqid,))" << endl;
+      f_service_ << indent() << "callback=self.cb_send_" << funname << "," << '\n' << indent()
+                 << "callbackArgs=(seqid,)," << '\n' << indent() << "errback=self.eb_send_"
+                 << funname << "," << '\n' << indent() << "errbackArgs=(seqid,))" << '\n';
       indent_down();
 
-      indent(f_service_) << "return d" << endl;
+      indent(f_service_) << "return d" << '\n';
       indent_down();
-      f_service_ << endl;
+      f_service_ << '\n';
 
-      indent(f_service_) << "def cb_send_" << funname << "(self, _, seqid):" << endl;
+      indent(f_service_) << "def cb_send_" << funname << "(self, _, seqid):" << '\n';
       indent_up();
       if ((*f_iter)->is_oneway()) {
         // if one-way, fire the deferred & remove it from _reqs
-        f_service_ << indent() << "d = self._reqs.pop(seqid)" << endl << indent()
-                   << "d.callback(None)" << endl << indent() << "return d" << endl;
+        f_service_ << indent() << "d = self._reqs.pop(seqid)" << '\n' << indent()
+                   << "d.callback(None)" << '\n' << indent() << "return d" << '\n';
       } else {
-        f_service_ << indent() << "return self._reqs[seqid]" << endl;
+        f_service_ << indent() << "return self._reqs[seqid]" << '\n';
       }
       indent_down();
-      f_service_ << endl;
+      f_service_ << '\n';
 
       // add an errback to fail the request if the call to send_<> raised an exception
-      indent(f_service_) << "def eb_send_" << funname << "(self, f, seqid):" << endl;
+      indent(f_service_) << "def eb_send_" << funname << "(self, f, seqid):" << '\n';
       indent_up();
-      f_service_ << indent() << "d = self._reqs.pop(seqid)" << endl << indent() << "d.errback(f)"
-                 << endl << indent() << "return d" << endl;
+      f_service_ << indent() << "d = self._reqs.pop(seqid)" << '\n' << indent() << "d.errback(f)"
+                 << '\n' << indent() << "return d" << '\n';
       indent_down();
     }
 
-    f_service_ << endl;
-    indent(f_service_) << "def send_" << function_signature(*f_iter, false) << ":" << endl;
+    f_service_ << '\n';
+    indent(f_service_) << "def send_" << function_signature(*f_iter, false) << ":" << '\n';
     indent_up();
 
     std::string argsname = (*f_iter)->get_name() + "_args";
@@ -1570,29 +1568,29 @@
 
     // Serialize the request header
     if (gen_twisted_ || gen_tornado_) {
-      f_service_ << indent() << "oprot = self._oprot_factory.getProtocol(self._transport)" << endl
+      f_service_ << indent() << "oprot = self._oprot_factory.getProtocol(self._transport)" << '\n'
                  << indent() << "oprot.writeMessageBegin('" << (*f_iter)->get_name() << "', "
-                 << messageType << ", self._seqid)" << endl;
+                 << messageType << ", self._seqid)" << '\n';
     } else {
       f_service_ << indent() << "self._oprot.writeMessageBegin('" << (*f_iter)->get_name() << "', "
-                 << messageType << ", self._seqid)" << endl;
+                 << messageType << ", self._seqid)" << '\n';
     }
 
-    f_service_ << indent() << "args = " << argsname << "()" << endl;
+    f_service_ << indent() << "args = " << argsname << "()" << '\n';
 
     for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) {
       f_service_ << indent() << "args." << (*fld_iter)->get_name() << " = "
-                 << (*fld_iter)->get_name() << endl;
+                 << (*fld_iter)->get_name() << '\n';
     }
 
     // Write to the stream
     if (gen_twisted_ || gen_tornado_) {
-      f_service_ << indent() << "args.write(oprot)" << endl << indent() << "oprot.writeMessageEnd()"
-                 << endl << indent() << "oprot.trans.flush()" << endl;
+      f_service_ << indent() << "args.write(oprot)" << '\n' << indent() << "oprot.writeMessageEnd()"
+                 << '\n' << indent() << "oprot.trans.flush()" << '\n';
     } else {
-      f_service_ << indent() << "args.write(self._oprot)" << endl << indent()
-                 << "self._oprot.writeMessageEnd()" << endl << indent()
-                 << "self._oprot.trans.flush()" << endl;
+      f_service_ << indent() << "args.write(self._oprot)" << '\n' << indent()
+                 << "self._oprot.writeMessageEnd()" << '\n' << indent()
+                 << "self._oprot.trans.flush()" << '\n';
     }
 
     indent_down();
@@ -1600,51 +1598,51 @@
     if (!(*f_iter)->is_oneway()) {
       std::string resultname = (*f_iter)->get_name() + "_result";
       // Open function
-      f_service_ << endl;
+      f_service_ << '\n';
       if (gen_twisted_ || gen_tornado_) {
         f_service_ << indent() << "def recv_" << (*f_iter)->get_name()
-                   << "(self, iprot, mtype, rseqid):" << endl;
+                   << "(self, iprot, mtype, rseqid):" << '\n';
       } else {
         t_struct noargs(program_);
         t_function recv_function((*f_iter)->get_returntype(),
                                  string("recv_") + (*f_iter)->get_name(),
                                  &noargs);
-        f_service_ << indent() << "def " << function_signature(&recv_function) << ":" << endl;
+        f_service_ << indent() << "def " << function_signature(&recv_function) << ":" << '\n';
       }
       indent_up();
 
       // TODO(mcslee): Validate message reply here, seq ids etc.
 
       if (gen_twisted_) {
-        f_service_ << indent() << "d = self._reqs.pop(rseqid)" << endl;
+        f_service_ << indent() << "d = self._reqs.pop(rseqid)" << '\n';
       } else if (gen_tornado_) {
       } else {
-        f_service_ << indent() << "iprot = self._iprot" << endl << indent()
-                   << "(fname, mtype, rseqid) = iprot.readMessageBegin()" << endl;
+        f_service_ << indent() << "iprot = self._iprot" << '\n' << indent()
+                   << "(fname, mtype, rseqid) = iprot.readMessageBegin()" << '\n';
       }
 
-      f_service_ << indent() << "if mtype == TMessageType.EXCEPTION:" << endl
-                 << indent() << indent_str() << "x = TApplicationException()" << endl;
+      f_service_ << indent() << "if mtype == TMessageType.EXCEPTION:" << '\n'
+                 << indent() << indent_str() << "x = TApplicationException()" << '\n';
 
       if (gen_twisted_) {
-        f_service_ << indent() << indent_str() << "x.read(iprot)" << endl << indent()
-                   << indent_str() << "iprot.readMessageEnd()" << endl << indent() << indent_str() << "return d.errback(x)"
-                   << endl << indent() << "result = " << resultname << "()" << endl << indent()
-                   << "result.read(iprot)" << endl << indent() << "iprot.readMessageEnd()" << endl;
+        f_service_ << indent() << indent_str() << "x.read(iprot)" << '\n' << indent()
+                   << indent_str() << "iprot.readMessageEnd()" << '\n' << indent() << indent_str() << "return d.errback(x)"
+                   << '\n' << indent() << "result = " << resultname << "()" << '\n' << indent()
+                   << "result.read(iprot)" << '\n' << indent() << "iprot.readMessageEnd()" << '\n';
       } else {
-        f_service_ << indent() << indent_str() << "x.read(iprot)" << endl << indent()
-                   << indent_str() << "iprot.readMessageEnd()" << endl << indent() << indent_str() << "raise x" << endl
-                   << indent() << "result = " << resultname << "()" << endl << indent()
-                   << "result.read(iprot)" << endl << indent() << "iprot.readMessageEnd()" << endl;
+        f_service_ << indent() << indent_str() << "x.read(iprot)" << '\n' << indent()
+                   << indent_str() << "iprot.readMessageEnd()" << '\n' << indent() << indent_str() << "raise x" << '\n'
+                   << indent() << "result = " << resultname << "()" << '\n' << indent()
+                   << "result.read(iprot)" << '\n' << indent() << "iprot.readMessageEnd()" << '\n';
       }
 
       // Careful, only return _result if not a void function
       if (!(*f_iter)->get_returntype()->is_void()) {
-        f_service_ << indent() << "if result.success is not None:" << endl;
+        f_service_ << indent() << "if result.success is not None:" << '\n';
         if (gen_twisted_) {
-          f_service_ << indent() << indent_str() << "return d.callback(result.success)" << endl;
+          f_service_ << indent() << indent_str() << "return d.callback(result.success)" << '\n';
         } else {
-          f_service_ << indent() << indent_str() << "return result.success" << endl;
+          f_service_ << indent() << indent_str() << "return result.success" << '\n';
         }
       }
 
@@ -1653,32 +1651,32 @@
       vector<t_field*>::const_iterator x_iter;
       for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) {
         const string& xname = (*x_iter)->get_name();
-        f_service_ << indent() << "if result." << xname << " is not None:" << endl;
+        f_service_ << indent() << "if result." << xname << " is not None:" << '\n';
         if (gen_twisted_) {
           f_service_ << indent() << indent_str() << "return d.errback(result." << xname << ")"
-                     << endl;
+                     << '\n';
         } else {
-          f_service_ << indent() << indent_str() << "raise result." << xname << "" << endl;
+          f_service_ << indent() << indent_str() << "raise result." << xname << "" << '\n';
         }
       }
 
       // Careful, only return _result if not a void function
       if ((*f_iter)->get_returntype()->is_void()) {
         if (gen_twisted_) {
-          f_service_ << indent() << "return d.callback(None)" << endl;
+          f_service_ << indent() << "return d.callback(None)" << '\n';
         } else {
-          f_service_ << indent() << "return" << endl;
+          f_service_ << indent() << "return" << '\n';
         }
       } else {
         if (gen_twisted_) {
           f_service_
               << indent()
               << "return d.errback(TApplicationException(TApplicationException.MISSING_RESULT, \""
-              << (*f_iter)->get_name() << " failed: unknown result\"))" << endl;
+              << (*f_iter)->get_name() << " failed: unknown result\"))" << '\n';
         } else {
           f_service_ << indent()
                      << "raise TApplicationException(TApplicationException.MISSING_RESULT, \""
-                     << (*f_iter)->get_name() << " failed: unknown result\")" << endl;
+                     << (*f_iter)->get_name() << " failed: unknown result\")" << '\n';
         }
       }
 
@@ -1711,29 +1709,27 @@
   f_remote.open(f_remote_name.c_str());
 
   f_remote <<
-    "#!/usr/bin/env python" << endl <<
-    py_autogen_comment() << endl <<
-    "import sys" << endl <<
-    "import pprint" << endl <<
-    "if sys.version_info[0] > 2:" << endl <<
-    indent_str() << "from urllib.parse import urlparse" << endl <<
-    "else:" << endl <<
-    indent_str() << "from urlparse import urlparse" << endl <<
-    "from thrift.transport import TTransport, TSocket, TSSLSocket, THttpClient" << endl <<
-    "from thrift.protocol.TBinaryProtocol import TBinaryProtocol" << endl <<
-    endl;
+    "#!/usr/bin/env python" << '\n' <<
+    py_autogen_comment() << '\n' <<
+    "import sys" << '\n' <<
+    "import pprint" << '\n' <<
+    "if sys.version_info[0] > 2:" << '\n' <<
+    indent_str() << "from urllib.parse import urlparse" << '\n' <<
+    "else:" << '\n' <<
+    indent_str() << "from urlparse import urlparse" << '\n' <<
+    "from thrift.transport import TTransport, TSocket, TSSLSocket, THttpClient" << '\n' <<
+    "from thrift.protocol.TBinaryProtocol import TBinaryProtocol" << '\n' << '\n';
 
   f_remote <<
-    "from " << module_ << " import " << service_name_ << endl <<
-    "from " << module_ << ".ttypes import *" << endl <<
-    endl;
+    "from " << module_ << " import " << service_name_ << '\n' <<
+    "from " << module_ << ".ttypes import *" << '\n' << '\n';
 
   f_remote <<
-    "if len(sys.argv) <= 1 or sys.argv[1] == '--help':" << endl <<
-    indent_str() << "print('')" << endl <<
-    indent_str() << "print('Usage: ' + sys.argv[0] + ' [-h host[:port]] [-u url] [-f[ramed]] [-s[sl]] [-novalidate] [-ca_certs certs] [-keyfile keyfile] [-certfile certfile] function [arg1 [arg2...]]')" << endl <<
-    indent_str() << "print('')" << endl <<
-    indent_str() << "print('Functions:')" << endl;
+    "if len(sys.argv) <= 1 or sys.argv[1] == '--help':" << '\n' <<
+    indent_str() << "print('')" << '\n' <<
+    indent_str() << "print('Usage: ' + sys.argv[0] + ' [-h host[:port]] [-u url] [-f[ramed]] [-s[sl]] [-novalidate] [-ca_certs certs] [-keyfile keyfile] [-certfile certfile] function [arg1 [arg2...]]')" << '\n' <<
+    indent_str() << "print('')" << '\n' <<
+    indent_str() << "print('Functions:')" << '\n';
   for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
     f_remote << indent_str() << "print('  " << (*f_iter)->get_returntype()->get_name() << " "
              << (*f_iter)->get_name() << "(";
@@ -1749,88 +1745,88 @@
       }
       f_remote << args[i]->get_type()->get_name() << " " << args[i]->get_name();
     }
-    f_remote << ")')" << endl;
+    f_remote << ")')" << '\n';
   }
-  f_remote << indent_str() << "print('')" << endl << indent_str() << "sys.exit(0)" << endl << endl;
+  f_remote << indent_str() << "print('')" << '\n' << indent_str() << "sys.exit(0)" << '\n' << '\n';
 
-  f_remote << "pp = pprint.PrettyPrinter(indent=2)" << endl
-           << "host = 'localhost'" << endl
-           << "port = 9090" << endl
-           << "uri = ''" << endl
-           << "framed = False" << endl
-           << "ssl = False" << endl
-           << "validate = True" << endl
-           << "ca_certs = None" << endl
-           << "keyfile = None" << endl
-           << "certfile = None" << endl
-           << "http = False" << endl
-           << "argi = 1" << endl
-           << endl
-           << "if sys.argv[argi] == '-h':" << endl
-           << indent_str() << "parts = sys.argv[argi + 1].split(':')" << endl
-           << indent_str() << "host = parts[0]" << endl
-           << indent_str() << "if len(parts) > 1:" << endl
-           << indent_str() << indent_str() << "port = int(parts[1])" << endl
-           << indent_str() << "argi += 2" << endl
-           << endl
-           << "if sys.argv[argi] == '-u':" << endl
-           << indent_str() << "url = urlparse(sys.argv[argi + 1])" << endl
-           << indent_str() << "parts = url[1].split(':')" << endl
-           << indent_str() << "host = parts[0]" << endl
-           << indent_str() << "if len(parts) > 1:" << endl
-           << indent_str() << indent_str() << "port = int(parts[1])" << endl
-           << indent_str() << "else:" << endl
-           << indent_str() << indent_str() << "port = 80" << endl
-           << indent_str() << "uri = url[2]" << endl
-           << indent_str() << "if url[4]:" << endl
-           << indent_str() << indent_str() << "uri += '?%s' % url[4]" << endl
-           << indent_str() << "http = True" << endl
-           << indent_str() << "argi += 2" << endl
-           << endl
-           << "if sys.argv[argi] == '-f' or sys.argv[argi] == '-framed':" << endl
-           << indent_str() << "framed = True" << endl
-           << indent_str() << "argi += 1" << endl
-           << endl
-           << "if sys.argv[argi] == '-s' or sys.argv[argi] == '-ssl':" << endl
-           << indent_str() << "ssl = True" << endl
-           << indent_str() << "argi += 1" << endl
-           << endl
-           << "if sys.argv[argi] == '-novalidate':" << endl
-           << indent_str() << "validate = False" << endl
-           << indent_str() << "argi += 1" << endl
-           << endl
-           << "if sys.argv[argi] == '-ca_certs':" << endl
-           << indent_str() << "ca_certs = sys.argv[argi+1]" << endl
-           << indent_str() << "argi += 2" << endl
-           << endl
-           << "if sys.argv[argi] == '-keyfile':" << endl
-           << indent_str() << "keyfile = sys.argv[argi+1]" << endl
-           << indent_str() << "argi += 2" << endl
-           << endl
-           << "if sys.argv[argi] == '-certfile':" << endl
-           << indent_str() << "certfile = sys.argv[argi+1]" << endl
-           << indent_str() << "argi += 2" << endl
-           << endl
-           << "cmd = sys.argv[argi]" << endl
-           << "args = sys.argv[argi + 1:]" << endl
-           << endl
-           << "if http:" << endl
-           << indent_str() << "transport = THttpClient.THttpClient(host, port, uri)" << endl
-           << "else:" << endl
-           << indent_str() << "if ssl:" << endl
+  f_remote << "pp = pprint.PrettyPrinter(indent=2)" << '\n'
+           << "host = 'localhost'" << '\n'
+           << "port = 9090" << '\n'
+           << "uri = ''" << '\n'
+           << "framed = False" << '\n'
+           << "ssl = False" << '\n'
+           << "validate = True" << '\n'
+           << "ca_certs = None" << '\n'
+           << "keyfile = None" << '\n'
+           << "certfile = None" << '\n'
+           << "http = False" << '\n'
+           << "argi = 1" << '\n'
+           << '\n'
+           << "if sys.argv[argi] == '-h':" << '\n'
+           << indent_str() << "parts = sys.argv[argi + 1].split(':')" << '\n'
+           << indent_str() << "host = parts[0]" << '\n'
+           << indent_str() << "if len(parts) > 1:" << '\n'
+           << indent_str() << indent_str() << "port = int(parts[1])" << '\n'
+           << indent_str() << "argi += 2" << '\n'
+           << '\n'
+           << "if sys.argv[argi] == '-u':" << '\n'
+           << indent_str() << "url = urlparse(sys.argv[argi + 1])" << '\n'
+           << indent_str() << "parts = url[1].split(':')" << '\n'
+           << indent_str() << "host = parts[0]" << '\n'
+           << indent_str() << "if len(parts) > 1:" << '\n'
+           << indent_str() << indent_str() << "port = int(parts[1])" << '\n'
+           << indent_str() << "else:" << '\n'
+           << indent_str() << indent_str() << "port = 80" << '\n'
+           << indent_str() << "uri = url[2]" << '\n'
+           << indent_str() << "if url[4]:" << '\n'
+           << indent_str() << indent_str() << "uri += '?%s' % url[4]" << '\n'
+           << indent_str() << "http = True" << '\n'
+           << indent_str() << "argi += 2" << '\n'
+           << '\n'
+           << "if sys.argv[argi] == '-f' or sys.argv[argi] == '-framed':" << '\n'
+           << indent_str() << "framed = True" << '\n'
+           << indent_str() << "argi += 1" << '\n'
+           << '\n'
+           << "if sys.argv[argi] == '-s' or sys.argv[argi] == '-ssl':" << '\n'
+           << indent_str() << "ssl = True" << '\n'
+           << indent_str() << "argi += 1" << '\n'
+           << '\n'
+           << "if sys.argv[argi] == '-novalidate':" << '\n'
+           << indent_str() << "validate = False" << '\n'
+           << indent_str() << "argi += 1" << '\n'
+           << '\n'
+           << "if sys.argv[argi] == '-ca_certs':" << '\n'
+           << indent_str() << "ca_certs = sys.argv[argi+1]" << '\n'
+           << indent_str() << "argi += 2" << '\n'
+           << '\n'
+           << "if sys.argv[argi] == '-keyfile':" << '\n'
+           << indent_str() << "keyfile = sys.argv[argi+1]" << '\n'
+           << indent_str() << "argi += 2" << '\n'
+           << '\n'
+           << "if sys.argv[argi] == '-certfile':" << '\n'
+           << indent_str() << "certfile = sys.argv[argi+1]" << '\n'
+           << indent_str() << "argi += 2" << '\n'
+           << '\n'
+           << "cmd = sys.argv[argi]" << '\n'
+           << "args = sys.argv[argi + 1:]" << '\n'
+           << '\n'
+           << "if http:" << '\n'
+           << indent_str() << "transport = THttpClient.THttpClient(host, port, uri)" << '\n'
+           << "else:" << '\n'
+           << indent_str() << "if ssl:" << '\n'
            << indent_str() << indent_str() << "socket = TSSLSocket.TSSLSocket(host, port, "
               "validate=validate, ca_certs=ca_certs, keyfile=keyfile, certfile=certfile)"
-           << endl
-           << indent_str() << "else:" << endl
-           << indent_str() << indent_str() << "socket = TSocket.TSocket(host, port)" << endl
-           << indent_str() << "if framed:" << endl
-           << indent_str() << indent_str() << "transport = TTransport.TFramedTransport(socket)" << endl
-           << indent_str() << "else:" << endl
-           << indent_str() << indent_str() << "transport = TTransport.TBufferedTransport(socket)" << endl
-           << "protocol = TBinaryProtocol(transport)" << endl
-           << "client = " << service_name_ << ".Client(protocol)" << endl
-           << "transport.open()" << endl
-           << endl;
+           << '\n'
+           << indent_str() << "else:" << '\n'
+           << indent_str() << indent_str() << "socket = TSocket.TSocket(host, port)" << '\n'
+           << indent_str() << "if framed:" << '\n'
+           << indent_str() << indent_str() << "transport = TTransport.TFramedTransport(socket)" << '\n'
+           << indent_str() << "else:" << '\n'
+           << indent_str() << indent_str() << "transport = TTransport.TBufferedTransport(socket)" << '\n'
+           << "protocol = TBinaryProtocol(transport)" << '\n'
+           << "client = " << service_name_ << ".Client(protocol)" << '\n'
+           << "transport.open()" << '\n'
+           << '\n';
 
   // Generate the dispatch methods
   bool first = true;
@@ -1846,12 +1842,12 @@
     const std::vector<t_field*>& args = arg_struct->get_members();
     std::vector<t_field*>::size_type num_args = args.size();
 
-    f_remote << "if cmd == '" << (*f_iter)->get_name() << "':" << endl;
+    f_remote << "if cmd == '" << (*f_iter)->get_name() << "':" << '\n';
     indent_up();
-    f_remote << indent() << "if len(args) != " << num_args << ":" << endl
+    f_remote << indent() << "if len(args) != " << num_args << ":" << '\n'
              << indent() << indent_str() << "print('" << (*f_iter)->get_name() << " requires " << num_args
-             << " args')" << endl
-             << indent() << indent_str() << "sys.exit(1)" << endl
+             << " args')" << '\n'
+             << indent() << indent_str() << "sys.exit(1)" << '\n'
              << indent() << "pp.pprint(client." << (*f_iter)->get_name() << "(";
     indent_down();
     bool first_arg = true;
@@ -1866,19 +1862,19 @@
         f_remote << "eval(args[" << i << "]),";
       }
     }
-    f_remote << "))" << endl;
+    f_remote << "))" << '\n';
 
-    f_remote << endl;
+    f_remote << '\n';
   }
 
   if (functions.size() > 0) {
-    f_remote << "else:" << endl;
-    f_remote << indent_str() << "print('Unrecognized method %s' % cmd)" << endl;
-    f_remote << indent_str() << "sys.exit(1)" << endl;
-    f_remote << endl;
+    f_remote << "else:" << '\n';
+    f_remote << indent_str() << "print('Unrecognized method %s' % cmd)" << '\n';
+    f_remote << indent_str() << "sys.exit(1)" << '\n';
+    f_remote << '\n';
   }
 
-  f_remote << "transport.close()" << endl;
+  f_remote << "transport.close()" << '\n';
 
   // Close service file
   f_remote.close();
@@ -1913,100 +1909,100 @@
     extends_processor = extends + ".Processor, ";
   }
 
-  f_service_ << endl << endl;
+  f_service_ << '\n' << '\n';
 
   // Generate the header portion
   if (gen_zope_interface_) {
-    f_service_ << "@implementer(Iface)" << endl
-               << "class Processor(" << extends_processor << "TProcessor):" << endl;
+    f_service_ << "@implementer(Iface)" << '\n'
+               << "class Processor(" << extends_processor << "TProcessor):" << '\n';
   } else {
-    f_service_ << "class Processor(" << extends_processor << "Iface, TProcessor):" << endl;
+    f_service_ << "class Processor(" << extends_processor << "Iface, TProcessor):" << '\n';
   }
 
   indent_up();
 
-  indent(f_service_) << "def __init__(self, handler):" << endl;
+  indent(f_service_) << "def __init__(self, handler):" << '\n';
   indent_up();
   if (extends.empty()) {
     if (gen_zope_interface_) {
-      f_service_ << indent() << "self._handler = Iface(handler)" << endl;
+      f_service_ << indent() << "self._handler = Iface(handler)" << '\n';
     } else {
-      f_service_ << indent() << "self._handler = handler" << endl;
+      f_service_ << indent() << "self._handler = handler" << '\n';
     }
 
-    f_service_ << indent() << "self._processMap = {}" << endl;
+    f_service_ << indent() << "self._processMap = {}" << '\n';
   } else {
     if (gen_zope_interface_) {
-      f_service_ << indent() << extends << ".Processor.__init__(self, Iface(handler))" << endl;
+      f_service_ << indent() << extends << ".Processor.__init__(self, Iface(handler))" << '\n';
     } else {
-      f_service_ << indent() << extends << ".Processor.__init__(self, handler)" << endl;
+      f_service_ << indent() << extends << ".Processor.__init__(self, handler)" << '\n';
     }
   }
   for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
     f_service_ << indent() << "self._processMap[\"" << (*f_iter)->get_name()
-               << "\"] = Processor.process_" << (*f_iter)->get_name() << endl;
+               << "\"] = Processor.process_" << (*f_iter)->get_name() << '\n';
   }
-  f_service_ << indent() << "self._on_message_begin = None" << endl;
+  f_service_ << indent() << "self._on_message_begin = None" << '\n';
   indent_down();
-  f_service_ << endl;
+  f_service_ << '\n';
 
-  f_service_ << indent() << "def on_message_begin(self, func):" << endl;
+  f_service_ << indent() << "def on_message_begin(self, func):" << '\n';
   indent_up();
-    f_service_ << indent() << "self._on_message_begin = func" << endl;
+    f_service_ << indent() << "self._on_message_begin = func" << '\n';
   indent_down();
-  f_service_ << endl;
+  f_service_ << '\n';
 
   // Generate the server implementation
-  f_service_ << indent() << "def process(self, iprot, oprot):" << endl;
+  f_service_ << indent() << "def process(self, iprot, oprot):" << '\n';
   indent_up();
 
-  f_service_ << indent() << "(name, type, seqid) = iprot.readMessageBegin()" << endl;
-  f_service_ << indent() << "if self._on_message_begin:" << endl;
+  f_service_ << indent() << "(name, type, seqid) = iprot.readMessageBegin()" << '\n';
+  f_service_ << indent() << "if self._on_message_begin:" << '\n';
   indent_up();
-    f_service_ << indent() << "self._on_message_begin(name, type, seqid)" << endl;
+    f_service_ << indent() << "self._on_message_begin(name, type, seqid)" << '\n';
   indent_down();
 
   // TODO(mcslee): validate message
 
   // HOT: dictionary function lookup
-  f_service_ << indent() << "if name not in self._processMap:" << endl;
+  f_service_ << indent() << "if name not in self._processMap:" << '\n';
   indent_up();
-  f_service_ << indent() << "iprot.skip(TType.STRUCT)" << endl
-             << indent() << "iprot.readMessageEnd()" << endl
+  f_service_ << indent() << "iprot.skip(TType.STRUCT)" << '\n'
+             << indent() << "iprot.readMessageEnd()" << '\n'
              << indent()
              << "x = TApplicationException(TApplicationException.UNKNOWN_METHOD, 'Unknown "
                 "function %s' % (name))"
-             << endl
-             << indent() << "oprot.writeMessageBegin(name, TMessageType.EXCEPTION, seqid)" << endl
-             << indent() << "x.write(oprot)" << endl
-             << indent() << "oprot.writeMessageEnd()" << endl
-             << indent() << "oprot.trans.flush()" << endl;
+             << '\n'
+             << indent() << "oprot.writeMessageBegin(name, TMessageType.EXCEPTION, seqid)" << '\n'
+             << indent() << "x.write(oprot)" << '\n'
+             << indent() << "oprot.writeMessageEnd()" << '\n'
+             << indent() << "oprot.trans.flush()" << '\n';
 
   if (gen_twisted_) {
-    f_service_ << indent() << "return defer.succeed(None)" << endl;
+    f_service_ << indent() << "return defer.succeed(None)" << '\n';
   } else {
-    f_service_ << indent() << "return" << endl;
+    f_service_ << indent() << "return" << '\n';
   }
   indent_down();
 
-  f_service_ << indent() << "else:" << endl;
+  f_service_ << indent() << "else:" << '\n';
 
   if (gen_twisted_ || gen_tornado_) {
     f_service_ << indent() << indent_str()
-               << "return self._processMap[name](self, seqid, iprot, oprot)" << endl;
+               << "return self._processMap[name](self, seqid, iprot, oprot)" << '\n';
   } else {
     f_service_ << indent() << indent_str() << "self._processMap[name](self, seqid, iprot, oprot)"
-               << endl;
+               << '\n';
 
     // Read end of args field, the T_STOP, and the struct close
-    f_service_ << indent() << "return True" << endl;
+    f_service_ << indent() << "return True" << '\n';
   }
 
   indent_down();
 
   // Generate the process subfunctions
   for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
-    f_service_ << endl;
+    f_service_ << '\n';
     generate_process_function(tservice, *f_iter);
   }
 
@@ -2022,11 +2018,11 @@
   (void)tservice;
   // Open function
   if (gen_tornado_) {
-    f_service_ << indent() << "@gen.coroutine" << endl << indent() << "def process_"
-               << tfunction->get_name() << "(self, seqid, iprot, oprot):" << endl;
+    f_service_ << indent() << "@gen.coroutine" << '\n' << indent() << "def process_"
+               << tfunction->get_name() << "(self, seqid, iprot, oprot):" << '\n';
   } else {
     f_service_ << indent() << "def process_" << tfunction->get_name()
-               << "(self, seqid, iprot, oprot):" << endl;
+               << "(self, seqid, iprot, oprot):" << '\n';
   }
 
   indent_up();
@@ -2034,8 +2030,8 @@
   string argsname = tfunction->get_name() + "_args";
   string resultname = tfunction->get_name() + "_result";
 
-  f_service_ << indent() << "args = " << argsname << "()" << endl << indent() << "args.read(iprot)"
-             << endl << indent() << "iprot.readMessageEnd()" << endl;
+  f_service_ << indent() << "args = " << argsname << "()" << '\n' << indent() << "args.read(iprot)"
+             << '\n' << indent() << "iprot.readMessageEnd()" << '\n';
 
   t_struct* xs = tfunction->get_xceptions();
   const std::vector<t_field*>& xceptions = xs->get_members();
@@ -2043,7 +2039,7 @@
 
   // Declare result for non oneway function
   if (!tfunction->is_oneway()) {
-    f_service_ << indent() << "result = " << resultname << "()" << endl;
+    f_service_ << indent() << "result = " << resultname << "()" << '\n';
   }
 
   if (gen_twisted_) {
@@ -2063,85 +2059,85 @@
       }
       f_service_ << "args." << (*f_iter)->get_name();
     }
-    f_service_ << ")" << endl;
+    f_service_ << ")" << '\n';
 
     if (tfunction->is_oneway()) {
       f_service_ << indent() << "d.addErrback(self.handle_exception_" << tfunction->get_name()
-                 << ", seqid)" << endl;
+                 << ", seqid)" << '\n';
     } else {
       f_service_ << indent() << "d.addCallback(self.write_results_success_" << tfunction->get_name()
-                 << ", result, seqid, oprot)" << endl
+                 << ", result, seqid, oprot)" << '\n'
                  << indent() << "d.addErrback(self.write_results_exception_"
-                 << tfunction->get_name() << ", result, seqid, oprot)" << endl;
+                 << tfunction->get_name() << ", result, seqid, oprot)" << '\n';
     }
-    f_service_ << indent() << "return d" << endl << endl;
+    f_service_ << indent() << "return d" << '\n' << '\n';
 
     indent_down();
 
     if (tfunction->is_oneway()) {
       indent(f_service_) << "def handle_exception_" << tfunction->get_name()
-                         << "(self, error, seqid):" << endl;
+                         << "(self, error, seqid):" << '\n';
     } else {
       indent(f_service_) << "def write_results_success_" << tfunction->get_name()
-                         << "(self, success, result, seqid, oprot):" << endl;
+                         << "(self, success, result, seqid, oprot):" << '\n';
       indent_up();
       if (!tfunction->get_returntype()->is_void()) {
-        f_service_ << indent() << "result.success = success" << endl;
+        f_service_ << indent() << "result.success = success" << '\n';
       }
       f_service_ << indent() << "oprot.writeMessageBegin(\"" << tfunction->get_name()
-                 << "\", TMessageType.REPLY, seqid)" << endl
-                 << indent() << "result.write(oprot)" << endl
-                 << indent() << "oprot.writeMessageEnd()" << endl
-                 << indent() << "oprot.trans.flush()" << endl
-                 << endl;
+                 << "\", TMessageType.REPLY, seqid)" << '\n'
+                 << indent() << "result.write(oprot)" << '\n'
+                 << indent() << "oprot.writeMessageEnd()" << '\n'
+                 << indent() << "oprot.trans.flush()" << '\n'
+                 << '\n';
       indent_down();
 
       indent(f_service_) << "def write_results_exception_" << tfunction->get_name()
-                         << "(self, error, result, seqid, oprot):" << endl;
+                         << "(self, error, result, seqid, oprot):" << '\n';
     }
     indent_up();
     if (!tfunction->is_oneway()) {
-      f_service_ << indent() << "msg_type = TMessageType.REPLY" << endl;
+      f_service_ << indent() << "msg_type = TMessageType.REPLY" << '\n';
     }
-    f_service_ << indent() << "try:" << endl;
+    f_service_ << indent() << "try:" << '\n';
 
     // Kinda absurd
-    f_service_ << indent() << indent_str() << "error.raiseException()" << endl;
+    f_service_ << indent() << indent_str() << "error.raiseException()" << '\n';
     if (!tfunction->is_oneway()) {
       for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) {
         const string& xname = (*x_iter)->get_name();
         f_service_ << indent() << "except " << type_name((*x_iter)->get_type()) << " as " << xname
-                   << ":" << endl;
+                   << ":" << '\n';
         indent_up();
-        f_service_ << indent() << "result." << xname << " = " << xname << endl;
+        f_service_ << indent() << "result." << xname << " = " << xname << '\n';
         indent_down();
       }
     }
-    f_service_ << indent() << "except TTransport.TTransportException:" << endl
-               << indent() << indent_str() << "raise" << endl;
+    f_service_ << indent() << "except TTransport.TTransportException:" << '\n'
+               << indent() << indent_str() << "raise" << '\n';
     if (!tfunction->is_oneway()) {
-      f_service_ << indent() << "except TApplicationException as ex:" << endl
+      f_service_ << indent() << "except TApplicationException as ex:" << '\n'
                  << indent() << indent_str()
-                 << "logging.exception('TApplication exception in handler')" << endl
-                 << indent() << indent_str() << "msg_type = TMessageType.EXCEPTION" << endl
-                 << indent() << indent_str() << "result = ex" << endl
-                 << indent() << "except Exception:" << endl
+                 << "logging.exception('TApplication exception in handler')" << '\n'
+                 << indent() << indent_str() << "msg_type = TMessageType.EXCEPTION" << '\n'
+                 << indent() << indent_str() << "result = ex" << '\n'
+                 << indent() << "except Exception:" << '\n'
                  << indent() << indent_str()
-                 << "logging.exception('Unexpected exception in handler')" << endl
-                 << indent() << indent_str() << "msg_type = TMessageType.EXCEPTION" << endl
+                 << "logging.exception('Unexpected exception in handler')" << '\n'
+                 << indent() << indent_str() << "msg_type = TMessageType.EXCEPTION" << '\n'
                  << indent() << indent_str()
                  << "result = TApplicationException(TApplicationException.INTERNAL_ERROR, "
                     "'Internal error')"
-                 << endl
+                 << '\n'
                  << indent() << "oprot.writeMessageBegin(\"" << tfunction->get_name()
-                 << "\", msg_type, seqid)" << endl
-                 << indent() << "result.write(oprot)" << endl
-                 << indent() << "oprot.writeMessageEnd()" << endl
-                 << indent() << "oprot.trans.flush()" << endl;
+                 << "\", msg_type, seqid)" << '\n'
+                 << indent() << "result.write(oprot)" << '\n'
+                 << indent() << "oprot.writeMessageEnd()" << '\n'
+                 << indent() << "oprot.trans.flush()" << '\n';
     } else {
-      f_service_ << indent() << "except Exception:" << endl
+      f_service_ << indent() << "except Exception:" << '\n'
                  << indent() << indent_str()
-                 << "logging.exception('Exception in oneway handler')" << endl;
+                 << "logging.exception('Exception in oneway handler')" << '\n';
     }
     indent_down();
 
@@ -2152,9 +2148,9 @@
     vector<t_field*>::const_iterator f_iter;
 
     if (!tfunction->is_oneway()) {
-      indent(f_service_) << "msg_type = TMessageType.REPLY" << endl;
+      indent(f_service_) << "msg_type = TMessageType.REPLY" << '\n';
     }
-    f_service_ << indent() << "try:" << endl;
+    f_service_ << indent() << "try:" << '\n';
     indent_up();
     f_service_ << indent();
     if (!tfunction->is_oneway() && !tfunction->get_returntype()->is_void()) {
@@ -2170,45 +2166,45 @@
       }
       f_service_ << "args." << (*f_iter)->get_name();
     }
-    f_service_ << "))" << endl;
+    f_service_ << "))" << '\n';
 
     indent_down();
     if (!tfunction->is_oneway()) {
       for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) {
         const string& xname = (*x_iter)->get_name();
         f_service_ << indent() << "except " << type_name((*x_iter)->get_type()) << " as " << xname
-                   << ":" << endl
-                   << indent() << indent_str() << "result." << xname << " = " << xname << endl;
+                   << ":" << '\n'
+                   << indent() << indent_str() << "result." << xname << " = " << xname << '\n';
       }
     }
-    f_service_ << indent() << "except TTransport.TTransportException:" << endl
-               << indent() << indent_str() << "raise" << endl;
+    f_service_ << indent() << "except TTransport.TTransportException:" << '\n'
+               << indent() << indent_str() << "raise" << '\n';
     if (!tfunction->is_oneway()) {
-      f_service_ << indent() << "except TApplicationException as ex:" << endl
+      f_service_ << indent() << "except TApplicationException as ex:" << '\n'
                  << indent() << indent_str()
-                 << "logging.exception('TApplication exception in handler')" << endl
-                 << indent() << indent_str() << "msg_type = TMessageType.EXCEPTION" << endl
-                 << indent() << indent_str() << "result = ex" << endl
-                 << indent() << "except Exception:" << endl
+                 << "logging.exception('TApplication exception in handler')" << '\n'
+                 << indent() << indent_str() << "msg_type = TMessageType.EXCEPTION" << '\n'
+                 << indent() << indent_str() << "result = ex" << '\n'
+                 << indent() << "except Exception:" << '\n'
                  << indent() << indent_str()
-                 << "logging.exception('Unexpected exception in handler')" << endl
-                 << indent() << indent_str() << "msg_type = TMessageType.EXCEPTION" << endl
+                 << "logging.exception('Unexpected exception in handler')" << '\n'
+                 << indent() << indent_str() << "msg_type = TMessageType.EXCEPTION" << '\n'
                  << indent() << indent_str()
                  << "result = TApplicationException(TApplicationException.INTERNAL_ERROR, "
                     "'Internal error')"
-                 << endl;
+                 << '\n';
     } else {
-      f_service_ << indent() << "except Exception:" << endl
+      f_service_ << indent() << "except Exception:" << '\n'
                  << indent() << indent_str()
-                 << "logging.exception('Exception in oneway handler')" << endl;
+                 << "logging.exception('Exception in oneway handler')" << '\n';
     }
 
     if (!tfunction->is_oneway()) {
       f_service_ << indent() << "oprot.writeMessageBegin(\"" << tfunction->get_name()
-                 << "\", msg_type, seqid)" << endl
-                 << indent() << "result.write(oprot)" << endl
-                 << indent() << "oprot.writeMessageEnd()" << endl
-                 << indent() << "oprot.trans.flush()" << endl;
+                 << "\", msg_type, seqid)" << '\n'
+                 << indent() << "result.write(oprot)" << '\n'
+                 << indent() << "oprot.writeMessageEnd()" << '\n'
+                 << indent() << "oprot.trans.flush()" << '\n';
     }
 
     // Close function
@@ -2217,7 +2213,7 @@
   } else { // py
     // Try block for a function with exceptions
     // It also catches arbitrary exceptions raised by handler method to propagate them to the client
-    f_service_ << indent() << "try:" << endl;
+    f_service_ << indent() << "try:" << '\n';
     indent_up();
 
     // Generate the function call
@@ -2239,48 +2235,48 @@
       }
       f_service_ << "args." << (*f_iter)->get_name();
     }
-    f_service_ << ")" << endl;
+    f_service_ << ")" << '\n';
     if (!tfunction->is_oneway()) {
-      f_service_ << indent() << "msg_type = TMessageType.REPLY" << endl;
+      f_service_ << indent() << "msg_type = TMessageType.REPLY" << '\n';
     }
 
     indent_down();
     f_service_ << indent()
-               << "except TTransport.TTransportException:" << endl
-               << indent() << indent_str() << "raise" << endl;
+               << "except TTransport.TTransportException:" << '\n'
+               << indent() << indent_str() << "raise" << '\n';
 
     if (!tfunction->is_oneway()) {
       for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) {
         const string& xname = (*x_iter)->get_name();
         f_service_ << indent() << "except " << type_name((*x_iter)->get_type()) << " as " << xname
-                   << ":" << endl;
+                   << ":" << '\n';
         indent_up();
-        f_service_ << indent() << "msg_type = TMessageType.REPLY" << endl;
-        f_service_ << indent() << "result." << xname << " = " << xname << endl;
+        f_service_ << indent() << "msg_type = TMessageType.REPLY" << '\n';
+        f_service_ << indent() << "result." << xname << " = " << xname << '\n';
         indent_down();
       }
 
-      f_service_ << indent() << "except TApplicationException as ex:" << endl
+      f_service_ << indent() << "except TApplicationException as ex:" << '\n'
                  << indent() << indent_str()
-                 << "logging.exception('TApplication exception in handler')" << endl
-                 << indent() << indent_str() << "msg_type = TMessageType.EXCEPTION" << endl
-                 << indent() << indent_str() << "result = ex" << endl
-                 << indent() << "except Exception:" << endl
+                 << "logging.exception('TApplication exception in handler')" << '\n'
+                 << indent() << indent_str() << "msg_type = TMessageType.EXCEPTION" << '\n'
+                 << indent() << indent_str() << "result = ex" << '\n'
+                 << indent() << "except Exception:" << '\n'
                  << indent() << indent_str()
-                 << "logging.exception('Unexpected exception in handler')" << endl
-                 << indent() << indent_str() << "msg_type = TMessageType.EXCEPTION" << endl
+                 << "logging.exception('Unexpected exception in handler')" << '\n'
+                 << indent() << indent_str() << "msg_type = TMessageType.EXCEPTION" << '\n'
                  << indent() << indent_str()
                  << "result = TApplicationException(TApplicationException.INTERNAL_ERROR, "
                     "'Internal error')"
-                 << endl
+                 << '\n'
                  << indent() << "oprot.writeMessageBegin(\"" << tfunction->get_name()
-                 << "\", msg_type, seqid)" << endl
-                 << indent() << "result.write(oprot)" << endl
-                 << indent() << "oprot.writeMessageEnd()" << endl
-                 << indent() << "oprot.trans.flush()" << endl;
+                 << "\", msg_type, seqid)" << '\n'
+                 << indent() << "result.write(oprot)" << '\n'
+                 << indent() << "oprot.writeMessageEnd()" << '\n'
+                 << indent() << "oprot.trans.flush()" << '\n';
     } else {
-      f_service_ << indent() << "except Exception:" << endl
-                 << indent() << indent_str() << "logging.exception('Exception in oneway handler')" << endl;
+      f_service_ << indent() << "except Exception:" << '\n'
+                 << indent() << indent_str() << "logging.exception('Exception in oneway handler')" << '\n';
     }
 
     // Close function
@@ -2345,14 +2341,14 @@
         throw "compiler error: no Python name for base type " + t_base_type::t_base_name(tbase);
       }
     }
-    out << endl;
+    out << '\n';
   } else if (type->is_enum()) {
     if (gen_enum_) {
       indent(out) << name << " = " << type_name(type) << "(iprot.readI32())";
     } else {
       indent(out) << name << " = iprot.readI32()";
     }
-    out << endl;
+    out << '\n';
   } else {
     printf("DO NOT KNOW HOW TO DESERIALIZE FIELD '%s' TYPE '%s'\n",
            tfield->get_name().c_str(),
@@ -2365,10 +2361,10 @@
  */
 void t_py_generator::generate_deserialize_struct(ostream& out, t_struct* tstruct, string prefix) {
   if (is_immutable(tstruct)) {
-    out << indent() << prefix << " = " << type_name(tstruct) << ".read(iprot)" << endl;
+    out << indent() << prefix << " = " << type_name(tstruct) << ".read(iprot)" << '\n';
   } else {
-    out << indent() << prefix << " = " << type_name(tstruct) << "()" << endl
-        << indent() << prefix << ".read(iprot)" << endl;
+    out << indent() << prefix << " = " << type_name(tstruct) << "()" << '\n'
+        << indent() << prefix << ".read(iprot)" << '\n';
   }
 }
 
@@ -2389,20 +2385,20 @@
 
   // Declare variables, read header
   if (ttype->is_map()) {
-    out << indent() << prefix << " = {}" << endl << indent() << "(" << ktype << ", " << vtype
-        << ", " << size << ") = iprot.readMapBegin()" << endl;
+    out << indent() << prefix << " = {}" << '\n' << indent() << "(" << ktype << ", " << vtype
+        << ", " << size << ") = iprot.readMapBegin()" << '\n';
   } else if (ttype->is_set()) {
-    out << indent() << prefix << " = set()" << endl << indent() << "(" << etype << ", " << size
-        << ") = iprot.readSetBegin()" << endl;
+    out << indent() << prefix << " = set()" << '\n' << indent() << "(" << etype << ", " << size
+        << ") = iprot.readSetBegin()" << '\n';
   } else if (ttype->is_list()) {
-    out << indent() << prefix << " = []" << endl << indent() << "(" << etype << ", " << size
-        << ") = iprot.readListBegin()" << endl;
+    out << indent() << prefix << " = []" << '\n' << indent() << "(" << etype << ", " << size
+        << ") = iprot.readListBegin()" << '\n';
   }
 
   // For loop iterates over elements
   string i = tmp("_i");
   indent(out) <<
-    "for " << i << " in range(" << size << "):" << endl;
+    "for " << i << " in range(" << size << "):" << '\n';
 
   indent_up();
 
@@ -2418,20 +2414,20 @@
 
   // Read container end
   if (ttype->is_map()) {
-    indent(out) << "iprot.readMapEnd()" << endl;
+    indent(out) << "iprot.readMapEnd()" << '\n';
     if (is_immutable(ttype)) {
-      indent(out) << prefix << " = TFrozenDict(" << prefix << ")" << endl;
+      indent(out) << prefix << " = TFrozenDict(" << prefix << ")" << '\n';
     }
   } else if (ttype->is_set()) {
-    indent(out) << "iprot.readSetEnd()" << endl;
+    indent(out) << "iprot.readSetEnd()" << '\n';
     if (is_immutable(ttype)) {
-      indent(out) << prefix << " = frozenset(" << prefix << ")" << endl;
+      indent(out) << prefix << " = frozenset(" << prefix << ")" << '\n';
     }
   } else if (ttype->is_list()) {
     if (is_immutable(ttype)) {
-      indent(out) << prefix << " = tuple(" << prefix << ")" << endl;
+      indent(out) << prefix << " = tuple(" << prefix << ")" << '\n';
     }
-    indent(out) << "iprot.readListEnd()" << endl;
+    indent(out) << "iprot.readListEnd()" << '\n';
   }
 }
 
@@ -2447,7 +2443,7 @@
   generate_deserialize_field(out, &fkey);
   generate_deserialize_field(out, &fval);
 
-  indent(out) << prefix << "[" << key << "] = " << val << endl;
+  indent(out) << prefix << "[" << key << "] = " << val << '\n';
 }
 
 /**
@@ -2459,7 +2455,7 @@
 
   generate_deserialize_field(out, &felem);
 
-  indent(out) << prefix << ".add(" << elem << ")" << endl;
+  indent(out) << prefix << ".add(" << elem << ")" << '\n';
 }
 
 /**
@@ -2473,7 +2469,7 @@
 
   generate_deserialize_field(out, &felem);
 
-  indent(out) << prefix << ".append(" << elem << ")" << endl;
+  indent(out) << prefix << ".append(" << elem << ")" << '\n';
 }
 
 /**
@@ -2543,7 +2539,7 @@
         out << "writeI32(" << name << ")";
       }
     }
-    out << endl;
+    out << '\n';
   } else {
     printf("DO NOT KNOW HOW TO SERIALIZE FIELD '%s%s' TYPE '%s'\n",
            prefix.c_str(),
@@ -2560,50 +2556,50 @@
  */
 void t_py_generator::generate_serialize_struct(ostream& out, t_struct* tstruct, string prefix) {
   (void)tstruct;
-  indent(out) << prefix << ".write(oprot)" << endl;
+  indent(out) << prefix << ".write(oprot)" << '\n';
 }
 
 void t_py_generator::generate_serialize_container(ostream& out, t_type* ttype, string prefix) {
   if (ttype->is_map()) {
     indent(out) << "oprot.writeMapBegin(" << type_to_enum(((t_map*)ttype)->get_key_type()) << ", "
                 << type_to_enum(((t_map*)ttype)->get_val_type()) << ", "
-                << "len(" << prefix << "))" << endl;
+                << "len(" << prefix << "))" << '\n';
   } else if (ttype->is_set()) {
     indent(out) << "oprot.writeSetBegin(" << type_to_enum(((t_set*)ttype)->get_elem_type()) << ", "
-                << "len(" << prefix << "))" << endl;
+                << "len(" << prefix << "))" << '\n';
   } else if (ttype->is_list()) {
     indent(out) << "oprot.writeListBegin(" << type_to_enum(((t_list*)ttype)->get_elem_type())
                 << ", "
-                << "len(" << prefix << "))" << endl;
+                << "len(" << prefix << "))" << '\n';
   }
 
   if (ttype->is_map()) {
     string kiter = tmp("kiter");
     string viter = tmp("viter");
-    indent(out) << "for " << kiter << ", " << viter << " in " << prefix << ".items():" << endl;
+    indent(out) << "for " << kiter << ", " << viter << " in " << prefix << ".items():" << '\n';
     indent_up();
     generate_serialize_map_element(out, (t_map*)ttype, kiter, viter);
     indent_down();
   } else if (ttype->is_set()) {
     string iter = tmp("iter");
-    indent(out) << "for " << iter << " in " << prefix << ":" << endl;
+    indent(out) << "for " << iter << " in " << prefix << ":" << '\n';
     indent_up();
     generate_serialize_set_element(out, (t_set*)ttype, iter);
     indent_down();
   } else if (ttype->is_list()) {
     string iter = tmp("iter");
-    indent(out) << "for " << iter << " in " << prefix << ":" << endl;
+    indent(out) << "for " << iter << " in " << prefix << ":" << '\n';
     indent_up();
     generate_serialize_list_element(out, (t_list*)ttype, iter);
     indent_down();
   }
 
   if (ttype->is_map()) {
-    indent(out) << "oprot.writeMapEnd()" << endl;
+    indent(out) << "oprot.writeMapEnd()" << '\n';
   } else if (ttype->is_set()) {
-    indent(out) << "oprot.writeSetEnd()" << endl;
+    indent(out) << "oprot.writeSetEnd()" << '\n';
   } else if (ttype->is_list()) {
-    indent(out) << "oprot.writeListEnd()" << endl;
+    indent(out) << "oprot.writeListEnd()" << '\n';
   }
 }
 
@@ -2669,7 +2665,7 @@
   const vector<t_field*>& fields = tstruct->get_members();
   if (fields.size() > 0) {
     if (has_doc) {
-      ss << endl;
+      ss << '\n';
     }
     has_doc = true;
     ss << subheader << ":\n";
@@ -2680,7 +2676,7 @@
       if (p->has_doc()) {
         ss << ": " << p->get_doc();
       } else {
-        ss << endl;
+        ss << '\n';
       }
     }
   }
diff --git a/compiler/cpp/src/thrift/generate/t_rb_generator.cc b/compiler/cpp/src/thrift/generate/t_rb_generator.cc
index 17e57cf..e946573 100644
--- a/compiler/cpp/src/thrift/generate/t_rb_generator.cc
+++ b/compiler/cpp/src/thrift/generate/t_rb_generator.cc
@@ -43,8 +43,6 @@
 using std::stringstream;
 using std::vector;
 
-static const string endl = "\n"; // avoid ostream << std::endl flushes
-
 /**
  * A subclass of std::ofstream that includes indenting functionality.
  */
@@ -283,11 +281,11 @@
   f_consts_.open(f_consts_name.c_str());
 
   // Print header
-  f_types_ << rb_autogen_comment() << endl << render_require_thrift() << render_includes() << endl;
+  f_types_ << rb_autogen_comment() << '\n' << render_require_thrift() << render_includes() << '\n';
   begin_namespace(f_types_, ruby_modules(program_));
 
-  f_consts_ << rb_autogen_comment() << endl << render_require_thrift() << "require '"
-            << require_prefix_ << underscore(program_name_) << "_types'" << endl << endl;
+  f_consts_ << rb_autogen_comment() << '\n' << render_require_thrift() << "require '"
+            << require_prefix_ << underscore(program_name_) << "_types'" << '\n' << '\n';
   begin_namespace(f_consts_, ruby_modules(program_));
 }
 
@@ -360,7 +358,7 @@
  * @param tenum The enumeration
  */
 void t_rb_generator::generate_enum(t_enum* tenum) {
-  f_types_.indent() << "module " << capitalize(tenum->get_name()) << endl;
+  f_types_.indent() << "module " << capitalize(tenum->get_name()) << '\n';
   f_types_.indent_up();
 
   vector<t_enum_value*> constants = tenum->get_constants();
@@ -374,7 +372,7 @@
     string name = capitalize((*c_iter)->get_name());
 
     generate_rdoc(f_types_, *c_iter);
-    f_types_.indent() << name << " = " << value << endl;
+    f_types_.indent() << name << " = " << value << '\n';
   }
 
   // Create a hash mapping values back to their names (as strings) since ruby has no native enum
@@ -387,7 +385,7 @@
       f_types_ << ", ";
     f_types_ << value << " => \"" << capitalize((*c_iter)->get_name()) << "\"";
   }
-  f_types_ << "}" << endl;
+  f_types_ << "}" << '\n';
 
   // Create a set with valid values for this enum
   f_types_.indent() << "VALID_VALUES = Set.new([";
@@ -397,10 +395,10 @@
       f_types_ << ", ";
     f_types_ << capitalize((*c_iter)->get_name());
   }
-  f_types_ << "]).freeze" << endl;
+  f_types_ << "]).freeze" << '\n';
 
   f_types_.indent_down();
-  f_types_.indent() << "end" << endl << endl;
+  f_types_.indent() << "end" << '\n' << '\n';
 }
 
 /**
@@ -414,7 +412,7 @@
   name[0] = toupper(name[0]);
 
   f_consts_.indent() << name << " = ";
-  render_const_value(f_consts_, type, value) << endl << endl;
+  render_const_value(f_consts_, type, value) << '\n' << '\n';
 }
 
 /**
@@ -454,7 +452,7 @@
   } else if (type->is_enum()) {
     out.indent() << value->get_integer();
   } else if (type->is_struct() || type->is_xception()) {
-    out << full_type_name(type) << ".new({" << endl;
+    out << full_type_name(type) << ".new({" << '\n';
     out.indent_up();
     const vector<t_field*>& fields = ((t_struct*)type)->get_members();
     vector<t_field*>::const_iterator f_iter;
@@ -472,21 +470,21 @@
       }
       out.indent();
       render_const_value(out, g_type_string, v_iter->first) << " => ";
-      render_const_value(out, field_type, v_iter->second) << "," << endl;
+      render_const_value(out, field_type, v_iter->second) << "," << '\n';
     }
     out.indent_down();
     out.indent() << "})";
   } else if (type->is_map()) {
     t_type* ktype = ((t_map*)type)->get_key_type();
     t_type* vtype = ((t_map*)type)->get_val_type();
-    out << "{" << endl;
+    out << "{" << '\n';
     out.indent_up();
     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) {
       out.indent();
       render_const_value(out, ktype, v_iter->first) << " => ";
-      render_const_value(out, vtype, v_iter->second) << "," << endl;
+      render_const_value(out, vtype, v_iter->second) << "," << '\n';
     }
     out.indent_down();
     out.indent() << "}";
@@ -498,16 +496,16 @@
       etype = ((t_set*)type)->get_elem_type();
     }
     if (type->is_set()) {
-      out << "Set.new([" << endl;
+      out << "Set.new([" << '\n';
     } else {
-      out << "[" << endl;
+      out << "[" << '\n';
     }
     out.indent_up();
     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) {
       out.indent();
-      render_const_value(out, etype, *v_iter) << "," << endl;
+      render_const_value(out, etype, *v_iter) << "," << '\n';
     }
     out.indent_down();
     if (type->is_set()) {
@@ -552,7 +550,7 @@
   if (is_exception) {
     out << " < ::Thrift::Exception";
   }
-  out << "; end" << endl << endl;
+  out << "; end" << '\n' << '\n';
 }
 
 /**
@@ -576,10 +574,10 @@
   if (is_exception) {
     out << " < ::Thrift::Exception";
   }
-  out << endl;
+  out << '\n';
 
   out.indent_up();
-  out.indent() << "include ::Thrift::Struct, ::Thrift::Struct_Union" << endl;
+  out.indent() << "include ::Thrift::Struct, ::Thrift::Struct_Union" << '\n';
 
   if (is_exception) {
     generate_rb_simple_exception_constructor(out, tstruct);
@@ -589,10 +587,10 @@
   generate_field_defns(out, tstruct);
   generate_rb_struct_required_validator(out, tstruct);
 
-  out.indent() << "::Thrift::Struct.generate_accessors self" << endl;
+  out.indent() << "::Thrift::Struct.generate_accessors self" << '\n';
 
   out.indent_down();
-  out.indent() << "end" << endl << endl;
+  out.indent() << "end" << '\n' << '\n';
 }
 
 /**
@@ -603,10 +601,10 @@
                                        bool is_exception = false) {
   (void)is_exception;
   generate_rdoc(out, tstruct);
-  out.indent() << "class " << type_name(tstruct) << " < ::Thrift::Union" << endl;
+  out.indent() << "class " << type_name(tstruct) << " < ::Thrift::Union" << '\n';
 
   out.indent_up();
-  out.indent() << "include ::Thrift::Struct_Union" << endl;
+  out.indent() << "include ::Thrift::Struct_Union" << '\n';
 
   generate_field_constructors(out, tstruct);
 
@@ -614,15 +612,15 @@
   generate_field_defns(out, tstruct);
   generate_rb_union_validator(out, tstruct);
 
-  out.indent() << "::Thrift::Union.generate_accessors self" << endl;
+  out.indent() << "::Thrift::Union.generate_accessors self" << '\n';
 
   out.indent_down();
-  out.indent() << "end" << endl << endl;
+  out.indent() << "end" << '\n' << '\n';
 }
 
 void t_rb_generator::generate_field_constructors(t_rb_ofstream& out, t_struct* tstruct) {
 
-  out.indent() << "class << self" << endl;
+  out.indent() << "class << self" << '\n';
   out.indent_up();
 
   const vector<t_field*>& fields = tstruct->get_members();
@@ -630,19 +628,19 @@
 
   for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
     if (f_iter != fields.begin()) {
-      out << endl;
+      out << '\n';
     }
     std::string field_name = (*f_iter)->get_name();
 
-    out.indent() << "def " << field_name << "(val)" << endl;
-    out.indent() << "  " << tstruct->get_name() << ".new(:" << field_name << ", val)" << endl;
-    out.indent() << "end" << endl;
+    out.indent() << "def " << field_name << "(val)" << '\n';
+    out.indent() << "  " << tstruct->get_name() << ".new(:" << field_name << ", val)" << '\n';
+    out.indent() << "end" << '\n';
   }
 
   out.indent_down();
-  out.indent() << "end" << endl;
+  out.indent() << "end" << '\n';
 
-  out << endl;
+  out << '\n';
 }
 
 void t_rb_generator::generate_rb_simple_exception_constructor(t_rb_ofstream& out,
@@ -655,15 +653,15 @@
     if ((*m_iter)->get_type()->is_string()) {
       string name = (*m_iter)->get_name();
 
-      out.indent() << "def initialize(message=nil)" << endl;
+      out.indent() << "def initialize(message=nil)" << '\n';
       out.indent_up();
-      out.indent() << "super()" << endl;
-      out.indent() << "self." << name << " = message" << endl;
+      out.indent() << "super()" << '\n';
+      out.indent() << "self." << name << " = message" << '\n';
       out.indent_down();
-      out.indent() << "end" << endl << endl;
+      out.indent() << "end" << '\n' << '\n';
 
       if (name != "message") {
-        out.indent() << "def message; " << name << " end" << endl << endl;
+        out.indent() << "def message; " << name << " end" << '\n' << '\n';
       }
     }
   }
@@ -677,20 +675,20 @@
     std::string field_name = (*f_iter)->get_name();
     std::string cap_field_name = upcase_string(field_name);
 
-    out.indent() << cap_field_name << " = " << (*f_iter)->get_key() << endl;
+    out.indent() << cap_field_name << " = " << (*f_iter)->get_key() << '\n';
   }
-  out << endl;
+  out << '\n';
 }
 
 void t_rb_generator::generate_field_defns(t_rb_ofstream& out, t_struct* tstruct) {
   const vector<t_field*>& fields = tstruct->get_members();
   vector<t_field*>::const_iterator f_iter;
 
-  out.indent() << "FIELDS = {" << endl;
+  out.indent() << "FIELDS = {" << '\n';
   out.indent_up();
   for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
     if (f_iter != fields.begin()) {
-      out << "," << endl;
+      out << "," << '\n';
     }
 
     // generate the field docstrings within the FIELDS constant. no real better place...
@@ -705,10 +703,10 @@
                         (*f_iter)->get_req() == t_field::T_OPTIONAL);
   }
   out.indent_down();
-  out << endl;
-  out.indent() << "}" << endl << endl;
+  out << '\n';
+  out.indent() << "}" << '\n' << '\n';
 
-  out.indent() << "def struct_fields; FIELDS; end" << endl << endl;
+  out.indent() << "def struct_fields; FIELDS; end" << '\n' << '\n';
 }
 
 void t_rb_generator::generate_field_data(t_rb_ofstream& out,
@@ -765,7 +763,7 @@
 
 void t_rb_generator::begin_namespace(t_rb_ofstream& out, vector<std::string> modules) {
   for (auto & module : modules) {
-    out.indent() << "module " << module << endl;
+    out.indent() << "module " << module << '\n';
     out.indent_up();
   }
 }
@@ -774,7 +772,7 @@
   for (vector<std::string>::reverse_iterator m_iter = modules.rbegin(); m_iter != modules.rend();
        ++m_iter) {
     out.indent_down();
-    out.indent() << "end" << endl;
+    out.indent() << "end" << '\n';
   }
 }
 
@@ -787,25 +785,25 @@
   string f_service_name = namespace_dir_ + underscore(service_name_) + ".rb";
   f_service_.open(f_service_name.c_str());
 
-  f_service_ << rb_autogen_comment() << endl << render_require_thrift();
+  f_service_ << rb_autogen_comment() << '\n' << render_require_thrift();
 
   if (tservice->get_extends() != nullptr) {
     if (namespaced_) {
       f_service_ << "require '" << rb_namespace_to_path_prefix(
                                        tservice->get_extends()->get_program()->get_namespace("rb"))
-                 << underscore(tservice->get_extends()->get_name()) << "'" << endl;
+                 << underscore(tservice->get_extends()->get_name()) << "'" << '\n';
     } else {
       f_service_ << "require '" << require_prefix_
-                 << underscore(tservice->get_extends()->get_name()) << "'" << endl;
+                 << underscore(tservice->get_extends()->get_name()) << "'" << '\n';
     }
   }
 
-  f_service_ << "require '" << require_prefix_ << underscore(program_name_) << "_types'" << endl
-             << endl;
+  f_service_ << "require '" << require_prefix_ << underscore(program_name_) << "_types'" << '\n'
+             << '\n';
 
   begin_namespace(f_service_, ruby_modules(tservice->get_program()));
 
-  f_service_.indent() << "module " << capitalize(tservice->get_name()) << endl;
+  f_service_.indent() << "module " << capitalize(tservice->get_name()) << '\n';
   f_service_.indent_up();
 
   // Generate the three main parts of the service (well, two for now in PHP)
@@ -814,7 +812,7 @@
   generate_service_helpers(tservice);
 
   f_service_.indent_down();
-  f_service_.indent() << "end" << endl << endl;
+  f_service_.indent() << "end" << '\n' << '\n';
 
   end_namespace(f_service_, ruby_modules(tservice->get_program()));
 
@@ -831,7 +829,7 @@
   vector<t_function*> functions = tservice->get_functions();
   vector<t_function*>::iterator f_iter;
 
-  f_service_.indent() << "# HELPER FUNCTIONS AND STRUCTURES" << endl << endl;
+  f_service_.indent() << "# HELPER FUNCTIONS AND STRUCTURES" << '\n' << '\n';
 
   for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
     t_struct* ts = (*f_iter)->get_arglist();
@@ -874,10 +872,10 @@
     extends_client = " < " + extends + "::Client ";
   }
 
-  f_service_.indent() << "class Client" << extends_client << endl;
+  f_service_.indent() << "class Client" << extends_client << '\n';
   f_service_.indent_up();
 
-  f_service_.indent() << "include ::Thrift::Client" << endl << endl;
+  f_service_.indent() << "include ::Thrift::Client" << '\n' << '\n';
 
   // Generate client method implementations
   vector<t_function*> functions = tservice->get_functions();
@@ -889,7 +887,7 @@
     string funname = (*f_iter)->get_name();
 
     // Open function
-    f_service_.indent() << "def " << function_signature(*f_iter) << endl;
+    f_service_.indent() << "def " << function_signature(*f_iter) << '\n';
     f_service_.indent_up();
     f_service_.indent() << "send_" << funname << "(";
 
@@ -902,20 +900,20 @@
       }
       f_service_ << (*fld_iter)->get_name();
     }
-    f_service_ << ")" << endl;
+    f_service_ << ")" << '\n';
 
     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_ << "recv_" << funname << "()" << '\n';
     }
     f_service_.indent_down();
-    f_service_.indent() << "end" << endl;
-    f_service_ << endl;
+    f_service_.indent() << "end" << '\n';
+    f_service_ << '\n';
 
-    f_service_.indent() << "def send_" << function_signature(*f_iter) << endl;
+    f_service_.indent() << "def send_" << function_signature(*f_iter) << '\n';
     f_service_.indent_up();
 
     std::string argsname = capitalize((*f_iter)->get_name() + "_args");
@@ -927,10 +925,10 @@
       f_service_ << ", :" << (*fld_iter)->get_name() << " => " << (*fld_iter)->get_name();
     }
 
-    f_service_ << ")" << endl;
+    f_service_ << ")" << '\n';
 
     f_service_.indent_down();
-    f_service_.indent() << "end" << endl;
+    f_service_.indent() << "end" << '\n';
 
     if (!(*f_iter)->is_oneway()) {
       std::string resultname = capitalize((*f_iter)->get_name() + "_result");
@@ -940,22 +938,22 @@
                                string("recv_") + (*f_iter)->get_name(),
                                &noargs);
       // Open function
-      f_service_ << endl;
-      f_service_.indent() << "def " << function_signature(&recv_function) << endl;
+      f_service_ << '\n';
+      f_service_.indent() << "def " << function_signature(&recv_function) << '\n';
       f_service_.indent_up();
 
-      f_service_.indent() << "fname, mtype, rseqid = receive_message_begin()" << endl;
-      f_service_.indent() << "handle_exception(mtype)" << endl;
+      f_service_.indent() << "fname, mtype, rseqid = receive_message_begin()" << '\n';
+      f_service_.indent() << "handle_exception(mtype)" << '\n';
 
-      f_service_.indent() << "if reply_seqid(rseqid)==false" << endl;
-      f_service_.indent() << "  raise \"seqid reply faild\"" << endl;
-      f_service_.indent() << "end" << endl;
+      f_service_.indent() << "if reply_seqid(rseqid)==false" << '\n';
+      f_service_.indent() << "  raise \"seqid reply faild\"" << '\n';
+      f_service_.indent() << "end" << '\n';
 
-      f_service_.indent() << "result = receive_message(" << resultname << ")" << endl;
+      f_service_.indent() << "result = receive_message(" << resultname << ")" << '\n';
 
       // Careful, only return _result if not a void function
       if (!(*f_iter)->get_returntype()->is_void()) {
-        f_service_.indent() << "return result.success unless result.success.nil?" << endl;
+        f_service_.indent() << "return result.success unless result.success.nil?" << '\n';
       }
 
       t_struct* xs = (*f_iter)->get_xceptions();
@@ -963,27 +961,27 @@
       vector<t_field*>::const_iterator x_iter;
       for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) {
         f_service_.indent() << "raise result." << (*x_iter)->get_name() << " unless result."
-                            << (*x_iter)->get_name() << ".nil?" << endl;
+                            << (*x_iter)->get_name() << ".nil?" << '\n';
       }
 
       // Careful, only return _result if not a void function
       if ((*f_iter)->get_returntype()->is_void()) {
-        f_service_.indent() << "return" << endl;
+        f_service_.indent() << "return" << '\n';
       } else {
         f_service_.indent() << "raise "
                                "::Thrift::ApplicationException.new(::Thrift::ApplicationException::"
                                "MISSING_RESULT, '" << (*f_iter)->get_name()
-                            << " failed: unknown result')" << endl;
+                            << " failed: unknown result')" << '\n';
       }
 
       // Close function
       f_service_.indent_down();
-      f_service_.indent() << "end" << endl << endl;
+      f_service_.indent() << "end" << '\n' << '\n';
     }
   }
 
   f_service_.indent_down();
-  f_service_.indent() << "end" << endl << endl;
+  f_service_.indent() << "end" << '\n' << '\n';
 }
 
 /**
@@ -1004,10 +1002,10 @@
   }
 
   // Generate the header portion
-  f_service_.indent() << "class Processor" << extends_processor << endl;
+  f_service_.indent() << "class Processor" << extends_processor << '\n';
   f_service_.indent_up();
 
-  f_service_.indent() << "include ::Thrift::Processor" << endl << endl;
+  f_service_.indent() << "include ::Thrift::Processor" << '\n' << '\n';
 
   // Generate the process subfunctions
   for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
@@ -1015,7 +1013,7 @@
   }
 
   f_service_.indent_down();
-  f_service_.indent() << "end" << endl << endl;
+  f_service_.indent() << "end" << '\n' << '\n';
 }
 
 /**
@@ -1026,13 +1024,13 @@
 void t_rb_generator::generate_process_function(t_service* tservice, t_function* tfunction) {
   (void)tservice;
   // Open function
-  f_service_.indent() << "def process_" << tfunction->get_name() << "(seqid, iprot, oprot)" << endl;
+  f_service_.indent() << "def process_" << tfunction->get_name() << "(seqid, iprot, oprot)" << '\n';
   f_service_.indent_up();
 
   string argsname = capitalize(tfunction->get_name()) + "_args";
   string resultname = capitalize(tfunction->get_name()) + "_result";
 
-  f_service_.indent() << "args = read_args(iprot, " << argsname << ")" << endl;
+  f_service_.indent() << "args = read_args(iprot, " << argsname << ")" << '\n';
 
   t_struct* xs = tfunction->get_xceptions();
   const std::vector<t_field*>& xceptions = xs->get_members();
@@ -1040,12 +1038,12 @@
 
   // Declare result for non oneway function
   if (!tfunction->is_oneway()) {
-    f_service_.indent() << "result = " << resultname << ".new()" << endl;
+    f_service_.indent() << "result = " << resultname << ".new()" << '\n';
   }
 
   // Try block for a function with exceptions
   if (xceptions.size() > 0) {
-    f_service_.indent() << "begin" << endl;
+    f_service_.indent() << "begin" << '\n';
     f_service_.indent_up();
   }
 
@@ -1068,37 +1066,37 @@
     }
     f_service_ << "args." << (*f_iter)->get_name();
   }
-  f_service_ << ")" << endl;
+  f_service_ << ")" << '\n';
 
   if (!tfunction->is_oneway() && xceptions.size() > 0) {
     f_service_.indent_down();
     for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) {
       f_service_.indent() << "rescue " << full_type_name((*x_iter)->get_type()) << " => "
-                          << (*x_iter)->get_name() << endl;
+                          << (*x_iter)->get_name() << '\n';
       if (!tfunction->is_oneway()) {
         f_service_.indent_up();
         f_service_.indent() << "result." << (*x_iter)->get_name() << " = " << (*x_iter)->get_name()
-                            << endl;
+                            << '\n';
         f_service_.indent_down();
       }
     }
-    f_service_.indent() << "end" << endl;
+    f_service_.indent() << "end" << '\n';
   }
 
   // Shortcut out here for oneway functions
   if (tfunction->is_oneway()) {
-    f_service_.indent() << "return" << endl;
+    f_service_.indent() << "return" << '\n';
     f_service_.indent_down();
-    f_service_.indent() << "end" << endl << endl;
+    f_service_.indent() << "end" << '\n' << '\n';
     return;
   }
 
   f_service_.indent() << "write_result(result, oprot, '" << tfunction->get_name() << "', seqid)"
-                      << endl;
+                      << '\n';
 
   // Close function
   f_service_.indent_down();
-  f_service_.indent() << "end" << endl << endl;
+  f_service_.indent() << "end" << '\n' << '\n';
 }
 
 /**
@@ -1219,7 +1217,7 @@
 }
 
 void t_rb_generator::generate_rb_struct_required_validator(t_rb_ofstream& out, t_struct* tstruct) {
-  out.indent() << "def validate" << endl;
+  out.indent() << "def validate" << '\n';
   out.indent_up();
 
   const vector<t_field*>& fields = tstruct->get_members();
@@ -1235,7 +1233,7 @@
       } else {
         out << " unless @" << field->get_name();
       }
-      out << endl;
+      out << '\n';
     }
   }
 
@@ -1246,21 +1244,21 @@
     if (field->get_type()->is_enum()) {
       out.indent() << "unless @" << field->get_name() << ".nil? || "
                    << full_type_name(field->get_type()) << "::VALID_VALUES.include?(@"
-                   << field->get_name() << ")" << endl;
+                   << field->get_name() << ")" << '\n';
       out.indent_up();
       out.indent() << "raise ::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, "
-                      "'Invalid value of field " << field->get_name() << "!')" << endl;
+                      "'Invalid value of field " << field->get_name() << "!')" << '\n';
       out.indent_down();
-      out.indent() << "end" << endl;
+      out.indent() << "end" << '\n';
     }
   }
 
   out.indent_down();
-  out.indent() << "end" << endl << endl;
+  out.indent() << "end" << '\n' << '\n';
 }
 
 void t_rb_generator::generate_rb_union_validator(t_rb_ofstream& out, t_struct* tstruct) {
-  out.indent() << "def validate" << endl;
+  out.indent() << "def validate" << '\n';
   out.indent_up();
 
   const vector<t_field*>& fields = tstruct->get_members();
@@ -1268,25 +1266,25 @@
 
   out.indent()
       << "raise(StandardError, 'Union fields are not set.') if get_set_field.nil? || get_value.nil?"
-      << endl;
+      << '\n';
 
   // if field is an enum, check that its value is valid
   for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
     const t_field* field = (*f_iter);
 
     if (field->get_type()->is_enum()) {
-      out.indent() << "if get_set_field == :" << field->get_name() << endl;
+      out.indent() << "if get_set_field == :" << field->get_name() << '\n';
       out.indent() << "  raise "
                       "::Thrift::ProtocolException.new(::Thrift::ProtocolException::UNKNOWN, "
                       "'Invalid value of field " << field->get_name() << "!') unless "
                    << full_type_name(field->get_type()) << "::VALID_VALUES.include?(get_value)"
-                   << endl;
-      out.indent() << "end" << endl;
+                   << '\n';
+      out.indent() << "end" << '\n';
     }
   }
 
   out.indent_down();
-  out.indent() << "end" << endl << endl;
+  out.indent() << "end" << '\n' << '\n';
 }
 
 std::string t_rb_generator::display_name() const {
diff --git a/compiler/cpp/src/thrift/generate/t_rs_generator.cc b/compiler/cpp/src/thrift/generate/t_rs_generator.cc
index 2742724..780c8fd 100644
--- a/compiler/cpp/src/thrift/generate/t_rs_generator.cc
+++ b/compiler/cpp/src/thrift/generate/t_rs_generator.cc
@@ -31,7 +31,6 @@
 using std::string;
 using std::vector;
 
-static const string endl("\n"); // avoid ostream << std::endl flushes
 static const string SERVICE_RESULT_VARIABLE("result_value");
 static const string RESULT_STRUCT_SUFFIX("Result");
 static const string RUST_RESERVED_WORDS[]
@@ -521,9 +520,9 @@
   f_gen_.open(f_gen_name.c_str());
 
   // header comment
-  f_gen_ << "// " << autogen_summary() << endl;
-  f_gen_ << "// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING" << endl;
-  f_gen_ << endl;
+  f_gen_ << "// " << autogen_summary() << '\n';
+  f_gen_ << "// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING" << '\n';
+  f_gen_ << '\n';
 
   render_attributes_and_includes();
 }
@@ -532,11 +531,11 @@
   // turn off some compiler/clippy warnings
 
   // code may not be used
-  f_gen_ << "#![allow(dead_code)]" << endl;
+  f_gen_ << "#![allow(dead_code)]" << '\n';
   // code always includes BTreeMap/BTreeSet/OrderedFloat
-  f_gen_ << "#![allow(unused_imports)]" << endl;
+  f_gen_ << "#![allow(unused_imports)]" << '\n';
   // code might not include imports from crates
-  f_gen_ << "#![allow(unused_extern_crates)]" << endl;
+  f_gen_ << "#![allow(unused_extern_crates)]" << '\n';
   // constructors take *all* struct parameters, which can trigger the "too many arguments" warning
   // some auto-gen'd types can be deeply nested. clippy recommends factoring them out which is hard
   // to autogen some methods may start with "is_"
@@ -548,38 +547,38 @@
   // 2. When you define types out of order
   f_gen_ << "#![allow(clippy::too_many_arguments, clippy::type_complexity, clippy::vec_box, "
             "clippy::wrong_self_convention)]"
-         << endl;
+         << '\n';
   // prevent rustfmt from running against this file
   // lines are too long, code is (thankfully!) not visual-indented, etc.
   // can't use #[rustfmt::skip] see: https://github.com/rust-lang/rust/issues/54726
-  f_gen_ << "#![cfg_attr(rustfmt, rustfmt_skip)]" << endl;
-  f_gen_ << endl;
+  f_gen_ << "#![cfg_attr(rustfmt, rustfmt_skip)]" << '\n';
+  f_gen_ << '\n';
 
   // add standard includes
-  f_gen_ << "use std::cell::RefCell;" << endl;
-  f_gen_ << "use std::collections::{BTreeMap, BTreeSet};" << endl;
-  f_gen_ << "use std::convert::{From, TryFrom};" << endl;
-  f_gen_ << "use std::default::Default;" << endl;
-  f_gen_ << "use std::error::Error;" << endl;
-  f_gen_ << "use std::fmt;" << endl;
-  f_gen_ << "use std::fmt::{Display, Formatter};" << endl;
-  f_gen_ << "use std::rc::Rc;" << endl;
-  f_gen_ << endl;
-  f_gen_ << "use thrift::OrderedFloat;" << endl;
+  f_gen_ << "use std::cell::RefCell;" << '\n';
+  f_gen_ << "use std::collections::{BTreeMap, BTreeSet};" << '\n';
+  f_gen_ << "use std::convert::{From, TryFrom};" << '\n';
+  f_gen_ << "use std::default::Default;" << '\n';
+  f_gen_ << "use std::error::Error;" << '\n';
+  f_gen_ << "use std::fmt;" << '\n';
+  f_gen_ << "use std::fmt::{Display, Formatter};" << '\n';
+  f_gen_ << "use std::rc::Rc;" << '\n';
+  f_gen_ << '\n';
+  f_gen_ << "use thrift::OrderedFloat;" << '\n';
   f_gen_ << "use thrift::{ApplicationError, ApplicationErrorKind, ProtocolError, "
             "ProtocolErrorKind, TThriftClient};"
-         << endl;
+         << '\n';
   f_gen_ << "use thrift::protocol::{TFieldIdentifier, TListIdentifier, TMapIdentifier, "
             "TMessageIdentifier, TMessageType, TInputProtocol, TOutputProtocol, TSerializable, "
             "TSetIdentifier, TStructIdentifier, TType};"
-         << endl;
-  f_gen_ << "use thrift::protocol::field_id;" << endl;
-  f_gen_ << "use thrift::protocol::verify_expected_message_type;" << endl;
-  f_gen_ << "use thrift::protocol::verify_expected_sequence_number;" << endl;
-  f_gen_ << "use thrift::protocol::verify_expected_service_call;" << endl;
-  f_gen_ << "use thrift::protocol::verify_required_field_exists;" << endl;
-  f_gen_ << "use thrift::server::TProcessor;" << endl;
-  f_gen_ << endl;
+         << '\n';
+  f_gen_ << "use thrift::protocol::field_id;" << '\n';
+  f_gen_ << "use thrift::protocol::verify_expected_message_type;" << '\n';
+  f_gen_ << "use thrift::protocol::verify_expected_sequence_number;" << '\n';
+  f_gen_ << "use thrift::protocol::verify_expected_service_call;" << '\n';
+  f_gen_ << "use thrift::protocol::verify_required_field_exists;" << '\n';
+  f_gen_ << "use thrift::server::TProcessor;" << '\n';
+  f_gen_ << '\n';
 
   // add all the program includes
   // NOTE: this is more involved than you would expect because of service extension
@@ -615,13 +614,13 @@
       string_replace(module_namespace, ".", "::");
 
       if (module_namespace.empty()) {
-        f_gen_ << "use crate::" << rust_snake_case(module_name) << ";" << endl;
+        f_gen_ << "use crate::" << rust_snake_case(module_name) << ";" << '\n';
       } else {
         f_gen_ << "use crate::" << module_namespace << "::" << rust_snake_case(module_name) << ";"
-               << endl;
+               << '\n';
       }
     }
-    f_gen_ << endl;
+    f_gen_ << '\n';
   }
 }
 
@@ -673,8 +672,8 @@
 
   f_gen_ << "pub const " << rust_upper_case(name) << ": " << to_rust_const_type(ttype) << " = ";
   render_const_value(ttype, tvalue, false);
-  f_gen_ << ";" << endl;
-  f_gen_ << endl;
+  f_gen_ << ";" << '\n';
+  f_gen_ << '\n';
 }
 
 void t_rs_generator::render_const_value_holder(const string& name,
@@ -686,19 +685,19 @@
 
   string holder_name("Const" + rust_camel_case(name));
 
-  f_gen_ << indent() << "pub struct " << holder_name << ";" << endl;
-  f_gen_ << indent() << "impl " << holder_name << " {" << endl;
+  f_gen_ << indent() << "pub struct " << holder_name << ";" << '\n';
+  f_gen_ << indent() << "impl " << holder_name << " {" << '\n';
   indent_up();
 
-  f_gen_ << indent() << "pub fn const_value() -> " << to_rust_type(ttype) << " {" << endl;
+  f_gen_ << indent() << "pub fn const_value() -> " << to_rust_type(ttype) << " {" << '\n';
   indent_up();
   render_const_value(ttype, tvalue, true, false);
   indent_down();
-  f_gen_ << indent() << "}" << endl;
+  f_gen_ << indent() << "}" << '\n';
 
   indent_down();
-  f_gen_ << indent() << "}" << endl;
-  f_gen_ << endl;
+  f_gen_ << indent() << "}" << '\n';
+  f_gen_ << '\n';
 }
 
 void t_rs_generator::render_const_value(t_type* ttype,
@@ -748,10 +747,10 @@
   } else if (ttype->is_typedef()) {
     render_const_value(get_true_type(ttype), tvalue, is_owned, true);
   } else if (ttype->is_enum()) {
-    f_gen_ << "{" << endl;
+    f_gen_ << "{" << '\n';
     indent_up();
     f_gen_ << indent() << to_rust_type(ttype) << "::try_from(" << tvalue->get_integer()
-           << ").expect(\"expecting valid const value\")" << endl;
+           << ").expect(\"expecting valid const value\")" << '\n';
     indent_down();
     f_gen_ << indent() << "}";
   } else if (ttype->is_struct() || ttype->is_xception()) {
@@ -772,21 +771,21 @@
   }
 
   if (!is_inline) {
-    f_gen_ << endl;
+    f_gen_ << '\n';
   }
 }
 
 void t_rs_generator::render_const_struct(t_type* ttype, t_const_value*) {
   if (((t_struct*)ttype)->is_union()) {
-    f_gen_ << "{" << endl;
+    f_gen_ << "{" << '\n';
     indent_up();
-    f_gen_ << indent() << "unimplemented!()" << endl;
+    f_gen_ << indent() << "unimplemented!()" << '\n';
     indent_down();
     f_gen_ << indent() << "}";
   } else {
-    f_gen_ << "{" << endl;
+    f_gen_ << "{" << '\n';
     indent_up();
-    f_gen_ << indent() << "unimplemented!()" << endl;
+    f_gen_ << indent() << "unimplemented!()" << '\n';
     indent_down();
     f_gen_ << indent() << "}";
   }
@@ -794,7 +793,7 @@
 
 void t_rs_generator::render_const_list(t_type* ttype, t_const_value* tvalue) {
   t_type* elem_type = ((t_list*)ttype)->get_elem_type();
-  f_gen_ << "vec![" << endl;
+  f_gen_ << "vec![" << '\n';
   indent_up();
   const vector<t_const_value*>& elems = tvalue->get_list();
   vector<t_const_value*>::const_iterator elem_iter;
@@ -802,7 +801,7 @@
     f_gen_ << indent();
     t_const_value* elem_value = (*elem_iter);
     render_const_value(elem_type, elem_value);
-    f_gen_ << "," << endl;
+    f_gen_ << "," << '\n';
   }
   indent_down();
   f_gen_ << indent() << "]";
@@ -810,7 +809,7 @@
 
 void t_rs_generator::render_const_set(t_type* ttype, t_const_value* tvalue) {
   t_type* elem_type = ((t_set*)ttype)->get_elem_type();
-  f_gen_ << "BTreeSet::from([" << endl;
+  f_gen_ << "BTreeSet::from([" << '\n';
   indent_up();
   const vector<t_const_value*>& elems = tvalue->get_list();
   vector<t_const_value*>::const_iterator elem_iter;
@@ -818,7 +817,7 @@
     f_gen_ << indent();
     t_const_value* elem_value = (*elem_iter);
     render_const_value(elem_type, elem_value);
-    f_gen_ << "," << endl;
+    f_gen_ << "," << '\n';
   }
   indent_down();
   f_gen_ << indent() << "])";
@@ -827,7 +826,7 @@
 void t_rs_generator::render_const_map(t_type* ttype, t_const_value* tvalue) {
   t_type* key_type = ((t_map*)ttype)->get_key_type();
   t_type* val_type = ((t_map*)ttype)->get_val_type();
-  f_gen_ << "BTreeMap::from([" << endl;
+  f_gen_ << "BTreeMap::from([" << '\n';
   indent_up();
   const map<t_const_value*, t_const_value*, t_const_value::value_compare>& elems
       = tvalue->get_map();
@@ -836,16 +835,16 @@
     t_const_value* key_value = elem_iter->first;
     t_const_value* val_value = elem_iter->second;
 
-    f_gen_ << indent() << "(" << endl;
+    f_gen_ << indent() << "(" << '\n';
     indent_up();
     f_gen_ << indent();
     render_const_value(key_type, key_value);
-    f_gen_ << "," << endl;
+    f_gen_ << "," << '\n';
     f_gen_ << indent();
     render_const_value(val_type, val_value);
-    f_gen_ << "," << endl;
+    f_gen_ << "," << '\n';
     indent_down();
-    f_gen_ << indent() << ")," << endl;
+    f_gen_ << indent() << ")," << '\n';
   }
   indent_down();
   f_gen_ << indent() << "])";
@@ -860,8 +859,8 @@
 void t_rs_generator::generate_typedef(t_typedef* ttypedef) {
   std::string actual_type = to_rust_type(ttypedef->get_type());
   f_gen_ << "pub type " << rust_safe_name(ttypedef->get_symbolic()) << " = " << actual_type << ";"
-         << endl;
-  f_gen_ << endl;
+         << '\n';
+  f_gen_ << '\n';
 }
 
 //-----------------------------------------------------------------------------
@@ -879,13 +878,13 @@
 
 void t_rs_generator::render_enum_definition(t_enum* tenum, const string& enum_name) {
   render_rustdoc((t_doc*)tenum);
-  f_gen_ << "#[derive(Copy, Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]" << endl;
-  f_gen_ << "pub struct " << enum_name << "(pub i32);" << endl;
-  f_gen_ << endl;
+  f_gen_ << "#[derive(Copy, Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]" << '\n';
+  f_gen_ << "pub struct " << enum_name << "(pub i32);" << '\n';
+  f_gen_ << '\n';
 }
 
 void t_rs_generator::render_enum_impl(t_enum* tenum, const string& enum_name) {
-  f_gen_ << "impl " << enum_name << " {" << endl;
+  f_gen_ << "impl " << enum_name << " {" << '\n';
   indent_up();
 
   vector<t_enum_value*> constants = tenum->get_constants();
@@ -898,114 +897,114 @@
       render_rustdoc((t_doc*)val);
       f_gen_ << indent() << "pub const " << rust_enum_variant_name(val->get_name()) << ": "
              << enum_name << " = " << enum_name << "(" << val->get_value() << ")"
-             << ";" << endl;
+             << ";" << '\n';
     }
   }
 
   // array containing all IDL-defined enum variants
   {
-    f_gen_ << indent() << "pub const ENUM_VALUES: &'static [Self] = &[" << endl;
+    f_gen_ << indent() << "pub const ENUM_VALUES: &'static [Self] = &[" << '\n';
     indent_up();
     vector<t_enum_value*>::iterator constants_iter;
     for (constants_iter = constants.begin(); constants_iter != constants.end(); ++constants_iter) {
       t_enum_value* val = (*constants_iter);
-      f_gen_ << indent() << "Self::" << rust_enum_variant_name(val->get_name()) << "," << endl;
+      f_gen_ << indent() << "Self::" << rust_enum_variant_name(val->get_name()) << "," << '\n';
     }
     indent_down();
-    f_gen_ << indent() << "];" << endl;
+    f_gen_ << indent() << "];" << '\n';
   }
 
   indent_down();
-  f_gen_ << "}" << endl;
-  f_gen_ << endl;
+  f_gen_ << "}" << '\n';
+  f_gen_ << '\n';
 
-  f_gen_ << "impl TSerializable for " << enum_name << " {" << endl;
+  f_gen_ << "impl TSerializable for " << enum_name << " {" << '\n';
   indent_up();
 
-  f_gen_ << indent() << "#[allow(clippy::trivially_copy_pass_by_ref)]" << endl;
+  f_gen_ << indent() << "#[allow(clippy::trivially_copy_pass_by_ref)]" << '\n';
   f_gen_
       << indent()
       << "fn write_to_out_protocol(&self, o_prot: &mut dyn TOutputProtocol) -> thrift::Result<()> {"
-      << endl;
+      << '\n';
   indent_up();
-  f_gen_ << indent() << "o_prot.write_i32(self.0)" << endl;
+  f_gen_ << indent() << "o_prot.write_i32(self.0)" << '\n';
   indent_down();
-  f_gen_ << indent() << "}" << endl;
+  f_gen_ << indent() << "}" << '\n';
 
   f_gen_ << indent()
          << "fn read_from_in_protocol(i_prot: &mut dyn TInputProtocol) -> thrift::Result<"
-         << enum_name << "> {" << endl;
+         << enum_name << "> {" << '\n';
   indent_up();
-  f_gen_ << indent() << "let enum_value = i_prot.read_i32()?;" << endl;
+  f_gen_ << indent() << "let enum_value = i_prot.read_i32()?;" << '\n';
   f_gen_ << indent() << "Ok(" << enum_name << "::from(enum_value)"
-         << ")" << endl;
+         << ")" << '\n';
   indent_down();
-  f_gen_ << indent() << "}" << endl;
+  f_gen_ << indent() << "}" << '\n';
 
   indent_down();
-  f_gen_ << "}" << endl;
-  f_gen_ << endl;
+  f_gen_ << "}" << '\n';
+  f_gen_ << '\n';
 }
 
 void t_rs_generator::render_enum_conversion(t_enum* tenum, const string& enum_name) {
   // From trait: i32 -> ENUM_TYPE
-  f_gen_ << "impl From<i32> for " << enum_name << " {" << endl;
+  f_gen_ << "impl From<i32> for " << enum_name << " {" << '\n';
   indent_up();
-  f_gen_ << indent() << "fn from(i: i32) -> Self {" << endl;
+  f_gen_ << indent() << "fn from(i: i32) -> Self {" << '\n';
   indent_up();
-  f_gen_ << indent() << "match i {" << endl;
+  f_gen_ << indent() << "match i {" << '\n';
   indent_up();
   vector<t_enum_value*> constants = tenum->get_constants();
   vector<t_enum_value*>::iterator constants_iter;
   for (constants_iter = constants.begin(); constants_iter != constants.end(); ++constants_iter) {
     t_enum_value* val = (*constants_iter);
     f_gen_ << indent() << val->get_value() << " => " << enum_name
-           << "::" << rust_enum_variant_name(val->get_name()) << "," << endl;
+           << "::" << rust_enum_variant_name(val->get_name()) << "," << '\n';
   }
-  f_gen_ << indent() << "_ => " << enum_name << "(i)" << endl;
+  f_gen_ << indent() << "_ => " << enum_name << "(i)" << '\n';
   indent_down();
-  f_gen_ << indent() << "}" << endl;
+  f_gen_ << indent() << "}" << '\n';
   indent_down();
-  f_gen_ << indent() << "}" << endl;
+  f_gen_ << indent() << "}" << '\n';
   indent_down();
-  f_gen_ << "}" << endl;
-  f_gen_ << endl;
+  f_gen_ << "}" << '\n';
+  f_gen_ << '\n';
 
   // From trait: &i32 -> ENUM_TYPE
-  f_gen_ << "impl From<&i32> for " << enum_name << " {" << endl;
+  f_gen_ << "impl From<&i32> for " << enum_name << " {" << '\n';
   indent_up();
-  f_gen_ << indent() << "fn from(i: &i32) -> Self {" << endl;
+  f_gen_ << indent() << "fn from(i: &i32) -> Self {" << '\n';
   indent_up();
-  f_gen_ << indent() << enum_name << "::from(*i)" << endl;
+  f_gen_ << indent() << enum_name << "::from(*i)" << '\n';
   indent_down();
-  f_gen_ << indent() << "}" << endl;
+  f_gen_ << indent() << "}" << '\n';
   indent_down();
-  f_gen_ << "}" << endl;
-  f_gen_ << endl;
+  f_gen_ << "}" << '\n';
+  f_gen_ << '\n';
 
   // From trait: ENUM_TYPE -> int
-  f_gen_ << "impl From<" << enum_name << "> for i32 {" << endl;
+  f_gen_ << "impl From<" << enum_name << "> for i32 {" << '\n';
   indent_up();
-  f_gen_ << indent() << "fn from(e: " << enum_name << ") -> i32 {" << endl;
+  f_gen_ << indent() << "fn from(e: " << enum_name << ") -> i32 {" << '\n';
   indent_up();
-  f_gen_ << indent() << "e.0" << endl;
+  f_gen_ << indent() << "e.0" << '\n';
   indent_down();
-  f_gen_ << indent() << "}" << endl;
+  f_gen_ << indent() << "}" << '\n';
   indent_down();
-  f_gen_ << "}" << endl;
-  f_gen_ << endl;
+  f_gen_ << "}" << '\n';
+  f_gen_ << '\n';
 
   // From trait: &ENUM_TYPE -> int
-  f_gen_ << "impl From<&" << enum_name << "> for i32 {" << endl;
+  f_gen_ << "impl From<&" << enum_name << "> for i32 {" << '\n';
   indent_up();
-  f_gen_ << indent() << "fn from(e: &" << enum_name << ") -> i32 {" << endl;
+  f_gen_ << indent() << "fn from(e: &" << enum_name << ") -> i32 {" << '\n';
   indent_up();
-  f_gen_ << indent() << "e.0" << endl;
+  f_gen_ << indent() << "e.0" << '\n';
   indent_down();
-  f_gen_ << indent() << "}" << endl;
+  f_gen_ << indent() << "}" << '\n';
   indent_down();
-  f_gen_ << "}" << endl;
-  f_gen_ << endl;
+  f_gen_ << "}" << '\n';
+  f_gen_ << '\n';
 }
 
 //-----------------------------------------------------------------------------
@@ -1056,8 +1055,8 @@
     }
   }
   f_gen_ << "#[derive(Clone, Debug" << (need_default ? ", Default" : "")
-         << ", Eq, Hash, Ord, PartialEq, PartialOrd)]" << endl;
-  f_gen_ << visibility_qualifier(struct_type) << "struct " << struct_name << " {" << endl;
+         << ", Eq, Hash, Ord, PartialEq, PartialOrd)]" << '\n';
+  f_gen_ << visibility_qualifier(struct_type) << "struct " << struct_name << " {" << '\n';
 
   // render the members
   if (!members.empty()) {
@@ -1072,53 +1071,53 @@
 
       render_rustdoc((t_doc*)member);
       f_gen_ << indent() << visibility_qualifier(struct_type) << rust_field_name(member) << ": "
-             << rust_type << "," << endl;
+             << rust_type << "," << '\n';
     }
 
     indent_down();
   }
 
-  f_gen_ << "}" << endl;
-  f_gen_ << endl;
+  f_gen_ << "}" << '\n';
+  f_gen_ << '\n';
 }
 
 void t_rs_generator::render_exception_struct_error_trait_impls(const string& struct_name,
                                                                t_struct* tstruct) {
   // error::Error trait
-  f_gen_ << "impl Error for " << struct_name << " {}" << endl;
-  f_gen_ << endl;
+  f_gen_ << "impl Error for " << struct_name << " {}" << '\n';
+  f_gen_ << '\n';
 
   // convert::From trait
-  f_gen_ << "impl From<" << struct_name << "> for thrift::Error {" << endl;
+  f_gen_ << "impl From<" << struct_name << "> for thrift::Error {" << '\n';
   indent_up();
-  f_gen_ << indent() << "fn from(e: " << struct_name << ") -> Self {" << endl;
+  f_gen_ << indent() << "fn from(e: " << struct_name << ") -> Self {" << '\n';
   indent_up();
-  f_gen_ << indent() << "thrift::Error::User(Box::new(e))" << endl;
+  f_gen_ << indent() << "thrift::Error::User(Box::new(e))" << '\n';
   indent_down();
-  f_gen_ << indent() << "}" << endl;
+  f_gen_ << indent() << "}" << '\n';
   indent_down();
-  f_gen_ << "}" << endl;
-  f_gen_ << endl;
+  f_gen_ << "}" << '\n';
+  f_gen_ << '\n';
 
   // fmt::Display trait
-  f_gen_ << "impl Display for " << struct_name << " {" << endl;
+  f_gen_ << "impl Display for " << struct_name << " {" << '\n';
   indent_up();
-  f_gen_ << indent() << "fn fmt(&self, f: &mut Formatter) -> fmt::Result {" << endl;
+  f_gen_ << indent() << "fn fmt(&self, f: &mut Formatter) -> fmt::Result {" << '\n';
   indent_up();
   f_gen_ << indent() << "write!(f, "
          << "\"remote service threw " << tstruct->get_name() << "\"" // use *original* name
-         << ")" << endl;
+         << ")" << '\n';
   indent_down();
-  f_gen_ << indent() << "}" << endl;
+  f_gen_ << indent() << "}" << '\n';
   indent_down();
-  f_gen_ << "}" << endl;
-  f_gen_ << endl;
+  f_gen_ << "}" << '\n';
+  f_gen_ << '\n';
 }
 
 void t_rs_generator::render_struct_impl(const string& struct_name,
                                         t_struct* tstruct,
                                         t_rs_generator::e_struct_type struct_type) {
-  f_gen_ << "impl " << struct_name << " {" << endl;
+  f_gen_ << "impl " << struct_name << " {" << '\n';
   indent_up();
 
   if (struct_type == t_rs_generator::T_REGULAR || struct_type == t_rs_generator::T_EXCEPTION) {
@@ -1131,10 +1130,10 @@
 
   if (struct_type == t_rs_generator::T_REGULAR || struct_type == t_rs_generator::T_EXCEPTION) {
     indent_down();
-    f_gen_ << "}" << endl;
-    f_gen_ << endl;
+    f_gen_ << "}" << '\n';
+    f_gen_ << '\n';
 
-    f_gen_ << "impl TSerializable for " << struct_name << " {" << endl;
+    f_gen_ << "impl TSerializable for " << struct_name << " {" << '\n';
     indent_up();
   }
 
@@ -1142,8 +1141,8 @@
   render_struct_sync_write(tstruct, struct_type);
 
   indent_down();
-  f_gen_ << "}" << endl;
-  f_gen_ << endl;
+  f_gen_ << "}" << '\n';
+  f_gen_ << '\n';
 }
 
 void t_rs_generator::render_struct_constructor(const string& struct_name,
@@ -1213,13 +1212,13 @@
 
   string visibility(visibility_qualifier(struct_type));
   f_gen_ << indent() << visibility << "fn new" << type_parameter_string << "(" << arg_string
-         << ") -> " << struct_name << " " << type_qualifier_string << "{" << endl;
+         << ") -> " << struct_name << " " << type_qualifier_string << "{" << '\n';
   indent_up();
 
   if (members.empty()) {
-    f_gen_ << indent() << struct_name << " {}" << endl;
+    f_gen_ << indent() << struct_name << " {}" << '\n';
   } else {
-    f_gen_ << indent() << struct_name << " {" << endl;
+    f_gen_ << indent() << struct_name << " {" << '\n';
     indent_up();
 
     for (members_iter = members.begin(); members_iter != members.end(); ++members_iter) {
@@ -1228,18 +1227,18 @@
       string member_name(rust_field_name(member));
 
       if (is_optional(member_req)) {
-        f_gen_ << indent() << member_name << ": " << member_name << ".into()," << endl;
+        f_gen_ << indent() << member_name << ": " << member_name << ".into()," << '\n';
       } else {
-        f_gen_ << indent() << member_name << "," << endl;
+        f_gen_ << indent() << member_name << "," << '\n';
       }
     }
 
     indent_down();
-    f_gen_ << indent() << "}" << endl;
+    f_gen_ << indent() << "}" << '\n';
   }
 
   indent_down();
-  f_gen_ << indent() << "}" << endl;
+  f_gen_ << indent() << "}" << '\n';
 }
 
 void t_rs_generator::render_result_struct_to_result_method(t_struct* tstruct) {
@@ -1272,7 +1271,7 @@
   // maintaining a rendered branch count (while a little ugly) got me the
   // rendering I wanted with code that was reasonably understandable
 
-  f_gen_ << indent() << "fn ok_or(self) -> thrift::Result<" << rust_return_type << "> {" << endl;
+  f_gen_ << indent() << "fn ok_or(self) -> thrift::Result<" << rust_return_type << "> {" << '\n';
   indent_up();
 
   int rendered_branch_count = 0;
@@ -1284,10 +1283,10 @@
       string field_name("self." + rust_field_name(tfield));
       string branch_statement = rendered_branch_count == 0 ? "if" : "} else if";
 
-      f_gen_ << indent() << branch_statement << " " << field_name << ".is_some() {" << endl;
+      f_gen_ << indent() << branch_statement << " " << field_name << ".is_some() {" << '\n';
       indent_up();
       f_gen_ << indent() << "Err(thrift::Error::User(Box::new(" << field_name << ".unwrap())))"
-             << endl;
+             << '\n';
       indent_down();
 
       rendered_branch_count++;
@@ -1299,35 +1298,35 @@
     if (rendered_branch_count == 0) {
       // we have the unit return and this service call has no user-defined
       // exceptions. this means that we've a trivial return (happens with oneways)
-      f_gen_ << indent() << "Ok(())" << endl;
+      f_gen_ << indent() << "Ok(())" << '\n';
     } else {
       // we have the unit return, but there are user-defined exceptions
       // if we've gotten this far then we have the default return (i.e. call successful)
-      f_gen_ << indent() << "} else {" << endl;
+      f_gen_ << indent() << "} else {" << '\n';
       indent_up();
-      f_gen_ << indent() << "Ok(())" << endl;
+      f_gen_ << indent() << "Ok(())" << '\n';
       indent_down();
-      f_gen_ << indent() << "}" << endl;
+      f_gen_ << indent() << "}" << '\n';
     }
   } else {
     string branch_statement = rendered_branch_count == 0 ? "if" : "} else if";
     f_gen_ << indent() << branch_statement << " self." << SERVICE_RESULT_VARIABLE << ".is_some() {"
-           << endl;
+           << '\n';
     indent_up();
-    f_gen_ << indent() << "Ok(self." << SERVICE_RESULT_VARIABLE << ".unwrap())" << endl;
+    f_gen_ << indent() << "Ok(self." << SERVICE_RESULT_VARIABLE << ".unwrap())" << '\n';
     indent_down();
-    f_gen_ << indent() << "} else {" << endl;
+    f_gen_ << indent() << "} else {" << '\n';
     indent_up();
     // if we haven't found a valid return value *or* a user exception
     // then we're in trouble; return a default error
     render_thrift_error("Application", "ApplicationError", "ApplicationErrorKind::MissingResult",
                         "\"no result received for " + service_call_name + "\"");
     indent_down();
-    f_gen_ << indent() << "}" << endl;
+    f_gen_ << indent() << "}" << '\n';
   }
 
   indent_down();
-  f_gen_ << indent() << "}" << endl;
+  f_gen_ << indent() << "}" << '\n';
 }
 
 void t_rs_generator::render_union(t_struct* tstruct) {
@@ -1343,32 +1342,32 @@
     throw "cannot generate rust enum with 0 members"; // may be valid thrift, but it's invalid rust
   }
 
-  f_gen_ << "#[derive(Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]" << endl;
-  f_gen_ << "pub enum " << union_name << " {" << endl;
+  f_gen_ << "#[derive(Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]" << '\n';
+  f_gen_ << "pub enum " << union_name << " {" << '\n';
   indent_up();
 
   vector<t_field*>::const_iterator member_iter;
   for (member_iter = members.begin(); member_iter != members.end(); ++member_iter) {
     t_field* tfield = (*member_iter);
     f_gen_ << indent() << rust_union_field_name(tfield) << "(" << to_rust_type(tfield->get_type())
-           << ")," << endl;
+           << ")," << '\n';
   }
 
   indent_down();
-  f_gen_ << "}" << endl;
-  f_gen_ << endl;
+  f_gen_ << "}" << '\n';
+  f_gen_ << '\n';
 }
 
 void t_rs_generator::render_union_impl(const string& union_name, t_struct* tstruct) {
-  f_gen_ << "impl TSerializable for " << union_name << " {" << endl;
+  f_gen_ << "impl TSerializable for " << union_name << " {" << '\n';
   indent_up();
 
   render_union_sync_read(union_name, tstruct);
   render_union_sync_write(union_name, tstruct);
 
   indent_down();
-  f_gen_ << "}" << endl;
-  f_gen_ << endl;
+  f_gen_ << "}" << '\n';
+  f_gen_ << '\n';
 }
 
 //-----------------------------------------------------------------------------
@@ -1382,14 +1381,14 @@
   f_gen_
       << indent()
       << "fn write_to_out_protocol(&self, o_prot: &mut dyn TOutputProtocol) -> thrift::Result<()> {"
-      << endl;
+      << '\n';
   indent_up();
 
   // write struct header to output protocol
   // note: use the *original* struct name here
   f_gen_ << indent()
-         << "let struct_ident = TStructIdentifier::new(\"" + tstruct->get_name() + "\");" << endl;
-  f_gen_ << indent() << "o_prot.write_struct_begin(&struct_ident)?;" << endl;
+         << "let struct_ident = TStructIdentifier::new(\"" + tstruct->get_name() + "\");" << '\n';
+  f_gen_ << indent() << "o_prot.write_struct_begin(&struct_ident)?;" << '\n';
 
   // write struct members to output protocol
   vector<t_field*> members = tstruct->get_sorted_members();
@@ -1404,30 +1403,30 @@
   }
 
   // write struct footer to output protocol
-  f_gen_ << indent() << "o_prot.write_field_stop()?;" << endl;
-  f_gen_ << indent() << "o_prot.write_struct_end()" << endl;
+  f_gen_ << indent() << "o_prot.write_field_stop()?;" << '\n';
+  f_gen_ << indent() << "o_prot.write_struct_end()" << '\n';
 
   indent_down();
-  f_gen_ << indent() << "}" << endl;
+  f_gen_ << indent() << "}" << '\n';
 }
 
 void t_rs_generator::render_union_sync_write(const string& union_name, t_struct* tstruct) {
   f_gen_
       << indent()
       << "fn write_to_out_protocol(&self, o_prot: &mut dyn TOutputProtocol) -> thrift::Result<()> {"
-      << endl;
+      << '\n';
   indent_up();
 
   // write struct header to output protocol
   // note: use the *original* struct name here
   f_gen_ << indent()
-         << "let struct_ident = TStructIdentifier::new(\"" + tstruct->get_name() + "\");" << endl;
-  f_gen_ << indent() << "o_prot.write_struct_begin(&struct_ident)?;" << endl;
+         << "let struct_ident = TStructIdentifier::new(\"" + tstruct->get_name() + "\");" << '\n';
+  f_gen_ << indent() << "o_prot.write_struct_begin(&struct_ident)?;" << '\n';
 
   // write the enum field to the output protocol
   vector<t_field*> members = tstruct->get_sorted_members();
   if (!members.empty()) {
-    f_gen_ << indent() << "match *self {" << endl;
+    f_gen_ << indent() << "match *self {" << '\n';
     indent_up();
     vector<t_field*>::iterator members_iter;
     for (members_iter = members.begin(); members_iter != members.end(); ++members_iter) {
@@ -1440,22 +1439,22 @@
       }
       string match_var((ttype->is_base_type() && !ttype->is_string()) ? "f" : "ref f");
       f_gen_ << indent() << union_name << "::" << rust_union_field_name(member) << "(" << match_var
-             << ") => {" << endl;
+             << ") => {" << '\n';
       indent_up();
       render_struct_field_sync_write("f", true, member, member_req);
       indent_down();
-      f_gen_ << indent() << "}," << endl;
+      f_gen_ << indent() << "}," << '\n';
     }
     indent_down();
-    f_gen_ << indent() << "}" << endl;
+    f_gen_ << indent() << "}" << '\n';
   }
 
   // write struct footer to output protocol
-  f_gen_ << indent() << "o_prot.write_field_stop()?;" << endl;
-  f_gen_ << indent() << "o_prot.write_struct_end()" << endl;
+  f_gen_ << indent() << "o_prot.write_field_stop()?;" << '\n';
+  f_gen_ << indent() << "o_prot.write_struct_end()" << '\n';
 
   indent_down();
-  f_gen_ << indent() << "}" << endl;
+  f_gen_ << indent() << "}" << '\n';
 }
 
 void t_rs_generator::render_struct_field_sync_write(const string& field_var,
@@ -1475,23 +1474,23 @@
   if (is_optional(req)) {
     string let_var((actual_type->is_base_type() && !actual_type->is_string()) ? "fld_var"
                                                                               : "ref fld_var");
-    f_gen_ << indent() << "if let Some(" << let_var << ") = " << field_var << " {" << endl;
+    f_gen_ << indent() << "if let Some(" << let_var << ") = " << field_var << " {" << '\n';
     indent_up();
-    f_gen_ << indent() << "o_prot.write_field_begin(&" << field_ident_string << ")?;" << endl;
+    f_gen_ << indent() << "o_prot.write_field_begin(&" << field_ident_string << ")?;" << '\n';
     render_type_sync_write("fld_var", true, field_type);
-    f_gen_ << indent() << "o_prot.write_field_end()?" << endl;
+    f_gen_ << indent() << "o_prot.write_field_end()?" << '\n';
     indent_down();
     /* FIXME: rethink how I deal with OPT_IN_REQ_OUT
     if (req == t_field::T_OPT_IN_REQ_OUT) {
-      f_gen_ << indent() << "let field_ident = " << field_ident_string << ";" << endl;
-      f_gen_ << indent() << "o_prot.write_field_begin(&field_ident)?;" << endl;
-      f_gen_ << indent() << "o_prot.write_field_end()?;" << endl;
+      f_gen_ << indent() << "let field_ident = " << field_ident_string << ";" << '\n';
+      f_gen_ << indent() << "o_prot.write_field_begin(&field_ident)?;" << '\n';
+      f_gen_ << indent() << "o_prot.write_field_end()?;" << '\n';
     }*/
-    f_gen_ << indent() << "}" << endl;
+    f_gen_ << indent() << "}" << '\n';
   } else {
-    f_gen_ << indent() << "o_prot.write_field_begin(&" << field_ident_string << ")?;" << endl;
+    f_gen_ << indent() << "o_prot.write_field_begin(&" << field_ident_string << ")?;" << '\n';
     render_type_sync_write(field_var, field_var_is_ref, tfield->get_type());
-    f_gen_ << indent() << "o_prot.write_field_end()?;" << endl;
+    f_gen_ << indent() << "o_prot.write_field_end()?;" << '\n';
   }
 }
 
@@ -1506,32 +1505,32 @@
     case t_base_type::TYPE_STRING: {
       string ref(type_var_is_ref ? "" : "&");
       if (tbase_type->is_binary()) {
-        f_gen_ << indent() << "o_prot.write_bytes(" + ref + type_var + ")?;" << endl;
+        f_gen_ << indent() << "o_prot.write_bytes(" + ref + type_var + ")?;" << '\n';
       } else {
-        f_gen_ << indent() << "o_prot.write_string(" + ref + type_var + ")?;" << endl;
+        f_gen_ << indent() << "o_prot.write_string(" + ref + type_var + ")?;" << '\n';
       }
       return;
     }
     case t_base_type::TYPE_UUID:
-      f_gen_ << indent() << "o_prot.write_uuid(&" + type_var + ")?;" << endl;
+      f_gen_ << indent() << "o_prot.write_uuid(&" + type_var + ")?;" << '\n';
       return;
     case t_base_type::TYPE_BOOL:
-      f_gen_ << indent() << "o_prot.write_bool(" + type_var + ")?;" << endl;
+      f_gen_ << indent() << "o_prot.write_bool(" + type_var + ")?;" << '\n';
       return;
     case t_base_type::TYPE_I8:
-      f_gen_ << indent() << "o_prot.write_i8(" + type_var + ")?;" << endl;
+      f_gen_ << indent() << "o_prot.write_i8(" + type_var + ")?;" << '\n';
       return;
     case t_base_type::TYPE_I16:
-      f_gen_ << indent() << "o_prot.write_i16(" + type_var + ")?;" << endl;
+      f_gen_ << indent() << "o_prot.write_i16(" + type_var + ")?;" << '\n';
       return;
     case t_base_type::TYPE_I32:
-      f_gen_ << indent() << "o_prot.write_i32(" + type_var + ")?;" << endl;
+      f_gen_ << indent() << "o_prot.write_i32(" + type_var + ")?;" << '\n';
       return;
     case t_base_type::TYPE_I64:
-      f_gen_ << indent() << "o_prot.write_i64(" + type_var + ")?;" << endl;
+      f_gen_ << indent() << "o_prot.write_i64(" + type_var + ")?;" << '\n';
       return;
     case t_base_type::TYPE_DOUBLE:
-      f_gen_ << indent() << "o_prot.write_double(" + type_var + ".into())?;" << endl;
+      f_gen_ << indent() << "o_prot.write_double(" + type_var + ".into())?;" << '\n';
       return;
     default:
       throw "compiler error: unhandled type";
@@ -1541,7 +1540,7 @@
     render_type_sync_write(type_var, type_var_is_ref, ttypedef->get_type());
     return;
   } else if (ttype->is_enum() || ttype->is_struct() || ttype->is_xception()) {
-    f_gen_ << indent() << type_var + ".write_to_out_protocol(o_prot)?;" << endl;
+    f_gen_ << indent() << type_var + ".write_to_out_protocol(o_prot)?;" << '\n';
     return;
   } else if (ttype->is_map()) {
     render_map_sync_write(type_var, type_var_is_ref, (t_map*)ttype);
@@ -1566,15 +1565,15 @@
          << "&TListIdentifier::new(" << to_rust_field_type_enum(elem_type) << ", " << list_var
          << ".len() as i32"
          << ")"
-         << ")?;" << endl;
+         << ")?;" << '\n';
 
   string ref(list_var_is_ref ? "" : "&");
-  f_gen_ << indent() << "for e in " << ref << list_var << " {" << endl;
+  f_gen_ << indent() << "for e in " << ref << list_var << " {" << '\n';
   indent_up();
   render_type_sync_write(string_container_write_variable(elem_type, "e"), true, elem_type);
   indent_down();
-  f_gen_ << indent() << "}" << endl;
-  f_gen_ << indent() << "o_prot.write_list_end()?;" << endl;
+  f_gen_ << indent() << "}" << '\n';
+  f_gen_ << indent() << "o_prot.write_list_end()?;" << '\n';
 }
 
 void t_rs_generator::render_set_sync_write(const string& set_var,
@@ -1586,15 +1585,15 @@
          << "&TSetIdentifier::new(" << to_rust_field_type_enum(elem_type) << ", " << set_var
          << ".len() as i32"
          << ")"
-         << ")?;" << endl;
+         << ")?;" << '\n';
 
   string ref(set_var_is_ref ? "" : "&");
-  f_gen_ << indent() << "for e in " << ref << set_var << " {" << endl;
+  f_gen_ << indent() << "for e in " << ref << set_var << " {" << '\n';
   indent_up();
   render_type_sync_write(string_container_write_variable(elem_type, "e"), true, elem_type);
   indent_down();
-  f_gen_ << indent() << "}" << endl;
-  f_gen_ << indent() << "o_prot.write_set_end()?;" << endl;
+  f_gen_ << indent() << "}" << '\n';
+  f_gen_ << indent() << "o_prot.write_set_end()?;" << '\n';
 }
 
 void t_rs_generator::render_map_sync_write(const string& map_var,
@@ -1606,16 +1605,16 @@
   f_gen_ << indent() << "o_prot.write_map_begin("
          << "&TMapIdentifier::new(" << to_rust_field_type_enum(key_type) << ", "
          << to_rust_field_type_enum(val_type) << ", " << map_var << ".len() as i32)"
-         << ")?;" << endl;
+         << ")?;" << '\n';
 
   string ref(map_var_is_ref ? "" : "&");
-  f_gen_ << indent() << "for (k, v) in " << ref << map_var << " {" << endl;
+  f_gen_ << indent() << "for (k, v) in " << ref << map_var << " {" << '\n';
   indent_up();
   render_type_sync_write(string_container_write_variable(key_type, "k"), true, key_type);
   render_type_sync_write(string_container_write_variable(val_type, "v"), true, val_type);
   indent_down();
-  f_gen_ << indent() << "}" << endl;
-  f_gen_ << indent() << "o_prot.write_map_end()?;" << endl;
+  f_gen_ << indent() << "}" << '\n';
+  f_gen_ << indent() << "o_prot.write_map_end()?;" << '\n';
 }
 
 string t_rs_generator::string_container_write_variable(t_type* ttype, const string& base_var) {
@@ -1651,11 +1650,11 @@
                                              t_rs_generator::e_struct_type struct_type) {
   f_gen_ << indent()
          << "fn read_from_in_protocol(i_prot: &mut dyn TInputProtocol) -> thrift::Result<"
-         << struct_name << "> {" << endl;
+         << struct_name << "> {" << '\n';
 
   indent_up();
 
-  f_gen_ << indent() << "i_prot.read_struct_begin()?;" << endl;
+  f_gen_ << indent() << "i_prot.read_struct_begin()?;" << '\n';
 
   // create temporary variables: one for each field in the struct
   const vector<t_field*> members = tstruct->get_sorted_members();
@@ -1671,55 +1670,55 @@
     } else {
       f_gen_ << "None;";
     }
-    f_gen_ << endl;
+    f_gen_ << '\n';
   }
 
   // now loop through the fields we've received
-  f_gen_ << indent() << "loop {" << endl; // start loop
+  f_gen_ << indent() << "loop {" << '\n'; // start loop
   indent_up();
 
   // break out if you've found the Stop field
-  f_gen_ << indent() << "let field_ident = i_prot.read_field_begin()?;" << endl;
-  f_gen_ << indent() << "if field_ident.field_type == TType::Stop {" << endl;
+  f_gen_ << indent() << "let field_ident = i_prot.read_field_begin()?;" << '\n';
+  f_gen_ << indent() << "if field_ident.field_type == TType::Stop {" << '\n';
   indent_up();
-  f_gen_ << indent() << "break;" << endl;
+  f_gen_ << indent() << "break;" << '\n';
   indent_down();
-  f_gen_ << indent() << "}" << endl;
+  f_gen_ << indent() << "}" << '\n';
 
   // now read all the fields found
   // avoid clippy::match_single_binding
   if (members.empty()) {
-    f_gen_ << indent() << "i_prot.skip(field_ident.field_type)?;" << endl;
+    f_gen_ << indent() << "i_prot.skip(field_ident.field_type)?;" << '\n';
   } else {
-    f_gen_ << indent() << "let field_id = field_id(&field_ident)?;" << endl;
-    f_gen_ << indent() << "match field_id {" << endl; // start match
+    f_gen_ << indent() << "let field_id = field_id(&field_ident)?;" << '\n';
+    f_gen_ << indent() << "match field_id {" << '\n'; // start match
     indent_up();
 
     for (members_iter = members.begin(); members_iter != members.end(); ++members_iter) {
       t_field* tfield = (*members_iter);
-      f_gen_ << indent() << rust_safe_field_id(tfield->get_key()) << " => {" << endl;
+      f_gen_ << indent() << rust_safe_field_id(tfield->get_key()) << " => {" << '\n';
       indent_up();
       render_type_sync_read("val", tfield->get_type());
-      f_gen_ << indent() << struct_field_read_temp_variable(tfield) << " = Some(val);" << endl;
+      f_gen_ << indent() << struct_field_read_temp_variable(tfield) << " = Some(val);" << '\n';
       indent_down();
-      f_gen_ << indent() << "}," << endl;
+      f_gen_ << indent() << "}," << '\n';
     }
 
     // default case (skip fields)
-    f_gen_ << indent() << "_ => {" << endl;
+    f_gen_ << indent() << "_ => {" << '\n';
     indent_up();
-    f_gen_ << indent() << "i_prot.skip(field_ident.field_type)?;" << endl;
+    f_gen_ << indent() << "i_prot.skip(field_ident.field_type)?;" << '\n';
     indent_down();
-    f_gen_ << indent() << "}," << endl;
+    f_gen_ << indent() << "}," << '\n';
 
     indent_down();
-    f_gen_ << indent() << "};" << endl; // finish match
+    f_gen_ << indent() << "};" << '\n'; // finish match
   }
 
-  f_gen_ << indent() << "i_prot.read_field_end()?;" << endl;
+  f_gen_ << indent() << "i_prot.read_field_end()?;" << '\n';
   indent_down();
-  f_gen_ << indent() << "}" << endl;                          // finish loop
-  f_gen_ << indent() << "i_prot.read_struct_end()?;" << endl; // read message footer from the wire
+  f_gen_ << indent() << "}" << '\n';                          // finish loop
+  f_gen_ << indent() << "i_prot.read_struct_end()?;" << '\n'; // read message footer from the wire
 
   // verify that all required fields exist
   for (members_iter = members.begin(); members_iter != members.end(); ++members_iter) {
@@ -1729,15 +1728,15 @@
       f_gen_ << indent() << "verify_required_field_exists("
              << "\"" << struct_name << "." << rust_field_name(tfield) << "\""
              << ", "
-             << "&" << struct_field_read_temp_variable(tfield) << ")?;" << endl;
+             << "&" << struct_field_read_temp_variable(tfield) << ")?;" << '\n';
     }
   }
 
   // construct the struct
   if (members.size() == 0) {
-    f_gen_ << indent() << "let ret = " << struct_name << " {};" << endl;
+    f_gen_ << indent() << "let ret = " << struct_name << " {};" << '\n';
   } else {
-    f_gen_ << indent() << "let ret = " << struct_name << " {" << endl;
+    f_gen_ << indent() << "let ret = " << struct_name << " {" << '\n';
     indent_up();
 
     for (members_iter = members.begin(); members_iter != members.end(); ++members_iter) {
@@ -1746,109 +1745,109 @@
       string field_name(rust_field_name(tfield));
       string field_key = struct_field_read_temp_variable(tfield);
       if (is_optional(req)) {
-        f_gen_ << indent() << field_name << ": " << field_key << "," << endl;
+        f_gen_ << indent() << field_name << ": " << field_key << "," << '\n';
       } else {
         f_gen_ << indent() << field_name << ": " << field_key
                << ".expect(\"auto-generated code should have checked for presence of required "
                   "fields\")"
-               << "," << endl;
+               << "," << '\n';
       }
     }
 
     indent_down();
-    f_gen_ << indent() << "};" << endl;
+    f_gen_ << indent() << "};" << '\n';
   }
 
   // return the constructed value
-  f_gen_ << indent() << "Ok(ret)" << endl;
+  f_gen_ << indent() << "Ok(ret)" << '\n';
 
   indent_down();
-  f_gen_ << indent() << "}" << endl;
+  f_gen_ << indent() << "}" << '\n';
 }
 
 void t_rs_generator::render_union_sync_read(const string& union_name, t_struct* tstruct) {
   f_gen_ << indent()
          << "fn read_from_in_protocol(i_prot: &mut dyn TInputProtocol) -> thrift::Result<"
-         << union_name << "> {" << endl;
+         << union_name << "> {" << '\n';
   indent_up();
 
   // create temporary variables to hold the
   // completed union as well as a count of fields read
-  f_gen_ << indent() << "let mut ret: Option<" << union_name << "> = None;" << endl;
-  f_gen_ << indent() << "let mut received_field_count = 0;" << endl;
+  f_gen_ << indent() << "let mut ret: Option<" << union_name << "> = None;" << '\n';
+  f_gen_ << indent() << "let mut received_field_count = 0;" << '\n';
 
   // read the struct preamble
-  f_gen_ << indent() << "i_prot.read_struct_begin()?;" << endl;
+  f_gen_ << indent() << "i_prot.read_struct_begin()?;" << '\n';
 
   // now loop through the fields we've received
-  f_gen_ << indent() << "loop {" << endl; // start loop
+  f_gen_ << indent() << "loop {" << '\n'; // start loop
   indent_up();
 
   // break out if you've found the Stop field
-  f_gen_ << indent() << "let field_ident = i_prot.read_field_begin()?;" << endl;
-  f_gen_ << indent() << "if field_ident.field_type == TType::Stop {" << endl;
+  f_gen_ << indent() << "let field_ident = i_prot.read_field_begin()?;" << '\n';
+  f_gen_ << indent() << "if field_ident.field_type == TType::Stop {" << '\n';
   indent_up();
-  f_gen_ << indent() << "break;" << endl;
+  f_gen_ << indent() << "break;" << '\n';
   indent_down();
-  f_gen_ << indent() << "}" << endl;
+  f_gen_ << indent() << "}" << '\n';
 
   // now read all the fields found
-  f_gen_ << indent() << "let field_id = field_id(&field_ident)?;" << endl;
-  f_gen_ << indent() << "match field_id {" << endl; // start match
+  f_gen_ << indent() << "let field_id = field_id(&field_ident)?;" << '\n';
+  f_gen_ << indent() << "match field_id {" << '\n'; // start match
   indent_up();
 
   const vector<t_field*> members = tstruct->get_sorted_members();
   vector<t_field*>::const_iterator members_iter;
   for (members_iter = members.begin(); members_iter != members.end(); ++members_iter) {
     t_field* member = (*members_iter);
-    f_gen_ << indent() << rust_safe_field_id(member->get_key()) << " => {" << endl;
+    f_gen_ << indent() << rust_safe_field_id(member->get_key()) << " => {" << '\n';
     indent_up();
     render_type_sync_read("val", member->get_type());
-    f_gen_ << indent() << "if ret.is_none() {" << endl;
+    f_gen_ << indent() << "if ret.is_none() {" << '\n';
     indent_up();
     f_gen_ << indent() << "ret = Some(" << union_name << "::" << rust_union_field_name(member)
-           << "(val));" << endl;
+           << "(val));" << '\n';
     indent_down();
-    f_gen_ << indent() << "}" << endl;
-    f_gen_ << indent() << "received_field_count += 1;" << endl;
+    f_gen_ << indent() << "}" << '\n';
+    f_gen_ << indent() << "received_field_count += 1;" << '\n';
     indent_down();
-    f_gen_ << indent() << "}," << endl;
+    f_gen_ << indent() << "}," << '\n';
   }
 
   // default case (skip fields)
-  f_gen_ << indent() << "_ => {" << endl;
+  f_gen_ << indent() << "_ => {" << '\n';
   indent_up();
-  f_gen_ << indent() << "i_prot.skip(field_ident.field_type)?;" << endl;
-  f_gen_ << indent() << "received_field_count += 1;" << endl;
+  f_gen_ << indent() << "i_prot.skip(field_ident.field_type)?;" << '\n';
+  f_gen_ << indent() << "received_field_count += 1;" << '\n';
   indent_down();
-  f_gen_ << indent() << "}," << endl;
+  f_gen_ << indent() << "}," << '\n';
 
   indent_down();
-  f_gen_ << indent() << "};" << endl; // finish match
-  f_gen_ << indent() << "i_prot.read_field_end()?;" << endl;
+  f_gen_ << indent() << "};" << '\n'; // finish match
+  f_gen_ << indent() << "i_prot.read_field_end()?;" << '\n';
   indent_down();
-  f_gen_ << indent() << "}" << endl;                          // finish loop
-  f_gen_ << indent() << "i_prot.read_struct_end()?;" << endl; // finish reading message from wire
+  f_gen_ << indent() << "}" << '\n';                          // finish loop
+  f_gen_ << indent() << "i_prot.read_struct_end()?;" << '\n'; // finish reading message from wire
 
   // return the value or an error
-  f_gen_ << indent() << "if received_field_count == 0 {" << endl;
+  f_gen_ << indent() << "if received_field_count == 0 {" << '\n';
   indent_up();
   render_thrift_error("Protocol", "ProtocolError", "ProtocolErrorKind::InvalidData",
                       "\"received empty union from remote " + union_name + "\"");
   indent_down();
-  f_gen_ << indent() << "} else if received_field_count > 1 {" << endl;
+  f_gen_ << indent() << "} else if received_field_count > 1 {" << '\n';
   indent_up();
   render_thrift_error("Protocol", "ProtocolError", "ProtocolErrorKind::InvalidData",
                       "\"received multiple fields for union from remote " + union_name + "\"");
   indent_down();
-  f_gen_ << indent() << "} else {" << endl;
+  f_gen_ << indent() << "} else {" << '\n';
   indent_up();
-  f_gen_ << indent() << "Ok(ret.expect(\"return value should have been constructed\"))" << endl;
+  f_gen_ << indent() << "Ok(ret.expect(\"return value should have been constructed\"))" << '\n';
   indent_down();
-  f_gen_ << indent() << "}" << endl;
+  f_gen_ << indent() << "}" << '\n';
 
   indent_down();
-  f_gen_ << indent() << "}" << endl;
+  f_gen_ << indent() << "}" << '\n';
 }
 
 // Construct the rust representation of all supported types from the wire.
@@ -1860,32 +1859,32 @@
       throw "cannot read field of type TYPE_VOID from input protocol";
     case t_base_type::TYPE_STRING:
       if (tbase_type->is_binary()) {
-        f_gen_ << indent() << "let " << type_var << " = i_prot.read_bytes()?;" << endl;
+        f_gen_ << indent() << "let " << type_var << " = i_prot.read_bytes()?;" << '\n';
       } else {
-        f_gen_ << indent() << "let " << type_var << " = i_prot.read_string()?;" << endl;
+        f_gen_ << indent() << "let " << type_var << " = i_prot.read_string()?;" << '\n';
       }
       return;
     case t_base_type::TYPE_UUID:
-      f_gen_ << indent() << "let " << type_var << " = i_prot.read_uuid()?;" << endl;
+      f_gen_ << indent() << "let " << type_var << " = i_prot.read_uuid()?;" << '\n';
       return;
     case t_base_type::TYPE_BOOL:
-      f_gen_ << indent() << "let " << type_var << " = i_prot.read_bool()?;" << endl;
+      f_gen_ << indent() << "let " << type_var << " = i_prot.read_bool()?;" << '\n';
       return;
     case t_base_type::TYPE_I8:
-      f_gen_ << indent() << "let " << type_var << " = i_prot.read_i8()?;" << endl;
+      f_gen_ << indent() << "let " << type_var << " = i_prot.read_i8()?;" << '\n';
       return;
     case t_base_type::TYPE_I16:
-      f_gen_ << indent() << "let " << type_var << " = i_prot.read_i16()?;" << endl;
+      f_gen_ << indent() << "let " << type_var << " = i_prot.read_i16()?;" << '\n';
       return;
     case t_base_type::TYPE_I32:
-      f_gen_ << indent() << "let " << type_var << " = i_prot.read_i32()?;" << endl;
+      f_gen_ << indent() << "let " << type_var << " = i_prot.read_i32()?;" << '\n';
       return;
     case t_base_type::TYPE_I64:
-      f_gen_ << indent() << "let " << type_var << " = i_prot.read_i64()?;" << endl;
+      f_gen_ << indent() << "let " << type_var << " = i_prot.read_i64()?;" << '\n';
       return;
     case t_base_type::TYPE_DOUBLE:
       f_gen_ << indent() << "let " << type_var << " = OrderedFloat::from(i_prot.read_double()?);"
-             << endl;
+             << '\n';
       return;
     default:
       throw "compiler error: unhandled type";
@@ -1905,7 +1904,7 @@
   } else if (ttype->is_enum() || ttype->is_struct() || ttype->is_xception()) {
     string read_call(to_rust_type(ttype) + "::read_from_in_protocol(i_prot)?");
     read_call = is_boxed ? "Box::new(" + read_call + ")" : read_call;
-    f_gen_ << indent() << "let " << type_var << " = " << read_call << ";" << endl;
+    f_gen_ << indent() << "let " << type_var << " = " << read_call << ";" << '\n';
     return;
   } else if (ttype->is_map()) {
     render_map_sync_read((t_map*)ttype, type_var);
@@ -1925,42 +1924,42 @@
 void t_rs_generator::render_list_sync_read(t_list* tlist, const string& list_var) {
   t_type* elem_type = tlist->get_elem_type();
 
-  f_gen_ << indent() << "let list_ident = i_prot.read_list_begin()?;" << endl;
+  f_gen_ << indent() << "let list_ident = i_prot.read_list_begin()?;" << '\n';
   f_gen_ << indent() << "let mut " << list_var << ": " << to_rust_type((t_type*)tlist)
-         << " = Vec::with_capacity(list_ident.size as usize);" << endl;
-  f_gen_ << indent() << "for _ in 0..list_ident.size {" << endl;
+         << " = Vec::with_capacity(list_ident.size as usize);" << '\n';
+  f_gen_ << indent() << "for _ in 0..list_ident.size {" << '\n';
 
   indent_up();
 
   string list_elem_var = tmp("list_elem_");
   render_type_sync_read(list_elem_var, elem_type);
-  f_gen_ << indent() << list_var << ".push(" << list_elem_var << ");" << endl;
+  f_gen_ << indent() << list_var << ".push(" << list_elem_var << ");" << '\n';
 
   indent_down();
 
-  f_gen_ << indent() << "}" << endl;
-  f_gen_ << indent() << "i_prot.read_list_end()?;" << endl;
+  f_gen_ << indent() << "}" << '\n';
+  f_gen_ << indent() << "i_prot.read_list_end()?;" << '\n';
 }
 
 // Construct the rust representation of a set from the wire.
 void t_rs_generator::render_set_sync_read(t_set* tset, const string& set_var) {
   t_type* elem_type = tset->get_elem_type();
 
-  f_gen_ << indent() << "let set_ident = i_prot.read_set_begin()?;" << endl;
+  f_gen_ << indent() << "let set_ident = i_prot.read_set_begin()?;" << '\n';
   f_gen_ << indent() << "let mut " << set_var << ": " << to_rust_type((t_type*)tset)
-         << " = BTreeSet::new();" << endl;
-  f_gen_ << indent() << "for _ in 0..set_ident.size {" << endl;
+         << " = BTreeSet::new();" << '\n';
+  f_gen_ << indent() << "for _ in 0..set_ident.size {" << '\n';
 
   indent_up();
 
   string set_elem_var = tmp("set_elem_");
   render_type_sync_read(set_elem_var, elem_type);
-  f_gen_ << indent() << set_var << ".insert(" << set_elem_var << ");" << endl;
+  f_gen_ << indent() << set_var << ".insert(" << set_elem_var << ");" << '\n';
 
   indent_down();
 
-  f_gen_ << indent() << "}" << endl;
-  f_gen_ << indent() << "i_prot.read_set_end()?;" << endl;
+  f_gen_ << indent() << "}" << '\n';
+  f_gen_ << indent() << "i_prot.read_set_end()?;" << '\n';
 }
 
 // Construct the rust representation of a map from the wire.
@@ -1968,10 +1967,10 @@
   t_type* key_type = tmap->get_key_type();
   t_type* val_type = tmap->get_val_type();
 
-  f_gen_ << indent() << "let map_ident = i_prot.read_map_begin()?;" << endl;
+  f_gen_ << indent() << "let map_ident = i_prot.read_map_begin()?;" << '\n';
   f_gen_ << indent() << "let mut " << map_var << ": " << to_rust_type((t_type*)tmap)
-         << " = BTreeMap::new();" << endl;
-  f_gen_ << indent() << "for _ in 0..map_ident.size {" << endl;
+         << " = BTreeMap::new();" << '\n';
+  f_gen_ << indent() << "for _ in 0..map_ident.size {" << '\n';
 
   indent_up();
 
@@ -1980,12 +1979,12 @@
   string val_elem_var = tmp("map_val_");
   render_type_sync_read(val_elem_var, val_type);
   f_gen_ << indent() << map_var << ".insert(" << key_elem_var << ", " << val_elem_var << ");"
-         << endl;
+         << '\n';
 
   indent_down();
 
-  f_gen_ << indent() << "}" << endl;
-  f_gen_ << indent() << "i_prot.read_map_end()?;" << endl;
+  f_gen_ << indent() << "}" << '\n';
+  f_gen_ << indent() << "i_prot.read_map_end()?;" << '\n';
 }
 
 string t_rs_generator::struct_field_read_temp_variable(t_field* tfield) {
@@ -2036,7 +2035,7 @@
   render_sync_client_definition_and_impl(client_impl_name);
   render_sync_client_tthriftclient_impl(client_impl_name);
   render_sync_client_marker_trait_impls(tservice, client_impl_name);
-  f_gen_ << endl;
+  f_gen_ << '\n';
   render_sync_client_process_impl(tservice);
 }
 
@@ -2048,7 +2047,7 @@
   }
 
   render_rustdoc((t_doc*)tservice);
-  f_gen_ << "pub trait " << rust_sync_client_trait_name(tservice) << extension << " {" << endl;
+  f_gen_ << "pub trait " << rust_sync_client_trait_name(tservice) << extension << " {" << '\n';
   indent_up();
 
   const std::vector<t_function*> functions = tservice->get_functions();
@@ -2060,25 +2059,25 @@
     string func_return = to_rust_type(tfunc->get_returntype());
     render_rustdoc((t_doc*)tfunc);
     f_gen_ << indent() << "fn " << func_name << func_args << " -> thrift::Result<" << func_return
-           << ">;" << endl;
+           << ">;" << '\n';
   }
 
   indent_down();
-  f_gen_ << indent() << "}" << endl;
-  f_gen_ << endl;
+  f_gen_ << indent() << "}" << '\n';
+  f_gen_ << '\n';
 }
 
 void t_rs_generator::render_sync_client_marker_trait(t_service* tservice) {
   f_gen_ << indent() << "pub trait " << rust_sync_client_marker_trait_name(tservice) << " {}"
-         << endl;
-  f_gen_ << endl;
+         << '\n';
+  f_gen_ << '\n';
 }
 
 void t_rs_generator::render_sync_client_marker_trait_impls(t_service* tservice,
                                                            const string& impl_struct_name) {
   f_gen_ << indent() << "impl " << SYNC_CLIENT_GENERIC_BOUND_VARS << " " << rust_namespace(tservice)
          << rust_sync_client_marker_trait_name(tservice) << " for " << impl_struct_name
-         << SYNC_CLIENT_GENERIC_BOUND_VARS << " " << SYNC_CLIENT_GENERIC_BOUNDS << " {}" << endl;
+         << SYNC_CLIENT_GENERIC_BOUND_VARS << " " << SYNC_CLIENT_GENERIC_BOUNDS << " {}" << '\n';
 
   t_service* extends = tservice->get_extends();
   if (extends) {
@@ -2090,64 +2089,64 @@
 
   // render the definition for the client struct
   f_gen_ << "pub struct " << client_impl_name << SYNC_CLIENT_GENERIC_BOUND_VARS << " "
-         << SYNC_CLIENT_GENERIC_BOUNDS << " {" << endl;
+         << SYNC_CLIENT_GENERIC_BOUNDS << " {" << '\n';
   indent_up();
-  f_gen_ << indent() << "_i_prot: IP," << endl;
-  f_gen_ << indent() << "_o_prot: OP," << endl;
-  f_gen_ << indent() << "_sequence_number: i32," << endl;
+  f_gen_ << indent() << "_i_prot: IP," << '\n';
+  f_gen_ << indent() << "_o_prot: OP," << '\n';
+  f_gen_ << indent() << "_sequence_number: i32," << '\n';
   indent_down();
-  f_gen_ << "}" << endl;
-  f_gen_ << endl;
+  f_gen_ << "}" << '\n';
+  f_gen_ << '\n';
 
   // render the struct implementation
   // this includes the new() function as well as the helper send/recv methods for each service call
   f_gen_ << "impl " << SYNC_CLIENT_GENERIC_BOUND_VARS << " " << client_impl_name
-         << SYNC_CLIENT_GENERIC_BOUND_VARS << " " << SYNC_CLIENT_GENERIC_BOUNDS << " {" << endl;
+         << SYNC_CLIENT_GENERIC_BOUND_VARS << " " << SYNC_CLIENT_GENERIC_BOUNDS << " {" << '\n';
   indent_up();
   render_sync_client_lifecycle_functions(client_impl_name);
   indent_down();
-  f_gen_ << "}" << endl;
-  f_gen_ << endl;
+  f_gen_ << "}" << '\n';
+  f_gen_ << '\n';
 }
 
 void t_rs_generator::render_sync_client_lifecycle_functions(const string& client_struct) {
   f_gen_ << indent() << "pub fn new(input_protocol: IP, output_protocol: OP) -> " << client_struct
-         << SYNC_CLIENT_GENERIC_BOUND_VARS << " {" << endl;
+         << SYNC_CLIENT_GENERIC_BOUND_VARS << " {" << '\n';
   indent_up();
 
   f_gen_ << indent() << client_struct
-         << " { _i_prot: input_protocol, _o_prot: output_protocol, _sequence_number: 0 }" << endl;
+         << " { _i_prot: input_protocol, _o_prot: output_protocol, _sequence_number: 0 }" << '\n';
 
   indent_down();
-  f_gen_ << indent() << "}" << endl;
+  f_gen_ << indent() << "}" << '\n';
 }
 
 void t_rs_generator::render_sync_client_tthriftclient_impl(const string& client_impl_name) {
   f_gen_ << indent() << "impl " << SYNC_CLIENT_GENERIC_BOUND_VARS << " TThriftClient for "
          << client_impl_name << SYNC_CLIENT_GENERIC_BOUND_VARS << " " << SYNC_CLIENT_GENERIC_BOUNDS
-         << " {" << endl;
+         << " {" << '\n';
   indent_up();
 
   f_gen_ << indent() << "fn i_prot_mut(&mut self) -> &mut dyn TInputProtocol { &mut self._i_prot }"
-         << endl;
+         << '\n';
   f_gen_ << indent() << "fn o_prot_mut(&mut self) -> &mut dyn TOutputProtocol { &mut self._o_prot }"
-         << endl;
-  f_gen_ << indent() << "fn sequence_number(&self) -> i32 { self._sequence_number }" << endl;
+         << '\n';
+  f_gen_ << indent() << "fn sequence_number(&self) -> i32 { self._sequence_number }" << '\n';
   f_gen_ << indent()
          << "fn increment_sequence_number(&mut self) -> i32 { self._sequence_number += 1; "
             "self._sequence_number }"
-         << endl;
+         << '\n';
 
   indent_down();
-  f_gen_ << indent() << "}" << endl;
-  f_gen_ << endl;
+  f_gen_ << indent() << "}" << '\n';
+  f_gen_ << '\n';
 }
 
 void t_rs_generator::render_sync_client_process_impl(t_service* tservice) {
   string marker_extension = "" + sync_client_marker_traits_for_extension(tservice);
 
   f_gen_ << "impl <C: TThriftClient + " << rust_sync_client_marker_trait_name(tservice)
-         << marker_extension << "> " << rust_sync_client_trait_name(tservice) << " for C {" << endl;
+         << marker_extension << "> " << rust_sync_client_trait_name(tservice) << " for C {" << '\n';
   indent_up();
 
   const std::vector<t_function*> functions = tservice->get_functions();
@@ -2158,8 +2157,8 @@
   }
 
   indent_down();
-  f_gen_ << "}" << endl;
-  f_gen_ << endl;
+  f_gen_ << "}" << '\n';
+  f_gen_ << '\n';
 }
 
 string t_rs_generator::sync_client_marker_traits_for_extension(t_service* tservice) {
@@ -2182,35 +2181,35 @@
   string func_return = to_rust_type(tfunc->get_returntype());
 
   f_gen_ << indent() << "fn " << func_name << func_decl_args << " -> thrift::Result<" << func_return
-         << "> {" << endl;
+         << "> {" << '\n';
   indent_up();
 
-  f_gen_ << indent() << "(" << endl;
+  f_gen_ << indent() << "(" << '\n';
   indent_up();
   render_sync_send(tfunc);
   indent_down();
-  f_gen_ << indent() << ")?;" << endl;
+  f_gen_ << indent() << ")?;" << '\n';
   if (tfunc->is_oneway()) {
-    f_gen_ << indent() << "Ok(())" << endl;
+    f_gen_ << indent() << "Ok(())" << '\n';
   } else {
     render_sync_recv(tfunc);
   }
 
   indent_down();
-  f_gen_ << indent() << "}" << endl;
+  f_gen_ << indent() << "}" << '\n';
 }
 
 void t_rs_generator::render_sync_send(t_function* tfunc) {
-  f_gen_ << indent() << "{" << endl;
+  f_gen_ << indent() << "{" << '\n';
   indent_up();
 
   // increment the sequence number and generate the call header
   string message_type = tfunc->is_oneway() ? "TMessageType::OneWay" : "TMessageType::Call";
-  f_gen_ << indent() << "self.increment_sequence_number();" << endl;
+  f_gen_ << indent() << "self.increment_sequence_number();" << '\n';
   f_gen_ << indent() << "let message_ident = "
          << "TMessageIdentifier::new(\"" << tfunc->get_name() << "\", " // note: use *original* name
          << message_type << ", "
-         << "self.sequence_number());" << endl;
+         << "self.sequence_number());" << '\n';
   // pack the arguments into the containing struct that we'll write out over the wire
   // note that this struct is generated even if we have 0 args
   ostringstream struct_definition;
@@ -2226,50 +2225,50 @@
     struct_fields = struct_fields.substr(0, struct_fields.size() - 2); // strip trailing comma
   }
   f_gen_ << indent() << "let call_args = " << service_call_args_struct_name(tfunc) << " { "
-         << struct_fields << " };" << endl;
+         << struct_fields << " };" << '\n';
   // write everything over the wire
-  f_gen_ << indent() << "self.o_prot_mut().write_message_begin(&message_ident)?;" << endl;
+  f_gen_ << indent() << "self.o_prot_mut().write_message_begin(&message_ident)?;" << '\n';
   f_gen_ << indent() << "call_args.write_to_out_protocol(self.o_prot_mut())?;"
-         << endl; // written even if we have 0 args
-  f_gen_ << indent() << "self.o_prot_mut().write_message_end()?;" << endl;
-  f_gen_ << indent() << "self.o_prot_mut().flush()" << endl;
+         << '\n'; // written even if we have 0 args
+  f_gen_ << indent() << "self.o_prot_mut().write_message_end()?;" << '\n';
+  f_gen_ << indent() << "self.o_prot_mut().flush()" << '\n';
 
   indent_down();
-  f_gen_ << indent() << "}" << endl;
+  f_gen_ << indent() << "}" << '\n';
 }
 
 void t_rs_generator::render_sync_recv(t_function* tfunc) {
-  f_gen_ << indent() << "{" << endl;
+  f_gen_ << indent() << "{" << '\n';
   indent_up();
 
-  f_gen_ << indent() << "let message_ident = self.i_prot_mut().read_message_begin()?;" << endl;
+  f_gen_ << indent() << "let message_ident = self.i_prot_mut().read_message_begin()?;" << '\n';
   f_gen_
       << indent()
       << "verify_expected_sequence_number(self.sequence_number(), message_ident.sequence_number)?;"
-      << endl;
+      << '\n';
   f_gen_ << indent() << "verify_expected_service_call(\"" << tfunc->get_name()
-         << "\", &message_ident.name)?;" << endl; // note: use *original* name
+         << "\", &message_ident.name)?;" << '\n'; // note: use *original* name
   // FIXME: replace with a "try" block
-  f_gen_ << indent() << "if message_ident.message_type == TMessageType::Exception {" << endl;
+  f_gen_ << indent() << "if message_ident.message_type == TMessageType::Exception {" << '\n';
   indent_up();
   f_gen_ << indent()
          << "let remote_error = "
             "thrift::Error::read_application_error_from_in_protocol(self.i_prot_mut())?;"
-         << endl;
-  f_gen_ << indent() << "self.i_prot_mut().read_message_end()?;" << endl;
-  f_gen_ << indent() << "return Err(thrift::Error::Application(remote_error))" << endl;
+         << '\n';
+  f_gen_ << indent() << "self.i_prot_mut().read_message_end()?;" << '\n';
+  f_gen_ << indent() << "return Err(thrift::Error::Application(remote_error))" << '\n';
   indent_down();
-  f_gen_ << indent() << "}" << endl;
+  f_gen_ << indent() << "}" << '\n';
   f_gen_ << indent()
          << "verify_expected_message_type(TMessageType::Reply, message_ident.message_type)?;"
-         << endl;
+         << '\n';
   f_gen_ << indent() << "let result = " << service_call_result_struct_name(tfunc)
-         << "::read_from_in_protocol(self.i_prot_mut())?;" << endl;
-  f_gen_ << indent() << "self.i_prot_mut().read_message_end()?;" << endl;
-  f_gen_ << indent() << "result.ok_or()" << endl;
+         << "::read_from_in_protocol(self.i_prot_mut())?;" << '\n';
+  f_gen_ << indent() << "self.i_prot_mut().read_message_end()?;" << '\n';
+  f_gen_ << indent() << "result.ok_or()" << '\n';
 
   indent_down();
-  f_gen_ << indent() << "}" << endl;
+  f_gen_ << indent() << "}" << '\n';
 }
 
 string t_rs_generator::rust_sync_service_call_declaration(t_function* tfunc, bool self_is_mutable) {
@@ -2400,7 +2399,7 @@
   std::vector<t_function*>::const_iterator func_iter;
 
   render_rustdoc((t_doc*)tservice);
-  f_gen_ << "pub trait " << rust_sync_handler_trait_name(tservice) << extension << " {" << endl;
+  f_gen_ << "pub trait " << rust_sync_handler_trait_name(tservice) << extension << " {" << '\n';
   indent_up();
   for (func_iter = functions.begin(); func_iter != functions.end(); ++func_iter) {
     t_function* tfunc = (*func_iter);
@@ -2409,11 +2408,11 @@
     string func_return = to_rust_type(tfunc->get_returntype());
     render_rustdoc((t_doc*)tfunc);
     f_gen_ << indent() << "fn " << func_name << func_args << " -> thrift::Result<" << func_return
-           << ">;" << endl;
+           << ">;" << '\n';
   }
   indent_down();
-  f_gen_ << indent() << "}" << endl;
-  f_gen_ << endl;
+  f_gen_ << indent() << "}" << '\n';
+  f_gen_ << '\n';
 }
 
 void t_rs_generator::render_sync_processor_definition_and_impl(t_service* tservice) {
@@ -2422,36 +2421,36 @@
 
   // struct
   f_gen_ << indent() << "pub struct " << service_processor_name << "<H: " << handler_trait_name
-         << "> {" << endl;
+         << "> {" << '\n';
   indent_up();
-  f_gen_ << indent() << "handler: H," << endl;
+  f_gen_ << indent() << "handler: H," << '\n';
   indent_down();
-  f_gen_ << indent() << "}" << endl;
-  f_gen_ << endl;
+  f_gen_ << indent() << "}" << '\n';
+  f_gen_ << '\n';
 
   // delegating impl
   f_gen_ << indent() << "impl <H: " << handler_trait_name << "> " << service_processor_name
-         << "<H> {" << endl;
+         << "<H> {" << '\n';
   indent_up();
-  f_gen_ << indent() << "pub fn new(handler: H) -> " << service_processor_name << "<H> {" << endl;
+  f_gen_ << indent() << "pub fn new(handler: H) -> " << service_processor_name << "<H> {" << '\n';
   indent_up();
-  f_gen_ << indent() << service_processor_name << " {" << endl;
+  f_gen_ << indent() << service_processor_name << " {" << '\n';
   indent_up();
-  f_gen_ << indent() << "handler," << endl;
+  f_gen_ << indent() << "handler," << '\n';
   indent_down();
-  f_gen_ << indent() << "}" << endl;
+  f_gen_ << indent() << "}" << '\n';
   indent_down();
-  f_gen_ << indent() << "}" << endl;
+  f_gen_ << indent() << "}" << '\n';
   render_sync_process_delegation_functions(tservice);
   indent_down();
-  f_gen_ << indent() << "}" << endl;
-  f_gen_ << endl;
+  f_gen_ << indent() << "}" << '\n';
+  f_gen_ << '\n';
 
   // actual impl
   string service_actual_processor_name = rust_sync_processor_impl_name(tservice);
-  f_gen_ << indent() << "pub struct " << service_actual_processor_name << ";" << endl;
-  f_gen_ << endl;
-  f_gen_ << indent() << "impl " << service_actual_processor_name << " {" << endl;
+  f_gen_ << indent() << "pub struct " << service_actual_processor_name << ";" << '\n';
+  f_gen_ << '\n';
+  f_gen_ << indent() << "impl " << service_actual_processor_name << " {" << '\n';
   indent_up();
 
   vector<t_function*> functions = tservice->get_functions();
@@ -2462,44 +2461,44 @@
   }
 
   indent_down();
-  f_gen_ << indent() << "}" << endl;
-  f_gen_ << endl;
+  f_gen_ << indent() << "}" << '\n';
+  f_gen_ << '\n';
 
   // processor impl
   f_gen_ << indent() << "impl <H: " << handler_trait_name << "> TProcessor for "
-         << service_processor_name << "<H> {" << endl;
+         << service_processor_name << "<H> {" << '\n';
   indent_up();
 
   f_gen_ << indent()
          << "fn process(&self, i_prot: &mut dyn TInputProtocol, o_prot: &mut dyn TOutputProtocol) "
             "-> thrift::Result<()> {"
-         << endl;
+         << '\n';
   indent_up();
 
-  f_gen_ << indent() << "let message_ident = i_prot.read_message_begin()?;" << endl;
+  f_gen_ << indent() << "let message_ident = i_prot.read_message_begin()?;" << '\n';
 
   f_gen_ << indent() << "let res = match &*message_ident.name {"
-         << endl; // [sigh] explicit deref coercion
+         << '\n'; // [sigh] explicit deref coercion
   indent_up();
   render_process_match_statements(tservice);
-  f_gen_ << indent() << "method => {" << endl;
+  f_gen_ << indent() << "method => {" << '\n';
   indent_up();
   render_thrift_error("Application", "ApplicationError", "ApplicationErrorKind::UnknownMethod",
                       "format!(\"unknown method {}\", method)");
   indent_down();
-  f_gen_ << indent() << "}," << endl;
+  f_gen_ << indent() << "}," << '\n';
 
   indent_down();
-  f_gen_ << indent() << "};" << endl;
+  f_gen_ << indent() << "};" << '\n';
   f_gen_ << indent() << "thrift::server::handle_process_result(&message_ident, res, o_prot)"
-         << endl;
+         << '\n';
 
   indent_down();
-  f_gen_ << indent() << "}" << endl;
+  f_gen_ << indent() << "}" << '\n';
 
   indent_down();
-  f_gen_ << indent() << "}" << endl;
-  f_gen_ << endl;
+  f_gen_ << indent() << "}" << '\n';
+  f_gen_ << '\n';
 }
 
 void t_rs_generator::render_sync_process_delegation_functions(t_service* tservice) {
@@ -2514,7 +2513,7 @@
            << "incoming_sequence_number: i32, "
            << "i_prot: &mut dyn TInputProtocol, "
            << "o_prot: &mut dyn TOutputProtocol) "
-           << "-> thrift::Result<()> {" << endl;
+           << "-> thrift::Result<()> {" << '\n';
     indent_up();
 
     f_gen_ << indent() << actual_processor << "::" << function_name << "("
@@ -2522,10 +2521,10 @@
            << "incoming_sequence_number, "
            << "i_prot, "
            << "o_prot"
-           << ")" << endl;
+           << ")" << '\n';
 
     indent_down();
-    f_gen_ << indent() << "}" << endl;
+    f_gen_ << indent() << "}" << '\n';
   }
 
   t_service* extends = tservice->get_extends();
@@ -2540,12 +2539,12 @@
   for (func_iter = functions.begin(); func_iter != functions.end(); ++func_iter) {
     t_function* tfunc = (*func_iter);
     f_gen_ << indent() << "\"" << tfunc->get_name() << "\""
-           << " => {" << endl; // note: use *original* name
+           << " => {" << '\n'; // note: use *original* name
     indent_up();
     f_gen_ << indent() << "self.process_" << rust_snake_case(tfunc->get_name())
-           << "(message_ident.sequence_number, i_prot, o_prot)" << endl;
+           << "(message_ident.sequence_number, i_prot, o_prot)" << '\n';
     indent_down();
-    f_gen_ << indent() << "}," << endl;
+    f_gen_ << indent() << "}," << '\n';
   }
 
   t_service* extends = tservice->get_extends();
@@ -2568,90 +2567,90 @@
          << "(handler: &H, " << sequence_number_param << ": i32, "
          << "i_prot: &mut dyn TInputProtocol, " << output_protocol_param
          << ": &mut dyn TOutputProtocol) "
-         << "-> thrift::Result<()> {" << endl;
+         << "-> thrift::Result<()> {" << '\n';
 
   indent_up();
 
   // *always* read arguments from the input protocol
   f_gen_ << indent() << "let " << (has_non_void_args(tfunc) ? "args" : "_") << " = "
-         << service_call_args_struct_name(tfunc) << "::read_from_in_protocol(i_prot)?;" << endl;
+         << service_call_args_struct_name(tfunc) << "::read_from_in_protocol(i_prot)?;" << '\n';
 
   f_gen_ << indent() << "match handler." << service_call_handler_function_name(tfunc)
-         << rust_sync_service_call_invocation(tfunc, "args.") << " {" << endl; // start match
+         << rust_sync_service_call_invocation(tfunc, "args.") << " {" << '\n'; // start match
   indent_up();
 
   // handler succeeded
   string handler_return_variable
       = tfunc->is_oneway() || tfunc->get_returntype()->is_void() ? "_" : "handler_return";
-  f_gen_ << indent() << "Ok(" << handler_return_variable << ") => {" << endl;
+  f_gen_ << indent() << "Ok(" << handler_return_variable << ") => {" << '\n';
   indent_up();
   render_sync_handler_succeeded(tfunc);
   indent_down();
-  f_gen_ << indent() << "}," << endl;
+  f_gen_ << indent() << "}," << '\n';
   // handler failed
-  f_gen_ << indent() << "Err(e) => {" << endl;
+  f_gen_ << indent() << "Err(e) => {" << '\n';
   indent_up();
   render_sync_handler_failed(tfunc);
   indent_down();
-  f_gen_ << indent() << "}," << endl;
+  f_gen_ << indent() << "}," << '\n';
 
   indent_down();
-  f_gen_ << indent() << "}" << endl; // end match
+  f_gen_ << indent() << "}" << '\n'; // end match
 
   indent_down();
-  f_gen_ << indent() << "}" << endl; // end function
+  f_gen_ << indent() << "}" << '\n'; // end function
 }
 
 void t_rs_generator::render_sync_handler_succeeded(t_function* tfunc) {
   if (tfunc->is_oneway()) {
-    f_gen_ << indent() << "Ok(())" << endl;
+    f_gen_ << indent() << "Ok(())" << '\n';
   } else {
     f_gen_ << indent() << "let message_ident = TMessageIdentifier::new("
            << "\"" << tfunc->get_name() << "\", " // note: use *original* name
            << "TMessageType::Reply, "
-           << "incoming_sequence_number);" << endl;
-    f_gen_ << indent() << "o_prot.write_message_begin(&message_ident)?;" << endl;
-    f_gen_ << indent() << "let ret = " << handler_successful_return_struct(tfunc) << ";" << endl;
-    f_gen_ << indent() << "ret.write_to_out_protocol(o_prot)?;" << endl;
-    f_gen_ << indent() << "o_prot.write_message_end()?;" << endl;
-    f_gen_ << indent() << "o_prot.flush()" << endl;
+           << "incoming_sequence_number);" << '\n';
+    f_gen_ << indent() << "o_prot.write_message_begin(&message_ident)?;" << '\n';
+    f_gen_ << indent() << "let ret = " << handler_successful_return_struct(tfunc) << ";" << '\n';
+    f_gen_ << indent() << "ret.write_to_out_protocol(o_prot)?;" << '\n';
+    f_gen_ << indent() << "o_prot.write_message_end()?;" << '\n';
+    f_gen_ << indent() << "o_prot.flush()" << '\n';
   }
 }
 
 void t_rs_generator::render_sync_handler_failed(t_function* tfunc) {
   string err_var("e");
 
-  f_gen_ << indent() << "match " << err_var << " {" << endl;
+  f_gen_ << indent() << "match " << err_var << " {" << '\n';
   indent_up();
 
   // if there are any user-defined exceptions for this service call handle them first
   if (tfunc->get_xceptions() != nullptr
       && tfunc->get_xceptions()->get_sorted_members().size() > 0) {
     string user_err_var("usr_err");
-    f_gen_ << indent() << "thrift::Error::User(" << user_err_var << ") => {" << endl;
+    f_gen_ << indent() << "thrift::Error::User(" << user_err_var << ") => {" << '\n';
     indent_up();
     render_sync_handler_failed_user_exception_branch(tfunc);
     indent_down();
-    f_gen_ << indent() << "}," << endl;
+    f_gen_ << indent() << "}," << '\n';
   }
 
   // application error
   string app_err_var("app_err");
-  f_gen_ << indent() << "thrift::Error::Application(" << app_err_var << ") => {" << endl;
+  f_gen_ << indent() << "thrift::Error::Application(" << app_err_var << ") => {" << '\n';
   indent_up();
   render_sync_handler_failed_application_exception_branch(tfunc, app_err_var);
   indent_down();
-  f_gen_ << indent() << "}," << endl;
+  f_gen_ << indent() << "}," << '\n';
 
   // default case
-  f_gen_ << indent() << "_ => {" << endl;
+  f_gen_ << indent() << "_ => {" << '\n';
   indent_up();
   render_sync_handler_failed_default_exception_branch(tfunc);
   indent_down();
-  f_gen_ << indent() << "}," << endl;
+  f_gen_ << indent() << "}," << '\n';
 
   indent_down();
-  f_gen_ << indent() << "}" << endl;
+  f_gen_ << indent() << "}" << '\n';
 }
 
 void t_rs_generator::render_sync_handler_failed_user_exception_branch(t_function* tfunc) {
@@ -2670,11 +2669,11 @@
     string if_statement(branches_rendered == 0 ? "if usr_err" : "} else if usr_err");
     string exception_type(to_rust_type(xception_field->get_type()));
     f_gen_ << indent() << if_statement << ".downcast_ref::<" << exception_type << ">().is_some() {"
-           << endl;
+           << '\n';
     indent_up();
 
     f_gen_ << indent() << "let err = usr_err.downcast::<" << exception_type
-           << ">().expect(\"downcast already checked\");" << endl;
+           << ">().expect(\"downcast already checked\");" << '\n';
 
     // render the members of the return struct
     ostringstream members;
@@ -2701,17 +2700,17 @@
 
     // now write out the return struct
     f_gen_ << indent() << "let ret_err = " << service_call_result_struct_name(tfunc) << "{ "
-           << member_string << "};" << endl;
+           << member_string << "};" << '\n';
 
     f_gen_ << indent() << "let message_ident = "
            << "TMessageIdentifier::new("
            << "\"" << tfunc->get_name() << "\", " // note: use *original* name
            << "TMessageType::Reply, "
-           << "incoming_sequence_number);" << endl;
-    f_gen_ << indent() << "o_prot.write_message_begin(&message_ident)?;" << endl;
-    f_gen_ << indent() << "ret_err.write_to_out_protocol(o_prot)?;" << endl;
-    f_gen_ << indent() << "o_prot.write_message_end()?;" << endl;
-    f_gen_ << indent() << "o_prot.flush()" << endl;
+           << "incoming_sequence_number);" << '\n';
+    f_gen_ << indent() << "o_prot.write_message_begin(&message_ident)?;" << '\n';
+    f_gen_ << indent() << "ret_err.write_to_out_protocol(o_prot)?;" << '\n';
+    f_gen_ << indent() << "o_prot.write_message_end()?;" << '\n';
+    f_gen_ << indent() << "o_prot.flush()" << '\n';
 
     indent_down();
 
@@ -2719,41 +2718,41 @@
   }
 
   // the catch all, if somehow it was a user exception that we don't support
-  f_gen_ << indent() << "} else {" << endl;
+  f_gen_ << indent() << "} else {" << '\n';
   indent_up();
 
   // FIXME: same as default block below
 
-  f_gen_ << indent() << "let ret_err = {" << endl;
+  f_gen_ << indent() << "let ret_err = {" << '\n';
   indent_up();
   render_thrift_error_struct("ApplicationError", "ApplicationErrorKind::Unknown",
                              "usr_err.to_string()");
   indent_down();
-  f_gen_ << indent() << "};" << endl;
+  f_gen_ << indent() << "};" << '\n';
   render_sync_handler_send_exception_response(tfunc, "ret_err");
 
   indent_down();
-  f_gen_ << indent() << "}" << endl;
+  f_gen_ << indent() << "}" << '\n';
 }
 
 void t_rs_generator::render_sync_handler_failed_application_exception_branch(
     t_function* tfunc,
     const string& app_err_var) {
   if (tfunc->is_oneway()) {
-    f_gen_ << indent() << "Err(thrift::Error::Application(" << app_err_var << "))" << endl;
+    f_gen_ << indent() << "Err(thrift::Error::Application(" << app_err_var << "))" << '\n';
   } else {
     render_sync_handler_send_exception_response(tfunc, app_err_var);
   }
 }
 
 void t_rs_generator::render_sync_handler_failed_default_exception_branch(t_function* tfunc) {
-  f_gen_ << indent() << "let ret_err = {" << endl;
+  f_gen_ << indent() << "let ret_err = {" << '\n';
   indent_up();
   render_thrift_error_struct("ApplicationError", "ApplicationErrorKind::Unknown", "e.to_string()");
   indent_down();
-  f_gen_ << indent() << "};" << endl;
+  f_gen_ << indent() << "};" << '\n';
   if (tfunc->is_oneway()) {
-    f_gen_ << indent() << "Err(thrift::Error::Application(ret_err))" << endl;
+    f_gen_ << indent() << "Err(thrift::Error::Application(ret_err))" << '\n';
   } else {
     render_sync_handler_send_exception_response(tfunc, "ret_err");
   }
@@ -2764,12 +2763,12 @@
   f_gen_ << indent() << "let message_ident = TMessageIdentifier::new("
          << "\"" << tfunc->get_name() << "\", " // note: use *original* name
          << "TMessageType::Exception, "
-         << "incoming_sequence_number);" << endl;
-  f_gen_ << indent() << "o_prot.write_message_begin(&message_ident)?;" << endl;
+         << "incoming_sequence_number);" << '\n';
+  f_gen_ << indent() << "o_prot.write_message_begin(&message_ident)?;" << '\n';
   f_gen_ << indent() << "thrift::Error::write_application_error_to_out_protocol(&" << err_var
-         << ", o_prot)?;" << endl;
-  f_gen_ << indent() << "o_prot.write_message_end()?;" << endl;
-  f_gen_ << indent() << "o_prot.flush()" << endl;
+         << ", o_prot)?;" << '\n';
+  f_gen_ << indent() << "o_prot.write_message_end()?;" << '\n';
+  f_gen_ << indent() << "o_prot.flush()" << '\n';
 }
 
 string t_rs_generator::handler_successful_return_struct(t_function* tfunc) {
@@ -2811,10 +2810,10 @@
 //-----------------------------------------------------------------------------
 
 void t_rs_generator::render_type_comment(const string& type_name) {
-  f_gen_ << "//" << endl;
-  f_gen_ << "// " << type_name << endl;
-  f_gen_ << "//" << endl;
-  f_gen_ << endl;
+  f_gen_ << "//" << '\n';
+  f_gen_ << "// " << type_name << '\n';
+  f_gen_ << "//" << '\n';
+  f_gen_ << '\n';
 }
 
 // NOTE: do *not* put in an extra newline after doc is generated.
@@ -2831,26 +2830,26 @@
                                          const string& error_struct,
                                          const string& sub_error_kind,
                                          const string& error_message) {
-  f_gen_ << indent() << "Err(" << endl;
+  f_gen_ << indent() << "Err(" << '\n';
   indent_up();
-  f_gen_ << indent() << "thrift::Error::" << error_kind << "(" << endl;
+  f_gen_ << indent() << "thrift::Error::" << error_kind << "(" << '\n';
   indent_up();
   render_thrift_error_struct(error_struct, sub_error_kind, error_message);
   indent_down();
-  f_gen_ << indent() << ")" << endl;
+  f_gen_ << indent() << ")" << '\n';
   indent_down();
-  f_gen_ << indent() << ")" << endl;
+  f_gen_ << indent() << ")" << '\n';
 }
 
 void t_rs_generator::render_thrift_error_struct(const string& error_struct,
                                                 const string& sub_error_kind,
                                                 const string& error_message) {
-  f_gen_ << indent() << error_struct << "::new(" << endl;
+  f_gen_ << indent() << error_struct << "::new(" << '\n';
   indent_up();
-  f_gen_ << indent() << sub_error_kind << "," << endl;
-  f_gen_ << indent() << error_message << endl;
+  f_gen_ << indent() << sub_error_kind << "," << '\n';
+  f_gen_ << indent() << error_message << '\n';
   indent_down();
-  f_gen_ << indent() << ")" << endl;
+  f_gen_ << indent() << ")" << '\n';
 }
 
 bool t_rs_generator::is_double(t_type* ttype) {
diff --git a/compiler/cpp/src/thrift/generate/t_st_generator.cc b/compiler/cpp/src/thrift/generate/t_st_generator.cc
index b141186..c1ad355 100644
--- a/compiler/cpp/src/thrift/generate/t_st_generator.cc
+++ b/compiler/cpp/src/thrift/generate/t_st_generator.cc
@@ -43,8 +43,6 @@
 using std::stringstream;
 using std::vector;
 
-static const string endl = "\n"; // avoid ostream << std::endl flushes
-
 /**
  * Smalltalk code generator.
  *
@@ -177,7 +175,7 @@
   f_.open(f_name.c_str());
 
   // Print header
-  f_ << st_autogen_comment() << endl;
+  f_ << st_autogen_comment() << '\n';
 
   st_class_def(f_, program_name_);
   generate_class_side_definition();
@@ -219,10 +217,10 @@
 
 void t_st_generator::generate_force_consts() {
   f_ << prefix(class_name()) << " enums keysAndValuesDo: [:k :v | " << prefix(class_name())
-     << " enums at: k put: v value].!" << endl;
+     << " enums at: k put: v value].!" << '\n';
 
   f_ << prefix(class_name()) << " constants keysAndValuesDo: [:k :v | " << prefix(class_name())
-     << " constants at: k put: v value].!" << endl;
+     << " constants at: k put: v value].!" << '\n';
 }
 
 void t_st_generator::close_generator() {
@@ -252,11 +250,11 @@
 }
 
 void t_st_generator::st_class_def(std::ostream& out, string name) {
-  out << "Object subclass: #" << prefix(name) << endl;
+  out << "Object subclass: #" << prefix(name) << '\n';
   indent_up();
-  out << indent() << "instanceVariableNames: ''" << endl << indent() << "classVariableNames: ''"
-      << endl << indent() << "poolDictionaries: ''" << endl << indent() << "category: '"
-      << generated_category() << "'!" << endl << endl;
+  out << indent() << "instanceVariableNames: ''" << '\n' << indent() << "classVariableNames: ''"
+      << '\n' << indent() << "poolDictionaries: ''" << '\n' << indent() << "category: '"
+      << generated_category() << "'!" << '\n' << '\n';
 }
 
 void t_st_generator::st_method(std::ostream& out, string cls, string name) {
@@ -281,14 +279,14 @@
   strftime(timestr, 50, "%m/%d/%Y %H:%M", tinfo);
 
   out << "!" << prefix(cls) << " methodsFor: '" + category + "' stamp: 'thrift " << timestr
-      << "'!\n" << name << endl;
+      << "'!\n" << name << '\n';
 
   indent_up();
   out << indent();
 }
 
 void t_st_generator::st_close_method(std::ostream& out) {
-  out << "! !" << endl << endl;
+  out << "! !" << '\n' << '\n';
   indent_down();
 }
 
@@ -316,16 +314,16 @@
 }
 
 void t_st_generator::generate_class_side_definition() {
-  f_ << prefix(class_name()) << " class" << endl << "\tinstanceVariableNames: 'constants enums'!"
-     << endl << endl;
+  f_ << prefix(class_name()) << " class" << '\n' << "\tinstanceVariableNames: 'constants enums'!"
+     << '\n' << '\n';
 
   st_accessors(f_, class_name() + " class", "enums");
   st_accessors(f_, class_name() + " class", "constants");
 
-  f_ << prefix(class_name()) << " enums: Dictionary new!" << endl;
-  f_ << prefix(class_name()) << " constants: Dictionary new!" << endl;
+  f_ << prefix(class_name()) << " enums: Dictionary new!" << '\n';
+  f_ << prefix(class_name()) << " constants: Dictionary new!" << '\n';
 
-  f_ << endl;
+  f_ << '\n';
 }
 
 /**
@@ -338,16 +336,16 @@
   string cls_name = program_name_ + capitalize(tenum->get_name());
 
   f_ << prefix(class_name()) << " enums at: '" << tenum->get_name() << "' put: ["
-     << "(Dictionary new " << endl;
+     << "(Dictionary new " << '\n';
 
   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) {
     int value = (*c_iter)->get_value();
-    f_ << "\tat: '" << (*c_iter)->get_name() << "' put: " << value << ";" << endl;
+    f_ << "\tat: '" << (*c_iter)->get_name() << "' put: " << value << ";" << '\n';
   }
 
-  f_ << "\tyourself)]!" << endl << endl;
+  f_ << "\tyourself)]!" << '\n' << '\n';
 }
 
 /**
@@ -359,7 +357,7 @@
   t_const_value* value = tconst->get_value();
 
   f_ << prefix(class_name()) << " constants at: '" << name << "' put: ["
-     << render_const_value(type, value) << "]!" << endl << endl;
+     << render_const_value(type, value) << "]!" << '\n' << '\n';
 }
 
 /**
@@ -398,7 +396,7 @@
   } else if (type->is_enum()) {
     indent(out) << value->get_integer();
   } else if (type->is_struct() || type->is_xception()) {
-    out << "(" << capitalize(type->get_name()) << " new " << endl;
+    out << "(" << capitalize(type->get_name()) << " new " << '\n';
     indent_up();
 
     const vector<t_field*>& fields = ((t_struct*)type)->get_members();
@@ -418,7 +416,7 @@
       }
 
       out << indent() << v_iter->first->get_string() << ": "
-          << render_const_value(field_type, v_iter->second) << ";" << endl;
+          << render_const_value(field_type, v_iter->second) << ";" << '\n';
     }
     out << indent() << "yourself)";
 
@@ -426,7 +424,7 @@
   } else if (type->is_map()) {
     t_type* ktype = ((t_map*)type)->get_key_type();
     t_type* vtype = ((t_map*)type)->get_val_type();
-    out << "(Dictionary new" << endl;
+    out << "(Dictionary new" << '\n';
     indent_up();
     indent_up();
     const map<t_const_value*, t_const_value*, t_const_value::value_compare>& val = value->get_map();
@@ -436,7 +434,7 @@
       out << "at: " << render_const_value(ktype, v_iter->first);
       out << " put: ";
       out << render_const_value(vtype, v_iter->second);
-      out << ";" << endl;
+      out << ";" << '\n';
     }
     out << indent() << indent() << "yourself)";
     indent_down();
@@ -449,9 +447,9 @@
       etype = ((t_set*)type)->get_elem_type();
     }
     if (type->is_set()) {
-      out << "(Set new" << endl;
+      out << "(Set new" << '\n';
     } else {
-      out << "(OrderedCollection new" << endl;
+      out << "(OrderedCollection new" << '\n';
     }
     indent_up();
     indent_up();
@@ -460,7 +458,7 @@
     for (v_iter = val.begin(); v_iter != val.end(); ++v_iter) {
       out << indent() << indent();
       out << "add: " << render_const_value(etype, *v_iter);
-      out << ";" << endl;
+      out << ";" << '\n';
     }
     out << indent() << indent() << "yourself)";
     indent_down();
@@ -502,7 +500,7 @@
   else
     out << "Object";
 
-  out << " subclass: #" << prefix(type_name(tstruct)) << endl << "\tinstanceVariableNames: '";
+  out << " subclass: #" << prefix(type_name(tstruct)) << '\n' << "\tinstanceVariableNames: '";
 
   if (members.size() > 0) {
     for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
@@ -556,7 +554,7 @@
                    camelcase((*m_iter)->get_name()),
                    a_type((*m_iter)->get_type()));
     }
-    out << endl;
+    out << '\n';
   }
 }
 
@@ -583,17 +581,17 @@
 
   out << "[oprot writeMapBegin: (TMap new keyType: " << type_to_enum(tmap->get_key_type())
       << "; valueType: " << type_to_enum(tmap->get_val_type()) << "; size: " << fname << " size)."
-      << endl;
+      << '\n';
   indent_up();
 
-  out << indent() << fname << " keysAndValuesDo: [:" << key << " :" << val << " |" << endl;
+  out << indent() << fname << " keysAndValuesDo: [:" << key << " :" << val << " |" << '\n';
   indent_up();
 
-  out << indent() << write_val(tmap->get_key_type(), key) << "." << endl << indent()
+  out << indent() << write_val(tmap->get_key_type(), key) << "." << '\n' << indent()
       << write_val(tmap->get_val_type(), val);
   indent_down();
 
-  out << "]." << endl << indent() << "oprot writeMapEnd] value";
+  out << "]." << '\n' << indent() << "oprot writeMapEnd] value";
   indent_down();
 
   return out.str();
@@ -604,18 +602,18 @@
   string desc = temp_name();
   string val = temp_name();
 
-  out << "[|" << desc << " " << val << "| " << endl;
+  out << "[|" << desc << " " << val << "| " << '\n';
   indent_up();
 
-  out << indent() << desc << " := iprot readMapBegin." << endl << indent() << val
-      << " := Dictionary new." << endl << indent() << desc << " size timesRepeat: [" << endl;
+  out << indent() << desc << " := iprot readMapBegin." << '\n' << indent() << val
+      << " := Dictionary new." << '\n' << indent() << desc << " size timesRepeat: [" << '\n';
 
   indent_up();
   out << indent() << val << " at: " << read_val(tmap->get_key_type())
       << " put: " << read_val(tmap->get_val_type());
   indent_down();
 
-  out << "]." << endl << indent() << "iprot readMapEnd." << endl << indent() << val << "] value";
+  out << "]." << '\n' << indent() << "iprot readMapEnd." << '\n' << indent() << val << "] value";
   indent_down();
 
   return out.str();
@@ -626,16 +624,16 @@
   string val = temp_name();
 
   out << "[oprot writeListBegin: (TList new elemType: " << type_to_enum(tlist->get_elem_type())
-      << "; size: " << fname << " size)." << endl;
+      << "; size: " << fname << " size)." << '\n';
   indent_up();
 
-  out << indent() << fname << " do: [:" << val << "|" << endl;
+  out << indent() << fname << " do: [:" << val << "|" << '\n';
   indent_up();
 
-  out << indent() << write_val(tlist->get_elem_type(), val) << endl;
+  out << indent() << write_val(tlist->get_elem_type(), val) << '\n';
   indent_down();
 
-  out << "]." << endl << indent() << "oprot writeListEnd] value";
+  out << "]." << '\n' << indent() << "oprot writeListEnd] value";
   indent_down();
 
   return out.str();
@@ -646,17 +644,17 @@
   string desc = temp_name();
   string val = temp_name();
 
-  out << "[|" << desc << " " << val << "| " << desc << " := iprot readListBegin." << endl;
+  out << "[|" << desc << " " << val << "| " << desc << " := iprot readListBegin." << '\n';
   indent_up();
 
-  out << indent() << val << " := OrderedCollection new." << endl << indent() << desc
-      << " size timesRepeat: [" << endl;
+  out << indent() << val << " := OrderedCollection new." << '\n' << indent() << desc
+      << " size timesRepeat: [" << '\n';
 
   indent_up();
   out << indent() << val << " add: " << read_val(tlist->get_elem_type());
   indent_down();
 
-  out << "]." << endl << indent() << "iprot readListEnd." << endl << indent() << val << "] value";
+  out << "]." << '\n' << indent() << "iprot readListEnd." << '\n' << indent() << val << "] value";
   indent_down();
 
   return out.str();
@@ -667,16 +665,16 @@
   string val = temp_name();
 
   out << "[oprot writeSetBegin: (TSet new elemType: " << type_to_enum(tset->get_elem_type())
-      << "; size: " << fname << " size)." << endl;
+      << "; size: " << fname << " size)." << '\n';
   indent_up();
 
-  out << indent() << fname << " do: [:" << val << "|" << endl;
+  out << indent() << fname << " do: [:" << val << "|" << '\n';
   indent_up();
 
-  out << indent() << write_val(tset->get_elem_type(), val) << endl;
+  out << indent() << write_val(tset->get_elem_type(), val) << '\n';
   indent_down();
 
-  out << "]." << endl << indent() << "oprot writeSetEnd] value";
+  out << "]." << '\n' << indent() << "oprot writeSetEnd] value";
   indent_down();
 
   return out.str();
@@ -687,17 +685,17 @@
   string desc = temp_name();
   string val = temp_name();
 
-  out << "[|" << desc << " " << val << "| " << desc << " := iprot readSetBegin." << endl;
+  out << "[|" << desc << " " << val << "| " << desc << " := iprot readSetBegin." << '\n';
   indent_up();
 
-  out << indent() << val << " := Set new." << endl << indent() << desc << " size timesRepeat: ["
-      << endl;
+  out << indent() << val << " := Set new." << '\n' << indent() << desc << " size timesRepeat: ["
+      << '\n';
 
   indent_up();
   out << indent() << val << " add: " << read_val(tset->get_elem_type());
   indent_down();
 
-  out << "]." << endl << indent() << "iprot readSetEnd." << endl << indent() << val << "] value";
+  out << "]." << '\n' << indent() << "iprot readSetEnd." << '\n' << indent() << val << "] value";
   indent_down();
 
   return out.str();
@@ -709,7 +707,7 @@
   vector<t_field*>::const_iterator fld_iter;
 
   out << "[oprot writeStructBegin: "
-      << "(TStruct new name: '" + tstruct->get_name() + "')." << endl;
+      << "(TStruct new name: '" + tstruct->get_name() + "')." << '\n';
   indent_up();
 
   for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) {
@@ -718,15 +716,15 @@
     string accessor = sname + " " + camelcase(fname);
 
     if (optional) {
-      out << indent() << accessor << " ifNotNil: [" << endl;
+      out << indent() << accessor << " ifNotNil: [" << '\n';
       indent_up();
     }
 
     out << indent() << "oprot writeFieldBegin: (TField new name: '" << fname
         << "'; type: " << type_to_enum((*fld_iter)->get_type())
-        << "; id: " << (*fld_iter)->get_key() << ")." << endl;
+        << "; id: " << (*fld_iter)->get_key() << ")." << '\n';
 
-    out << indent() << write_val((*fld_iter)->get_type(), accessor) << "." << endl << indent()
+    out << indent() << write_val((*fld_iter)->get_type(), accessor) << "." << '\n' << indent()
         << "oprot writeFieldEnd";
 
     if (optional) {
@@ -734,7 +732,7 @@
       indent_down();
     }
 
-    out << "." << endl;
+    out << "." << '\n';
   }
 
   out << indent() << "oprot writeFieldStop; writeStructEnd] value";
@@ -755,33 +753,33 @@
     clsName = tstruct->get_name();
   }
 
-  out << "[|" << desc << " " << val << "|" << endl;
+  out << "[|" << desc << " " << val << "|" << '\n';
   indent_up();
 
   // This is nasty, but without it we'll break things by prefixing TResult.
   string name = ((capitalize(clsName) == "TResult") ? capitalize(clsName) : prefix(clsName));
-  out << indent() << val << " := " << name << " new." << endl;
+  out << indent() << val << " := " << name << " new." << '\n';
 
-  out << indent() << "iprot readStructBegin." << endl << indent() << "[" << desc
-      << " := iprot readFieldBegin." << endl << indent() << desc
-      << " type = TType stop] whileFalse: [|" << found << "|" << endl;
+  out << indent() << "iprot readStructBegin." << '\n' << indent() << "[" << desc
+      << " := iprot readFieldBegin." << '\n' << indent() << desc
+      << " type = TType stop] whileFalse: [|" << found << "|" << '\n';
   indent_up();
 
   for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) {
-    out << indent() << desc << " id = " << (*fld_iter)->get_key() << " ifTrue: [" << endl;
+    out << indent() << desc << " id = " << (*fld_iter)->get_key() << " ifTrue: [" << '\n';
     indent_up();
 
-    out << indent() << found << " := true." << endl << indent() << val << " "
+    out << indent() << found << " := true." << '\n' << indent() << val << " "
         << camelcase((*fld_iter)->get_name()) << ": " << read_val((*fld_iter)->get_type());
     indent_down();
 
-    out << "]." << endl;
+    out << "]." << '\n';
   }
 
-  out << indent() << found << " ifNil: [iprot skip: " << desc << " type]]." << endl;
+  out << indent() << found << " ifNil: [iprot skip: " << desc << " type]]." << '\n';
   indent_down();
 
-  out << indent() << "oprot readStructEnd." << endl << indent() << val << "] value";
+  out << indent() << "oprot readStructEnd." << '\n' << indent() << val << "] value";
   indent_down();
 
   return out.str();
@@ -847,32 +845,32 @@
   vector<t_field*>::const_iterator fld_iter;
 
   st_method(f_, client_class_name(), "send" + capitalize(signature));
-  f_ << "oprot writeMessageBegin:" << endl;
+  f_ << "oprot writeMessageBegin:" << '\n';
   indent_up();
 
-  f_ << indent() << "(TCallMessage new" << endl;
+  f_ << indent() << "(TCallMessage new" << '\n';
   indent_up();
 
-  f_ << indent() << "name: '" << funname << "'; " << endl << indent() << "seqid: self nextSeqid)."
-     << endl;
+  f_ << indent() << "name: '" << funname << "'; " << '\n' << indent() << "seqid: self nextSeqid)."
+     << '\n';
   indent_down();
   indent_down();
 
   f_ << indent() << "oprot writeStructBegin: "
-     << "(TStruct new name: '" + capitalize(camelcase(funname)) + "_args')." << endl;
+     << "(TStruct new name: '" + capitalize(camelcase(funname)) + "_args')." << '\n';
 
   for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) {
     string fname = camelcase((*fld_iter)->get_name());
 
     f_ << indent() << "oprot writeFieldBegin: (TField new name: '" << fname
        << "'; type: " << type_to_enum((*fld_iter)->get_type()) << "; id: " << (*fld_iter)->get_key()
-       << ")." << endl;
+       << ")." << '\n';
 
-    f_ << indent() << write_val((*fld_iter)->get_type(), fname) << "." << endl << indent()
-       << "oprot writeFieldEnd." << endl;
+    f_ << indent() << write_val((*fld_iter)->get_type(), fname) << "." << '\n' << indent()
+       << "oprot writeFieldEnd." << '\n';
   }
 
-  f_ << indent() << "oprot writeFieldStop; writeStructEnd; writeMessageEnd." << endl;
+  f_ << indent() << "oprot writeFieldStop; writeStructEnd; writeMessageEnd." << '\n';
   f_ << indent() << "oprot transport flush";
 
   st_close_method(f_);
@@ -897,11 +895,11 @@
   }
 
   st_method(f_, client_class_name(), "recv" + capitalize(funname));
-  f_ << "| f msg res | " << endl << indent() << "msg := oprot readMessageBegin." << endl << indent()
-     << "self validateRemoteMessage: msg." << endl << indent()
-     << "res := " << struct_reader(&result) << "." << endl << indent() << "oprot readMessageEnd."
-     << endl << indent() << "oprot transport flush." << endl << indent()
-     << "res exception ifNotNil: [res exception signal]." << endl << indent() << "^ res";
+  f_ << "| f msg res | " << '\n' << indent() << "msg := oprot readMessageBegin." << '\n' << indent()
+     << "self validateRemoteMessage: msg." << '\n' << indent()
+     << "res := " << struct_reader(&result) << "." << '\n' << indent() << "oprot readMessageEnd."
+     << '\n' << indent() << "oprot transport flush." << '\n' << indent()
+     << "res exception ifNotNil: [res exception signal]." << '\n' << indent() << "^ res";
   st_close_method(f_);
 }
 
@@ -940,7 +938,7 @@
     extends_client = extends + "Client";
   }
 
-  f_ << extends_client << " subclass: #" << prefix(client_class_name()) << endl
+  f_ << extends_client << " subclass: #" << prefix(client_class_name()) << '\n'
      << "\tinstanceVariableNames: ''\n"
      << "\tclassVariableNames: ''\n"
      << "\tpoolDictionaries: ''\n"
@@ -951,11 +949,11 @@
     string signature = function_signature(*f_iter);
 
     st_method(f_, client_class_name(), signature);
-    f_ << function_types_comment(*f_iter) << endl << indent() << "self send"
-       << capitalize(signature) << "." << endl;
+    f_ << function_types_comment(*f_iter) << '\n' << indent() << "self send"
+       << capitalize(signature) << "." << '\n';
 
     if (!(*f_iter)->is_oneway()) {
-      f_ << indent() << "^ self recv" << capitalize(funname) << " success " << endl;
+      f_ << indent() << "^ self recv" << capitalize(funname) << " success " << '\n';
     }
 
     st_close_method(f_);
diff --git a/compiler/cpp/src/thrift/generate/t_swift_generator.cc b/compiler/cpp/src/thrift/generate/t_swift_generator.cc
index fab1413..98b19ec 100644
--- a/compiler/cpp/src/thrift/generate/t_swift_generator.cc
+++ b/compiler/cpp/src/thrift/generate/t_swift_generator.cc
@@ -37,8 +37,6 @@
 using std::stringstream;
 using std::vector;
 
-static const string endl = "\n"; // avoid ostream << std::endl flushes
-
 /**
  * Swift 3 code generator.
  *
@@ -51,7 +49,7 @@
                     const string& option_string)
     : t_oop_generator(program) {
     update_keywords_for_validation();
-    
+
     (void)option_string;
     map<string, string>::const_iterator iter;
 
@@ -226,14 +224,14 @@
 private:
 
   void block_open(ostream& out) {
-    out << " {" << endl;
+    out << " {" << '\n';
     indent_up();
   }
 
   void block_close(ostream& out, bool end_line=true) {
     indent_down();
     indent(out) << "}";
-    if (end_line) out << endl;
+    if (end_line) out << '\n';
   }
 
   bool field_is_optional(t_field* tfield) {
@@ -320,18 +318,18 @@
   string f_decl_fullname = module_path + "/" + f_decl_name;
   f_decl_.open(f_decl_fullname.c_str());
 
-  f_decl_ << autogen_comment() << endl;
+  f_decl_ << autogen_comment() << '\n';
 
-  f_decl_ << swift_imports() << swift_thrift_imports() << endl;
+  f_decl_ << swift_imports() << swift_thrift_imports() << '\n';
 
   // ...and a .swift implementation extensions file
   string f_impl_name = name + "+Exts.swift";
   string f_impl_fullname = module_path + "/" + f_impl_name;
   f_impl_.open(f_impl_fullname.c_str());
 
-  f_impl_ << autogen_comment() << endl;
+  f_impl_ << autogen_comment() << '\n';
 
-  f_impl_ << swift_imports() << swift_thrift_imports() << endl;
+  f_impl_ << swift_imports() << swift_thrift_imports() << '\n';
 
 }
 
@@ -349,16 +347,16 @@
 
   vector<string>::const_iterator i_iter;
   for (i_iter=includes_list.begin(); i_iter!=includes_list.end(); ++i_iter) {
-    includes << "import " << *i_iter << endl;
+    includes << "import " << *i_iter << '\n';
   }
 
   if (namespaced_) {
     const vector<t_program*>& program_includes = program_->get_includes();
     for (auto program_include : program_includes) {
-      includes << ("import " + get_real_swift_module(program_include)) << endl;
+      includes << ("import " + get_real_swift_module(program_include)) << '\n';
     }
   }
-  includes << endl;
+  includes << '\n';
 
   return includes.str();
 }
@@ -381,10 +379,10 @@
 
   vector<string>::const_iterator i_iter;
   for (i_iter=includes_list.begin(); i_iter!=includes_list.end(); ++i_iter) {
-    includes << "import " << *i_iter << endl;
+    includes << "import " << *i_iter << '\n';
   }
 
-  includes << endl;
+  includes << '\n';
 
   return includes.str();
 }
@@ -395,7 +393,7 @@
 void t_swift_generator::close_generator() {
   // stick our constants declarations at the end of the header file
   // since they refer to things we are defining.
-  f_decl_ << constants_declarations_ << endl;
+  f_decl_ << constants_declarations_ << '\n';
 }
 
 /**
@@ -405,8 +403,8 @@
  */
 void t_swift_generator::generate_typedef(t_typedef* ttypedef) {
   f_decl_ << indent() << "public typealias " << ttypedef->get_symbolic()
-          << " = " << type_name(ttypedef->get_type()) << endl;
-  f_decl_ << endl;
+          << " = " << type_name(ttypedef->get_type()) << '\n';
+  f_decl_ << '\n';
 }
 
 
@@ -430,80 +428,80 @@
   vector<t_enum_value*>::iterator c_iter;
 
   for (c_iter = constants.begin(); c_iter != constants.end(); ++c_iter) {
-    f_decl_ << indent() << "case " << enum_case_name((*c_iter), true) << endl;
+    f_decl_ << indent() << "case " << enum_case_name((*c_iter), true) << '\n';
   }
 
   // unknown associated value case for safety and similar behavior to other languages
   if (safe_enums_) {
-    f_decl_ << indent() << "case unknown(Int32)" << endl;
+    f_decl_ << indent() << "case unknown(Int32)" << '\n';
   }
-  f_decl_ << endl;
+  f_decl_ << '\n';
 
   // TSerializable read(from:)
   f_decl_ << indent() << "public static func read(from proto: TProtocol) throws -> "
           << tenum->get_name();
   block_open(f_decl_);
-  f_decl_ << indent() << "let raw: Int32 = try proto.read()" << endl;
-  f_decl_ << indent() << "let new = " << tenum->get_name() << "(rawValue: raw)" << endl;
+  f_decl_ << indent() << "let raw: Int32 = try proto.read()" << '\n';
+  f_decl_ << indent() << "let new = " << tenum->get_name() << "(rawValue: raw)" << '\n';
 
-  f_decl_ << indent() << "if let unwrapped = new {" << endl;
+  f_decl_ << indent() << "if let unwrapped = new {" << '\n';
   indent_up();
-  f_decl_ << indent() << "return unwrapped" << endl;
+  f_decl_ << indent() << "return unwrapped" << '\n';
   indent_down();
-  f_decl_ << indent() << "} else {" << endl;
+  f_decl_ << indent() << "} else {" << '\n';
   indent_up();
-  f_decl_ << indent() << "throw TProtocolError(error: .invalidData," << endl;
+  f_decl_ << indent() << "throw TProtocolError(error: .invalidData," << '\n';
   f_decl_ << indent() << "                     message: \"Invalid enum value (\\(raw)) for \\("
-          << tenum->get_name() << ".self)\")" << endl;
+          << tenum->get_name() << ".self)\")" << '\n';
   indent_down();
-  f_decl_ << indent() << "}" << endl;
+  f_decl_ << indent() << "}" << '\n';
   block_close(f_decl_);
 
   // empty init for TSerializable
-  f_decl_ << endl;
+  f_decl_ << '\n';
   f_decl_ << indent() << "public init()";
   block_open(f_decl_);
 
-  f_decl_ << indent() << "self = ." << enum_case_name(constants.front(), false) << endl;
+  f_decl_ << indent() << "self = ." << enum_case_name(constants.front(), false) << '\n';
   block_close(f_decl_);
-  f_decl_ << endl;
+  f_decl_ << '\n';
 
   // rawValue getter
   f_decl_ << indent() << "public var rawValue: Int32";
   block_open(f_decl_);
-  f_decl_ << indent() << "switch self {" << endl;
+  f_decl_ << indent() << "switch self {" << '\n';
   for (c_iter = constants.begin(); c_iter != constants.end(); ++c_iter) {
     f_decl_ << indent() << "case ." << enum_case_name((*c_iter), true)
-            << ": return " << (*c_iter)->get_value() << endl;
+            << ": return " << (*c_iter)->get_value() << '\n';
   }
   if (safe_enums_) {
-    f_decl_ << indent() << "case .unknown(let value): return value" << endl;
+    f_decl_ << indent() << "case .unknown(let value): return value" << '\n';
   }
-  f_decl_ << indent() << "}" << endl;
+  f_decl_ << indent() << "}" << '\n';
   block_close(f_decl_);
-  f_decl_ << endl;
+  f_decl_ << '\n';
 
   // convenience rawValue initalizer
   f_decl_ << indent() << "public init?(rawValue: Int32)";
   block_open(f_decl_);
-  f_decl_ << indent() << "switch rawValue {" << endl;;
+  f_decl_ << indent() << "switch rawValue {" << '\n';;
   for (c_iter = constants.begin(); c_iter != constants.end(); ++c_iter) {
     f_decl_ << indent() << "case " << (*c_iter)->get_value()
-            << ": self = ." << enum_case_name((*c_iter), true) << endl;
+            << ": self = ." << enum_case_name((*c_iter), true) << '\n';
   }
   if (!safe_enums_) {
-    f_decl_ << indent() << "default: return nil" << endl;
+    f_decl_ << indent() << "default: return nil" << '\n';
   } else {
-    f_decl_ << indent() << "default: self = .unknown(rawValue)" << endl;
+    f_decl_ << indent() << "default: self = .unknown(rawValue)" << '\n';
   }
-  f_decl_ << indent() << "}" << endl;
+  f_decl_ << indent() << "}" << '\n';
   block_close(f_decl_);
 
 
 
 
   block_close(f_decl_);
-  f_decl_ << endl;
+  f_decl_ << '\n';
 }
 
 /**
@@ -521,36 +519,36 @@
 
   for (c_iter = constants.begin(); c_iter != constants.end(); ++c_iter) {
     f_decl_ << indent() << "case " << (*c_iter)->get_name()
-            << " = " << (*c_iter)->get_value() << endl;
+            << " = " << (*c_iter)->get_value() << '\n';
   }
 
-  f_decl_ << endl;
-  f_decl_ << indent() << "public init() { self.init(rawValue: " << constants.front()->get_value() << ")! }" << endl;
+  f_decl_ << '\n';
+  f_decl_ << indent() << "public init() { self.init(rawValue: " << constants.front()->get_value() << ")! }" << '\n';
 
   block_close(f_decl_);
-  f_decl_ << endl;
+  f_decl_ << '\n';
 
   f_impl_ << indent() << "extension " << tenum->get_name() << " : TEnum";
   block_open(f_impl_);
 
-  f_impl_ << endl;
+  f_impl_ << '\n';
 
   f_impl_ << indent() << "public static func readValueFromProtocol(proto: TProtocol) throws -> " << tenum->get_name();
   block_open(f_impl_);
-  f_impl_ << indent() << "var raw = Int32()" << endl
-          << indent() << "try proto.readI32(&raw)" << endl
-          << indent() << "return " << tenum->get_name() << "(rawValue: raw)!" << endl;
+  f_impl_ << indent() << "var raw = Int32()" << '\n'
+          << indent() << "try proto.readI32(&raw)" << '\n'
+          << indent() << "return " << tenum->get_name() << "(rawValue: raw)!" << '\n';
   block_close(f_impl_);
-  f_impl_ << endl;
+  f_impl_ << '\n';
 
   f_impl_ << indent() << "public static func writeValue(value: " << tenum->get_name() << ", toProtocol proto: TProtocol) throws";
   block_open(f_impl_);
-  f_impl_ << indent() << "try proto.writeI32(value.rawValue)" << endl;
+  f_impl_ << indent() << "try proto.writeI32(value.rawValue)" << '\n';
   block_close(f_impl_);
-  f_impl_ << endl;
+  f_impl_ << '\n';
 
   block_close(f_impl_);
-  f_impl_ << endl;
+  f_impl_ << '\n';
 }
 
 string t_swift_generator::enum_case_name(t_enum_value* tenum_case, bool declaration) {
@@ -593,7 +591,7 @@
     t_type* type = (*c_iter)->get_type();
     const_interface << "public let " << capitalize((*c_iter)->get_name()) << " : " << type_name(type) << " = ";
     render_const_value(const_interface, type, (*c_iter)->get_value());
-    const_interface << endl << endl;
+    const_interface << '\n' << '\n';
   }
 
   // this gets spit into the header file in ::close_generator
@@ -647,7 +645,7 @@
     vector<string>::const_iterator d_iter;
     for (d_iter = strings.begin(); d_iter != strings.end(); ++d_iter) {
       if ((*d_iter) != "") {
-        out << indent() << "/// " << (*d_iter) << endl;
+        out << indent() << "/// " << (*d_iter) << '\n';
       }
     }
   }
@@ -685,12 +683,12 @@
     out << indent() << "public enum " << tstruct->get_name();
     block_open(out);
     for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
-      out << endl;
+      out << '\n';
       string doc = (*m_iter)->get_doc();
       generate_docstring(out, doc);
       out << indent() << "case "
           << maybe_escape_identifier((*m_iter)->get_name()) << "(val: "
-          << type_name((*m_iter)->get_type(), false) << ")" << endl;
+          << type_name((*m_iter)->get_type(), false) << ")" << '\n';
     }
   } else {
     // Normal structs
@@ -707,20 +705,20 @@
     vector<t_field*> sorted = members;
     sort(sorted.begin(), sorted.end(), [](t_field *a, t_field *b) { return (a->get_key() < b->get_key()); } );
     for (m_iter = sorted.begin(); m_iter != sorted.end(); ++m_iter) {
-      out << endl;
+      out << '\n';
       // TODO: Defaults
 
       string doc = (*m_iter)->get_doc();
       generate_docstring(out, doc);
 
-      out << indent() << declare_property(*m_iter, is_private) << endl;
+      out << indent() << declare_property(*m_iter, is_private) << '\n';
     }
 
-    out << endl;
-    out << endl;
+    out << '\n';
+    out << '\n';
 
     if (!struct_has_required_fields(tstruct)) {
-      indent(out) << visibility << " init() { }" << endl;
+      indent(out) << visibility << " init() { }" << '\n';
     }
     if (struct_has_required_fields(tstruct)) {
       generate_swift_struct_init(out, tstruct, false, is_private);
@@ -732,7 +730,7 @@
 
   block_close(out);
 
-  out << endl;
+  out << '\n';
 }
 
 /**
@@ -761,11 +759,11 @@
   vector<t_field*>::const_iterator m_iter;
 
   for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
-    out << endl;
-    out << indent() << declare_property(*m_iter, is_private) << endl;
+    out << '\n';
+    out << indent() << declare_property(*m_iter, is_private) << '\n';
   }
 
-  out << endl;
+  out << '\n';
 
   // init
 
@@ -773,7 +771,7 @@
   block_open(out);
   block_close(out);
 
-  out << endl;
+  out << '\n';
 
   if (struct_has_required_fields(tstruct)) {
     generate_swift_struct_init(out, tstruct, false, is_private);
@@ -784,7 +782,7 @@
 
   block_close(out);
 
-  out << endl;
+  out << '\n';
 }
 
 /**
@@ -831,20 +829,20 @@
       should_set = should_set || !field_is_optional((*m_iter));
       if (should_set) {
         out << indent() << "self." << maybe_escape_identifier((*m_iter)->get_name()) << " = "
-            << maybe_escape_identifier((*m_iter)->get_name()) << endl;
+            << maybe_escape_identifier((*m_iter)->get_name()) << '\n';
       }
     } else {
       /** legacy Swift2/Cocoa */
       if (all || (*m_iter)->get_req() == t_field::T_REQUIRED || (*m_iter)->get_req() == t_field::T_OPT_IN_REQ_OUT) {
         out << indent() << "self." << maybe_escape_identifier((*m_iter)->get_name()) << " = "
-            << maybe_escape_identifier((*m_iter)->get_name()) << endl;
+            << maybe_escape_identifier((*m_iter)->get_name()) << '\n';
       }
     }
   }
 
   block_close(out);
 
-  out << endl;
+  out << '\n';
 }
 
 /**
@@ -861,7 +859,7 @@
   string visibility = is_private ? (gen_cocoa_ ? "private" : "fileprivate") : "public";
   indent(out) << "extension " << tstruct->get_name() << " : Hashable";
   block_open(out);
-  out << endl;
+  out << '\n';
   indent(out) << visibility << " func hash(into hasher: inout Hasher)";
   block_open(out);
 
@@ -872,21 +870,21 @@
     if (!tstruct->is_union()) {
       for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
         t_field* tfield = *m_iter;
-        indent(out) << "hasher.combine(" << maybe_escape_identifier(tfield->get_name()) << ")" << endl;
+        indent(out) << "hasher.combine(" << maybe_escape_identifier(tfield->get_name()) << ")" << '\n';
       }
     } else {
-      indent(out) << "switch self {" << endl;
+      indent(out) << "switch self {" << '\n';
       for (m_iter = members.begin(); m_iter != members.end(); m_iter++) {
         t_field *tfield = *m_iter;
-        indent(out) << "case ." << tfield->get_name() << "(let val): hasher.combine(val)" << endl;
+        indent(out) << "case ." << tfield->get_name() << "(let val): hasher.combine(val)" << '\n';
       }
-      indent(out) << "}" << endl << endl;
+      indent(out) << "}" << '\n' << '\n';
     }
   }
   block_close(out);
-  out << endl;
+  out << '\n';
   block_close(out);
-  out << endl;
+  out << '\n';
 }
 
 /**
@@ -912,7 +910,7 @@
 
   if (members.size()) {
     if (!tstruct->is_union()) {
-      out << endl;
+      out << '\n';
       indent_up();
 
       for (m_iter = members.begin(); m_iter != members.end();) {
@@ -922,30 +920,30 @@
         if (++m_iter != members.end()) {
           out << " &&";
         }
-        out << endl;
+        out << '\n';
       }
       indent_down();
     } else {
       block_open(out);
-      indent(out) << "switch (lhs, rhs) {" << endl;
+      indent(out) << "switch (lhs, rhs) {" << '\n';
       for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
         t_field* tfield = *m_iter;
         indent(out) << "case (." << tfield->get_name() << "(let lval), ."
                     << tfield->get_name() << "(let rval)): return lval == rval"
-                    << endl;
+                    << '\n';
       }
-      indent(out) << "default: return false" << endl;
-      indent(out) << "}" << endl;
+      indent(out) << "default: return false" << '\n';
+      indent(out) << "}" << '\n';
       indent_down();
-      indent(out) << "}()" << endl;
+      indent(out) << "}()" << '\n';
     }
   }
   else {
-    out << " true" << endl;
+    out << " true" << '\n';
   }
 
   block_close(out);
-  out << endl;
+  out << '\n';
 }
 
 /**
@@ -972,7 +970,7 @@
   generate_swift_struct_hashable_extension(out, tstruct, is_private);
   generate_swift_struct_thrift_extension(out, tstruct, is_result, is_private);
 
-  out << endl << endl;
+  out << '\n' << '\n';
 }
 
 /**
@@ -993,7 +991,7 @@
 
   block_open(out);
 
-  out << endl;
+  out << '\n';
   if (!gen_cocoa_) {
     /** Swift 3, no writer we just write field ID's */
     string access = (is_private) ? (gen_cocoa_ ? "private" : "fileprivate") : "public";
@@ -1012,11 +1010,11 @@
       // pad a colon
       out << ":";
     }
-    out << "]" << endl;
+    out << "]" << '\n';
     block_close(out);
-    out << endl;
+    out << '\n';
     out << indent() << access << " static var structName: String { return \""
-        << tstruct->get_name() << "\" }" << endl << endl;
+        << tstruct->get_name() << "\" }" << '\n' << '\n';
 
     if (tstruct->is_union()) {
       generate_swift_union_reader(out, tstruct);
@@ -1037,24 +1035,24 @@
   }
 
   block_close(out);
-  out << endl;
+  out << '\n';
 }
 
 void t_swift_generator::generate_swift_union_reader(ostream& out, t_struct* tstruct) {
   indent(out) << "public static func read(from proto: TProtocol) throws -> "
               << tstruct->get_name();
   block_open(out);
-  indent(out) << "_ = try proto.readStructBegin()" << endl;
+  indent(out) << "_ = try proto.readStructBegin()" << '\n';
 
   indent(out) << "var ret: " << tstruct->get_name() << "?";
-  out << endl;
+  out << '\n';
   indent(out) << "fields: while true";
   block_open(out);
-  out << endl;
-  indent(out) << "let (_, fieldType, fieldID) = try proto.readFieldBegin()" << endl << endl;
+  out << '\n';
+  indent(out) << "let (_, fieldType, fieldID) = try proto.readFieldBegin()" << '\n' << '\n';
   indent(out) << "switch (fieldID, fieldType)";
   block_open(out);
-  indent(out) << "case (_, .stop):            break fields" << endl;
+  indent(out) << "case (_, .stop):            break fields" << '\n';
 
   const vector<t_field*>& fields = tstruct->get_members();
   vector<t_field*>::const_iterator f_iter;
@@ -1094,28 +1092,28 @@
     indent(out) << padding << "ret = " << tstruct->get_name() << "."
                 << (*f_iter)->get_name() << "(val: " << "try "
                 << type_name((*f_iter)->get_type(), false, false)
-                << ".read(from: proto))" << endl;
+                << ".read(from: proto))" << '\n';
   }
 
-  indent(out) << "case let (_, unknownType):  try proto.skip(type: unknownType)" << endl;
+  indent(out) << "case let (_, unknownType):  try proto.skip(type: unknownType)" << '\n';
 
   block_close(out);
-  indent(out) << "try proto.readFieldEnd()" << endl;
+  indent(out) << "try proto.readFieldEnd()" << '\n';
 
   block_close(out);
-  out << endl;
+  out << '\n';
 
-  indent(out) << "try proto.readStructEnd()" << endl;
+  indent(out) << "try proto.readStructEnd()" << '\n';
 
   indent(out) << "if let ret = ret";
   block_open(out);
-  indent(out) << "return ret" << endl;
+  indent(out) << "return ret" << '\n';
   block_close(out);
-  out << endl;
+  out << '\n';
   indent(out) << "throw TProtocolError(error: .unknown, message: \"Missing required value for type: "
               << tstruct->get_name() << "\")";
   block_close(out);
-  out << endl;
+  out << '\n';
 
 }
 
@@ -1139,7 +1137,7 @@
                << tstruct->get_name();
 
     block_open(out);
-    indent(out) << "_ = try proto.readStructBegin()" << endl;
+    indent(out) << "_ = try proto.readStructBegin()" << '\n';
 
     const vector<t_field*>& fields = tstruct->get_members();
     vector<t_field*>::const_iterator f_iter;
@@ -1147,20 +1145,20 @@
     for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
       bool optional = field_is_optional(*f_iter);
       indent(out) << "var " << maybe_escape_identifier((*f_iter)->get_name()) << ": "
-                  << type_name((*f_iter)->get_type(), optional, !optional) << endl;
+                  << type_name((*f_iter)->get_type(), optional, !optional) << '\n';
     }
 
-    out << endl;
+    out << '\n';
 
     // Loop over reading in fields
     indent(out) << "fields: while true";
     block_open(out);
-    out << endl;
+    out << '\n';
 
-    indent(out) << "let (_, fieldType, fieldID) = try proto.readFieldBegin()" << endl << endl;
+    indent(out) << "let (_, fieldType, fieldID) = try proto.readFieldBegin()" << '\n' << '\n';
     indent(out) << "switch (fieldID, fieldType)";
     block_open(out);
-    indent(out) << "case (_, .stop):            break fields" << endl;
+    indent(out) << "case (_, .stop):            break fields" << '\n';
 
 
     // Generate deserialization code for known cases
@@ -1198,33 +1196,33 @@
       }
 
       out << padding << maybe_escape_identifier((*f_iter)->get_name()) << " = try "
-          << type_name((*f_iter)->get_type(), false, false) << ".read(from: proto)" << endl;
+          << type_name((*f_iter)->get_type(), false, false) << ".read(from: proto)" << '\n';
     }
 
-    indent(out) << "case let (_, unknownType):  try proto.skip(type: unknownType)" << endl;
+    indent(out) << "case let (_, unknownType):  try proto.skip(type: unknownType)" << '\n';
     block_close(out);
-    out << endl;
+    out << '\n';
 
     // Read field end marker
-    indent(out) << "try proto.readFieldEnd()" << endl;
+    indent(out) << "try proto.readFieldEnd()" << '\n';
     block_close(out);
-    out << endl;
-    indent(out) << "try proto.readStructEnd()" << endl;
+    out << '\n';
+    indent(out) << "try proto.readStructEnd()" << '\n';
 
     if (struct_has_required_fields(tstruct)) {
       // performs various checks (e.g. check that all required fields are set)
-      indent(out) << "// Required fields" << endl;
+      indent(out) << "// Required fields" << '\n';
 
       for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
         if (field_is_optional(*f_iter)) {
           continue;
         }
         indent(out) << "try proto.validateValue(" << maybe_escape_identifier((*f_iter)->get_name()) << ", "
-                    << "named: \"" << (*f_iter)->get_name() << "\")" << endl;
+                    << "named: \"" << (*f_iter)->get_name() << "\")" << '\n';
       }
     }
 
-    out << endl;
+    out << '\n';
 
     indent(out) << "return " << tstruct->get_name() << "(";
     for (f_iter = fields.begin(); f_iter != fields.end();) {
@@ -1242,8 +1240,8 @@
                 << tstruct->get_name();
 
     block_open(out);
-    out << endl;
-    indent(out) << "try __proto.readStructBegin()" << endl << endl;
+    out << '\n';
+    indent(out) << "try __proto.readStructBegin()" << '\n' << '\n';
 
     const vector<t_field*>& fields = tstruct->get_members();
     vector<t_field*>::const_iterator f_iter;
@@ -1251,66 +1249,66 @@
     for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
       bool optional = field_is_optional(*f_iter);
       indent(out) << "var " << maybe_escape_identifier((*f_iter)->get_name()) << " : "
-                  << type_name((*f_iter)->get_type(), optional, !optional) << endl;
+                  << type_name((*f_iter)->get_type(), optional, !optional) << '\n';
     }
 
-    out << endl;
+    out << '\n';
 
     // Loop over reading in fields
     indent(out) << "fields: while true";
     block_open(out);
-    out << endl;
+    out << '\n';
 
-    indent(out) << "let (_, fieldType, fieldID) = try __proto.readFieldBegin()" << endl << endl;
+    indent(out) << "let (_, fieldType, fieldID) = try __proto.readFieldBegin()" << '\n' << '\n';
     indent(out) << "switch (fieldID, fieldType)";
 
     block_open(out);
 
-    indent(out) << "case (_, .STOP):" << endl;
+    indent(out) << "case (_, .STOP):" << '\n';
     indent_up();
-    indent(out) << "break fields" << endl << endl;
+    indent(out) << "break fields" << '\n' << '\n';
     indent_down();
 
     // Generate deserialization code for known cases
     for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
 
-      indent(out) << "case (" << (*f_iter)->get_key() << ", " << type_to_enum((*f_iter)->get_type()) << "):" << endl;
+      indent(out) << "case (" << (*f_iter)->get_key() << ", " << type_to_enum((*f_iter)->get_type()) << "):" << '\n';
       indent_up();
       indent(out) << maybe_escape_identifier((*f_iter)->get_name()) << " = try __proto.readValue() as "
-                  << type_name((*f_iter)->get_type()) << endl << endl;
+                  << type_name((*f_iter)->get_type()) << '\n' << '\n';
       indent_down();
 
     }
 
-    indent(out) << "case let (_, unknownType):" << endl;
+    indent(out) << "case let (_, unknownType):" << '\n';
     indent_up();
-    indent(out) << "try __proto.skipType(unknownType)" << endl;
+    indent(out) << "try __proto.skipType(unknownType)" << '\n';
     indent_down();
     block_close(out);
-    out << endl;
+    out << '\n';
 
     // Read field end marker
-    indent(out) << "try __proto.readFieldEnd()" << endl;
+    indent(out) << "try __proto.readFieldEnd()" << '\n';
 
     block_close(out);
-    out << endl;
-    indent(out) << "try __proto.readStructEnd()" << endl;
-    out << endl;
+    out << '\n';
+    indent(out) << "try __proto.readStructEnd()" << '\n';
+    out << '\n';
 
     if (struct_has_required_fields(tstruct)) {
       // performs various checks (e.g. check that all required fields are set)
-      indent(out) << "// Required fields" << endl;
+      indent(out) << "// Required fields" << '\n';
 
       for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
         if (field_is_optional(*f_iter)) {
           continue;
         }
         indent(out) << "try __proto.validateValue(" << (*f_iter)->get_name() << ", "
-                    << "named: \"" << (*f_iter)->get_name() << "\")" << endl;
+                    << "named: \"" << (*f_iter)->get_name() << "\")" << '\n';
       }
     }
 
-    out << endl;
+    out << '\n';
 
     indent(out) << "return " << tstruct->get_name() << "(";
     for (f_iter = fields.begin(); f_iter != fields.end();) {
@@ -1320,11 +1318,11 @@
       }
     }
   }
-  out << ")" << endl;
+  out << ")" << '\n';
 
   block_close(out);
 
-  out << endl;
+  out << '\n';
 }
 
 /**
@@ -1344,14 +1342,14 @@
   indent(out) << visibility << " static func writeValue(__value: " << tstruct->get_name()
               << ", toProtocol __proto: TProtocol) throws";
   block_open(out);
-  out << endl;
+  out << '\n';
 
   string name = tstruct->get_name();
   const vector<t_field*>& fields = tstruct->get_members();
   vector<t_field*>::const_iterator f_iter;
 
-  indent(out) << "try __proto.writeStructBeginWithName(\"" << name << "\")" << endl;
-  out << endl;
+  indent(out) << "try __proto.writeStructBeginWithName(\"" << name << "\")" << '\n';
+  out << '\n';
 
   for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
     t_field *tfield = *f_iter;
@@ -1367,19 +1365,19 @@
                 << (optional ? "" : "__value.") << maybe_escape_identifier(tfield->get_name()) << ", "
                 << "name: \"" << tfield->get_name() << "\", "
                 << "type: " << type_to_enum(tfield->get_type()) << ", "
-                << "id: " << tfield->get_key() << ")" << endl;
+                << "id: " << tfield->get_key() << ")" << '\n';
 
     if (optional) {
       block_close(out);
     }
 
-    out << endl;
+    out << '\n';
   }
 
-  indent(out) << "try __proto.writeFieldStop()" << endl << endl;
-  indent(out) << "try __proto.writeStructEnd()" << endl;
+  indent(out) << "try __proto.writeFieldStop()" << '\n' << '\n';
+  indent(out) << "try __proto.writeStructEnd()" << '\n';
   block_close(out);
-  out << endl;
+  out << '\n';
 }
 
 /**
@@ -1396,12 +1394,12 @@
   indent(out) << "private static func writeValue(__value: " << tstruct->get_name()
               << ", toProtocol __proto: TProtocol) throws";
   block_open(out);
-  out << endl;
+  out << '\n';
   string name = tstruct->get_name();
   const vector<t_field*>& fields = tstruct->get_members();
   vector<t_field*>::const_iterator f_iter;
-  indent(out) << "try __proto.writeStructBeginWithName(\"" << name << "\")" << endl;
-  out << endl;
+  indent(out) << "try __proto.writeStructBeginWithName(\"" << name << "\")" << '\n';
+  out << '\n';
 
   for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
     t_field *tfield = *f_iter;
@@ -1413,15 +1411,15 @@
     indent(out) << "try __proto.writeFieldValue(result, "
                 << "name: \"" << tfield->get_name() << "\", "
                 << "type: " << type_to_enum(tfield->get_type()) << ", "
-                << "id: " << tfield->get_key() << ")" << endl;
+                << "id: " << tfield->get_key() << ")" << '\n';
 
     block_close(out);
   }
   // Write the struct map
-  indent(out) << "try __proto.writeFieldStop()" << endl << endl;
-  indent(out) << "try __proto.writeStructEnd()" << endl;
+  indent(out) << "try __proto.writeFieldStop()" << '\n' << '\n';
+  indent(out) << "try __proto.writeStructEnd()" << '\n';
   block_close(out);
-  out << endl;
+  out << '\n';
 }
 
 /**
@@ -1440,50 +1438,50 @@
               << (debug_descriptions_ ? "CustomDebugStringConvertible" : "CustomStringConvertible");
 
   block_open(out);
-  out << endl;
+  out << '\n';
   indent(out) << "public var description : String";
   block_open(out);
   indent(out) << "var desc = \"" << tstruct->get_name();
 
   if (!gen_cocoa_) {
     if (!tstruct->is_union()) {
-      out << "(\"" << endl;
+      out << "(\"" << '\n';
       for (f_iter = fields.begin(); f_iter != fields.end();) {
         indent(out) << "desc += \"" << (*f_iter)->get_name()
                     << "=\\(String(describing: self." << maybe_escape_identifier((*f_iter)->get_name()) << "))";
         if (++f_iter != fields.end()) {
           out << ", ";
         }
-        out << "\"" << endl;
+        out << "\"" << '\n';
       }
     } else {
-      out << ".\"" << endl;
-      indent(out) << "switch self {" << endl;
+      out << ".\"" << '\n';
+      indent(out) << "switch self {" << '\n';
       for (f_iter = fields.begin(); f_iter != fields.end();f_iter++) {
         indent(out) << "case ." << (*f_iter)->get_name() << "(let val): "
                     << "desc += \"" << (*f_iter)->get_name() << "(val: \\(val))\""
-                    << endl;
+                    << '\n';
       }
-      indent(out) << "}" << endl;
+      indent(out) << "}" << '\n';
     }
   } else {
-    out << "(\"" << endl;
+    out << "(\"" << '\n';
     for (f_iter = fields.begin(); f_iter != fields.end();) {
       indent(out) << "desc += \"" << (*f_iter)->get_name()
                   << "=\\(self." << maybe_escape_identifier((*f_iter)->get_name()) << ")";
       if (++f_iter != fields.end()) {
         out << ", ";
       }
-      out << "\"" << endl;
+      out << "\"" << '\n';
     }
-    indent(out) << "desc += \")\"" << endl;
+    indent(out) << "desc += \")\"" << '\n';
   }
 
-  indent(out) << "return desc" << endl;
+  indent(out) << "return desc" << '\n';
   block_close(out);
-  out << endl;
+  out << '\n';
   block_close(out);
-  out << endl;
+  out << '\n';
 }
 
 /**
@@ -1606,14 +1604,14 @@
       out << " : " << parent->get_name();
     }
     block_open(out);
-    out << endl;
+    out << '\n';
 
     vector<t_function*> functions = tservice->get_functions();
     vector<t_function*>::iterator f_iter;
 
     for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
       function_docstring(out, *f_iter);
-      indent(out) << function_signature(*f_iter) << endl << endl;
+      indent(out) << function_signature(*f_iter) << '\n' << '\n';
     }
 
   } else {
@@ -1624,7 +1622,7 @@
     vector<t_function*>::iterator f_iter;
 
     for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
-      out << endl;
+      out << '\n';
       indent(out) << function_signature(*f_iter) << "  // exceptions: ";
       t_struct* xs = (*f_iter)->get_xceptions();
       const vector<t_field*>& xceptions = xs->get_members();
@@ -1632,11 +1630,11 @@
       for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) {
         out << type_name((*x_iter)->get_type()) + ", ";
       }
-      out << endl;
+      out << '\n';
     }
   }
   block_close(out);
-  out << endl;
+  out << '\n';
 }
 
 /**
@@ -1652,7 +1650,7 @@
   indent(out) << "public protocol " << tservice->get_name() << "Async";
 
   block_open(out);
-  if (!gen_cocoa_) {  out << endl; }
+  if (!gen_cocoa_) {  out << '\n'; }
 
   vector<t_function*> functions = tservice->get_functions();
   vector<t_function*>::iterator f_iter;
@@ -1660,20 +1658,20 @@
   if (!gen_cocoa_) {
     for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
       async_function_docstring(out, *f_iter);
-      indent(out) << async_function_signature(*f_iter) << endl << endl;
+      indent(out) << async_function_signature(*f_iter) << '\n' << '\n';
     }
   } else {
     for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
-      out << endl;
-      indent(out) << async_function_signature(*f_iter) << endl;
+      out << '\n';
+      indent(out) << async_function_signature(*f_iter) << '\n';
       if (promise_kit_) {
-        indent(out) << promise_function_signature(*f_iter) << endl;
+        indent(out) << promise_function_signature(*f_iter) << '\n';
       } //
-      out << endl;
+      out << '\n';
     }
   }
   block_close(out);
-  out << endl;
+  out << '\n';
 }
 
 /**
@@ -1690,33 +1688,33 @@
     out << " : " << ((parent == nullptr) ? "TClient" : parent->get_name() + "Client");
     out <<  " /* , " << tservice->get_name() << " */";
     block_open(out);
-    out << endl;
+    out << '\n';
   } else {
     // a
     indent(out) << "public class " << tservice->get_name() << "Client /* : " << tservice->get_name() << " */";
     block_open(out);
-    out << endl;
+    out << '\n';
 
-    indent(out) << "let __inProtocol : TProtocol" << endl << endl;
-    indent(out) << "let __outProtocol : TProtocol" << endl << endl;
+    indent(out) << "let __inProtocol : TProtocol" << '\n' << '\n';
+    indent(out) << "let __outProtocol : TProtocol" << '\n' << '\n';
     indent(out) << "public init(inoutProtocol: TProtocol)";
     block_open(out);
 
-    indent(out) << "__inProtocol = inoutProtocol" << endl;
-    indent(out) << "__outProtocol = inoutProtocol" << endl;
+    indent(out) << "__inProtocol = inoutProtocol" << '\n';
+    indent(out) << "__outProtocol = inoutProtocol" << '\n';
     block_close(out);
-    out << endl;
+    out << '\n';
 
     indent(out) << "public init(inProtocol: TProtocol, outProtocol: TProtocol)";
     block_open(out);
-    indent(out) << "__inProtocol = inProtocol" << endl;
-    indent(out) << "__outProtocol = outProtocol" << endl;
+    indent(out) << "__inProtocol = inProtocol" << '\n';
+    indent(out) << "__outProtocol = outProtocol" << '\n';
     block_close(out);
-    out << endl;
+    out << '\n';
   }
 
   block_close(out);
-  out << endl;
+  out << '\n';
 }
 
 /**
@@ -1736,24 +1734,24 @@
     out <<  " /* , " << tservice->get_name() << " */";
 
     block_open(out);
-    out << endl;
+    out << '\n';
   } else {
     indent(out) << "public class " << tservice->get_name() << "AsyncClient /* : " << tservice->get_name() << " */";
     block_open(out);
-    out << endl;
+    out << '\n';
 
-    indent(out) << "let __protocolFactory : TProtocolFactory" << endl << endl;
-    indent(out) << "let __transportFactory : TAsyncTransportFactory" << endl << endl;
+    indent(out) << "let __protocolFactory : TProtocolFactory" << '\n' << '\n';
+    indent(out) << "let __transportFactory : TAsyncTransportFactory" << '\n' << '\n';
     indent(out) << "public init(protocolFactory: TProtocolFactory, transportFactory: TAsyncTransportFactory)";
     block_open(out);
 
-    indent(out) << "__protocolFactory = protocolFactory" << endl;
-    indent(out) << "__transportFactory = transportFactory" << endl;
+    indent(out) << "__protocolFactory = protocolFactory" << '\n';
+    indent(out) << "__transportFactory = transportFactory" << '\n';
     block_close(out);
-    out << endl;
+    out << '\n';
   }
   block_close(out);
-  out << endl;
+  out << '\n';
 }
 
 /**
@@ -1767,34 +1765,34 @@
     indent(out) << "open class " << tservice->get_name() << "Processor /* " << tservice->get_name() << " */";
 
     block_open(out);
-    out << endl;
+    out << '\n';
     out << indent() << "typealias ProcessorHandlerDictionary = "
-        << "[String: (Int32, TProtocol, TProtocol, " << tservice->get_name() << ") throws -> Void]" << endl
-        << endl
-        << indent() << "public var service: " << tservice->get_name() << endl
-        << endl
+        << "[String: (Int32, TProtocol, TProtocol, " << tservice->get_name() << ") throws -> Void]" << '\n'
+        << '\n'
+        << indent() << "public var service: " << tservice->get_name() << '\n'
+        << '\n'
         << indent() << "public required init(service: " << tservice->get_name() << ")";
   } else {
     indent(out) << "public class " << tservice->get_name() << "Processor : NSObject /* "
                 << tservice->get_name() << " */";
     block_open(out);
-    out << endl;
+    out << '\n';
 
     out << indent() << "typealias ProcessorHandlerDictionary = "
-        << "[String: (Int, TProtocol, TProtocol, " << tservice->get_name() << ") throws -> Void]" << endl
-        << endl
-        << indent() << "let service : " << tservice->get_name() << endl
-        << endl
+        << "[String: (Int, TProtocol, TProtocol, " << tservice->get_name() << ") throws -> Void]" << '\n'
+        << '\n'
+        << indent() << "let service : " << tservice->get_name() << '\n'
+        << '\n'
         << indent() << "public init(service: " << tservice->get_name() << ")";
   }
 
   block_open(out);
-  indent(out) << "self.service = service" << endl;
+  indent(out) << "self.service = service" << '\n';
   block_close(out);
-  out << endl;
+  out << '\n';
 
   block_close(out);
-  out << endl;
+  out << '\n';
 }
 
 /**
@@ -1831,7 +1829,7 @@
     // Serialize the request
     indent(out) << "try outProtocol.writeMessageBegin(name: \"" << funname << "\", "
                 << "type: " << (tfunction->is_oneway() ? ".oneway" : ".call") << ", "
-                << "sequenceID: 0)" << endl;
+                << "sequenceID: 0)" << '\n';
 
     indent(out) << "let args = " << argsname << "(";
 
@@ -1847,18 +1845,18 @@
         out << ", ";
       }
     }
-    out << ")" << endl;
-    indent(out) << "try args.write(to: outProtocol)" << endl;
-    indent(out) << "try outProtocol.writeMessageEnd()" << endl;
+    out << ")" << '\n';
+    indent(out) << "try args.write(to: outProtocol)" << '\n';
+    indent(out) << "try outProtocol.writeMessageEnd()" << '\n';
   } else {
-    out << endl;
+    out << '\n';
 
     // Serialize the request
     indent(out) << "try __outProtocol.writeMessageBeginWithName(\"" << funname << "\", "
                 << "type: " << (tfunction->is_oneway() ? ".ONEWAY" : ".CALL") << ", "
-                << "sequenceID: 0)" << endl;
+                << "sequenceID: 0)" << '\n';
 
-    out << endl;
+    out << '\n';
 
     indent(out) << "let __args = " << argsname << "(";
 
@@ -1874,13 +1872,13 @@
         out << ", ";
       }
     }
-    out << ")" << endl;
-    indent(out) << "try " << argsname << ".writeValue(__args, toProtocol: __outProtocol)" << endl << endl;
-    indent(out) << "try __outProtocol.writeMessageEnd()" << endl;
+    out << ")" << '\n';
+    indent(out) << "try " << argsname << ".writeValue(__args, toProtocol: __outProtocol)" << '\n' << '\n';
+    indent(out) << "try __outProtocol.writeMessageEnd()" << '\n';
   }
 
   block_close(out);
-  out << endl;
+  out << '\n';
 }
 
 /**
@@ -1913,7 +1911,7 @@
 
     // check for an exception
 
-    indent(out) << "try inProtocol.readResultMessageBegin() " << endl;
+    indent(out) << "try inProtocol.readResultMessageBegin() " << '\n';
 
     string resultname = function_result_helper_struct_type(tservice, tfunction);
     indent(out);
@@ -1924,15 +1922,15 @@
     }
 
     string return_type_name = type_name(tfunction->get_returntype());
-    out << "try " << resultname << ".read(from: inProtocol)" << endl;
+    out << "try " << resultname << ".read(from: inProtocol)" << '\n';
 
-    indent(out) << "try inProtocol.readMessageEnd()" << endl << endl;
+    indent(out) << "try inProtocol.readMessageEnd()" << '\n' << '\n';
 
     // Careful, only return _result if not a void function
     if (!tfunction->get_returntype()->is_void()) {
       indent(out) << "if let success = result.success";
       block_open(out);
-      indent(out) << "return success" << endl;
+      indent(out) << "return success" << '\n';
       block_close(out);
     }
 
@@ -1943,14 +1941,14 @@
     for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) {
       indent(out) << "if let " << (*x_iter)->get_name() << " = result." << (*x_iter)->get_name();
       block_open(out);
-      indent(out) << "throw " << (*x_iter)->get_name() << endl;
+      indent(out) << "throw " << (*x_iter)->get_name() << '\n';
       block_close(out);
     }
 
     // If you get here it's an exception, unless a void function
     if (!tfunction->get_returntype()->is_void()) {
       indent(out) << "throw TApplicationError(error: .missingResult(methodName: \""
-                  << tfunction->get_name() << "\"))" << endl;
+                  << tfunction->get_name() << "\"))" << '\n';
     }
   } else {
     if (needs_protocol) {
@@ -1966,22 +1964,22 @@
     block_open(out);
 
     // check for an exception
-    out << endl;
-    indent(out) << "try __inProtocol.readResultMessageBegin() " << endl << endl;
+    out << '\n';
+    indent(out) << "try __inProtocol.readResultMessageBegin() " << '\n' << '\n';
     string resultname = function_result_helper_struct_type(tservice, tfunction);
     indent(out);
     if (!tfunction->get_returntype()->is_void() || !tfunction->get_xceptions()->get_members().empty()) {
       out << "let __result = ";
     }
-    out << "try " << resultname << ".readValueFromProtocol(__inProtocol)" << endl << endl;
+    out << "try " << resultname << ".readValueFromProtocol(__inProtocol)" << '\n' << '\n';
 
-    indent(out) << "try __inProtocol.readMessageEnd()" << endl << endl;
+    indent(out) << "try __inProtocol.readMessageEnd()" << '\n' << '\n';
 
     // Careful, only return _result if not a void function
     if (!tfunction->get_returntype()->is_void()) {
       indent(out) << "if let __success = __result.success";
       block_open(out);
-      indent(out) << "return __success" << endl;
+      indent(out) << "return __success" << '\n';
       block_close(out);
     }
 
@@ -1992,24 +1990,24 @@
     for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) {
       indent(out) << "if let " << (*x_iter)->get_name() << " = __result." << (*x_iter)->get_name();
       block_open(out);
-      indent(out) << "throw " << (*x_iter)->get_name() << endl;
+      indent(out) << "throw " << (*x_iter)->get_name() << '\n';
       block_close(out);
     }
 
     // If you get here it's an exception, unless a void function
     if (!tfunction->get_returntype()->is_void()) {
-      indent(out) << "throw NSError(" << endl;
+      indent(out) << "throw NSError(" << '\n';
       indent_up();
-      indent(out) << "domain: TApplicationErrorDomain, " << endl;
-      indent(out) << "code: Int(TApplicationError.MissingResult.rawValue)," << endl;
-      indent(out) << "userInfo: [TApplicationErrorMethodKey: \"" << tfunction->get_name() << "\"])" << endl;
+      indent(out) << "domain: TApplicationErrorDomain, " << '\n';
+      indent(out) << "code: Int(TApplicationError.MissingResult.rawValue)," << '\n';
+      indent(out) << "userInfo: [TApplicationErrorMethodKey: \"" << tfunction->get_name() << "\"])" << '\n';
       indent_down();
     }
   }
 
   // Close function
   block_close(out);
-  out << endl;
+  out << '\n';
 }
 
 /**
@@ -2035,7 +2033,7 @@
     }
   }
 
-  out << ")" << endl;
+  out << ")" << '\n';
 }
 
 /**
@@ -2061,7 +2059,7 @@
     out << ", " << (*f_iter)->get_name() << ": " << (*f_iter)->get_name();
   }
 
-  out << ")" << endl;
+  out << ")" << '\n';
 }
 
 /**
@@ -2075,7 +2073,7 @@
   string name = tservice->get_name() + "Client";
   indent(out) << "extension " << name << " : " << tservice->get_name();
   block_open(out);
-  out << endl;
+  out << '\n';
 
   // generate client method implementations
   vector<t_function*> functions = tservice->get_functions();
@@ -2092,28 +2090,28 @@
     indent(out) << "public " << function_signature(*f_iter);
     block_open(out);
 
-    if (gen_cocoa_) { out << endl; }
+    if (gen_cocoa_) { out << '\n'; }
 
     generate_swift_service_client_send_function_invocation(out, *f_iter);
     if (!gen_cocoa_) {
-      indent(out) << "try outProtocol.transport.flush()" << endl;
+      indent(out) << "try outProtocol.transport.flush()" << '\n';
     } else {
-      out << endl;
-      indent(out) << "try __outProtocol.transport().flush()" << endl << endl;
+      out << '\n';
+      indent(out) << "try __outProtocol.transport().flush()" << '\n' << '\n';
     }
 
     if (!(*f_iter)->is_oneway()) {
       if ((*f_iter)->get_returntype()->is_void()) {
-        indent(out) << "try recv_" << (*f_iter)->get_name() << "()" << endl;
+        indent(out) << "try recv_" << (*f_iter)->get_name() << "()" << '\n';
       } else {
-        indent(out) << "return try recv_" << (*f_iter)->get_name() << "()" << endl;
+        indent(out) << "return try recv_" << (*f_iter)->get_name() << "()" << '\n';
       }
     }
     block_close(out);
-    out << endl;
+    out << '\n';
   }
   block_close(out);
-  out << endl;
+  out << '\n';
 }
 
 /**
@@ -2131,7 +2129,7 @@
 
   indent(out) << "extension " << name << " : " << protocol_name;
   block_open(out);
-  out << endl;
+  out << '\n';
 
   // generate client method implementations
   vector<t_function*> functions = tservice->get_functions();
@@ -2146,10 +2144,10 @@
 
     indent(out) << "public " << async_function_signature(*f_iter);
     block_open(out);
-    out << endl;
-    out << indent() << "let transport   = factory.newTransport()" << endl
-        << indent() << "let proto = Protocol(on: transport)" << endl
-        << endl;
+    out << '\n';
+    out << indent() << "let transport   = factory.newTransport()" << '\n'
+        << indent() << "let proto = Protocol(on: transport)" << '\n'
+        << '\n';
 
     out << indent() << "do";
     block_open(out);
@@ -2157,12 +2155,12 @@
     generate_swift_service_client_send_async_function_invocation(out, *f_iter);
 
     indent_down();
-    out << indent() << "} catch let error {" << endl;
+    out << indent() << "} catch let error {" << '\n';
     indent_up();
-    out << indent() << "completion(.error(error))" << endl;
+    out << indent() << "completion(.error(error))" << '\n';
     block_close(out);
 
-    out << endl;
+    out << '\n';
 
     bool ret_is_void = (*f_iter)->get_returntype()->is_void();
     bool is_oneway = (*f_iter)->is_oneway();
@@ -2170,10 +2168,10 @@
     string error_completion_call = "completion(.error(error))";
     indent(out) << "transport.flush";
     block_open(out);
-    out << indent() << "(trans, error) in" << endl << endl;
+    out << indent() << "(trans, error) in" << '\n' << '\n';
     out << indent() << "if let error = error";
     block_open(out);
-    out << indent() << error_completion_call << endl;
+    out << indent() << error_completion_call << '\n';
     block_close(out);
 
     if (!is_oneway) {
@@ -2183,24 +2181,24 @@
       if (!ret_is_void) {
         out << "let result = ";
       }
-      out << "try self.recv_" << (*f_iter)->get_name() << "(on: proto)" << endl;
+      out << "try self.recv_" << (*f_iter)->get_name() << "(on: proto)" << '\n';
 
-      out << indent() << (ret_is_void ? "completion(.success(Void()))" : "completion(.success(result))") << endl;
+      out << indent() << (ret_is_void ? "completion(.success(Void()))" : "completion(.success(result))") << '\n';
       indent_down();
-      out << indent() << "} catch let error {" << endl;
+      out << indent() << "} catch let error {" << '\n';
       indent_up();
-      out << indent() << error_completion_call << endl;
+      out << indent() << error_completion_call << '\n';
 
       block_close(out);
     } else {
-      out << indent() << "completion(.success(Void()))" << endl;
+      out << indent() << "completion(.success(Void()))" << '\n';
     }
     block_close(out);
     block_close(out);
 
   }
   block_close(out);
-  out << endl;
+  out << '\n';
 }
 
 void t_swift_generator::generate_old_swift_service_client_async_implementation(ostream& out,
@@ -2211,7 +2209,7 @@
 
   indent(out) << "extension " << name << " : " << protocol_name;
   block_open(out);
-  out << endl;
+  out << '\n';
 
   // generate client method implementations
   vector<t_function*> functions = tservice->get_functions();
@@ -2226,19 +2224,19 @@
 
     indent(out) << "public " << async_function_signature(*f_iter);
     block_open(out);
-    out << endl;
+    out << '\n';
 
-    out << indent() << "let __transport = __transportFactory.newTransport()" << endl
-        << indent() << "let __protocol = __protocolFactory.newProtocolOnTransport(__transport)" << endl
-        << endl;
+    out << indent() << "let __transport = __transportFactory.newTransport()" << '\n'
+        << indent() << "let __protocol = __protocolFactory.newProtocolOnTransport(__transport)" << '\n'
+        << '\n';
 
     generate_swift_service_client_send_async_function_invocation(out, *f_iter);
-    out << endl;
+    out << '\n';
 
     indent(out) << "__transport.flushWithCompletion(";
 
     if ((*f_iter)->is_oneway()) {
-      out << "success, failure: failure)" << endl;
+      out << "success, failure: failure)" << '\n';
     }
     else {
       block_open(out);
@@ -2249,25 +2247,25 @@
       if (!(*f_iter)->get_returntype()->is_void()) {
         out << "let result = ";
       }
-      out << "try self.recv_" << (*f_iter)->get_name() << "(__protocol)" << endl;
+      out << "try self.recv_" << (*f_iter)->get_name() << "(__protocol)" << '\n';
 
       out << indent() << "success(";
       if (!(*f_iter)->get_returntype()->is_void()) {
         out << "result";
       }
-      out << ")" << endl;
+      out << ")" << '\n';
 
       block_close(out);
       indent(out) << "catch let error";
       block_open(out);
-      indent(out) << "failure(error as NSError)" << endl;
+      indent(out) << "failure(error as NSError)" << '\n';
       block_close(out);
       block_close(out);
-      indent(out) << ", failure: failure)" << endl;
+      indent(out) << ", failure: failure)" << '\n';
     }
 
     block_close(out);
-    out << endl;
+    out << '\n';
 
     // Promise function
     if (promise_kit_) {
@@ -2275,17 +2273,17 @@
       indent(out) << "public " << promise_function_signature(*f_iter);
       block_open(out);
 
-      out << indent() << "let (__promise, __fulfill, __reject) = Promise<" << type_name((*f_iter)->get_returntype()) << ">.pendingPromise()" << endl << endl
-          << indent() << "let __transport = __transportFactory.newTransport()" << endl
-          << indent() << "let __protocol = __protocolFactory.newProtocolOnTransport(__transport)" << endl
-          << endl;
+      out << indent() << "let (__promise, __fulfill, __reject) = Promise<" << type_name((*f_iter)->get_returntype()) << ">.pendingPromise()" << '\n' << '\n'
+          << indent() << "let __transport = __transportFactory.newTransport()" << '\n'
+          << indent() << "let __protocol = __protocolFactory.newProtocolOnTransport(__transport)" << '\n'
+          << '\n';
 
       generate_swift_service_client_send_async_function_invocation(out, *f_iter);
-      out << endl;
+      out << '\n';
       indent(out) << "__transport.flushWithCompletion(";
 
       if ((*f_iter)->is_oneway()) {
-        out << "{ __fulfill() }, failure: { __reject($0) })" << endl;
+        out << "{ __fulfill() }, failure: { __reject($0) })" << '\n';
       }
       else {
         block_open(out);
@@ -2296,37 +2294,37 @@
         if (!(*f_iter)->get_returntype()->is_void()) {
           out << "let result = ";
         }
-        out << "try self.recv_" << (*f_iter)->get_name() << "(__protocol)" << endl;
+        out << "try self.recv_" << (*f_iter)->get_name() << "(__protocol)" << '\n';
 
         out << indent() << "__fulfill(";
         if (!(*f_iter)->get_returntype()->is_void()) {
           out << "result";
         }
-        out << ")" << endl;
+        out << ")" << '\n';
 
         block_close(out);
         indent(out) << "catch let error";
         block_open(out);
-        indent(out) << "__reject(error)" << endl;
+        indent(out) << "__reject(error)" << '\n';
         block_close(out);
         block_close(out);
 
-        indent(out) << ", failure: { error in " << endl;
+        indent(out) << ", failure: { error in " << '\n';
         indent_up();
-        indent(out) << "__reject(error)" << endl;
+        indent(out) << "__reject(error)" << '\n';
         indent_down();
-        indent(out) << "})" << endl;
+        indent(out) << "})" << '\n';
       }
 
-      indent(out) << "return __promise" << endl;
+      indent(out) << "return __promise" << '\n';
       block_close(out);
-      out << endl;
+      out << '\n';
 
     }
 
   }
   block_close(out);
-  out << endl;
+  out << '\n';
 }
 
 /**
@@ -2345,12 +2343,12 @@
 
   indent(out) << "extension " << name << " : TProcessor";
   block_open(out);
-  out << endl;
+  out << '\n';
   indent(out) << "static let processorHandlers" << (gen_cocoa_ ? " " : "") << ": ProcessorHandlerDictionary =";
   block_open(out);
 
-  out << endl;
-  out << indent() << "var processorHandlers = ProcessorHandlerDictionary()" << endl << endl;
+  out << '\n';
+  out << indent() << "var processorHandlers = ProcessorHandlerDictionary()" << '\n' << '\n';
 
   // generate method map for routing incoming calls
   vector<t_function*> functions = tservice->get_functions();
@@ -2361,25 +2359,25 @@
 
     string args_type = function_args_helper_struct_type(tservice, *f_iter);
 
-    out << indent() << "processorHandlers[\"" << tfunction->get_name() << "\"] = { sequenceID, inProtocol, outProtocol, handler in" << endl
-        << endl;
+    out << indent() << "processorHandlers[\"" << tfunction->get_name() << "\"] = { sequenceID, inProtocol, outProtocol, handler in" << '\n'
+        << '\n';
 
     indent_up();
     if (!gen_cocoa_) {
-      out << indent() << "let args = try " << args_type << ".read(from: inProtocol)" << endl
-          << endl
-          << indent() << "try inProtocol.readMessageEnd()" << endl
-          << endl;
+      out << indent() << "let args = try " << args_type << ".read(from: inProtocol)" << '\n'
+          << '\n'
+          << indent() << "try inProtocol.readMessageEnd()" << '\n'
+          << '\n';
     } else {
-      out << indent() << "let args = try " << args_type << ".readValueFromProtocol(inProtocol)" << endl
-          << endl
-          << indent() << "try inProtocol.readMessageEnd()" << endl
-          << endl;
+      out << indent() << "let args = try " << args_type << ".readValueFromProtocol(inProtocol)" << '\n'
+          << '\n'
+          << indent() << "try inProtocol.readMessageEnd()" << '\n'
+          << '\n';
     }
 
     if (!tfunction->is_oneway() ) {
       string result_type = function_result_helper_struct_type(tservice, tfunction);
-      indent(out) << "var result = " << result_type << "()" << endl;
+      indent(out) << "var result = " << result_type << "()" << '\n';
 
       indent(out) << "do";
       block_open(out);
@@ -2406,7 +2404,7 @@
         }
       }
 
-      out << ")" << endl;
+      out << ")" << '\n';
       block_close(out);
 
       t_struct* xs = tfunction->get_xceptions();
@@ -2423,37 +2421,37 @@
           }
           out << (*x_iter)->get_type()->get_name();
 
-          out << " { result." << (*x_iter)->get_name() << " = error }" << endl;
+          out << " { result." << (*x_iter)->get_name() << " = error }" << '\n';
         }
 
-        indent(out) << "catch let error { throw error }" << endl;
-        out << endl;
+        indent(out) << "catch let error { throw error }" << '\n';
+        out << '\n';
 
         if (!tfunction->is_oneway()) {
-          out << indent() << "try outProtocol.writeMessageBegin(name: \"" << tfunction->get_name() << "\", type: .reply, sequenceID: sequenceID)" << endl
-              << indent() << "try result.write(to: outProtocol)" << endl
-              << indent() << "try outProtocol.writeMessageEnd()" << endl
-              << indent() << "try outProtocol.transport.flush()" << endl;
+          out << indent() << "try outProtocol.writeMessageBegin(name: \"" << tfunction->get_name() << "\", type: .reply, sequenceID: sequenceID)" << '\n'
+              << indent() << "try result.write(to: outProtocol)" << '\n'
+              << indent() << "try outProtocol.writeMessageEnd()" << '\n'
+              << indent() << "try outProtocol.transport.flush()" << '\n';
         }
       } else {
         for (x_iter = xfields.begin(); x_iter != xfields.end(); ++x_iter) {
           indent(out) << "catch let error as " << (*x_iter)->get_type()->get_name();
           block_open(out);
-          indent(out) << "result." << (*x_iter)->get_name() << " = error" << endl;
+          indent(out) << "result." << (*x_iter)->get_name() << " = error" << '\n';
           block_close(out);
         }
 
         indent(out) << "catch let error";
         block_open(out);
-        out << indent() << "throw error" << endl;
+        out << indent() << "throw error" << '\n';
         block_close(out);
 
-        out << endl;
+        out << '\n';
 
         if (!tfunction->is_oneway()) {
-          out << indent() << "try outProtocol.writeMessageBeginWithName(\"" << tfunction->get_name() << "\", type: .REPLY, sequenceID: sequenceID)" << endl
-              << indent() << "try " << result_type << ".writeValue(result, toProtocol: outProtocol)" << endl
-              << indent() << "try outProtocol.writeMessageEnd()" << endl;
+          out << indent() << "try outProtocol.writeMessageBeginWithName(\"" << tfunction->get_name() << "\", type: .REPLY, sequenceID: sequenceID)" << '\n'
+              << indent() << "try " << result_type << ".writeValue(result, toProtocol: outProtocol)" << '\n'
+              << indent() << "try outProtocol.writeMessageEnd()" << '\n';
         }
       }
     }
@@ -2461,11 +2459,11 @@
 
   }
 
-  indent(out) << "return processorHandlers" << endl;
+  indent(out) << "return processorHandlers" << '\n';
 
   block_close(out,false);
-  out << "()" << endl;
-  out << endl;
+  out << "()" << '\n';
+  out << '\n';
 
   if (!gen_cocoa_) {
     indent(out) << "public func process(on inProtocol: TProtocol, outProtocol: TProtocol) throws";
@@ -2474,47 +2472,47 @@
   }
   block_open(out);
 
-  out << endl;
-  out << indent() << "let (messageName, _, sequenceID) = try inProtocol.readMessageBegin()" << endl
-      << endl
+  out << '\n';
+  out << indent() << "let (messageName, _, sequenceID) = try inProtocol.readMessageBegin()" << '\n'
+      << '\n'
       << indent() << "if let processorHandler = " << name << ".processorHandlers[messageName]";
   block_open(out);
   out << indent() << "do";
   block_open(out);
-  out << indent() << "try processorHandler(sequenceID, inProtocol, outProtocol, service)" << endl;
+  out << indent() << "try processorHandler(sequenceID, inProtocol, outProtocol, service)" << '\n';
   block_close(out);
   if (!gen_cocoa_) {
     out << indent() << "catch let error as TApplicationError";
     block_open(out);
-    out << indent() << "try outProtocol.writeException(messageName: messageName, sequenceID: sequenceID, ex: error)" << endl
-        << indent() << "try outProtocol.transport.flush()" << endl;
+    out << indent() << "try outProtocol.writeException(messageName: messageName, sequenceID: sequenceID, ex: error)" << '\n'
+        << indent() << "try outProtocol.transport.flush()" << '\n';
     block_close(out);
     block_close(out);
     out << indent() << "else";
     block_open(out);
-    out << indent() << "try inProtocol.skip(type: .struct)" << endl
-        << indent() << "try inProtocol.readMessageEnd()" << endl
-        << indent() << "let ex = TApplicationError(error: .unknownMethod(methodName: messageName))" << endl
-        << indent() << "try outProtocol.writeException(messageName: messageName, sequenceID: sequenceID, ex: ex)" << endl
-        << indent() << "try outProtocol.transport.flush()" << endl;
+    out << indent() << "try inProtocol.skip(type: .struct)" << '\n'
+        << indent() << "try inProtocol.readMessageEnd()" << '\n'
+        << indent() << "let ex = TApplicationError(error: .unknownMethod(methodName: messageName))" << '\n'
+        << indent() << "try outProtocol.writeException(messageName: messageName, sequenceID: sequenceID, ex: ex)" << '\n'
+        << indent() << "try outProtocol.transport.flush()" << '\n';
   } else {
     out << indent() << "catch let error as NSError";
     block_open(out);
-    out << indent() << "try outProtocol.writeExceptionForMessageName(messageName, sequenceID: sequenceID, ex: error)" << endl;
+    out << indent() << "try outProtocol.writeExceptionForMessageName(messageName, sequenceID: sequenceID, ex: error)" << '\n';
     block_close(out);
     block_close(out);
     out << indent() << "else";
     block_open(out);
-    out << indent() << "try inProtocol.skipType(.STRUCT)" << endl
-        << indent() << "try inProtocol.readMessageEnd()" << endl
-        << indent() << "try outProtocol.writeExceptionForMessageName(messageName," << endl;
+    out << indent() << "try inProtocol.skipType(.STRUCT)" << '\n'
+        << indent() << "try inProtocol.readMessageEnd()" << '\n'
+        << indent() << "try outProtocol.writeExceptionForMessageName(messageName," << '\n';
     indent_up();
-    out << indent() << "sequenceID: sequenceID," << endl
-        << indent() << "ex: NSError(" << endl;
+    out << indent() << "sequenceID: sequenceID," << '\n'
+        << indent() << "ex: NSError(" << '\n';
     indent_up();
-    out << indent() << "domain: TApplicationErrorDomain, " << endl
-        << indent() << "code: Int(TApplicationError.UnknownMethod.rawValue), " << endl
-        << indent() << "userInfo: [TApplicationErrorMethodKey: messageName]))" << endl;
+    out << indent() << "domain: TApplicationErrorDomain, " << '\n'
+        << indent() << "code: Int(TApplicationError.UnknownMethod.rawValue), " << '\n'
+        << indent() << "userInfo: [TApplicationErrorMethodKey: messageName]))" << '\n';
     indent_down();
     indent_down();
   }
@@ -2522,7 +2520,7 @@
   block_close(out);
   block_close(out);
   block_close(out);
-  out << endl;
+  out << '\n';
 }
 
 /**
@@ -2812,27 +2810,27 @@
     // Description
     string doc = tfunction->get_doc();
     generate_docstring(out, doc);
-    indent(out) << "///" << endl;
+    indent(out) << "///" << '\n';
 
     // Parameters
     const vector<t_field*>& fields = tfunction->get_arglist()->get_members();
     vector<t_field*>::const_iterator f_iter;
     if (!fields.empty()) {
-      indent(out) << "/// - Parameters:" << endl;
+      indent(out) << "/// - Parameters:" << '\n';
       for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
         indent(out) << "///   - " << (*f_iter)->get_name() << ": ";
         string doc = (*f_iter)->get_doc();
         if (!doc.empty() && doc[doc.length()-1] == '\n') {
             doc.erase(doc.length()-1);
         }
-        out << doc << endl;
+        out << doc << '\n';
       }
     }
 
     // Returns
     t_type* ttype = tfunction->get_returntype();
     if (!ttype->is_void()) {
-      indent(out) << "/// - Returns: " << type_name(ttype) << endl;
+      indent(out) << "/// - Returns: " << type_name(ttype) << '\n';
     }
 
     // Throws
@@ -2845,7 +2843,7 @@
       if (*x_iter != xceptions.back()) {
         out << ", ";
       }    }
-    out << endl;
+    out << '\n';
 }
 
 /**
@@ -2865,20 +2863,20 @@
     // Description
     string doc = tfunction->get_doc();
     generate_docstring(out, doc);
-    indent(out) << "///" << endl;
+    indent(out) << "///" << '\n';
 
     // Parameters
     const vector<t_field*>& fields = tfunction->get_arglist()->get_members();
     vector<t_field*>::const_iterator f_iter;
     if (!fields.empty()) {
-      indent(out) << "/// - Parameters:" << endl;
+      indent(out) << "/// - Parameters:" << '\n';
       for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
         indent(out) << "///   - " << (*f_iter)->get_name() << ": ";
         string doc = (*f_iter)->get_doc();
         if (!doc.empty() && doc[doc.length()-1] == '\n') {
             doc.erase(doc.length()-1);
         }
-        out << doc << endl;
+        out << doc << '\n';
       }
     }
 
@@ -2894,7 +2892,7 @@
         out << ", ";
       }
     }
-    out << endl;
+    out << '\n';
 }
 
 /**
diff --git a/compiler/cpp/src/thrift/generate/t_xml_generator.cc b/compiler/cpp/src/thrift/generate/t_xml_generator.cc
index 68675cf..86c2718 100644
--- a/compiler/cpp/src/thrift/generate/t_xml_generator.cc
+++ b/compiler/cpp/src/thrift/generate/t_xml_generator.cc
@@ -39,9 +39,6 @@
 using std::stack;
 using std::set;
 
-static const string endl = "\n";
-static const string quot = "\"";
-
 static const string default_ns_prefix = "http://thrift.apache.org/xml/ns/";
 
 /**
@@ -196,7 +193,7 @@
   close_top_element();
   // TODO: indent any EOLs that may occur with msg
   // TODO: proper msg escaping needed?
-  f_xml_ << indent() << "<!-- " << msg << " -->"  << endl;
+  f_xml_ << indent() << "<!-- " << msg << " -->"  << '\n';
   top_element_is_empty = false;
 }
 
@@ -204,7 +201,7 @@
   if( top_element_is_open) {
     top_element_is_open = false;
     if (elements_.size() > 0 && top_element_is_empty) {
-      f_xml_ << ">" << endl;
+      f_xml_ << ">" << '\n';
     }
   }
 }
@@ -224,9 +221,9 @@
 void t_xml_generator::write_element_end() {
   indent_down();
   if (top_element_is_empty && top_element_is_open) {
-    f_xml_ << " />" << endl;
+    f_xml_ << " />" << '\n';
   } else {
-    f_xml_ << indent() << "</" << elements_.top() << ">" << endl;
+    f_xml_ << indent() << "</" << elements_.top() << ">" << '\n';
   }
   top_element_is_empty = false;
   elements_.pop();
@@ -248,7 +245,7 @@
   top_element_is_empty = false;
   f_xml_ << indent()
     << "<" << name << ">" << escape_xml_string(val) << "</" << name << ">"
-    << endl;
+    << '\n';
 }
 
 string t_xml_generator::escape_xml_string(const string& input) {
@@ -511,7 +508,7 @@
 
   default:
     indent_up();
-    f_xml_ << indent() << "<null />" << endl;
+    f_xml_ << indent() << "<null />" << '\n';
     indent_down();
     break;
   }
diff --git a/compiler/cpp/src/thrift/generate/t_xsd_generator.cc b/compiler/cpp/src/thrift/generate/t_xsd_generator.cc
index 1f58f3a..8dd84f0 100644
--- a/compiler/cpp/src/thrift/generate/t_xsd_generator.cc
+++ b/compiler/cpp/src/thrift/generate/t_xsd_generator.cc
@@ -36,8 +36,6 @@
 using std::stringstream;
 using std::vector;
 
-static const string endl = "\n"; // avoid ostream << std::endl flushes
-
 /**
  * XSD generator, creates an XSD for the base types etc.
  *
@@ -121,22 +119,22 @@
   string f_php_name = get_out_dir() + program_->get_name() + "_xsd.php";
   f_php_.open(f_php_name.c_str());
 
-  f_php_ << "<?php" << endl
-         << autogen_comment() << endl;
+  f_php_ << "<?php" << '\n'
+         << autogen_comment() << '\n';
 }
 
 void t_xsd_generator::close_generator() {
-  f_php_ << "?>" << endl;
+  f_php_ << "?>" << '\n';
   f_php_.close();
 }
 
 void t_xsd_generator::generate_typedef(t_typedef* ttypedef) {
-  indent(s_xsd_types_) << "<xsd:simpleType name=\"" << ttypedef->get_name() << "\">" << endl;
+  indent(s_xsd_types_) << "<xsd:simpleType name=\"" << ttypedef->get_name() << "\">" << '\n';
   indent_up();
   indent(s_xsd_types_) << "<xsd:restriction base=\"" << type_name(ttypedef->get_type()) << "\" />"
-                       << endl;
+                       << '\n';
   indent_down();
-  indent(s_xsd_types_) << "</xsd:simpleType>" << endl << endl;
+  indent(s_xsd_types_) << "</xsd:simpleType>" << '\n' << '\n';
 }
 
 void t_xsd_generator::generate_struct(t_struct* tstruct) {
@@ -144,12 +142,12 @@
   const vector<t_field*>& members = tstruct->get_members();
   bool xsd_all = tstruct->get_xsd_all();
 
-  indent(s_xsd_types_) << "<xsd:complexType name=\"" << tstruct->get_name() << "\">" << endl;
+  indent(s_xsd_types_) << "<xsd:complexType name=\"" << tstruct->get_name() << "\">" << '\n';
   indent_up();
   if (xsd_all) {
-    indent(s_xsd_types_) << "<xsd:all>" << endl;
+    indent(s_xsd_types_) << "<xsd:all>" << '\n';
   } else {
-    indent(s_xsd_types_) << "<xsd:sequence>" << endl;
+    indent(s_xsd_types_) << "<xsd:sequence>" << '\n';
   }
   indent_up();
 
@@ -164,12 +162,12 @@
 
   indent_down();
   if (xsd_all) {
-    indent(s_xsd_types_) << "</xsd:all>" << endl;
+    indent(s_xsd_types_) << "</xsd:all>" << '\n';
   } else {
-    indent(s_xsd_types_) << "</xsd:sequence>" << endl;
+    indent(s_xsd_types_) << "</xsd:sequence>" << '\n';
   }
   indent_down();
-  indent(s_xsd_types_) << "</xsd:complexType>" << endl << endl;
+  indent(s_xsd_types_) << "</xsd:complexType>" << '\n' << '\n';
 }
 
 void t_xsd_generator::generate_element(ostream& out,
@@ -185,15 +183,15 @@
   string snillable = nillable ? " nillable=\"true\"" : "";
 
   if (ttype->is_void() || ttype->is_list()) {
-    indent(out) << "<xsd:element name=\"" << name << "\"" << soptional << snillable << ">" << endl;
+    indent(out) << "<xsd:element name=\"" << name << "\"" << soptional << snillable << ">" << '\n';
     indent_up();
     if (attrs == nullptr && ttype->is_void()) {
-      indent(out) << "<xsd:complexType />" << endl;
+      indent(out) << "<xsd:complexType />" << '\n';
     } else {
-      indent(out) << "<xsd:complexType>" << endl;
+      indent(out) << "<xsd:complexType>" << '\n';
       indent_up();
       if (ttype->is_list()) {
-        indent(out) << "<xsd:sequence minOccurs=\"0\" maxOccurs=\"unbounded\">" << endl;
+        indent(out) << "<xsd:sequence minOccurs=\"0\" maxOccurs=\"unbounded\">" << '\n';
         indent_up();
         string subname;
         t_type* subtype = ((t_list*)ttype)->get_elem_type();
@@ -203,55 +201,55 @@
           subname = type_name(subtype);
         }
         f_php_ << "$GLOBALS['" << program_->get_name() << "_xsd_elt_" << name << "'] = '" << subname
-               << "';" << endl;
+               << "';" << '\n';
         generate_element(out, subname, subtype, nullptr, false, false, true);
         indent_down();
-        indent(out) << "</xsd:sequence>" << endl;
-        indent(out) << "<xsd:attribute name=\"list\" type=\"xsd:boolean\" />" << endl;
+        indent(out) << "</xsd:sequence>" << '\n';
+        indent(out) << "<xsd:attribute name=\"list\" type=\"xsd:boolean\" />" << '\n';
       }
       if (attrs != nullptr) {
         const vector<t_field*>& members = attrs->get_members();
         vector<t_field*>::const_iterator a_iter;
         for (a_iter = members.begin(); a_iter != members.end(); ++a_iter) {
           indent(out) << "<xsd:attribute name=\"" << (*a_iter)->get_name() << "\" type=\""
-                      << type_name((*a_iter)->get_type()) << "\" />" << endl;
+                      << type_name((*a_iter)->get_type()) << "\" />" << '\n';
         }
       }
       indent_down();
-      indent(out) << "</xsd:complexType>" << endl;
+      indent(out) << "</xsd:complexType>" << '\n';
     }
     indent_down();
-    indent(out) << "</xsd:element>" << endl;
+    indent(out) << "</xsd:element>" << '\n';
   } else {
     if (attrs == nullptr) {
       indent(out) << "<xsd:element name=\"" << name << "\""
                   << " type=\"" << type_name(ttype) << "\"" << soptional << snillable << " />"
-                  << endl;
+                  << '\n';
     } else {
       // Wow, all this work for a SIMPLE TYPE with attributes?!?!?!
       indent(out) << "<xsd:element name=\"" << name << "\"" << soptional << snillable << ">"
-                  << endl;
+                  << '\n';
       indent_up();
-      indent(out) << "<xsd:complexType>" << endl;
+      indent(out) << "<xsd:complexType>" << '\n';
       indent_up();
-      indent(out) << "<xsd:complexContent>" << endl;
+      indent(out) << "<xsd:complexContent>" << '\n';
       indent_up();
-      indent(out) << "<xsd:extension base=\"" << type_name(ttype) << "\">" << endl;
+      indent(out) << "<xsd:extension base=\"" << type_name(ttype) << "\">" << '\n';
       indent_up();
       const vector<t_field*>& members = attrs->get_members();
       vector<t_field*>::const_iterator a_iter;
       for (a_iter = members.begin(); a_iter != members.end(); ++a_iter) {
         indent(out) << "<xsd:attribute name=\"" << (*a_iter)->get_name() << "\" type=\""
-                    << type_name((*a_iter)->get_type()) << "\" />" << endl;
+                    << type_name((*a_iter)->get_type()) << "\" />" << '\n';
       }
       indent_down();
-      indent(out) << "</xsd:extension>" << endl;
+      indent(out) << "</xsd:extension>" << '\n';
       indent_down();
-      indent(out) << "</xsd:complexContent>" << endl;
+      indent(out) << "</xsd:complexContent>" << '\n';
       indent_down();
-      indent(out) << "</xsd:complexType>" << endl;
+      indent(out) << "</xsd:complexType>" << '\n';
       indent_down();
-      indent(out) << "</xsd:element>" << endl;
+      indent(out) << "</xsd:element>" << '\n';
     }
   }
 }
@@ -274,10 +272,10 @@
   }
 
   // Print the XSD header
-  f_xsd_ << "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>" << endl
-         << "<xsd:schema xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"" << ns << ">" << endl
+  f_xsd_ << "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>" << '\n'
+         << "<xsd:schema xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"" << ns << ">" << '\n'
          << xml_autogen_comment()
-         << endl;
+         << '\n';
 
   // Print out the type definitions
   indent(f_xsd_) << s_xsd_types_.str();
@@ -292,7 +290,7 @@
     string elemname = (*f_iter)->get_name() + "_response";
     t_type* returntype = (*f_iter)->get_returntype();
     generate_element(f_xsd_, elemname, returntype);
-    f_xsd_ << endl;
+    f_xsd_ << '\n';
 
     t_struct* xs = (*f_iter)->get_xceptions();
     const std::vector<t_field*>& xceptions = xs->get_members();
@@ -308,7 +306,7 @@
   }
 
   // Close the XSD document
-  f_xsd_ << endl << "</xsd:schema>" << endl;
+  f_xsd_ << '\n' << "</xsd:schema>" << '\n';
   f_xsd_.close();
 }
 
diff --git a/compiler/cpp/src/thrift/main.cc b/compiler/cpp/src/thrift/main.cc
index 5177076..56c5811 100644
--- a/compiler/cpp/src/thrift/main.cc
+++ b/compiler/cpp/src/thrift/main.cc
@@ -373,7 +373,12 @@
   }
 
   // Uh oh
-  pwarning(0, "Could not find include file %s\n", filename.c_str());
+  if (g_strict >= 192) {
+    // On strict mode this should be failure instead of warning
+    failure("Could not find include file %s", filename.c_str());
+  } else {
+    pwarning(0, "Could not find include file %s\n", filename.c_str());
+  }
   return std::string();
 }
 
diff --git a/compiler/cpp/test/Makefile.am b/compiler/cpp/test/Makefile.am
index 10efd07..6d4d09e 100644
--- a/compiler/cpp/test/Makefile.am
+++ b/compiler/cpp/test/Makefile.am
@@ -23,5 +23,8 @@
 
 AUTOMAKE_OPTIONS = subdir-objects serial-tests nostdinc
 
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
 AM_CPPFLAGS = -I$(top_srcdir)/compiler/cpp/src
 AM_CXXFLAGS = -Wall -Wextra -pedantic
diff --git a/compiler/cpp/tests/netcore/t_netcore_generator_helpers_tests.cc b/compiler/cpp/tests/netcore/t_netcore_generator_helpers_tests.cc
index 6acedc0..348ac9f 100644
--- a/compiler/cpp/tests/netcore/t_netcore_generator_helpers_tests.cc
+++ b/compiler/cpp/tests/netcore/t_netcore_generator_helpers_tests.cc
@@ -5,9 +5,9 @@
 // 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
@@ -36,7 +36,8 @@
                                 "using System.Threading;\n"
                                 "using System.Threading.Tasks;\n"
                                 "using Thrift;\n"
-                                "using Thrift.Collections;\n" + endl;
+                                "using Thrift.Collections;\n"
+                                "\n";
 
     t_program* program = new t_program(path, name);
     t_netstd_generator* gen = new t_netstd_generator(program, parsed_options, option_string);
@@ -65,7 +66,8 @@
                                     "using Thrift;\n"
                                     "using Thrift.Collections;\n"
                                     "using System.ServiceModel;\n"
-                                    "using System.Runtime.Serialization;\n" + endl;
+                                    "using System.Runtime.Serialization;\n"
+                                    "\n";
 
     t_program* program = new t_program(path, name);
     t_netstd_generator* gen = new t_netstd_generator(program, parsed_options, option_string);
diff --git a/composer.json b/composer.json
index 77248a9..684c1b3 100644
--- a/composer.json
+++ b/composer.json
@@ -23,8 +23,11 @@
     "require-dev": {
         "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
         "squizlabs/php_codesniffer": "3.*",
+        "php-mock/php-mock-phpunit": "^2.10",
         "ext-json": "*",
-        "ext-xml": "*"
+        "ext-xml": "*",
+        "ext-curl": "*",
+        "ext-pcntl": "*"
     },
     "autoload": {
         "psr-4": {"Thrift\\": "lib/php/lib/"}
diff --git a/configure.ac b/configure.ac
index 12a1168..c8eaa6d 100644
--- a/configure.ac
+++ b/configure.ac
@@ -214,7 +214,7 @@
   AC_PATH_PROG([GRADLE], [gradle])
   AC_SUBST(CLASSPATH)
   AC_SUBST(GRADLE_OPTS)
-  if test "x$JAVA" != "x" && test "x$JAVAC" != "x" && "x$GRADLE" != "x" ; then
+  if test "x$JAVA" != "x" && test "x$JAVAC" != "x" && test "x$GRADLE" != "x" ; then
     have_kotlin="yes"
   fi
 fi
diff --git a/contrib/fb303/TClientInfo.cpp b/contrib/fb303/TClientInfo.cpp
index a4b00cf..c30b42b 100644
--- a/contrib/fb303/TClientInfo.cpp
+++ b/contrib/fb303/TClientInfo.cpp
@@ -149,7 +149,7 @@
     char addrBuf[INET6_ADDRSTRLEN];
     const char* addrStr = info->getAddr(addrBuf, sizeof addrBuf);
     if (addrStr == nullptr) {
-      // cerr << "no addr!" << endl;
+      // cerr << "no addr!" << '\n';
       continue;
     }
 
@@ -160,7 +160,7 @@
     char buf[256];
     snprintf(buf, sizeof buf, "%d %s %s %.3f %llu", i, addrStr, callStr, secs,
              (uint64_t)info->getNCalls());
-               
+
     result.push_back(buf);
   }
 }
diff --git a/contrib/fb303/cpp/ServiceTracker.cpp b/contrib/fb303/cpp/ServiceTracker.cpp
index a2e670c..43e8847 100644
--- a/contrib/fb303/cpp/ServiceTracker.cpp
+++ b/contrib/fb303/cpp/ServiceTracker.cpp
@@ -344,7 +344,7 @@
       break;
     }
     cout << '[' << level_string << "] [" << now_pretty << "] "
-         << message << endl;
+         << message << '\n';
   }
 }
 
diff --git a/contrib/fb303/py/Makefile.am b/contrib/fb303/py/Makefile.am
index 060495e..706e10a 100644
--- a/contrib/fb303/py/Makefile.am
+++ b/contrib/fb303/py/Makefile.am
@@ -18,6 +18,9 @@
 #
 
 DESTDIR ?= /
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
 EXTRA_DIST = setup.py src
 
 all:
diff --git a/contrib/thrift_dump.cpp b/contrib/thrift_dump.cpp
index 59c8ac8..01864d0 100644
--- a/contrib/thrift_dump.cpp
+++ b/contrib/thrift_dump.cpp
@@ -80,12 +80,12 @@
       }
     }
   } catch (TProtocolException exn) {
-    cout << "Protocol Exception: " << exn.what() << endl;
+    cout << "Protocol Exception: " << exn.what() << '\n';
   } catch (...) {
     oprot->getTransport()->flush();
   }
 
-  cout << endl;
+  cout << '\n';
 
   return 0;
 }
diff --git a/contrib/zeromq/test-client.cpp b/contrib/zeromq/test-client.cpp
index 159c250..f2bd213 100644
--- a/contrib/zeromq/test-client.cpp
+++ b/contrib/zeromq/test-client.cpp
@@ -33,7 +33,7 @@
     usleep(50000);
   } else {
     int value = client.get();
-    std::cout << value << std::endl;
+    std::cout << value << '\n';
   }
 
   return 0;
diff --git a/debian/changelog b/debian/changelog
index 4089829..147c4b4 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+thrift (0.20.0) stable; urgency=low
+
+  * update to 0.20.0
+
+ -- Apache Thrift Developers <dev@thrift.apache.org>  Sat, 04 Feb 2024 14:55:00 +0100
+
 thrift (0.19.0) stable; urgency=low
 
   * update to 0.19.0
diff --git a/debian/copyright b/debian/copyright
index e39dc74..76212b9 100644
--- a/debian/copyright
+++ b/debian/copyright
@@ -72,8 +72,12 @@
   lib/netstd/Thrift/Transport/TTransport.cs
   lib/netstd/Thrift/Transport/TTransportException.cs
   lib/netstd/Thrift/Transport/TTransportFactory.cs
-  lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Properties/AssemblyInfo.cs
-  lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift.PublicInterfaces.Compile.Tests.csproj
+  lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.netstd2/Properties/AssemblyInfo.cs
+  lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.netstd2/Thrift.Compile.netstd2.csproj
+  lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net6/Properties/AssemblyInfo.cs
+  lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net6/Thrift.Compile.net6.csproj
+  lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net8/Properties/AssemblyInfo.cs
+  lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net8/Thrift.Compile.net8.csproj
   lib/rb/lib/thrift.rb
   lib/st/README.md
   lib/st/thrift.st
diff --git a/doap.rdf b/doap.rdf
index 6ad3026..703082a 100644
--- a/doap.rdf
+++ b/doap.rdf
@@ -57,17 +57,22 @@
     <release rdf:parseType="Collection">
       <Version>
         <name>Apache Thrift</name>
-        <created>2022-07-15</created>
+        <created>2024-02-04</created>
+        <revision>0.20.0</revision>
+      </Version>
+      <Version>
+        <name>Apache Thrift</name>
+        <created>2023-07-15</created>
         <revision>0.19.0</revision>
       </Version>
       <Version>
         <name>Apache Thrift</name>
-        <created>2022-02-15</created>
+        <created>2023-02-15</created>
         <revision>0.18.1</revision>
       </Version>
       <Version>
         <name>Apache Thrift</name>
-        <created>2022-02-06</created>
+        <created>2023-02-06</created>
         <revision>0.18.0</revision>
       </Version>
       <Version>
diff --git a/doc/ReleaseManagement.md b/doc/ReleaseManagement.md
index e06c9b4..7b6f008 100644
--- a/doc/ReleaseManagement.md
+++ b/doc/ReleaseManagement.md
@@ -126,12 +126,12 @@
         THRIFT-123  C++ - Library  Drop C++03  [THRIFT-123](https://issues.apache.org/jira/browse/THRIFT-3978) - Drop C++03
         ```
 
-        For example, if the row above was row "B" in EXCEL it would look something like:
+        For example, if the row above was row "1" in EXCEL it would look something like:
 
         ```text
-        =CONCAT("[", B1, "]",
+        =CONCAT("[", A1, "]",
                 "https://issues.apache.org/jira/browse/", 
-                B1, " - ", B3)
+                A1, " - ", C1)
         ```
 
     1. Create a level 3 section in `CHANGES.md` under the release for each component and copy the items from the RelNote column into the changes file.
@@ -148,12 +148,16 @@
         ~$ git clone -b "release/1.0.0" git@github.com:apache/thrift.git thrift-1.0.0-src
         ```
 
-    1. In the clean copy of the release branch, start a docker build container and run `make dist`:
-
-        ```code
-        ~$ cd thrift-1.0.0-src
-        ~/thrift-1.0.0-src$ docker run -v $(pwd):/thrift/src:rw \
-            -it thrift/thrift-build:ubuntu-bionic /bin/bash
+    1. In the clean copy of the release branch, build the container image:
+	
+        ```bash
+        ~$ docker build -t thrift build/docker/ubuntu-jammy
+        ```
+	
+    1. Run the container and `make dist`:
+	
+        ```bash
+        ~$ docker run -v $(pwd):/thrift/src -it thrift /bin/bash
         root@8b4101188aa2:/thrift/src# ./bootstrap.sh && ./configure && make dist
         ```
 
@@ -275,9 +279,10 @@
     The CHANGES list for this release is available at:
     https://github.com/apache/thrift/blob/release/1.0.0/CHANGES.md
 
-
     Please download, verify sig/sum, install and test the libraries and languages of your choice.
 
+    I start this voting thread with my own +1 vote.
+
     This vote will close in 72 hours on 2019-07-06 21:00 UTC
 
     [ ] +1 Release this as Apache Thrift 1.0.0
diff --git a/doc/specs/thrift-compact-protocol.md b/doc/specs/thrift-compact-protocol.md
index a31a2d3..95145b7 100644
--- a/doc/specs/thrift-compact-protocol.md
+++ b/doc/specs/thrift-compact-protocol.md
@@ -48,43 +48,38 @@
 
 ### Integer encoding
 
-The _compact protocol_ uses multiple encodings for ints: the _zigzag int_, and the _var int_.
+The _compact protocol_ uses [ZigZag](https://en.wikipedia.org/wiki/Variable-length_quantity#Zigzag_encoding)'ed
+varint (aka [ULEB128](https://en.wikipedia.org/wiki/LEB128)) encoding.
 
-Values of type `int32` and `int64` are first transformed to a *zigzag int*. A zigzag int folds positive and negative
-numbers into the positive number space. When we read 0, 1, 2, 3, 4 or 5 from the wire, this is translated to 0, -1, 1,
--2 or 2 respectively. Here are the (Scala) formulas to convert from int32/int64 to a zigzag int and back:
+Values of type `int8` are encoded as one byte, rest are converted to `int64`, Zigzag'ed then encoded as varint.
+Zigzag encoding maps signed integers to another domain, one where the sign bit is encoded in the least significant
+bit (LSB). For example 0 maps to 0, -1 to 1, 1 to 2, -2 to 3, etc. Hence the term zigzag. Mapping the sign bit to
+the LSB is important for compactness when the absolute value of the value is small, as ULEB encoding is more
+efficient for small values. Here are the (Scala) formulas to convert from `int64` to a zigzag `int64` and back:
 
 ```scala
-def intToZigZag(n: Int): Int = (n << 1) ^ (n >> 31)
-def zigzagToInt(n: Int): Int = (n >>> 1) ^ - (n & 1)
-def longToZigZag(n: Long): Long = (n << 1) ^ (n >> 63)
-def zigzagToLong(n: Long): Long = (n >>> 1) ^ - (n & 1)
+def ToZigzag(n: Long): Long = (n << 1) ^ (n >> 63)
+def FromZigzag(n: Long): Long = (n >>> 1) ^ - (n & 1)
 ```
 
-The zigzag int is then encoded as a *var int*, also known as *Unsigned LEB128*.  Var ints take 1 to 5 bytes (int32) or 
-1 to 10 bytes (int64). The process consists in taking a Big Endian unsigned integer, left-padding the bit-string to 
-make it a multiple of 7 bits, splitting it into 7-bit groups, prefixing the most-significant 7-bit group with the 0 
-bit, prefixing the remaining 7-bit groups with the 1 bit and encoding the resulting bit-string in Little Endian.
+A ULEB128 is encoded 7-bits at a time, starting from the LSB. Each 7-bits are encoded as 8-bits with the top bit set
+if this is not the last byte, unset otherwise.
 
 For example, the integer 50399 is encoded as follows:
 
 ```
-50399 = 1100 0100 1101 1111         (Big Endian representation)
-      = 00000 1100 0100 1101 1111   (Left-padding)
-      = 0000011 0001001 1011111     (7-bit groups)
-      = 00000011 10001001 11011111  (Most-significant bit prefixes)
-      = 11011111 10001001 00000011  (Little Endian representation)
-      = 0xDF 0x89 0x03
+50399 =          11000100 11011111  (LSB)
+      =  0000011  0001001  1011111  (7-bit groups)
+      = 00000011 10001001 11011111  (add continuation bits)
+      =     0x03     0x89     0xDF  (hex)
+→ 0xDF 0x89 0x03 (write to ram LSB first)
 ```
 
-Var ints are sometimes used directly inside the compact protocol to represent positive numbers.
-
-To encode an `int16` as zigzag int, it is first converted to an `int32` and then encoded as such. The type `int8` simply
-uses a single byte as in the binary protocol.
+Varints are sometimes used directly inside the compact protocol to represent positive numbers.
 
 ### Enum encoding
 
-The generated code encodes `Enum`s by taking the ordinal value and then encoding that as an int32.
+The generated code encodes `Enum`s by taking the ordinal value and then encoding that as an `int32`.
 
 ### Binary encoding
 
@@ -99,36 +94,33 @@
 
 Where:
 
-* `byte length` is the length of the byte array, using var int encoding (must be >= 0).
+* `byte length` is the length of the byte array, using varint encoding (must be >= 0).
 * `bytes` are the bytes of the byte array.
 
 ### String encoding
 
-*String*s are first encoded to UTF-8, and then send as binary. They do not
-include a NUL delimiter.
+*String*s are first encoded to UTF-8, and then send as binary. They do not include a NUL delimiter.
 
 ### Double encoding
 
-Values of type `double` are first converted to an int64 according to the IEEE 754 floating-point "double format" bit
-layout. Most run-times provide a library to make this conversion. But while the binary protocol encodes the int64 
-in 8 bytes in big endian order, the compact protocol encodes it in little endian order - this is due to an early 
-implementation bug that finally became the de-facto standard.
+Values of type `double` are first converted to an `int64` according to the IEEE 754 floating-point "double format"
+bit layout. Most run-times provide a library to make this conversion. But while the binary protocol encodes the
+`int64` in 8 bytes in big endian order, the compact protocol encodes it in little endian order - this is due to an
+early implementation bug that finally became the de-facto standard.
 
 ### Boolean encoding
 
 Booleans are encoded differently depending on whether it is a field value (in a struct) or an element value (in a set,
-list or map). Field values are encoded directly in the field header. Element values of type `bool` are sent as an int8;
-true as `1` and false as `0`.
+list or map). Field values are encoded directly in the field header. Element values of type `bool` are sent as an
+`int8`; true as `1` and false as `0`.
 
 ### Universal unique identifier encoding
 
-Values of `uuid` type are expected as 16-byte binary in big endian (or "network") order. Byte order conversion 
-might be necessary on certain platforms, e.g. Windows holds GUIDs in a complex record-like structure whose 
-memory layout differs.
+Values of `uuid` type are expected as 16-byte binary in big endian order. Byte order conversion might be necessary on
+certain platforms, e.g. Windows holds GUIDs in a complex record-like structure whose memory layout differs.
 
 *Note*: Since the length is fixed, no `byte length` prefix is necessary and the field is always 16 bytes long.
 
-
 ## Message
 
 A `Message` on the wire looks as follows:
@@ -145,8 +137,8 @@
 * `pppppppp` is the protocol id, fixed to `1000 0010`, 0x82.
 * `mmm` is the message type, an unsigned 3 bit integer.
 * `vvvvv` is the version, an unsigned 5 bit integer, fixed to `00001`.
-* `seq id` is the sequence id, a signed 32 bit integer encoded as a var int.
-* `name length` is the byte length of the name field, a signed 32 bit integer encoded as a var int (must be >= 0).
+* `seq id` is the sequence id, a signed 32 bit integer encoded as a varint.
+* `name length` is the byte length of the name field, a signed 32 bit integer encoded as a varint (must be >= 0).
 * `name` is the method name to invoke, a UTF-8 encoded string.
 
 Message types are encoded with the following values:
@@ -204,7 +196,7 @@
 
 * `dddd` is the field id delta, an unsigned 4 bits integer, strictly positive.
 * `tttt` is field-type id, an unsigned 4 bit integer.
-* `field id` the field id, a signed 16 bit integer encoded as zigzag int.
+* `field id` the field id, a varint (int16). Max field id is 32767.
 * `field-value` the encoded field value.
 
 The field id delta can be computed by `current-field-id - previous-field-id`, or just `current-field-id` if this is the
@@ -250,7 +242,7 @@
 
 * `ssss` is the size, 4 bit unsigned int, values `0` - `14`
 * `tttt` is the element-type, a 4 bit unsigned int
-* `size` is the size, a var int (int32), positive values `15` or higher
+* `size` is the size, a varint (int32), positive values `15` or higher
 * `elements` are the encoded elements
 
 The short form should be used when the length is in the range 0 - 14 (inclusive).
diff --git a/lib/Makefile.am b/lib/Makefile.am
index 3f717f1..19177cc 100644
--- a/lib/Makefile.am
+++ b/lib/Makefile.am
@@ -102,6 +102,9 @@
 
 # All of the libs that don't use Automake need to go in here
 # so they will end up in our release tarballs.
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
 EXTRA_DIST = \
 	d \
 	dart \
diff --git a/lib/c_glib/Makefile.am b/lib/c_glib/Makefile.am
index b2061bb..80a5165 100644
--- a/lib/c_glib/Makefile.am
+++ b/lib/c_glib/Makefile.am
@@ -112,6 +112,9 @@
                             src/thrift/c_glib/processor/thrift_multiplexed_processor.h
 
 
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
 EXTRA_DIST = \
              CMakeLists.txt \
              coding_standards.md \
diff --git a/lib/c_glib/test/CMakeLists.txt b/lib/c_glib/test/CMakeLists.txt
index 4d3092f..4f60473 100644
--- a/lib/c_glib/test/CMakeLists.txt
+++ b/lib/c_glib/test/CMakeLists.txt
@@ -231,7 +231,7 @@
     gen-cpp/ThriftTest.h
     gen-cpp/ThriftTest_constants.h
     gen-cpp/ThriftTest_types.h
-    COMMAND ${THRIFT_COMPILER} --gen cpp ${PROJECT_SOURCE_DIR}/test/v0.16/ThriftTest.thrift
+    COMMAND ${THRIFT_COMPILER} --gen cpp ${PROJECT_SOURCE_DIR}/test/ThriftTest.thrift
 )
 
 # TODO: Add memory checks using ctest_memcheck or similar
diff --git a/lib/c_glib/test/Makefile.am b/lib/c_glib/test/Makefile.am
index f3a0c30..0a5f220 100644
--- a/lib/c_glib/test/Makefile.am
+++ b/lib/c_glib/test/Makefile.am
@@ -335,7 +335,7 @@
 gen-c_glib/t_test_second_service.c gen-c_glib/t_test_thrift_test.c gen-c_glib/t_test_thrift_test_types.c gen-c_glib/t_test_second_service.h gen-c_glib/t_test_thrift_test.h gen-c_glib/t_test_thrift_test_types.h: ../../../test/v0.16/ThriftTest.thrift $(THRIFT)
 	$(THRIFT) --gen c_glib $<
 
-gen-cpp/ThriftTest.cpp gen-cpp/ThriftTest_constants.cpp gen-cpp/ThriftTest_types.cpp: ../../../test/v0.16/ThriftTest.thrift $(THRIFT)
+gen-cpp/ThriftTest.cpp gen-cpp/ThriftTest_constants.cpp gen-cpp/ThriftTest_types.cpp: ../../../test/ThriftTest.thrift $(THRIFT)
 	$(THRIFT) --gen cpp $<
 
 TESTS = \
@@ -401,6 +401,9 @@
     *.gcda                              \
     *.gcov
 
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
 EXTRA_DIST = \
              CMakeLists.txt \
              ContainerTest.thrift
diff --git a/lib/c_glib/test/testthrifttestclient.cpp b/lib/c_glib/test/testthrifttestclient.cpp
index 77daf3d..77cd24a 100644
--- a/lib/c_glib/test/testthrifttestclient.cpp
+++ b/lib/c_glib/test/testthrifttestclient.cpp
@@ -51,7 +51,6 @@
 using namespace thrift::test;
 
 using std::cout;
-using std::endl;
 using std::fixed;
 using std::make_pair;
 using std::map;
@@ -76,51 +75,56 @@
   TestHandler() = default;
 
   void testVoid() override {
-    cout << "[C -> C++] testVoid()" << endl;
+    cout << "[C -> C++] testVoid()" << '\n';
   }
 
   void testString(string& out, const string &thing) override {
-    cout << "[C -> C++] testString(\"" << thing << "\")" << endl;
+    cout << "[C -> C++] testString(\"" << thing << "\")" << '\n';
     out = thing;
   }
 
   bool testBool(const bool thing) override {
-    cout << "[C -> C++] testBool(" << (thing ? "true" : "false") << ")" << endl;
+    cout << "[C -> C++] testBool(" << (thing ? "true" : "false") << ")" << '\n';
     return thing;
   }
   int8_t testByte(const int8_t thing) override {
-    cout << "[C -> C++] testByte(" << (int)thing << ")" << endl;
+    cout << "[C -> C++] testByte(" << (int)thing << ")" << '\n';
     return thing;
   }
   int32_t testI32(const int32_t thing) override {
-    cout << "[C -> C++] testI32(" << thing << ")" << endl;
+    cout << "[C -> C++] testI32(" << thing << ")" << '\n';
     return thing;
   }
 
   int64_t testI64(const int64_t thing) override {
-    cout << "[C -> C++] testI64(" << thing << ")" << endl;
+    cout << "[C -> C++] testI64(" << thing << ")" << '\n';
     return thing;
   }
 
   double testDouble(const double thing) override {
     cout.precision(6);
-    cout << "[C -> C++] testDouble(" << fixed << thing << ")" << endl;
+    cout << "[C -> C++] testDouble(" << fixed << thing << ")" << '\n';
     return thing;
   }
 
   void testBinary(string& out, const string &thing) override {
-    cout << "[C -> C++] testBinary(\"" << thing << "\")" << endl;
+    cout << "[C -> C++] testBinary(\"" << thing << "\")" << '\n';
     out = thing;
   }
 
+  std::string testUuid(const std::string thing) override {
+    cout << "[C -> C++] testUuid(\"" << std::hex << thing << "\")" << '\n';
+    return thing;
+  }
+
   void testStruct(Xtruct& out, const Xtruct &thing) override {
-    cout << "[C -> C++] testStruct({\"" << thing.string_thing << "\", " << (int)thing.byte_thing << ", " << thing.i32_thing << ", " << thing.i64_thing << "})" << endl;
+    cout << "[C -> C++] testStruct({\"" << thing.string_thing << "\", " << (int)thing.byte_thing << ", " << thing.i32_thing << ", " << thing.i64_thing << "})" << '\n';
     out = thing;
   }
 
   void testNest(Xtruct2& out, const Xtruct2& nest) override {
     const Xtruct &thing = nest.struct_thing;
-    cout << "[C -> C++] testNest({" << (int)nest.byte_thing << ", {\"" << thing.string_thing << "\", " << (int)thing.byte_thing << ", " << thing.i32_thing << ", " << thing.i64_thing << "}, " << nest.i32_thing << "})" << endl;
+    cout << "[C -> C++] testNest({" << (int)nest.byte_thing << ", {\"" << thing.string_thing << "\", " << (int)thing.byte_thing << ", " << thing.i32_thing << ", " << thing.i64_thing << "}, " << nest.i32_thing << "})" << '\n';
     out = nest;
   }
 
@@ -136,7 +140,7 @@
       }
       cout << m_iter->first << " => " << m_iter->second;
     }
-    cout << "})" << endl;
+    cout << "})" << '\n';
     out = thing;
   }
 
@@ -152,7 +156,7 @@
       }
       cout << "\"" << m_iter->first << "\" => \"" << m_iter->second << "\"";
     }
-    cout << "})" << endl;
+    cout << "})" << '\n';
     out = thing;
   }
 
@@ -169,7 +173,7 @@
       }
       cout << *s_iter;
     }
-    cout << "})" << endl;
+    cout << "})" << '\n';
     out = thing;
   }
 
@@ -185,21 +189,21 @@
       }
       cout << *l_iter;
     }
-    cout << "})" << endl;
+    cout << "})" << '\n';
     out = thing;
   }
 
   Numberz::type testEnum(const Numberz::type thing) override {
-    cout << "[C -> C++] testEnum(" << thing << ")" << endl;
+    cout << "[C -> C++] testEnum(" << thing << ")" << '\n';
     return thing;
   }
 
   UserId testTypedef(const UserId thing) override {
-    cout << "[C -> C++] testTypedef(" << thing << ")" << endl;
+    cout << "[C -> C++] testTypedef(" << thing << ")" << '\n';
     return thing;  }
 
   void testMapMap(map<int32_t, map<int32_t,int32_t> > &mapmap, const int32_t hello) override {
-    cout << "[C -> C++] testMapMap(" << hello << ")" << endl;
+    cout << "[C -> C++] testMapMap(" << hello << ")" << '\n';
 
     map<int32_t,int32_t> pos;
     map<int32_t,int32_t> neg;
@@ -216,7 +220,7 @@
   void testInsanity(map<UserId, map<Numberz::type,Insanity> > &insane, const Insanity &argument) override {
     THRIFT_UNUSED_VARIABLE (argument);
 
-    cout << "[C -> C++] testInsanity()" << endl;
+    cout << "[C -> C++] testInsanity()" << '\n';
 
     Xtruct hello;
     hello.string_thing = "Hello2";
@@ -278,7 +282,7 @@
       }
       cout << "}, ";
     }
-    cout << "}" << endl;
+    cout << "}" << '\n';
 
 
   }
@@ -288,7 +292,7 @@
     THRIFT_UNUSED_VARIABLE (arg4);
     THRIFT_UNUSED_VARIABLE (arg5);
 
-    cout << "[C -> C++] testMulti()" << endl;
+    cout << "[C -> C++] testMulti()" << '\n';
 
     hello.string_thing = "Hello2";
     hello.byte_thing = arg0;
@@ -299,7 +303,7 @@
   void testException(const std::string &arg)
     noexcept(false)  override
   {
-    cout << "[C -> C++] testException(" << arg << ")" << endl;
+    cout << "[C -> C++] testException(" << arg << ")" << '\n';
     if (arg.compare("Xception") == 0) {
       Xception e;
       e.errorCode = 1001;
@@ -317,7 +321,7 @@
 
   void testMultiException(Xtruct &result, const std::string &arg0, const std::string &arg1) noexcept(false) override {
 
-    cout << "[C -> C++] testMultiException(" << arg0 << ", " << arg1 << ")" << endl;
+    cout << "[C -> C++] testMultiException(" << arg0 << ", " << arg1 << ")" << '\n';
 
     if (arg0.compare("Xception") == 0) {
       Xception e;
@@ -336,9 +340,9 @@
   }
 
   void testOneway(int sleepFor) override {
-    cout << "testOneway(" << sleepFor << "): Sleeping..." << endl;
+    cout << "testOneway(" << sleepFor << "): Sleeping..." << '\n';
     sleep(sleepFor);
-    cout << "testOneway(" << sleepFor << "): done sleeping!" << endl;
+    cout << "testOneway(" << sleepFor << "): done sleeping!" << '\n';
   }
 };
 
diff --git a/lib/c_glib/test/testthrifttestzlibclient.cpp b/lib/c_glib/test/testthrifttestzlibclient.cpp
index 5c4b931..7c0f24a 100644
--- a/lib/c_glib/test/testthrifttestzlibclient.cpp
+++ b/lib/c_glib/test/testthrifttestzlibclient.cpp
@@ -46,7 +46,6 @@
 using namespace thrift::test;
 
 using std::cout;
-using std::endl;
 using std::fixed;
 using std::make_pair;
 using std::map;
@@ -71,51 +70,56 @@
   TestHandler() = default;
 
   void testVoid() override {
-    cout << "[C -> C++] testVoid()" << endl;
+    cout << "[C -> C++] testVoid()" << '\n';
   }
 
   void testString(string& out, const string &thing) override {
-    cout << "[C -> C++] testString(\"" << thing << "\")" << endl;
+    cout << "[C -> C++] testString(\"" << thing << "\")" << '\n';
     out = thing;
   }
 
   bool testBool(const bool thing) override {
-    cout << "[C -> C++] testBool(" << (thing ? "true" : "false") << ")" << endl;
+    cout << "[C -> C++] testBool(" << (thing ? "true" : "false") << ")" << '\n';
     return thing;
   }
   int8_t testByte(const int8_t thing) override {
-    cout << "[C -> C++] testByte(" << (int)thing << ")" << endl;
+    cout << "[C -> C++] testByte(" << (int)thing << ")" << '\n';
     return thing;
   }
   int32_t testI32(const int32_t thing) override {
-    cout << "[C -> C++] testI32(" << thing << ")" << endl;
+    cout << "[C -> C++] testI32(" << thing << ")" << '\n';
     return thing;
   }
 
   int64_t testI64(const int64_t thing) override {
-    cout << "[C -> C++] testI64(" << thing << ")" << endl;
+    cout << "[C -> C++] testI64(" << thing << ")" << '\n';
     return thing;
   }
 
   double testDouble(const double thing) override {
     cout.precision(6);
-    cout << "[C -> C++] testDouble(" << fixed << thing << ")" << endl;
+    cout << "[C -> C++] testDouble(" << fixed << thing << ")" << '\n';
     return thing;
   }
 
   void testBinary(string& out, const string &thing) override {
-    cout << "[C -> C++] testBinary(\"" << thing << "\")" << endl;
+    cout << "[C -> C++] testBinary(\"" << thing << "\")" << '\n';
     out = thing;
   }
 
+  std::string testUuid(const std::string thing) override {
+    cout << "[C -> C++] testUuid(\"" << std::hex << thing << "\")" << '\n';
+    return thing;
+  }
+
   void testStruct(Xtruct& out, const Xtruct &thing) override {
-    cout << "[C -> C++] testStruct({\"" << thing.string_thing << "\", " << (int)thing.byte_thing << ", " << thing.i32_thing << ", " << thing.i64_thing << "})" << endl;
+    cout << "[C -> C++] testStruct({\"" << thing.string_thing << "\", " << (int)thing.byte_thing << ", " << thing.i32_thing << ", " << thing.i64_thing << "})" << '\n';
     out = thing;
   }
 
   void testNest(Xtruct2& out, const Xtruct2& nest) override {
     const Xtruct &thing = nest.struct_thing;
-    cout << "[C -> C++] testNest({" << (int)nest.byte_thing << ", {\"" << thing.string_thing << "\", " << (int)thing.byte_thing << ", " << thing.i32_thing << ", " << thing.i64_thing << "}, " << nest.i32_thing << "})" << endl;
+    cout << "[C -> C++] testNest({" << (int)nest.byte_thing << ", {\"" << thing.string_thing << "\", " << (int)thing.byte_thing << ", " << thing.i32_thing << ", " << thing.i64_thing << "}, " << nest.i32_thing << "})" << '\n';
     out = nest;
   }
 
@@ -131,7 +135,7 @@
       }
       cout << m_iter->first << " => " << m_iter->second;
     }
-    cout << "})" << endl;
+    cout << "})" << '\n';
     out = thing;
   }
 
@@ -147,7 +151,7 @@
       }
       cout << "\"" << m_iter->first << "\" => \"" << m_iter->second << "\"";
     }
-    cout << "})" << endl;
+    cout << "})" << '\n';
     out = thing;
   }
 
@@ -164,7 +168,7 @@
       }
       cout << *s_iter;
     }
-    cout << "})" << endl;
+    cout << "})" << '\n';
     out = thing;
   }
 
@@ -180,21 +184,22 @@
       }
       cout << *l_iter;
     }
-    cout << "})" << endl;
+    cout << "})" << '\n';
     out = thing;
   }
 
   Numberz::type testEnum(const Numberz::type thing) override {
-    cout << "[C -> C++] testEnum(" << thing << ")" << endl;
+    cout << "[C -> C++] testEnum(" << thing << ")" << '\n';
     return thing;
   }
 
   UserId testTypedef(const UserId thing) override {
-    cout << "[C -> C++] testTypedef(" << thing << ")" << endl;
-    return thing;  }
+    cout << "[C -> C++] testTypedef(" << thing << ")" << '\n';
+    return thing;
+  }
 
   void testMapMap(map<int32_t, map<int32_t,int32_t> > &mapmap, const int32_t hello) override {
-    cout << "[C -> C++] testMapMap(" << hello << ")" << endl;
+    cout << "[C -> C++] testMapMap(" << hello << ")" << '\n';
 
     map<int32_t,int32_t> pos;
     map<int32_t,int32_t> neg;
@@ -211,7 +216,7 @@
   void testInsanity(map<UserId, map<Numberz::type,Insanity> > &insane, const Insanity &argument) override {
     THRIFT_UNUSED_VARIABLE (argument);
 
-    cout << "[C -> C++] testInsanity()" << endl;
+    cout << "[C -> C++] testInsanity()" << '\n';
 
     Xtruct hello;
     hello.string_thing = "Hello2";
@@ -273,7 +278,7 @@
       }
       cout << "}, ";
     }
-    cout << "}" << endl;
+    cout << "}" << '\n';
 
 
   }
@@ -283,7 +288,7 @@
     THRIFT_UNUSED_VARIABLE (arg4);
     THRIFT_UNUSED_VARIABLE (arg5);
 
-    cout << "[C -> C++] testMulti()" << endl;
+    cout << "[C -> C++] testMulti()" << '\n';
 
     hello.string_thing = "Hello2";
     hello.byte_thing = arg0;
@@ -294,7 +299,7 @@
   void testException(const std::string &arg)
     throw(Xception, apache::thrift::TException) override
   {
-    cout << "[C -> C++] testException(" << arg << ")" << endl;
+    cout << "[C -> C++] testException(" << arg << ")" << '\n';
     if (arg.compare("Xception") == 0) {
       Xception e;
       e.errorCode = 1001;
@@ -312,7 +317,7 @@
 
   void testMultiException(Xtruct &result, const std::string &arg0, const std::string &arg1) throw(Xception, Xception2) override {
 
-    cout << "[C -> C++] testMultiException(" << arg0 << ", " << arg1 << ")" << endl;
+    cout << "[C -> C++] testMultiException(" << arg0 << ", " << arg1 << ")" << '\n';
 
     if (arg0.compare("Xception") == 0) {
       Xception e;
@@ -331,9 +336,9 @@
   }
 
   void testOneway(int sleepFor) override {
-    cout << "testOneway(" << sleepFor << "): Sleeping..." << endl;
+    cout << "testOneway(" << sleepFor << "): Sleeping..." << '\n';
     sleep(sleepFor);
-    cout << "testOneway(" << sleepFor << "): done sleeping!" << endl;
+    cout << "testOneway(" << sleepFor << "): done sleeping!" << '\n';
   }
 };
 
diff --git a/lib/cl/Makefile.am b/lib/cl/Makefile.am
index 34b3886..a54eb92 100644
--- a/lib/cl/Makefile.am
+++ b/lib/cl/Makefile.am
@@ -32,6 +32,9 @@
 	$(RM) run-tests quicklisp.lisp backport-update.zip
 	$(RM) -rf lib externals quicklisp
 
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
 EXTRA_DIST = \
 	README.md \
 	READMES \
diff --git a/lib/cpp/CMakeLists.txt b/lib/cpp/CMakeLists.txt
index 6a66e5a..5980734 100644
--- a/lib/cpp/CMakeLists.txt
+++ b/lib/cpp/CMakeLists.txt
@@ -31,6 +31,7 @@
 set(thriftcpp_SOURCES
    src/thrift/TApplicationException.cpp
    src/thrift/TOutput.cpp
+   src/thrift/TUuid.cpp
    src/thrift/async/TAsyncChannel.cpp
    src/thrift/async/TAsyncProtocolProcessor.cpp
    src/thrift/async/TConcurrentClientSyncInfo.h
diff --git a/lib/cpp/Makefile.am b/lib/cpp/Makefile.am
index c015b0d..3d7beab 100644
--- a/lib/cpp/Makefile.am
+++ b/lib/cpp/Makefile.am
@@ -57,6 +57,7 @@
 
 libthrift_la_SOURCES = src/thrift/TApplicationException.cpp \
                        src/thrift/TOutput.cpp \
+                       src/thrift/TUuid.cpp \
                        src/thrift/VirtualProfiling.cpp \
                        src/thrift/async/TAsyncChannel.cpp \
                        src/thrift/async/TAsyncProtocolProcessor.cpp \
@@ -136,6 +137,7 @@
                          src/thrift/thrift-config.h \
                          src/thrift/thrift_export.h \
                          src/thrift/TDispatchProcessor.h \
+                         src/thrift/TUuid.h \
                          src/thrift/Thrift.h \
                          src/thrift/TOutput.h \
                          src/thrift/TProcessor.h \
@@ -252,6 +254,9 @@
              libthriftnb.vcxproj.filters \
              3rdparty.props
 
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
 EXTRA_DIST = \
              CMakeLists.txt \
              coding_standards.md \
diff --git a/lib/cpp/README.md b/lib/cpp/README.md
index 8074484..74983ae 100644
--- a/lib/cpp/README.md
+++ b/lib/cpp/README.md
@@ -232,6 +232,32 @@
 The PRNG seed is key to the application security. This method should be
 overridden if it's not strong enough for you.
 
+# Thrift UUID
+
+The `uuid` `BaseType` is implemented in C++ by the `apache::thrift::TUuid` class. This class
+is a strong wrapper class around an internal buffer of 16 bytes.
+
+The `apache::thrift::TUuid` supports construction from different UUID string representations.
+Some examples of supported string formats are:
+
+* `"hhhhhhhh-hhhh-hhhh-hhhh-hhhhhhhhhhhh"`
+* `"{hhhhhhhh-hhhh-hhhh-hhhh-hhhhhhhhhhhh}"`
+* `"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh"`
+* `"{hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh}"`
+
+## `TUuid` and `boost::uuids::uuid`
+
+Internally the TUuid class is implemented using the `boost::uuids::uuid` library. As a result the TUuid
+can seamlessly interoperate with the boost UUID type since the underlying data structure is the same.
+
+For convenience, when boost is already used by a project the `THRIFT_TUUID_SUPPORT_BOOST_UUID` preprocessor
+directive can be set when including the thrift library to enable construction of a `TUuid` from a
+`boost::uuids::uuid`. By default this is an implicit constructor that can be changed to be explicit
+by defining the `THRIFT_TUUID_BOOST_CONSTRUCTOR_EXPLICIT` preprocessor directive.
+
+The thrift library does not need to be compiled differently when this constructor is needed. The preprocessor
+directives can be set on the project that uses the thrift library.
+
 # Deprecations
 
 ## 0.12.0
diff --git a/lib/cpp/libthrift.vcxproj b/lib/cpp/libthrift.vcxproj
index 0b5e16d..7fcccfe 100644
--- a/lib/cpp/libthrift.vcxproj
+++ b/lib/cpp/libthrift.vcxproj
@@ -57,6 +57,7 @@
     <ClCompile Include="src\thrift\server\TThreadPoolServer.cpp" />
     <ClCompile Include="src\thrift\TApplicationException.cpp" />
     <ClCompile Include="src\thrift\TOutput.cpp" />
+    <ClCompile Include="src\thrift\TUuid.cpp" />
     <ClCompile Include="src\thrift\transport\SocketCommon.cpp" />
     <ClCompile Include="src\thrift\transport\TBufferTransports.cpp" />
     <ClCompile Include="src\thrift\transport\TFDTransport.cpp" />
@@ -96,6 +97,7 @@
     <ClInclude Include="src\thrift\Thrift.h" />
     <ClInclude Include="src\thrift\TOutput.h" />
     <ClInclude Include="src\thrift\TProcessor.h" />
+    <ClInclude Include="src\thrift\TUuid.h" />
     <ClInclude Include="src\thrift\transport\TBufferTransports.h" />
     <ClInclude Include="src\thrift\transport\TFDTransport.h" />
     <ClInclude Include="src\thrift\transport\TFileTransport.h" />
diff --git a/lib/cpp/libthrift.vcxproj.filters b/lib/cpp/libthrift.vcxproj.filters
index 98426fa..4b2ba3b 100644
--- a/lib/cpp/libthrift.vcxproj.filters
+++ b/lib/cpp/libthrift.vcxproj.filters
@@ -4,6 +4,7 @@
     <ClCompile Include="src\thrift\transport\TBufferTransports.cpp">
       <Filter>transport</Filter>
     </ClCompile>
+    <ClCompile Include="src\thrift\TUuid.cpp" />
     <ClCompile Include="src\thrift\TOutput.cpp" />
     <ClCompile Include="src\thrift\TApplicationException.cpp" />
     <ClCompile Include="src\thrift\transport\TTransportException.cpp">
@@ -106,6 +107,7 @@
     <ClInclude Include="src\thrift\protocol\TBinaryProtocol.h">
       <Filter>protocol</Filter>
     </ClInclude>
+    <ClInclude Include="src\thrift\TUuid.h" />
     <ClInclude Include="src\thrift\Thrift.h" />
     <ClInclude Include="src\thrift\TProcessor.h" />
     <ClInclude Include="src\thrift\TApplicationException.h" />
diff --git a/lib/cpp/src/thrift/TNonCopyable.h b/lib/cpp/src/thrift/TNonCopyable.h
index a60f1f0..51c94e2 100644
--- a/lib/cpp/src/thrift/TNonCopyable.h
+++ b/lib/cpp/src/thrift/TNonCopyable.h
@@ -30,7 +30,7 @@
 class TNonCopyable {
 protected:
   TNonCopyable() = default;
-  ~TNonCopyable() = default;
+  virtual ~TNonCopyable() = default;
 
   TNonCopyable(const TNonCopyable&) = delete;
   TNonCopyable& operator=(const TNonCopyable&) = delete;
diff --git a/lib/cpp/src/thrift/TUuid.cpp b/lib/cpp/src/thrift/TUuid.cpp
new file mode 100644
index 0000000..a0c45f9
--- /dev/null
+++ b/lib/cpp/src/thrift/TUuid.cpp
@@ -0,0 +1,61 @@
+/*
+ * 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/TUuid.h>
+
+#include <boost/uuid/string_generator.hpp>
+#include <boost/uuid/uuid.hpp>
+#include <boost/uuid/uuid_io.hpp>
+
+namespace apache {
+namespace thrift {
+
+namespace {
+static const boost::uuids::string_generator gen;
+}
+
+TUuid::TUuid(const std::string& str) noexcept {
+  std::fill(this->begin(), this->end(), 0);
+  if (str.empty()) {
+    return ;
+  }
+
+  try {
+    const boost::uuids::uuid uuid{gen(str)};
+    std::copy(uuid.begin(), uuid.end(), this->begin());
+  } catch (const std::runtime_error&) {
+    // Invalid string most probably
+  }
+}
+
+bool TUuid::is_nil() const noexcept {
+  boost::uuids::uuid uuid_tmp{};
+  std::copy(this->begin(), this->end(), std::begin(uuid_tmp));
+  return uuid_tmp.is_nil();
+}
+
+std::string to_string(const TUuid& in) {
+  boost::uuids::uuid uuid_tmp{};
+  std::copy(std::begin(in), std::end(in), std::begin(uuid_tmp));
+  return boost::uuids::to_string(uuid_tmp);
+}
+
+
+}
+} // apache::thrift
\ No newline at end of file
diff --git a/lib/cpp/src/thrift/TUuid.h b/lib/cpp/src/thrift/TUuid.h
new file mode 100644
index 0000000..bcf0160
--- /dev/null
+++ b/lib/cpp/src/thrift/TUuid.h
@@ -0,0 +1,171 @@
+/*
+ * 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.
+ */
+
+#ifndef _THRIFT_TUUID_H_
+#define _THRIFT_TUUID_H_ 1
+
+#include <thrift/Thrift.h>
+
+#ifdef THRIFT_TUUID_SUPPORT_BOOST_UUID
+#include <boost/uuid/uuid.hpp>
+#endif // THRIFT_TUUID_SUPPORT_BOOST_UUID
+
+#include <algorithm>
+
+namespace apache {
+namespace thrift {
+
+/**
+ * Thrift wrapper class for a UUID type.
+ *
+ * The UUID is stored as a 16 byte buffer.
+ * This class stores the UUID in network order when assigned from a string.
+ */
+class TUuid {
+public:
+  typedef uint8_t value_type;
+  typedef uint8_t* iterator;
+  typedef uint8_t const* const_iterator;
+  typedef std::size_t size_type;
+  typedef std::ptrdiff_t difference_type;
+
+  TUuid() = default;
+  TUuid(const TUuid& other) = default;
+  TUuid(TUuid&& other) = default;
+  TUuid& operator=(const TUuid&) = default;
+  TUuid& operator=(TUuid&&) = default;
+  ~TUuid() = default;
+
+  /**
+   * Construct the object from a 16 byte buffer.
+   */
+  explicit TUuid(const uint8_t (&data)[16]) noexcept
+  {
+    std::copy(std::begin(data), std::end(data), std::begin(this->data_));
+  }
+
+  /**
+   * Construct the object from the specified string.
+   *
+   * Supported string formats are:
+   *   - "hhhhhhhh-hhhh-hhhh-hhhh-hhhhhhhhhhhh"
+   *   - "{hhhhhhhh-hhhh-hhhh-hhhh-hhhhhhhhhhhh}"
+   *   - "hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh"
+   *   - "{hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh}"
+   *
+   * If the string is invalid, the object will be set to a
+   * nil (empty) UUID.
+   */
+  explicit TUuid(const std::string& str) noexcept;
+
+#ifdef THRIFT_TUUID_SUPPORT_BOOST_UUID
+  /**
+   * Construct the TUuid from a boost::uuids::uuid.
+   *
+   * This constructor will only be available if the <tt>THRIFT_TUUID_SUPPORT_BOOST_UUID</tt>
+   * compiler directive is set when this file is included.
+   *
+   * This constructor is by default implicit. It can be made explicit by defining the
+   * <tt>THRIFT_TUUID_BOOST_CONSTRUCTOR_EXPLICIT</tt> compiler directive.
+   */
+  #ifdef THRIFT_TUUID_BOOST_CONSTRUCTOR_EXPLICIT
+  explicit
+  #endif // THRIFT_TUUID_BOOST_CONSTRUCTOR_EXPLICIT
+  TUuid(const boost::uuids::uuid& buuid) noexcept
+  {
+    std::copy(std::begin(buuid.data), std::end(buuid.data), std::begin(this->data_));
+  }
+#endif // THRIFT_TUUID_SUPPORT_BOOST_UUID
+
+  /**
+   * Check if the UUID is nil.
+   */
+  bool is_nil() const noexcept;
+
+  /**
+   * Compare two TUuid objects for equality.
+   */
+  inline bool operator==(const TUuid& other) const;
+
+  /**
+   * Compare two TUuid objects for inequality.
+   */
+  inline bool operator!=(const TUuid& other) const;
+
+  iterator begin() noexcept { return data_; }
+  const_iterator begin() const noexcept { return data_; }
+  iterator end() noexcept { return data_ + size(); }
+  const_iterator end() const noexcept { return data_ + size(); }
+  size_type size() const noexcept { return 16; }
+  inline const_iterator data() const { return data_; }
+  inline iterator data() { return data_; }
+
+  void swap(TUuid& other) noexcept { std::swap(data_, other.data_); }
+
+private:
+  /**
+   * The UUID data.
+   */
+  uint8_t data_[16] = {};
+};
+
+/**
+ * Get the String representation of a TUUID.
+ *
+ * The format returned is:
+ *   - "hhhhhhhh-hhhh-hhhh-hhhh-hhhhhhhhhhhh"
+ */
+std::string to_string(const TUuid& uuid) noexcept(false);
+
+/**
+ * Swap two TUuid objects
+ */
+inline void swap(TUuid& lhs, TUuid& rhs) noexcept {
+  lhs.swap(rhs);
+}
+
+/**
+ * TUuid equality comparison operator implementation
+ */
+inline bool TUuid::operator==(const TUuid& other) const {
+  // Compare using temporary strings.
+  // Can't use strcmp() since we expect embeded zeros
+  // Perhaps the reason we should use std::array instead
+  return std::string(this->begin(), this->end()) == std::string(other.begin(), other.end());
+}
+
+/**
+ * TUuid inequality comparison operator implementation
+ */
+inline bool TUuid::operator!=(const TUuid& other) const {
+  return !(*this == other);
+}
+
+/**
+ * TUuid ostream stream operator implementation
+ */
+inline std::ostream& operator<<(std::ostream& out, const TUuid& obj) {
+  out << to_string(obj);
+  return out;
+}
+
+} // namespace thrift
+} // namespace apache
+
+#endif // #ifndef _THRIFT_TUUID_H_
diff --git a/lib/cpp/src/thrift/async/TConcurrentClientSyncInfo.h b/lib/cpp/src/thrift/async/TConcurrentClientSyncInfo.h
index 0bc5eb5..dd9b055 100644
--- a/lib/cpp/src/thrift/async/TConcurrentClientSyncInfo.h
+++ b/lib/cpp/src/thrift/async/TConcurrentClientSyncInfo.h
@@ -36,7 +36,7 @@
 class TConcurrentSendSentry {
 public:
   explicit TConcurrentSendSentry(TConcurrentClientSyncInfo* sync);
-  ~TConcurrentSendSentry();
+  virtual ~TConcurrentSendSentry();
 
   void commit();
 
@@ -48,7 +48,7 @@
 class TConcurrentRecvSentry {
 public:
   TConcurrentRecvSentry(TConcurrentClientSyncInfo* sync, int32_t seqid);
-  ~TConcurrentRecvSentry();
+  virtual ~TConcurrentRecvSentry();
 
   void commit();
 
diff --git a/lib/cpp/src/thrift/async/TEvhttpClientChannel.cpp b/lib/cpp/src/thrift/async/TEvhttpClientChannel.cpp
index 7656596..43d4034 100644
--- a/lib/cpp/src/thrift/async/TEvhttpClientChannel.cpp
+++ b/lib/cpp/src/thrift/async/TEvhttpClientChannel.cpp
@@ -147,8 +147,7 @@
     self->finish(req);
   } catch (std::exception& e) {
     // don't propagate a C++ exception in C code (e.g. libevent)
-    std::cerr << "TEvhttpClientChannel::response exception thrown (ignored): " << e.what()
-              << std::endl;
+    std::cerr << "TEvhttpClientChannel::response exception thrown (ignored): " << e.what() << '\n';
   }
 }
 }
diff --git a/lib/cpp/src/thrift/async/TEvhttpServer.cpp b/lib/cpp/src/thrift/async/TEvhttpServer.cpp
index 7d2cf21..bea9001 100644
--- a/lib/cpp/src/thrift/async/TEvhttpServer.cpp
+++ b/lib/cpp/src/thrift/async/TEvhttpServer.cpp
@@ -127,13 +127,13 @@
   int rv = evhttp_add_header(ctx->req->output_headers, "Content-Type", "application/x-thrift");
   if (rv != 0) {
     // TODO: Log an error.
-    std::cerr << "evhttp_add_header failed " << __FILE__ << ":" << __LINE__ << std::endl;
+    std::cerr << "evhttp_add_header failed " << __FILE__ << ":" << __LINE__ << '\n';
   }
 
   struct evbuffer* buf = evbuffer_new();
   if (buf == nullptr) {
     // TODO: Log an error.
-    std::cerr << "evbuffer_new failed " << __FILE__ << ":" << __LINE__ << std::endl;
+    std::cerr << "evbuffer_new failed " << __FILE__ << ":" << __LINE__ << '\n';
   } else {
     uint8_t* obuf;
     uint32_t sz;
@@ -141,8 +141,7 @@
     int ret = evbuffer_add(buf, obuf, sz);
     if (ret != 0) {
       // TODO: Log an error.
-      std::cerr << "evhttp_add failed with " << ret << " " << __FILE__ << ":" << __LINE__
-                << std::endl;
+      std::cerr << "evhttp_add failed with " << ret << " " << __FILE__ << ":" << __LINE__ << '\n';
     }
   }
 
diff --git a/lib/cpp/src/thrift/async/TEvhttpServer.h b/lib/cpp/src/thrift/async/TEvhttpServer.h
index c5bf3b6..aecfade 100644
--- a/lib/cpp/src/thrift/async/TEvhttpServer.h
+++ b/lib/cpp/src/thrift/async/TEvhttpServer.h
@@ -50,7 +50,7 @@
    */
   TEvhttpServer(std::shared_ptr<TAsyncBufferProcessor> processor, int port);
 
-  ~TEvhttpServer();
+  virtual ~TEvhttpServer();
 
   static void request(struct evhttp_request* req, void* self);
   int serve();
diff --git a/lib/cpp/src/thrift/protocol/TBinaryProtocol.h b/lib/cpp/src/thrift/protocol/TBinaryProtocol.h
index 7b829c7..cba6e69 100644
--- a/lib/cpp/src/thrift/protocol/TBinaryProtocol.h
+++ b/lib/cpp/src/thrift/protocol/TBinaryProtocol.h
@@ -119,6 +119,8 @@
 
   inline uint32_t writeBinary(const std::string& str);
 
+  inline uint32_t writeUUID(const TUuid& uuid);
+
   /**
    * Reading functions
    */
@@ -166,6 +168,8 @@
 
   inline uint32_t readBinary(std::string& str);
 
+  inline uint32_t readUUID(TUuid& uuid);
+
   int getMinSerializedSize(TType type) override;
 
   void checkReadBytesAvailable(TSet& set) override
diff --git a/lib/cpp/src/thrift/protocol/TBinaryProtocol.tcc b/lib/cpp/src/thrift/protocol/TBinaryProtocol.tcc
index c448e77..1bd7a1a 100644
--- a/lib/cpp/src/thrift/protocol/TBinaryProtocol.tcc
+++ b/lib/cpp/src/thrift/protocol/TBinaryProtocol.tcc
@@ -193,6 +193,13 @@
   return TBinaryProtocolT<Transport_, ByteOrder_>::writeString(str);
 }
 
+template <class Transport_, class ByteOrder_>
+uint32_t TBinaryProtocolT<Transport_, ByteOrder_>::writeUUID(const TUuid& uuid) {
+  // TODO: Consider endian swapping, see lib/delphi/src/Thrift.Utils.pas:377
+  this->trans_->write(uuid.data(), uuid.size());
+  return 16;
+}
+
 /**
  * Reading functions
  */
@@ -286,7 +293,7 @@
     throw TProtocolException(TProtocolException::SIZE_LIMIT);
   }
   size = (uint32_t)sizei;
-  
+
   TMap map(keyType, valType, size);
   checkReadBytesAvailable(map);
 
@@ -429,6 +436,12 @@
 }
 
 template <class Transport_, class ByteOrder_>
+uint32_t TBinaryProtocolT<Transport_, ByteOrder_>::readUUID(TUuid& uuid) {
+  this->trans_->readAll(uuid.begin(), uuid.size());
+  return 16;
+}
+
+template <class Transport_, class ByteOrder_>
 template <typename StrType>
 uint32_t TBinaryProtocolT<Transport_, ByteOrder_>::readStringBody(StrType& str, int32_t size) {
   uint32_t result = 0;
diff --git a/lib/cpp/src/thrift/protocol/TDebugProtocol.cpp b/lib/cpp/src/thrift/protocol/TDebugProtocol.cpp
index 0e6d4a2..6e88313 100644
--- a/lib/cpp/src/thrift/protocol/TDebugProtocol.cpp
+++ b/lib/cpp/src/thrift/protocol/TDebugProtocol.cpp
@@ -70,10 +70,8 @@
     return "set";
   case T_LIST:
     return "list";
-  case T_UTF8:
-    return "utf8";
-  case T_UTF16:
-    return "utf16";
+  case T_UUID:
+    return "uuid";
   default:
     return "unknown";
   }
@@ -388,6 +386,17 @@
   // XXX Hex?
   return TDebugProtocol::writeString(str);
 }
+
+uint32_t TDebugProtocol::writeUUID(const TUuid& uuid) {
+  size_t size = writePlain("{\n");
+  indentUp();
+  size += writeIndented("[raw] = ");
+  size += writeString(std::string(std::begin(uuid), std::end(uuid)));
+  size += writeIndented("[enc] = \"" + to_string(uuid) + "\"\n");
+  indentDown();
+  size += writeIndented("}\n");
+  return size;
+}
 }
 }
 } // apache::thrift::protocol
diff --git a/lib/cpp/src/thrift/protocol/TDebugProtocol.h b/lib/cpp/src/thrift/protocol/TDebugProtocol.h
index 41bb0d4..02662f1 100644
--- a/lib/cpp/src/thrift/protocol/TDebugProtocol.h
+++ b/lib/cpp/src/thrift/protocol/TDebugProtocol.h
@@ -110,6 +110,8 @@
 
   uint32_t writeBinary(const std::string& str);
 
+  uint32_t writeUUID(const TUuid& uuid);
+
 private:
   void indentUp();
   void indentDown();
diff --git a/lib/cpp/src/thrift/protocol/TEnum.h b/lib/cpp/src/thrift/protocol/TEnum.h
index 9636785..bbd1247 100644
--- a/lib/cpp/src/thrift/protocol/TEnum.h
+++ b/lib/cpp/src/thrift/protocol/TEnum.h
@@ -18,7 +18,7 @@
  */
 
 #ifndef _THRIFT_ENUM_H_
-#define _THRIFT_ENUM_H_ 
+#define _THRIFT_ENUM_H_
 
 namespace apache {
 namespace thrift {
@@ -46,8 +46,7 @@
   T_MAP        = 13,
   T_SET        = 14,
   T_LIST       = 15,
-  T_UTF8       = 16,
-  T_UTF16      = 17
+  T_UUID       = 16,
 };
 
 /**
@@ -63,4 +62,4 @@
 
 }}} // apache::thrift::protocol
 
-#endif // #define _THRIFT_ENUM_H_ 
+#endif // #define _THRIFT_ENUM_H_
diff --git a/lib/cpp/src/thrift/protocol/TJSONProtocol.cpp b/lib/cpp/src/thrift/protocol/TJSONProtocol.cpp
index 6e4e8ef..3805869 100644
--- a/lib/cpp/src/thrift/protocol/TJSONProtocol.cpp
+++ b/lib/cpp/src/thrift/protocol/TJSONProtocol.cpp
@@ -68,6 +68,7 @@
 static const std::string kTypeNameMap("map");
 static const std::string kTypeNameList("lst");
 static const std::string kTypeNameSet("set");
+static const std::string kTypeNameUuid("uid");
 
 static const std::string& getTypeNameForTypeID(TType typeID) {
   switch (typeID) {
@@ -93,6 +94,8 @@
     return kTypeNameSet;
   case T_LIST:
     return kTypeNameList;
+  case T_UUID:
+    return kTypeNameUuid;
   default:
     throw TProtocolException(TProtocolException::NOT_IMPLEMENTED, "Unrecognized type");
   }
@@ -140,6 +143,9 @@
     case 't':
       result = T_BOOL;
       break;
+    case 'u':
+      result = T_UUID;
+      break;
     }
   }
   if (result == T_STOP) {
@@ -710,6 +716,10 @@
   return writeJSONBase64(str);
 }
 
+uint32_t TJSONProtocol::writeUUID(const TUuid& uuid) {
+  return writeJSONString(to_string(uuid));
+}
+
 /**
  * Reading functions
  */
@@ -1106,6 +1116,13 @@
   return readJSONBase64(str);
 }
 
+uint32_t TJSONProtocol::readUUID(TUuid& uuid) {
+  std::string uuid_str;
+  const uint32_t result = readJSONString(uuid_str);
+  uuid = TUuid{uuid_str};
+  return result;
+}
+
 // Return the minimum number of bytes a type will consume on the wire
 int TJSONProtocol::getMinSerializedSize(TType type)
 {
@@ -1113,7 +1130,7 @@
   {
     case T_STOP: return 0;
     case T_VOID: return 0;
-    case T_BOOL: return 1;  // written as int  
+    case T_BOOL: return 1;  // written as int
     case T_BYTE: return 1;
     case T_DOUBLE: return 1;
     case T_I16: return 1;
@@ -1124,6 +1141,7 @@
     case T_MAP: return 2;  // empty map
     case T_SET: return 2;  // empty set
     case T_LIST: return 2;  // empty list
+    case T_UUID: return 16;  // empty UUID
     default: throw TProtocolException(TProtocolException::UNKNOWN, "unrecognized type code");
   }
 }
diff --git a/lib/cpp/src/thrift/protocol/TJSONProtocol.h b/lib/cpp/src/thrift/protocol/TJSONProtocol.h
index d01bdf8..09eb6ea 100644
--- a/lib/cpp/src/thrift/protocol/TJSONProtocol.h
+++ b/lib/cpp/src/thrift/protocol/TJSONProtocol.h
@@ -198,6 +198,8 @@
 
   uint32_t writeBinary(const std::string& str);
 
+  uint32_t writeUUID(const TUuid& uuid);
+
   /**
    * Reading functions
    */
@@ -245,6 +247,8 @@
 
   uint32_t readBinary(std::string& str);
 
+  uint32_t readUUID(TUuid& uuid);
+
   int getMinSerializedSize(TType type) override;
 
   void checkReadBytesAvailable(TSet& set) override
diff --git a/lib/cpp/src/thrift/protocol/TProtocol.h b/lib/cpp/src/thrift/protocol/TProtocol.h
index 237c1e5..035b745 100644
--- a/lib/cpp/src/thrift/protocol/TProtocol.h
+++ b/lib/cpp/src/thrift/protocol/TProtocol.h
@@ -49,6 +49,7 @@
 #include <thrift/protocol/TList.h>
 #include <thrift/protocol/TSet.h>
 #include <thrift/protocol/TMap.h>
+#include <thrift/TUuid.h>
 
 #include <memory>
 
@@ -275,6 +276,8 @@
 
   virtual uint32_t writeBinary_virt(const std::string& str) = 0;
 
+  virtual uint32_t writeUUID_virt(const TUuid& uuid) = 0;
+
   uint32_t writeMessageBegin(const std::string& name,
                              const TMessageType messageType,
                              const int32_t seqid) {
@@ -382,6 +385,11 @@
     return writeBinary_virt(str);
   }
 
+  uint32_t writeUUID(const TUuid& uuid) {
+    T_VIRTUAL_CALL();
+    return writeUUID_virt(uuid);
+  }
+
   /**
    * Reading functions
    */
@@ -430,6 +438,8 @@
 
   virtual uint32_t readBinary_virt(std::string& str) = 0;
 
+  virtual uint32_t readUUID_virt(TUuid& uuid) = 0;
+
   uint32_t readMessageBegin(std::string& name, TMessageType& messageType, int32_t& seqid) {
     T_VIRTUAL_CALL();
     return readMessageBegin_virt(name, messageType, seqid);
@@ -530,6 +540,11 @@
     return readBinary_virt(str);
   }
 
+  uint32_t readUUID(TUuid& uuid) {
+    T_VIRTUAL_CALL();
+    return readUUID_virt(uuid);
+  }
+
   /*
    * std::vector is specialized for bool, and its elements are individual bits
    * rather than bools.   We need to define a different version of readBool()
diff --git a/lib/cpp/src/thrift/protocol/TProtocolDecorator.h b/lib/cpp/src/thrift/protocol/TProtocolDecorator.h
index 5258159..88fbbde 100644
--- a/lib/cpp/src/thrift/protocol/TProtocolDecorator.h
+++ b/lib/cpp/src/thrift/protocol/TProtocolDecorator.h
@@ -92,6 +92,7 @@
   uint32_t writeDouble_virt(const double dub) override { return protocol->writeDouble(dub); }
   uint32_t writeString_virt(const std::string& str) override { return protocol->writeString(str); }
   uint32_t writeBinary_virt(const std::string& str) override { return protocol->writeBinary(str); }
+  uint32_t writeUUID_virt(const TUuid& uuid) override { return protocol->writeUUID(uuid); }
 
   uint32_t readMessageBegin_virt(std::string& name,
                                          TMessageType& messageType,
@@ -140,6 +141,7 @@
 
   uint32_t readString_virt(std::string& str) override { return protocol->readString(str); }
   uint32_t readBinary_virt(std::string& str) override { return protocol->readBinary(str); }
+  uint32_t readUUID_virt(TUuid& uuid) override { return protocol->readUUID(uuid); }
 
 private:
   shared_ptr<TProtocol> protocol;
diff --git a/lib/cpp/src/thrift/protocol/TVirtualProtocol.h b/lib/cpp/src/thrift/protocol/TVirtualProtocol.h
index b7fe929..8789e47 100644
--- a/lib/cpp/src/thrift/protocol/TVirtualProtocol.h
+++ b/lib/cpp/src/thrift/protocol/TVirtualProtocol.h
@@ -393,6 +393,10 @@
     return static_cast<Protocol_*>(this)->writeBinary(str);
   }
 
+  uint32_t writeUUID_virt(const TUuid& uuid) override {
+    return static_cast<Protocol_*>(this)->writeUUID(uuid);
+  }
+
   /**
    * Reading functions
    */
@@ -471,6 +475,10 @@
     return static_cast<Protocol_*>(this)->readBinary(str);
   }
 
+  uint32_t readUUID_virt(TUuid& uuid) override {
+    return static_cast<Protocol_*>(this)->readUUID(uuid);
+  }
+
   uint32_t skip_virt(TType type) override { return static_cast<Protocol_*>(this)->skip(type); }
 
   /*
diff --git a/lib/cpp/src/thrift/server/TNonblockingServer.cpp b/lib/cpp/src/thrift/server/TNonblockingServer.cpp
index ae92da3..d53535b 100644
--- a/lib/cpp/src/thrift/server/TNonblockingServer.cpp
+++ b/lib/cpp/src/thrift/server/TNonblockingServer.cpp
@@ -886,8 +886,8 @@
 
 TNonblockingServer::~TNonblockingServer() {
   // Close any active connections (moves them to the idle connection stack)
-  while (activeConnections_.size()) {
-    activeConnections_.front()->close();
+  while (!activeConnections_.empty()) {
+    (*activeConnections_.begin())->close();
   }
   // Clean up unused TConnection objects in connectionStack_
   while (!connectionStack_.empty()) {
@@ -931,7 +931,8 @@
     result->setSocket(socket);
     result->init(ioThread);
   }
-  activeConnections_.push_back(result);
+
+  activeConnections_.insert(result);
   return result;
 }
 
@@ -941,11 +942,7 @@
 void TNonblockingServer::returnConnection(TConnection* connection) {
   Guard g(connMutex_);
 
-  activeConnections_.erase(std::remove(activeConnections_.begin(),
-                                       activeConnections_.end(),
-                                       connection),
-                           activeConnections_.end());
-
+  activeConnections_.erase(connection);
   if (connectionStackLimit_ && (connectionStack_.size() >= connectionStackLimit_)) {
     delete connection;
     --numTConnections_;
diff --git a/lib/cpp/src/thrift/server/TNonblockingServer.h b/lib/cpp/src/thrift/server/TNonblockingServer.h
index 65e569d..9f813ed 100644
--- a/lib/cpp/src/thrift/server/TNonblockingServer.h
+++ b/lib/cpp/src/thrift/server/TNonblockingServer.h
@@ -36,6 +36,7 @@
 #include <vector>
 #include <string>
 #include <cstdlib>
+#include <unordered_set>
 #ifdef HAVE_UNISTD_H
 #include <unistd.h>
 #endif
@@ -259,7 +260,7 @@
    * which in turn allows their transports, protocols, processors and handlers
    * to deallocate and clean up correctly.
    */
-  std::vector<TConnection*> activeConnections_;
+  std::unordered_set<TConnection*> activeConnections_;
 
   /*
   */
diff --git a/lib/cpp/src/thrift/transport/TBufferTransports.h b/lib/cpp/src/thrift/transport/TBufferTransports.h
index f72d8f6..8518800 100644
--- a/lib/cpp/src/thrift/transport/TBufferTransports.h
+++ b/lib/cpp/src/thrift/transport/TBufferTransports.h
@@ -269,6 +269,11 @@
    */
   uint32_t readAll(uint8_t* buf, uint32_t len) { return TBufferBase::readAll(buf, len); }
 
+  uint32_t readEnd() override {
+    resetConsumedMessageSize();
+    return 0;
+  }
+
 protected:
   void initPointers() {
     setReadBuffer(rBuf_.get(), 0);
diff --git a/lib/cpp/src/thrift/transport/TFileTransport.cpp b/lib/cpp/src/thrift/transport/TFileTransport.cpp
index dd7d229..3f4d812 100644
--- a/lib/cpp/src/thrift/transport/TFileTransport.cpp
+++ b/lib/cpp/src/thrift/transport/TFileTransport.cpp
@@ -55,8 +55,6 @@
 
 using std::shared_ptr;
 using std::cerr;
-using std::cout;
-using std::endl;
 using std::string;
 using namespace apache::thrift::protocol;
 using namespace apache::thrift::concurrency;
@@ -1032,7 +1030,7 @@
         break;
       }
     } catch (TException& te) {
-      cerr << te.what() << endl;
+      cerr << te.what() << '\n';
       break;
     }
   }
@@ -1060,7 +1058,7 @@
     } catch (TEOFException&) {
       break;
     } catch (TException& te) {
-      cerr << te.what() << endl;
+      cerr << te.what() << '\n';
       break;
     }
   }
diff --git a/lib/cpp/src/thrift/transport/TFileTransport.h b/lib/cpp/src/thrift/transport/TFileTransport.h
index 608cff1..902d906 100644
--- a/lib/cpp/src/thrift/transport/TFileTransport.h
+++ b/lib/cpp/src/thrift/transport/TFileTransport.h
@@ -123,7 +123,7 @@
 class TFileTransportBuffer {
 public:
   TFileTransportBuffer(uint32_t size);
-  ~TFileTransportBuffer();
+  virtual ~TFileTransportBuffer();
 
   bool addEvent(eventInfo* event);
   eventInfo* getNext();
diff --git a/lib/cpp/src/thrift/windows/OverlappedSubmissionThread.h b/lib/cpp/src/thrift/windows/OverlappedSubmissionThread.h
index 057f623..7326a9c 100644
--- a/lib/cpp/src/thrift/windows/OverlappedSubmissionThread.h
+++ b/lib/cpp/src/thrift/windows/OverlappedSubmissionThread.h
@@ -105,7 +105,7 @@
   // thread details
 private:
   TOverlappedSubmissionThread();
-  ~TOverlappedSubmissionThread();
+  virtual ~TOverlappedSubmissionThread();
   void run();
   static unsigned __stdcall thread_proc(void* addr);
 
@@ -122,7 +122,7 @@
 
 public:
   TAutoOverlapThread() : p(TOverlappedSubmissionThread::acquire_instance()) {}
-  ~TAutoOverlapThread() { TOverlappedSubmissionThread::release_instance(); }
+  virtual ~TAutoOverlapThread() { TOverlappedSubmissionThread::release_instance(); }
   TOverlappedSubmissionThread* operator->() { return p; }
 };
 }
diff --git a/lib/cpp/src/thrift/windows/Sync.h b/lib/cpp/src/thrift/windows/Sync.h
index a5b2ac5..89aaead 100644
--- a/lib/cpp/src/thrift/windows/Sync.h
+++ b/lib/cpp/src/thrift/windows/Sync.h
@@ -58,7 +58,7 @@
 struct TCriticalSection : apache::thrift::TNonCopyable {
   CRITICAL_SECTION cs;
   TCriticalSection() { InitializeCriticalSection(&cs); }
-  ~TCriticalSection() { DeleteCriticalSection(&cs); }
+  virtual ~TCriticalSection() { DeleteCriticalSection(&cs); }
 };
 
 class TAutoCrit : apache::thrift::TNonCopyable {
@@ -67,7 +67,7 @@
 
 public:
   explicit TAutoCrit(TCriticalSection& cs) : cs_(&cs.cs) { EnterCriticalSection(cs_); }
-  ~TAutoCrit() { LeaveCriticalSection(cs_); }
+  virtual ~TAutoCrit() { LeaveCriticalSection(cs_); }
 };
 
 struct TAutoResetEvent : apache::thrift::TNonCopyable {
@@ -80,7 +80,7 @@
       throw apache::thrift::concurrency::SystemResourceException("CreateEvent failed");
     }
   }
-  ~TAutoResetEvent() { CloseHandle(h); }
+  virtual ~TAutoResetEvent() { CloseHandle(h); }
 };
 
 struct TManualResetEvent : apache::thrift::TNonCopyable {
@@ -93,7 +93,7 @@
       throw apache::thrift::concurrency::SystemResourceException("CreateEvent failed");
     }
   }
-  ~TManualResetEvent() { CloseHandle(h); }
+  virtual ~TManualResetEvent() { CloseHandle(h); }
 };
 
 struct TAutoHandle : apache::thrift::TNonCopyable {
diff --git a/lib/cpp/src/thrift/windows/TWinsockSingleton.h b/lib/cpp/src/thrift/windows/TWinsockSingleton.h
index a098d2c..a8e517a 100644
--- a/lib/cpp/src/thrift/windows/TWinsockSingleton.h
+++ b/lib/cpp/src/thrift/windows/TWinsockSingleton.h
@@ -54,7 +54,7 @@
   TWinsockSingleton(void);
 
 public:
-  ~TWinsockSingleton(void);
+  virtual ~TWinsockSingleton(void);
 
 public:
   static void create(void);
diff --git a/lib/cpp/test/Benchmark.cpp b/lib/cpp/test/Benchmark.cpp
index 56adac0..22ec86c 100644
--- a/lib/cpp/test/Benchmark.cpp
+++ b/lib/cpp/test/Benchmark.cpp
@@ -53,7 +53,6 @@
   using namespace apache::thrift::transport;
   using namespace apache::thrift::protocol;
   using std::cout;
-  using std::endl;
 
   OneOfEach ooe;
   ooe.im_true = true;
@@ -66,6 +65,7 @@
   ooe.some_characters = "JSON THIS! \"\1";
   ooe.zomg_unicode = "\xd7\n\a\t";
   ooe.base64 = "\1\2\3\255";
+  ooe.rfc4122_uuid = apache::thrift::TUuid{"{5e2ab188-1726-4e75-a04f-1ed9a6a89c4c}"};
 
   int num = 100000;
   std::shared_ptr<TMemoryBuffer> buf(new TMemoryBuffer(num*1000));
@@ -83,7 +83,7 @@
       ooe.write(&prot);
     }
     elapsed = timer.frame();
-    cout << "Write big endian: " << num / (1000 * elapsed) << " kHz" << endl;
+    cout << "Write big endian: " << num / (1000 * elapsed) << " kHz" << '\n';
   }
 
   buf->getBuffer(&data, &datasize);
@@ -99,7 +99,7 @@
       ooe2.read(&prot);
     }
     elapsed = timer.frame();
-    cout << " Read big endian: " << num / (1000 * elapsed) << " kHz" << endl;
+    cout << " Read big endian: " << num / (1000 * elapsed) << " kHz" << '\n';
   }
 
   {
@@ -112,7 +112,7 @@
       ooe.write(&prot);
     }
     elapsed = timer.frame();
-    cout << "Write little endian: " << num / (1000 * elapsed) << " kHz" << endl;
+    cout << "Write little endian: " << num / (1000 * elapsed) << " kHz" << '\n';
   }
 
   {
@@ -126,7 +126,7 @@
       ooe2.read(&prot);
     }
     elapsed = timer.frame();
-    cout << " Read little endian: " << num / (1000 * elapsed) << " kHz" << endl;
+    cout << " Read little endian: " << num / (1000 * elapsed) << " kHz" << '\n';
   }
 
   {
@@ -139,7 +139,7 @@
       ooe.write(&prot);
     }
     elapsed = timer.frame();
-    cout << "Write big endian: " << num / (1000 * elapsed) << " kHz" << endl;
+    cout << "Write big endian: " << num / (1000 * elapsed) << " kHz" << '\n';
   }
 
   {
@@ -153,7 +153,7 @@
       ooe2.read(&prot);
     }
     elapsed = timer.frame();
-    cout << " Read big endian: " << num / (1000 * elapsed) << " kHz" << endl;
+    cout << " Read big endian: " << num / (1000 * elapsed) << " kHz" << '\n';
   }
 
 
@@ -176,7 +176,7 @@
 
     listDoublePerf.write(&prot);
     elapsed = timer.frame();
-    cout << "Double write big endian: " << num / (1000 * elapsed) << " kHz" << endl;
+    cout << "Double write big endian: " << num / (1000 * elapsed) << " kHz" << '\n';
   }
 
   buf->getBuffer(&data, &datasize);
@@ -190,7 +190,7 @@
 
     listDoublePerf2.read(&prot);
     elapsed = timer.frame();
-    cout << " Double read big endian: " << num / (1000 * elapsed) << " kHz" << endl;
+    cout << " Double read big endian: " << num / (1000 * elapsed) << " kHz" << '\n';
   }
 
   {
@@ -201,7 +201,7 @@
 
     listDoublePerf.write(&prot);
     elapsed = timer.frame();
-    cout << "Double write little endian: " << num / (1000 * elapsed) << " kHz" << endl;
+    cout << "Double write little endian: " << num / (1000 * elapsed) << " kHz" << '\n';
   }
 
   {
@@ -213,7 +213,7 @@
 
     listDoublePerf2.read(&prot);
     elapsed = timer.frame();
-    cout << " Double read little endian: " << num / (1000 * elapsed) << " kHz" << endl;
+    cout << " Double read little endian: " << num / (1000 * elapsed) << " kHz" << '\n';
   }
 
   {
@@ -224,7 +224,7 @@
 
     listDoublePerf.write(&prot);
     elapsed = timer.frame();
-    cout << "Double write big endian: " << num / (1000 * elapsed) << " kHz" << endl;
+    cout << "Double write big endian: " << num / (1000 * elapsed) << " kHz" << '\n';
   }
 
   {
@@ -236,7 +236,7 @@
 
     listDoublePerf2.read(&prot);
     elapsed = timer.frame();
-    cout << " Double read big endian: " << num / (1000 * elapsed) << " kHz" << endl;
+    cout << " Double read big endian: " << num / (1000 * elapsed) << " kHz" << '\n';
   }
 
 
diff --git a/lib/cpp/test/CMakeLists.txt b/lib/cpp/test/CMakeLists.txt
index 1117cd9..5ad8d74 100644
--- a/lib/cpp/test/CMakeLists.txt
+++ b/lib/cpp/test/CMakeLists.txt
@@ -82,6 +82,7 @@
     TServerSocketTest.cpp
     TServerTransportTest.cpp
     ThrifttReadCheckTests.cpp
+    TUuidTest.cpp
 )
 
 add_executable(UnitTests ${UnitTest_SOURCES})
@@ -94,6 +95,25 @@
     set_property( TARGET UnitTests APPEND_STRING PROPERTY COMPILE_FLAGS /wd4503 )
 endif()
 
+# Test the THRIFT_TUUID_SUPPORT_BOOST_UUID compiler directive globally set on the target
+add_executable(UnitTestsUuid
+    UnitTestMain.cpp
+    TUuidTestBoost.cpp
+)
+target_link_libraries(UnitTestsUuid testgencpp ${Boost_LIBRARIES})
+target_link_libraries(UnitTestsUuid thrift)
+target_compile_definitions(UnitTestsUuid PUBLIC THRIFT_TUUID_SUPPORT_BOOST_UUID)
+add_test(NAME UnitTestsUuid COMMAND UnitTestsUuid)
+
+# Test not setting the THRIFT_TUUID_SUPPORT_BOOST_UUID compiler directive as with the test above.
+# The test does set the directive before including the thrift header to test the behaviour
+add_executable(UnitTestsUuidNoDirective
+    UnitTestMain.cpp
+    TUuidTestBoostNoDirective.cpp
+)
+target_link_libraries(UnitTestsUuidNoDirective testgencpp ${Boost_LIBRARIES})
+target_link_libraries(UnitTestsUuidNoDirective thrift)
+add_test(NAME UnitTestsUuidNoDirective COMMAND UnitTestsUuidNoDirective)
 
 set( TInterruptTest_SOURCES
      TSocketInterruptTest.cpp
@@ -360,7 +380,7 @@
 )
 
 add_custom_command(OUTPUT gen-cpp/DebugProtoTest_types.cpp gen-cpp/DebugProtoTest_types.h gen-cpp/EmptyService.cpp gen-cpp/EmptyService.h
-    COMMAND ${THRIFT_COMPILER} --gen cpp ${PROJECT_SOURCE_DIR}/test/v0.16/DebugProtoTest.thrift
+    COMMAND ${THRIFT_COMPILER} --gen cpp ${PROJECT_SOURCE_DIR}/test/DebugProtoTest.thrift
 )
 
 add_custom_command(OUTPUT gen-cpp/EnumTest_types.cpp gen-cpp/EnumTest_types.h
@@ -384,7 +404,7 @@
 )
 
 add_custom_command(OUTPUT gen-cpp/SecondService.cpp gen-cpp/ThriftTest_constants.cpp gen-cpp/ThriftTest.cpp gen-cpp/ThriftTest_types.cpp gen-cpp/ThriftTest_types.h
-    COMMAND ${THRIFT_COMPILER} --gen cpp ${PROJECT_SOURCE_DIR}/test/v0.16/ThriftTest.thrift
+    COMMAND ${THRIFT_COMPILER} --gen cpp ${PROJECT_SOURCE_DIR}/test/ThriftTest.thrift
 )
 
 add_custom_command(OUTPUT gen-cpp/OneWayService.cpp gen-cpp/OneWayTest_types.h gen-cpp/OneWayService.h
diff --git a/lib/cpp/test/DebugProtoTest.cpp b/lib/cpp/test/DebugProtoTest.cpp
index 060f354..44eeef7 100644
--- a/lib/cpp/test/DebugProtoTest.cpp
+++ b/lib/cpp/test/DebugProtoTest.cpp
@@ -74,6 +74,10 @@
     "    [1] = 2,\n"
     "    [2] = 3,\n"
     "  },\n"
+    "  15: rfc4122_uuid (uuid) = {\n"
+    "    [raw] = \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\",\n"
+    "    [enc] = \"00000000-0000-0000-0000-000000000000\"\n"
+    "  }\n"
     "}");
   const std::string result(apache::thrift::ThriftDebugString(*ooe));
 
@@ -98,6 +102,7 @@
                                "\xb0\xcf\x81\xe2\x84\x8e\x20\xce\x91\x74\x74"
                                "\xce\xb1\xe2\x85\xbd\xce\xba\xc7\x83\xe2\x80"
                                "\xbc";
+  n->my_ooe.rfc4122_uuid = apache::thrift::TUuid{"{5e2ab188-1726-4e75-a04f-1ed9a6a89c4c}"};
   n->my_bonk.type = 31337;
   n->my_bonk.message = "I am a bonk... xor!";
 }
@@ -141,6 +146,10 @@
     "      [1] = 2,\n"
     "      [2] = 3,\n"
     "    },\n"
+    "    15: rfc4122_uuid (uuid) = {\n"
+    "      [raw] = \"^*\\xb1\\x88\\x17&Nu\\xa0O\\x1e\\xd9\\xa6\\xa8\\x9cL\",\n"
+    "      [enc] = \"5e2ab188-1726-4e75-a04f-1ed9a6a89c4c\"\n"
+    "    }\n"
     "  },\n"
     "}");
   const std::string result(apache::thrift::ThriftDebugString(*n));
@@ -228,6 +237,10 @@
     "        [1] = 2,\n"
     "        [2] = 3,\n"
     "      },\n"
+    "      15: rfc4122_uuid (uuid) = {\n"
+    "        [raw] = \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\",\n"
+    "        [enc] = \"00000000-0000-0000-0000-000000000000\"\n"
+    "      }\n"
     "    },\n"
     "    [1] = OneOfEach {\n"
     "      01: im_true (bool) = true,\n"
@@ -259,6 +272,10 @@
     "        [1] = 2,\n"
     "        [2] = 3,\n"
     "      },\n"
+    "      15: rfc4122_uuid (uuid) = {\n"
+    "        [raw] = \"^*\\xb1\\x88\\x17&Nu\\xa0O\\x1e\\xd9\\xa6\\xa8\\x9cL\",\n"
+    "        [enc] = \"5e2ab188-1726-4e75-a04f-1ed9a6a89c4c\"\n"
+    "      }\n"
     "    },\n"
     "  },\n"
     "  02: contain (set) = set<list>[3] {\n"
diff --git a/lib/cpp/test/JSONProtoTest.cpp b/lib/cpp/test/JSONProtoTest.cpp
index 082c8a2..b96638e 100644
--- a/lib/cpp/test/JSONProtoTest.cpp
+++ b/lib/cpp/test/JSONProtoTest.cpp
@@ -48,6 +48,7 @@
   ooe->some_characters = "JSON THIS! \"\1";
   ooe->zomg_unicode = "\xd7\n\a\t";
   ooe->base64 = "\1\2\3\255";
+  ooe->rfc4122_uuid = apache::thrift::TUuid{"00000000-0000-0000-0000-000000000000"};
 }
 
 BOOST_AUTO_TEST_CASE(test_json_proto_1) {
@@ -59,7 +60,7 @@
   "535897931},\"8\":{\"str\":\"JSON THIS! \\\"\\u0001\"},\"9\":{\"str\":\"\xd7\\"
   "n\\u0007\\t\"},\"10\":{\"tf\":0},\"11\":{\"str\":\"AQIDrQ\"},\"12\":{\"lst\""
   ":[\"i8\",3,1,2,3]},\"13\":{\"lst\":[\"i16\",3,1,2,3]},\"14\":{\"lst\":[\"i64"
-  "\",3,1,2,3]}}");
+  "\",3,1,2,3]},\"15\":{\"uid\":\"00000000-0000-0000-0000-000000000000\"}}");
 
   const std::string result(apache::thrift::ThriftJSONString(*ooe));
 
@@ -84,6 +85,7 @@
                                "\xb0\xcf\x81\xe2\x84\x8e\x20\xce\x91\x74\x74"
                                "\xce\xb1\xe2\x85\xbd\xce\xba\xc7\x83\xe2\x80"
                                "\xbc";
+  n->my_ooe.rfc4122_uuid = apache::thrift::TUuid{"5e2ab188-1726-4e75-a04f-1ed9a6a89c4c"};
   n->my_bonk.type = 31337;
   n->my_bonk.message = "I am a bonk... xor!";
 }
@@ -98,7 +100,8 @@
     "1.6180339887498949},\"8\":{\"str\":\":R (me going \\\"rrrr\\\")\"},\"9\":{"
     "\"str\":\"ӀⅮΝ Нοⅿоɡгаρℎ Αttαⅽκǃ‼\"},\"10\":{\"tf\":0},\"11\":{\"str\":\""
     "AQIDrQ\"},\"12\":{\"lst\":[\"i8\",3,1,2,3]},\"13\":{\"lst\":[\"i16\",3,1,2"
-    ",3]},\"14\":{\"lst\":[\"i64\",3,1,2,3]}}}}"
+    ",3]},\"14\":{\"lst\":[\"i64\",3,1,2,3]},\"15\":{\"uid\":\"5e2ab188-1726-"
+    "4e75-a04f-1ed9a6a89c4c\"}}}}"
   );
 
   const std::string result(apache::thrift::ThriftJSONString(*n));
@@ -162,12 +165,14 @@
   "},\"7\":{\"dbl\":3.1415926535897931},\"8\":{\"str\":\"JSON THIS! \\\"\\u0001"
   "\"},\"9\":{\"str\":\"\xd7\\n\\u0007\\t\"},\"10\":{\"tf\":0},\"11\":{\"str\":"
   "\"AQIDrQ\"},\"12\":{\"lst\":[\"i8\",3,1,2,3]},\"13\":{\"lst\":[\"i16\",3,1,2"
-  ",3]},\"14\":{\"lst\":[\"i64\",3,1,2,3]}},{\"1\":{\"tf\":1},\"2\":{\"tf\":0},"
+  ",3]},\"14\":{\"lst\":[\"i64\",3,1,2,3]},\"15\":{\"uid\":\"00000000-0000-0000"
+  "-0000-000000000000\"}},{\"1\":{\"tf\":1},\"2\":{\"tf\":0},"
   "\"3\":{\"i8\":51},\"4\":{\"i16\":16},\"5\":{\"i32\":32},\"6\":{\"i64\":64},"
   "\"7\":{\"dbl\":1.6180339887498949},\"8\":{\"str\":\":R (me going \\\"rrrr\\\""
   ")\"},\"9\":{\"str\":\"ӀⅮΝ Нοⅿоɡгаρℎ Αttαⅽκǃ‼\"},\"10\":{\"tf\":0},\"11\":{"
   "\"str\":\"AQIDrQ\"},\"12\":{\"lst\":[\"i8\",3,1,2,3]},\"13\":{\"lst\":[\"i16"
-  "\",3,1,2,3]},\"14\":{\"lst\":[\"i64\",3,1,2,3]}}]},\"2\":{\"set\":[\"lst\",3"
+  "\",3,1,2,3]},\"14\":{\"lst\":[\"i64\",3,1,2,3]},\"15\":{\"uid\":\"5e2ab188-"
+  "1726-4e75-a04f-1ed9a6a89c4c\"}}]},\"2\":{\"set\":[\"lst\",3"
   ",[\"str\",0],[\"str\",2,\"and a one\",\"and a two\"],[\"str\",3,\"then a one"
   ", two\",\"three!\",\"FOUR!!\"]]},\"3\":{\"map\":[\"str\",\"lst\",3,{\"nothin"
   "g\":[\"rec\",0],\"poe\":[\"rec\",3,{\"1\":{\"i32\":3},\"2\":{\"str\":\"quoth"
@@ -192,6 +197,8 @@
   OneOfEach ooe2;
   ooe2.read(proto.get());
 
+  BOOST_TEST_INFO("written: " << *ooe);
+  BOOST_TEST_INFO("read   : " << ooe2);
   BOOST_CHECK(*ooe == ooe2);
 }
 
@@ -205,6 +212,8 @@
   HolyMoley hm2;
   hm2.read(proto.get());
 
+  BOOST_TEST_INFO("written: " << *hm);
+  BOOST_TEST_INFO("read   : " << hm2);
   BOOST_CHECK(*hm == hm2);
 
   hm2.big[0].a_bite = 0x00;
@@ -230,14 +239,14 @@
   );
 
   std::shared_ptr<TMemoryBuffer> buffer(new TMemoryBuffer());
-  std::shared_ptr<TJSONProtocol> proto(new TJSONProtocol(buffer)); 
+  std::shared_ptr<TJSONProtocol> proto(new TJSONProtocol(buffer));
   dub.write(proto.get());
   Doubles dub_1;
   dub_1.read(proto.get());
 
   const std::string result(apache::thrift::ThriftJSONString(dub));
   const std::string result_1(apache::thrift::ThriftJSONString(dub_1));
-  
+
   BOOST_CHECK_MESSAGE(!expected_result.compare(result),
     "Expected:\n" << expected_result << "\nGotten:\n" << result);
   BOOST_CHECK_MESSAGE(!expected_result.compare(result_1),
diff --git a/lib/cpp/test/Makefile.am b/lib/cpp/test/Makefile.am
index cd401c0..adb923a 100644
--- a/lib/cpp/test/Makefile.am
+++ b/lib/cpp/test/Makefile.am
@@ -83,6 +83,8 @@
 
 check_PROGRAMS = \
 	UnitTests \
+	UnitTestsUuid \
+	UnitTestsUuidNoDirective \
 	TFDTransportTest \
 	TPipedTransportTest \
 	DebugProtoTest \
@@ -131,7 +133,8 @@
 	TServerSocketTest.cpp \
 	TServerTransportTest.cpp \
 	TTransportCheckThrow.h \
-	ThrifttReadCheckTests.cpp
+	ThrifttReadCheckTests.cpp \
+	TUuidTest.cpp
 
 UnitTests_LDADD = \
   libtestgencpp.la \
@@ -139,6 +142,30 @@
   $(BOOST_SYSTEM_LDADD) \
   $(BOOST_THREAD_LDADD)
 
+UnitTestsUuid_SOURCES = \
+	UnitTestMain.cpp \
+	TUuidTestBoost.cpp
+
+UnitTestsUuid_LDADD = \
+  libtestgencpp.la \
+  $(BOOST_TEST_LDADD) \
+  $(BOOST_SYSTEM_LDADD) \
+  $(BOOST_THREAD_LDADD)
+
+UnitTestsUuid_CPPFLAGS = \
+   $(AM_CPPFLAGS) \
+  -DTHRIFT_TUUID_SUPPORT_BOOST_UUID
+
+UnitTestsUuidNoDirective_SOURCES = \
+	UnitTestMain.cpp \
+	TUuidTestBoostNoDirective.cpp
+
+UnitTestsUuidNoDirective_LDADD = \
+  libtestgencpp.la \
+  $(BOOST_TEST_LDADD) \
+  $(BOOST_SYSTEM_LDADD) \
+  $(BOOST_THREAD_LDADD)
+
 TInterruptTest_SOURCES = \
 	TSocketInterruptTest.cpp \
 	TSSLSocketInterruptTest.cpp
@@ -386,7 +413,7 @@
 gen-cpp/AnnotationTest_constants.cpp gen-cpp/AnnotationTest_constants.h gen-cpp/AnnotationTest_types.cpp gen-cpp/AnnotationTest_types.h: $(top_srcdir)/test/AnnotationTest.thrift
 	$(THRIFT) --gen cpp $<
 
-gen-cpp/DebugProtoTest_types.cpp gen-cpp/DebugProtoTest_types.h gen-cpp/EmptyService.cpp gen-cpp/EmptyService.h: $(top_srcdir)/test/v0.16/DebugProtoTest.thrift
+gen-cpp/DebugProtoTest_types.cpp gen-cpp/DebugProtoTest_types.h gen-cpp/EmptyService.cpp gen-cpp/EmptyService.h: $(top_srcdir)/test/DebugProtoTest.thrift
 	$(THRIFT) --gen cpp $<
 
 gen-cpp/DoubleConstantsTest_constants.cpp gen-cpp/DoubleConstantsTest_constants.h: $(top_srcdir)/test/DoubleConstantsTest.thrift
@@ -408,7 +435,7 @@
 gen-cpp/Service.cpp gen-cpp/StressTest_types.cpp: $(top_srcdir)/test/StressTest.thrift
 	$(THRIFT) --gen cpp $<
 
-gen-cpp/SecondService.cpp gen-cpp/ThriftTest_constants.cpp gen-cpp/ThriftTest.cpp gen-cpp/ThriftTest_types.cpp gen-cpp/ThriftTest_types.h: $(top_srcdir)/test/v0.16/ThriftTest.thrift
+gen-cpp/SecondService.cpp gen-cpp/ThriftTest_constants.cpp gen-cpp/ThriftTest.cpp gen-cpp/ThriftTest_types.cpp gen-cpp/ThriftTest_types.h: $(top_srcdir)/test/ThriftTest.thrift
 	$(THRIFT) --gen cpp $<
 
 gen-cpp/OneWayService.cpp gen-cpp/OneWayTest_types.h gen-cpp/OneWayService.h: OneWayTest.thrift
@@ -424,6 +451,9 @@
 clean-local:
 	$(RM) gen-cpp/*
 
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
 EXTRA_DIST = \
 	concurrency \
 	processor \
diff --git a/lib/cpp/test/OneWayHTTPTest.cpp b/lib/cpp/test/OneWayHTTPTest.cpp
index 7823482..8789c2c 100644
--- a/lib/cpp/test/OneWayHTTPTest.cpp
+++ b/lib/cpp/test/OneWayHTTPTest.cpp
@@ -55,9 +55,6 @@
 using apache::thrift::transport::TSocket;
 using apache::thrift::transport::TTransportException;
 using std::shared_ptr;
-using std::cout;
-using std::cerr;
-using std::endl;
 using std::string;
 namespace utf = boost::unit_test;
 
@@ -70,12 +67,12 @@
 
   void roundTripRPC() override {
 #ifdef ENABLE_STDERR_LOGGING
-    cerr << "roundTripRPC()" << endl;
+    cerr << "roundTripRPC()" << '\n';
 #endif
   }
   void oneWayRPC() override {
 #ifdef ENABLE_STDERR_LOGGING
-    cerr << "oneWayRPC()" << std::endl ;
+    cerr << "oneWayRPC()" << '\n';
 #endif
  }
 };
@@ -201,7 +198,7 @@
 
   int port = ss->getPort() ;
 #ifdef ENABLE_STDERR_LOGGING
-  cerr << "port " << port << endl ;
+  cerr << "port " << port << '\n';
 #endif
 
   {
diff --git a/lib/cpp/test/SpecializationTest.cpp b/lib/cpp/test/SpecializationTest.cpp
index 008837d..7256c20 100644
--- a/lib/cpp/test/SpecializationTest.cpp
+++ b/lib/cpp/test/SpecializationTest.cpp
@@ -26,6 +26,7 @@
   ooe.some_characters = "JSON THIS! \"\1";
   ooe.zomg_unicode = "\xd7\n\a\t";
   ooe.base64 = "\1\2\3\255";
+  ooe.rfc4122_uuid = apache::thrift::TUuid{"00000000-0000-0000-0000-000000000000"};
 
   Nesting n;
   n.my_ooe = ooe;
@@ -89,6 +90,8 @@
   OneOfEach ooe2;
   ooe2.read(proto.get());
 
+  BOOST_TEST_INFO("Write: " << ooe);
+  BOOST_TEST_INFO("Read : " << ooe2);
   BOOST_CHECK(ooe == ooe2);
 
   hm.write(proto.get());
diff --git a/lib/cpp/test/TMemoryBufferTest.cpp b/lib/cpp/test/TMemoryBufferTest.cpp
index 2f1aea6..53e5d15 100644
--- a/lib/cpp/test/TMemoryBufferTest.cpp
+++ b/lib/cpp/test/TMemoryBufferTest.cpp
@@ -36,8 +36,6 @@
 using apache::thrift::transport::TMemoryBuffer;
 using apache::thrift::transport::TTransportException;
 using std::shared_ptr;
-using std::cout;
-using std::endl;
 using std::string;
 
 BOOST_AUTO_TEST_CASE(test_read_write_grow) {
diff --git a/lib/cpp/test/TServerSocketTest.cpp b/lib/cpp/test/TServerSocketTest.cpp
index 929defa..0860242 100644
--- a/lib/cpp/test/TServerSocketTest.cpp
+++ b/lib/cpp/test/TServerSocketTest.cpp
@@ -43,7 +43,7 @@
   accepted->close();
   sock1.close();
 
-  std::cout << "An error message from getaddrinfo on the console is expected:" << std::endl;
+  std::cout << "An error message from getaddrinfo on the console is expected:" << '\n';
   TServerSocket sock2("257.258.259.260", 0);
   BOOST_CHECK_THROW(sock2.listen(), TTransportException);
   sock2.close();
diff --git a/lib/cpp/test/TUuidTest.cpp b/lib/cpp/test/TUuidTest.cpp
new file mode 100644
index 0000000..4a521cf
--- /dev/null
+++ b/lib/cpp/test/TUuidTest.cpp
@@ -0,0 +1,186 @@
+/*
+ * 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 <boost/test/unit_test.hpp>
+#include <boost/uuid/uuid.hpp>
+#include <boost/uuid/uuid_io.hpp>
+#include <boost/uuid/string_generator.hpp>
+
+#include <thrift/TUuid.h>
+
+using apache::thrift::TUuid;
+
+BOOST_AUTO_TEST_SUITE(TUuidTest)
+
+BOOST_AUTO_TEST_CASE(construction) {
+    BOOST_TEST(TUuid().is_nil());
+}
+
+BOOST_AUTO_TEST_CASE(construction_string_valid) {
+  const std::string expected_1{"5e2ab188-1726-4e75-a04f-1ed9a6a89c4c"};
+
+  BOOST_TEST(to_string(TUuid("5e2ab188-1726-4e75-a04f-1ed9a6a89c4c")) == expected_1);
+  BOOST_TEST(to_string(TUuid("{5e2ab188-1726-4e75-a04f-1ed9a6a89c4c}")) == expected_1);
+  BOOST_TEST(to_string(TUuid("{5e2ab18817264e75a04f1ed9a6a89c4c}")) == expected_1);
+  BOOST_TEST(to_string(TUuid("5e2ab18817264e75a04f1ed9a6a89c4c")) == expected_1);
+}
+
+BOOST_AUTO_TEST_CASE(construction_string_invalid) {
+  // This test also ensures that the constructor does not throw
+  const std::string expected{"00000000-0000-0000-0000-000000000000"};
+
+  BOOST_TEST(to_string(TUuid("5e2ab188-1726-4e75-a04f")) == expected);
+  BOOST_TEST(to_string(TUuid("{}")) == expected);
+  BOOST_TEST(to_string(TUuid("{5e2ab18817264e75a04f1ed9a6a89c4c")) == expected);
+  BOOST_TEST(to_string(TUuid("5e2ab18817264e75a04f1ed9a689c4c")) == expected);
+}
+
+BOOST_AUTO_TEST_CASE(compare) {
+  BOOST_TEST(TUuid("5e2ab188-1726-4e75-a04f-1ed9a6a89c4c")
+             == TUuid("5e2ab188-1726-4e75-a04f-1ed9a6a89c4c"));
+  BOOST_TEST(TUuid("5e2ab188-1726-4e75-a04f-1ed9a6a89c4c")
+             != TUuid("00000000-1726-4e75-a04f-1ed9a6a89c4c"));
+  BOOST_TEST(TUuid("{5e2ab188-1726-4e75-a04f-1ed9a6a89c4c}")
+             == TUuid("5e2ab188-1726-4e75-a04f-1ed9a6a89c4c"));
+
+  // This comparison is expected to fail if strcmp is used
+  TUuid uuid_1{};
+  TUuid uuid_2{};
+  uuid_2.data()[15] = 0x64;
+  BOOST_TEST(uuid_1 != uuid_2);
+}
+
+BOOST_AUTO_TEST_CASE(assign_valid) {
+  TUuid uuid_1{};
+  BOOST_TEST(uuid_1.is_nil());
+  uuid_1 = TUuid{"5e2ab188-1726-4e75-a04f-1ed9a6a89c4c"};
+  BOOST_TEST(!uuid_1.is_nil());
+
+  BOOST_TEST(uuid_1 == TUuid("5e2ab188-1726-4e75-a04f-1ed9a6a89c4c"));
+
+  uuid_1 = TUuid{"{12345678-1726-4e75-a04f-1ed9a6a89c4c}"};
+  BOOST_TEST(uuid_1 != TUuid("5e2ab188-1726-4e75-a04f-1ed9a6a89c4c"));
+  BOOST_TEST(uuid_1 == TUuid("{12345678-1726-4e75-a04f-1ed9a6a89c4c}"));
+}
+
+BOOST_AUTO_TEST_CASE(assign_invalid) {
+  TUuid uuid_1{"5e2ab188-1726-4e75-a04f-1ed9a6a89c4c"};
+  BOOST_TEST(!uuid_1.is_nil());
+
+  BOOST_CHECK_NO_THROW(uuid_1 = TUuid{"123"});
+  BOOST_TEST(uuid_1.is_nil());
+  BOOST_TEST(to_string(uuid_1) == std::string{"00000000-0000-0000-0000-000000000000"});
+}
+
+BOOST_AUTO_TEST_CASE(swap) {
+  TUuid uuid_1{"5e2ab188-1726-4e75-a04f-1ed9a6a89c4c"};
+  TUuid uuid_2{};
+  BOOST_TEST(!uuid_1.is_nil());
+  BOOST_TEST(uuid_2.is_nil());
+
+  using std::swap;
+  swap(uuid_1, uuid_2);
+
+  BOOST_TEST(uuid_1.is_nil());
+  BOOST_TEST(!uuid_2.is_nil());
+
+  BOOST_TEST(to_string(uuid_1) == std::string{"00000000-0000-0000-0000-000000000000"});
+  BOOST_TEST(to_string(uuid_2) == std::string{"5e2ab188-1726-4e75-a04f-1ed9a6a89c4c"});
+}
+
+BOOST_AUTO_TEST_CASE(begin_end) {
+  TUuid uuid_1{"5e2ab188-1726-4e75-a04f-1ed9a6a89c4c"};
+  BOOST_TEST(std::distance(std::begin(uuid_1), std::end(uuid_1)) == uuid_1.size());
+}
+
+BOOST_AUTO_TEST_CASE(into_boost_uuid) {
+  TUuid uuid{"5e2ab188-1726-4e75-a04f-1ed9a6a89c4c"};
+  boost::uuids::uuid boost_uuid{};
+  BOOST_TEST(boost_uuid.is_nil());
+  std::copy(std::begin(uuid), std::end(uuid), boost_uuid.begin());
+  BOOST_TEST(!boost_uuid.is_nil());
+  BOOST_TEST(boost::uuids::to_string(boost_uuid) == "5e2ab188-1726-4e75-a04f-1ed9a6a89c4c");
+  BOOST_TEST(boost::uuids::to_string(boost_uuid) == to_string(uuid));
+}
+
+BOOST_AUTO_TEST_CASE(from_boost_uuid) {
+  static boost::uuids::string_generator gen;
+  boost::uuids::uuid boost_uuid{gen("1f610073-db33-4d21-adf2-75460d4955cc")};
+  BOOST_TEST(!boost_uuid.is_nil());
+  TUuid uuid;
+  BOOST_TEST(uuid.is_nil());
+
+  std::copy(std::begin(boost_uuid), std::end(boost_uuid), uuid.begin());
+  BOOST_TEST(!uuid.is_nil());
+
+  BOOST_TEST(to_string(boost_uuid) == to_string(uuid));
+}
+
+BOOST_AUTO_TEST_CASE(test_byte_order_variant) {
+  TUuid uuid{"5e2ab188-1726-4e75-a04f-1ed9a6a89c4c"};
+  boost::uuids::uuid boost_uuid{};
+  BOOST_TEST(boost_uuid.is_nil());
+  std::copy(std::begin(uuid), std::end(uuid), boost_uuid.begin());
+  BOOST_TEST(!boost_uuid.is_nil());
+  BOOST_TEST(boost_uuid.variant() == boost::uuids::uuid::variant_rfc_4122);
+}
+
+BOOST_AUTO_TEST_CASE(test_byte_order_verify_network) {
+  const TUuid uuid{"{00112233-4455-6677-8899-aabbccddeeff}"};
+
+  for (uint8_t idx = 0; idx < uuid.size(); ++idx) {
+    const uint8_t expected = idx * 0x11;
+    BOOST_TEST(*(std::begin(uuid) + idx) == expected);
+  }
+
+  const uint8_t test[16] = {0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
+                            0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff};
+
+  TUuid new_uuid;
+  std::copy(std::begin(test), std::end(test), std::begin(new_uuid));
+
+  BOOST_TEST(!new_uuid.is_nil());
+  BOOST_TEST(to_string(new_uuid) == std::string{"00112233-4455-6677-8899-aabbccddeeff"});
+
+  BOOST_TEST(new_uuid == uuid);
+}
+
+BOOST_AUTO_TEST_CASE(test_character_buffer) {
+
+  const uint8_t test[16] = {0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
+                            0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff};
+
+  const TUuid uuid{test};
+
+  BOOST_TEST(to_string(uuid) == std::string{"00112233-4455-6677-8899-aabbccddeeff"});
+}
+
+BOOST_AUTO_TEST_CASE(test_boost_buffer) {
+
+  static boost::uuids::string_generator gen;
+  boost::uuids::uuid boost_uuid{gen("1f610073-db33-4d21-adf2-75460d4955cc")};
+  BOOST_TEST(!boost_uuid.is_nil());
+
+  const TUuid uuid{boost_uuid.data};
+
+  BOOST_TEST(to_string(boost_uuid) == to_string(uuid));
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/lib/cpp/test/TUuidTestBoost.cpp b/lib/cpp/test/TUuidTestBoost.cpp
new file mode 100644
index 0000000..81c3559
--- /dev/null
+++ b/lib/cpp/test/TUuidTestBoost.cpp
@@ -0,0 +1,65 @@
+/*
+ * 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 <boost/test/unit_test.hpp>
+#include <boost/uuid/uuid.hpp>
+#include <boost/uuid/uuid_io.hpp>
+#include <boost/uuid/string_generator.hpp>
+
+#include <thrift/TUuid.h>
+
+using apache::thrift::TUuid;
+
+BOOST_AUTO_TEST_SUITE(TUuidBoostTest)
+
+BOOST_AUTO_TEST_CASE(compiler_directive) {
+    // Test if the macro is set as expected
+    #ifdef THRIFT_TUUID_SUPPORT_BOOST_UUID
+    BOOST_TEST(true);
+    #else
+    BOOST_TEST(false, "The 'THRIFT_TUUID_SUPPORT_BOOST_UUID' preprocessor directive must be set for these tests");
+    #endif // THRIFT_TUUID_SUPPORT_BOOST_UUID
+}
+
+BOOST_AUTO_TEST_CASE(from_boost_uuid_constructor) {
+  static boost::uuids::string_generator gen;
+  boost::uuids::uuid boost_uuid{gen("1f610073-db33-4d21-adf2-75460d4955cc")};
+  BOOST_TEST(!boost_uuid.is_nil());
+  const TUuid uuid{boost_uuid};
+  BOOST_TEST(!uuid.is_nil());
+
+  BOOST_TEST(to_string(boost_uuid) == to_string(uuid));
+  BOOST_TEST(to_string(uuid) == std::string{"1f610073-db33-4d21-adf2-75460d4955cc"});
+}
+
+BOOST_AUTO_TEST_CASE(from_boost_uuid_assignment) {
+  static boost::uuids::string_generator gen;
+  boost::uuids::uuid boost_uuid{gen("5cb719a4-cd15-4476-8bcc-f1834b2527ee")};
+  BOOST_TEST(!boost_uuid.is_nil());
+  TUuid uuid{};
+  BOOST_TEST(uuid.is_nil());
+
+  uuid = boost_uuid;
+
+  BOOST_TEST(to_string(boost_uuid) == to_string(uuid));
+  BOOST_TEST(to_string(uuid) == std::string{"5cb719a4-cd15-4476-8bcc-f1834b2527ee"});
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/lib/cpp/test/TUuidTestBoostNoDirective.cpp b/lib/cpp/test/TUuidTestBoostNoDirective.cpp
new file mode 100644
index 0000000..8af9c35
--- /dev/null
+++ b/lib/cpp/test/TUuidTestBoostNoDirective.cpp
@@ -0,0 +1,82 @@
+/*
+ * 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 <boost/test/unit_test.hpp>
+
+BOOST_AUTO_TEST_SUITE(TUuidBoostTestNoDirective)
+
+BOOST_AUTO_TEST_CASE(compiler_directive_not_set) {
+    // Test if the macro is set as expected
+    #ifdef THRIFT_TUUID_SUPPORT_BOOST_UUID
+    BOOST_TEST(false, "The 'THRIFT_TUUID_SUPPORT_BOOST_UUID' preprocessor must NOT be set for these tests");
+    #else
+    BOOST_TEST(true);
+    #endif // THRIFT_TUUID_SUPPORT_BOOST_UUID
+}
+BOOST_AUTO_TEST_SUITE_END()
+
+// This inclusion order is unconventional: This test specifcially tests that
+// the THRIFT_TUUID_SUPPORT_BOOST_UUID directive can be set before including the header
+// to enable boost::uuid support without causing linking or other errors with
+// the compiled thrift library.
+
+#define THRIFT_TUUID_SUPPORT_BOOST_UUID
+#define THRIFT_TUUID_BOOST_CONSTRUCTOR_EXPLICIT
+
+#include <boost/uuid/uuid_io.hpp>
+#include <boost/uuid/string_generator.hpp>
+
+#include <thrift/TUuid.h>
+using apache::thrift::TUuid;
+
+BOOST_AUTO_TEST_SUITE(TUuidBoostTestNoDirective)
+
+BOOST_AUTO_TEST_CASE(compiler_directive_set) {
+    // Test if the macro is set as expected
+    #ifdef THRIFT_TUUID_SUPPORT_BOOST_UUID
+    BOOST_TEST(true);
+    #else
+    BOOST_TEST(false, "The 'THRIFT_TUUID_SUPPORT_BOOST_UUID' preprocessor must now be set for these tests");
+    #endif // THRIFT_TUUID_SUPPORT_BOOST_UUID
+}
+
+BOOST_AUTO_TEST_CASE(from_boost_uuid_constructor) {
+  static boost::uuids::string_generator gen;
+  boost::uuids::uuid boost_uuid{gen("5cb719a4-cd15-4476-8bcc-f1834b2527ee")};
+  BOOST_TEST(!boost_uuid.is_nil());
+  const TUuid uuid{boost_uuid};
+  BOOST_TEST(!uuid.is_nil());
+
+  BOOST_TEST(to_string(boost_uuid) == to_string(uuid));
+  BOOST_TEST(to_string(uuid) == std::string{"5cb719a4-cd15-4476-8bcc-f1834b2527ee"});
+}
+
+BOOST_AUTO_TEST_CASE(from_boost_uuid_assignment) {
+  static boost::uuids::string_generator gen;
+  boost::uuids::uuid boost_uuid{gen("1f610073-db33-4d21-adf2-75460d4955cc")};
+  BOOST_TEST(!boost_uuid.is_nil());
+  TUuid uuid{};
+  BOOST_TEST(uuid.is_nil());
+
+  uuid = TUuid{boost_uuid};
+
+  BOOST_TEST(to_string(boost_uuid) == to_string(uuid));
+  BOOST_TEST(to_string(uuid) == std::string{"1f610073-db33-4d21-adf2-75460d4955cc"});
+}
+BOOST_AUTO_TEST_SUITE_END()
\ No newline at end of file
diff --git a/lib/cpp/test/ThrifttReadCheckTests.cpp b/lib/cpp/test/ThrifttReadCheckTests.cpp
index eb4ca01..481185e 100644
--- a/lib/cpp/test/ThrifttReadCheckTests.cpp
+++ b/lib/cpp/test/ThrifttReadCheckTests.cpp
@@ -55,8 +55,6 @@
 using apache::thrift::transport::TBufferedTransport;
 using apache::thrift::transport::TFramedTransport;
 using std::shared_ptr;
-using std::cout;
-using std::endl;
 using std::string;
 using std::memset;
 using namespace apache::thrift;
diff --git a/lib/cpp/test/ToStringTest.cpp b/lib/cpp/test/ToStringTest.cpp
index 736b33c..cb792df 100644
--- a/lib/cpp/test/ToStringTest.cpp
+++ b/lib/cpp/test/ToStringTest.cpp
@@ -160,4 +160,13 @@
                     "ListBonks(bonk=[Bonk(message=a, type=0), Bonk(message=b, type=0)])");
 }
 
+BOOST_AUTO_TEST_CASE(generated_uuid_to_string) {
+  thrift::test::CrazyNesting l;
+  l.uuid_field = apache::thrift::TUuid{"{4b686716-5f20-4deb-8ce0-9eaf379e8a3d}"};
+
+  BOOST_CHECK_EQUAL(to_string(l),
+                    "CrazyNesting(string_field=, set_field=<null>, list_field=[], binary_field=, "
+                    "uuid_field=4b686716-5f20-4deb-8ce0-9eaf379e8a3d)");
+}
+
 BOOST_AUTO_TEST_SUITE_END()
diff --git a/lib/cpp/test/concurrency/Tests.cpp b/lib/cpp/test/concurrency/Tests.cpp
index 45054a9..67de789 100644
--- a/lib/cpp/test/concurrency/Tests.cpp
+++ b/lib/cpp/test/concurrency/Tests.cpp
@@ -51,52 +51,52 @@
 
     ThreadFactoryTests threadFactoryTests;
 
-    std::cout << "ThreadFactory tests..." << std::endl;
+    std::cout << "ThreadFactory tests..." << '\n';
 
     const int reapLoops = 2 * WEIGHT;
     const int reapCount = 100 * WEIGHT;
     const size_t floodLoops = 3;
     const size_t floodCount = 500 * WEIGHT;
 
-    std::cout << "\t\tThreadFactory reap N threads test: N = " << reapLoops << "x" << reapCount << std::endl;
+    std::cout << "\t\tThreadFactory reap N threads test: N = " << reapLoops << "x" << reapCount << '\n';
 
     if (!threadFactoryTests.reapNThreads(reapLoops, reapCount)) {
-      std::cerr << "\t\ttThreadFactory reap N threads FAILED" << std::endl;
+      std::cerr << "\t\ttThreadFactory reap N threads FAILED" << '\n';
       return 1;
     }
 
-    std::cout << "\t\tThreadFactory flood N threads test: N = " << floodLoops << "x" << floodCount << std::endl;
+    std::cout << "\t\tThreadFactory flood N threads test: N = " << floodLoops << "x" << floodCount << '\n';
 
     if (!threadFactoryTests.floodNTest(floodLoops, floodCount)) {
-      std::cerr << "\t\ttThreadFactory flood N threads FAILED" << std::endl;
+      std::cerr << "\t\ttThreadFactory flood N threads FAILED" << '\n';
       return 1;
     }
 
-    std::cout << "\t\tThreadFactory synchronous start test" << std::endl;
+    std::cout << "\t\tThreadFactory synchronous start test" << '\n';
 
     if (!threadFactoryTests.synchStartTest()) {
-      std::cerr << "\t\ttThreadFactory synchronous start FAILED" << std::endl;
+      std::cerr << "\t\ttThreadFactory synchronous start FAILED" << '\n';
       return 1;
     }
 
-    std::cout << "\t\tThreadFactory monitor timeout test" << std::endl;
+    std::cout << "\t\tThreadFactory monitor timeout test" << '\n';
 
     if (!threadFactoryTests.monitorTimeoutTest()) {
-      std::cerr << "\t\ttThreadFactory monitor timeout FAILED" << std::endl;
+      std::cerr << "\t\ttThreadFactory monitor timeout FAILED" << '\n';
       return 1;
     }
   }
 
   if (runAll || args[0].compare("util") == 0) {
 
-    std::cout << "Util tests..." << std::endl;
+    std::cout << "Util tests..." << '\n';
 
-    std::cout << "\t\tUtil minimum time" << std::endl;
+    std::cout << "\t\tUtil minimum time" << '\n';
 
     int64_t time00 = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::steady_clock::now().time_since_epoch()).count();
     int64_t time01 = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::steady_clock::now().time_since_epoch()).count();
 
-    std::cout << "\t\t\tMinimum time: " << time01 - time00 << "ms" << std::endl;
+    std::cout << "\t\t\tMinimum time: " << time01 - time00 << "ms" << '\n';
 
     time00 = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::steady_clock::now().time_since_epoch()).count();
     time01 = time00;
@@ -107,54 +107,54 @@
       time01 = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::steady_clock::now().time_since_epoch()).count();
     }
 
-    std::cout << "\t\t\tscall per ms: " << count / (time01 - time00) << std::endl;
+    std::cout << "\t\t\tscall per ms: " << count / (time01 - time00) << '\n';
   }
 
   if (runAll || args[0].compare("timer-manager") == 0) {
 
-    std::cout << "TimerManager tests..." << std::endl;
+    std::cout << "TimerManager tests..." << '\n';
 
-    std::cout << "\t\tTimerManager test00" << std::endl;
+    std::cout << "\t\tTimerManager test00" << '\n';
 
     TimerManagerTests timerManagerTests;
 
     if (!timerManagerTests.test00()) {
-      std::cerr << "\t\tTimerManager tests FAILED" << std::endl;
+      std::cerr << "\t\tTimerManager tests FAILED" << '\n';
       return 1;
     }
 
-    std::cout << "\t\tTimerManager test01" << std::endl;
+    std::cout << "\t\tTimerManager test01" << '\n';
 
     if (!timerManagerTests.test01()) {
-      std::cerr << "\t\tTimerManager tests FAILED" << std::endl;
+      std::cerr << "\t\tTimerManager tests FAILED" << '\n';
       return 1;
     }
 
-    std::cout << "\t\tTimerManager test02" << std::endl;
+    std::cout << "\t\tTimerManager test02" << '\n';
 
     if (!timerManagerTests.test02()) {
-      std::cerr << "\t\tTimerManager tests FAILED" << std::endl;
+      std::cerr << "\t\tTimerManager tests FAILED" << '\n';
       return 1;
     }
 
-    std::cout << "\t\tTimerManager test03" << std::endl;
+    std::cout << "\t\tTimerManager test03" << '\n';
 
     if (!timerManagerTests.test03()) {
-      std::cerr << "\t\tTimerManager tests FAILED" << std::endl;
+      std::cerr << "\t\tTimerManager tests FAILED" << '\n';
       return 1;
     }
 
-    std::cout << "\t\tTimerManager test04" << std::endl;
+    std::cout << "\t\tTimerManager test04" << '\n';
 
     if (!timerManagerTests.test04()) {
-      std::cerr << "\t\tTimerManager tests FAILED" << std::endl;
+      std::cerr << "\t\tTimerManager tests FAILED" << '\n';
       return 1;
     }
   }
 
   if (runAll || args[0].compare("thread-manager") == 0) {
 
-    std::cout << "ThreadManager tests..." << std::endl;
+    std::cout << "ThreadManager tests..." << '\n';
 
     {
       size_t workerCount = 10 * WEIGHT;
@@ -163,26 +163,26 @@
 
       ThreadManagerTests threadManagerTests;
 
-      std::cout << "\t\tThreadManager api test:" << std::endl;
+      std::cout << "\t\tThreadManager api test:" << '\n';
 
       if (!threadManagerTests.apiTest()) {
-        std::cerr << "\t\tThreadManager apiTest FAILED" << std::endl;
+        std::cerr << "\t\tThreadManager apiTest FAILED" << '\n';
         return 1;
       }
 
       std::cout << "\t\tThreadManager load test: worker count: " << workerCount
-                << " task count: " << taskCount << " delay: " << delay << std::endl;
+                << " task count: " << taskCount << " delay: " << delay << '\n';
 
       if (!threadManagerTests.loadTest(taskCount, delay, workerCount)) {
-        std::cerr << "\t\tThreadManager loadTest FAILED" << std::endl;
+        std::cerr << "\t\tThreadManager loadTest FAILED" << '\n';
         return 1;
       }
 
       std::cout << "\t\tThreadManager block test: worker count: " << workerCount
-                << " delay: " << delay << std::endl;
+                << " delay: " << delay << '\n';
 
       if (!threadManagerTests.blockTest(delay, workerCount)) {
-        std::cerr << "\t\tThreadManager blockTest FAILED" << std::endl;
+        std::cerr << "\t\tThreadManager blockTest FAILED" << '\n';
         return 1;
       }
     }
@@ -190,7 +190,7 @@
 
   if (runAll || args[0].compare("thread-manager-benchmark") == 0) {
 
-    std::cout << "ThreadManager benchmark tests..." << std::endl;
+    std::cout << "ThreadManager benchmark tests..." << '\n';
 
     {
 
@@ -207,19 +207,19 @@
         size_t taskCount = workerCount * tasksPerWorker;
 
         std::cout << "\t\tThreadManager load test: worker count: " << workerCount
-                  << " task count: " << taskCount << " delay: " << delay << std::endl;
+                  << " task count: " << taskCount << " delay: " << delay << '\n';
 
         ThreadManagerTests threadManagerTests;
 
         if (!threadManagerTests.loadTest(taskCount, delay, workerCount))
         {
-          std::cerr << "\t\tThreadManager loadTest FAILED" << std::endl;
+          std::cerr << "\t\tThreadManager loadTest FAILED" << '\n';
           return 1;
         }
       }
     }
   }
 
-  std::cout << "ALL TESTS PASSED" << std::endl;
+  std::cout << "ALL TESTS PASSED" << '\n';
   return 0;
 }
diff --git a/lib/cpp/test/concurrency/ThreadFactoryTests.h b/lib/cpp/test/concurrency/ThreadFactoryTests.h
index 23e46e3..a2d55fe 100644
--- a/lib/cpp/test/concurrency/ThreadFactoryTests.h
+++ b/lib/cpp/test/concurrency/ThreadFactoryTests.h
@@ -53,7 +53,7 @@
 
     void run() override {
       Synchronized s(_monitor);
-      
+
       if (--_count == 0) {
         _monitor.notify();
       }
@@ -82,7 +82,7 @@
               threadFactory.newThread(shared_ptr<Runnable>(new ReapNTask(*monitor, activeCount))));
         } catch (SystemResourceException& e) {
           std::cout << "\t\t\tfailed to create " << lix* count + tix << " thread " << e.what()
-                    << std::endl;
+                    << '\n';
           throw;
         }
       }
@@ -96,7 +96,7 @@
           (*thread)->start();
         } catch (SystemResourceException& e) {
           std::cout << "\t\t\tfailed to start  " << lix* count + tix << " thread " << e.what()
-                    << std::endl;
+                    << '\n';
           throw;
         }
       }
@@ -107,11 +107,11 @@
           monitor->wait(1000);
         }
       }
-      
-      std::cout << "\t\t\treaped " << lix* count << " threads" << std::endl;
+
+      std::cout << "\t\t\treaped " << lix* count << " threads" << '\n';
     }
 
-    std::cout << "\t\t\tSuccess!" << std::endl;
+    std::cout << "\t\t\tSuccess!" << '\n';
     return true;
   }
 
@@ -202,7 +202,7 @@
 
     bool success = true;
 
-    std::cout << "\t\t\t" << (success ? "Success" : "Failure") << "!" << std::endl;
+    std::cout << "\t\t\t" << (success ? "Success" : "Failure") << "!" << '\n';
 
     return true;
   }
@@ -239,7 +239,7 @@
     std::cout << "\t\t\t" << (success ? "Success" : "Failure")
               << ": minimum required time to elapse " << count * timeout
               << "ms; actual elapsed time " << endTime - startTime << "ms"
-              << std::endl;
+              << '\n';
 
     return success;
   }
@@ -250,14 +250,14 @@
     ~FloodTask() override {
       if (_id % 10000 == 0) {
 		Synchronized sync(_mon);
-        std::cout << "\t\tthread " << _id << " done" << std::endl;
+        std::cout << "\t\tthread " << _id << " done" << '\n';
       }
     }
 
     void run() override {
       if (_id % 10000 == 0) {
 		Synchronized sync(_mon);
-        std::cout << "\t\tthread " << _id << " started" << std::endl;
+        std::cout << "\t\tthread " << _id << " started" << '\n';
       }
     }
     const size_t _id;
@@ -270,7 +270,7 @@
 
     bool success = false;
     Monitor mon;
-	
+
     for (size_t lix = 0; lix < loop; lix++) {
 
       ThreadFactory threadFactory = ThreadFactory();
@@ -287,14 +287,14 @@
         } catch (TException& e) {
 
           std::cout << "\t\t\tfailed to start  " << lix* count + tix << " thread " << e.what()
-                    << std::endl;
+                    << '\n';
 
           return success;
         }
       }
 
       Synchronized sync(mon);
-      std::cout << "\t\t\tflooded " << (lix + 1) * count << " threads" << std::endl;
+      std::cout << "\t\t\tflooded " << (lix + 1) * count << " threads" << '\n';
       success = true;
     }
 
diff --git a/lib/cpp/test/concurrency/ThreadManagerTests.h b/lib/cpp/test/concurrency/ThreadManagerTests.h
index fee7c7c..b33fc27 100644
--- a/lib/cpp/test/concurrency/ThreadManagerTests.h
+++ b/lib/cpp/test/concurrency/ThreadManagerTests.h
@@ -76,7 +76,7 @@
       {
         Synchronized s(_monitor);
 
-        // std::cout << "Thread " << _count << " completed " << std::endl;
+        // std::cout << "Thread " << _count << " completed " << '\n';
 
         _count--;
         if (_count % 10000 == 0) {
@@ -131,13 +131,13 @@
       threadManager->add(*ix);
     }
 
-    std::cout << "\t\t\t\tloaded " << count << " tasks to execute" << std::endl;
+    std::cout << "\t\t\t\tloaded " << count << " tasks to execute" << '\n';
 
     {
       Synchronized s(monitor);
 
       while (activeCount > 0) {
-        std::cout << "\t\t\t\tactiveCount = " << activeCount << std::endl;
+        std::cout << "\t\t\t\tactiveCount = " << activeCount << '\n';
         monitor.wait();
       }
     }
@@ -184,13 +184,13 @@
 
     std::cout << "\t\t\tfirst start: " << firstTime << " Last end: " << lastTime
               << " min: " << minTime << "ms max: " << maxTime << "ms average: " << averageTime
-              << "ms" << std::endl;
+              << "ms" << '\n';
 
     bool success = (time01 - time00) >= ((int64_t)count * timeout) / (int64_t)workerCount;
 
     std::cout << "\t\t\t" << (success ? "Success" : "Failure")
               << "! expected time: " << ((int64_t)count * timeout) / (int64_t)workerCount << "ms elapsed time: " << time01 - time00
-              << "ms" << std::endl;
+              << "ms" << '\n';
 
     return success;
   }
@@ -307,7 +307,7 @@
       }
 
       std::cout << "\t\t\t"
-                << "Pending tasks " << threadManager->pendingTaskCount() << std::endl;
+                << "Pending tasks " << threadManager->pendingTaskCount() << '\n';
 
       {
         Synchronized s(blockMonitor);
@@ -323,18 +323,18 @@
       }
 
       std::cout << "\t\t\t"
-                << "Pending tasks " << threadManager->pendingTaskCount() << std::endl;
+                << "Pending tasks " << threadManager->pendingTaskCount() << '\n';
 
       try {
         threadManager->add(extraTask, 1);
       } catch (TimedOutException&) {
         std::cout << "\t\t\t"
-                  << "add timed out unexpectedly" << std::endl;
+                  << "add timed out unexpectedly" << '\n';
         throw TException("Unexpected timeout adding task");
 
       } catch (TooManyPendingTasksException&) {
         std::cout << "\t\t\t"
-                  << "add encountered too many pending exepctions" << std::endl;
+                  << "add encountered too many pending exepctions" << '\n';
         throw TException("Unexpected timeout adding task");
       }
 
@@ -375,10 +375,10 @@
       }
 
     } catch (TException& e) {
-      std::cout << "ERROR: " << e.what() << std::endl;
+      std::cout << "ERROR: " << e.what() << '\n';
     }
 
-    std::cout << "\t\t\t" << (success ? "Success" : "Failure") << std::endl;
+    std::cout << "\t\t\t" << (success ? "Success" : "Failure") << '\n';
     return success;
   }
 
@@ -390,7 +390,7 @@
     sleep_(100);
     int64_t b = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::steady_clock::now().time_since_epoch()).count();
     if (b - a < 50 || b - a > 150) {
-      std::cerr << "\t\t\texpected 100ms gap, found " << (b-a) << "ms gap instead." << std::endl;
+      std::cerr << "\t\t\texpected 100ms gap, found " << (b-a) << "ms gap instead." << '\n';
       return false;
     }
 
@@ -403,18 +403,18 @@
     shared_ptr<ThreadManager> threadManager = ThreadManager::newSimpleThreadManager(1);
     threadManager->threadFactory(threadFactory);
 
-    std::cout << "\t\t\t\tstarting.. " << std::endl;
+    std::cout << "\t\t\t\tstarting.. " << '\n';
 
     threadManager->start();
     threadManager->setExpireCallback(expiredNotifier); // std::bind(&ThreadManagerTests::expiredNotifier, this));
 
-#define EXPECT(FUNC, COUNT) { size_t c = FUNC; if (c != COUNT) { std::cerr << "expected " #FUNC" to be " #COUNT ", but was " << c << std::endl; return false; } }
+#define EXPECT(FUNC, COUNT) { size_t c = FUNC; if (c != COUNT) { std::cerr << "expected " #FUNC" to be " #COUNT ", but was " << c << '\n'; return false; } }
 
     EXPECT(threadManager->workerCount(), 1);
     EXPECT(threadManager->idleWorkerCount(), 1);
     EXPECT(threadManager->pendingTaskCount(), 0);
 
-    std::cout << "\t\t\t\tadd 2nd worker.. " << std::endl;
+    std::cout << "\t\t\t\tadd 2nd worker.. " << '\n';
 
     threadManager->addWorker();
 
@@ -422,7 +422,7 @@
     EXPECT(threadManager->idleWorkerCount(), 2);
     EXPECT(threadManager->pendingTaskCount(), 0);
 
-    std::cout << "\t\t\t\tremove 2nd worker.. " << std::endl;
+    std::cout << "\t\t\t\tremove 2nd worker.. " << '\n';
 
     threadManager->removeWorker();
 
@@ -430,7 +430,7 @@
     EXPECT(threadManager->idleWorkerCount(), 1);
     EXPECT(threadManager->pendingTaskCount(), 0);
 
-    std::cout << "\t\t\t\tremove 1st worker.. " << std::endl;
+    std::cout << "\t\t\t\tremove 1st worker.. " << '\n';
 
     threadManager->removeWorker();
 
@@ -438,7 +438,7 @@
     EXPECT(threadManager->idleWorkerCount(), 0);
     EXPECT(threadManager->pendingTaskCount(), 0);
 
-    std::cout << "\t\t\t\tadd blocking task.. " << std::endl;
+    std::cout << "\t\t\t\tadd blocking task.. " << '\n';
 
     // We're going to throw a blocking task into the mix
     Monitor entryMonitor;   // signaled when task is running
@@ -454,7 +454,7 @@
     EXPECT(threadManager->idleWorkerCount(), 0);
     EXPECT(threadManager->pendingTaskCount(), 1);
 
-    std::cout << "\t\t\t\tadd other task.. " << std::endl;
+    std::cout << "\t\t\t\tadd other task.. " << '\n';
 
     shared_ptr<ThreadManagerTests::Task> otherTask(
       new ThreadManagerTests::Task(doneMonitor, activeCount, 0));
@@ -465,7 +465,7 @@
     EXPECT(threadManager->idleWorkerCount(), 0);
     EXPECT(threadManager->pendingTaskCount(), 2);
 
-    std::cout << "\t\t\t\tremove blocking task specifically.. " << std::endl;
+    std::cout << "\t\t\t\tremove blocking task specifically.. " << '\n';
 
     threadManager->remove(blockingTask);
 
@@ -473,11 +473,11 @@
     EXPECT(threadManager->idleWorkerCount(), 0);
     EXPECT(threadManager->pendingTaskCount(), 1);
 
-    std::cout << "\t\t\t\tremove next pending task.." << std::endl;
+    std::cout << "\t\t\t\tremove next pending task.." << '\n';
 
     shared_ptr<Runnable> nextTask = threadManager->removeNextPending();
     if (nextTask != otherTask) {
-      std::cerr << "\t\t\t\t\texpected removeNextPending to return otherTask" << std::endl;
+      std::cerr << "\t\t\t\t\texpected removeNextPending to return otherTask" << '\n';
       return false;
     }
 
@@ -485,15 +485,15 @@
     EXPECT(threadManager->idleWorkerCount(), 0);
     EXPECT(threadManager->pendingTaskCount(), 0);
 
-    std::cout << "\t\t\t\tremove next pending task (none left).." << std::endl;
+    std::cout << "\t\t\t\tremove next pending task (none left).." << '\n';
 
     nextTask = threadManager->removeNextPending();
     if (nextTask) {
-      std::cerr << "\t\t\t\t\texpected removeNextPending to return an empty Runnable" << std::endl;
+      std::cerr << "\t\t\t\t\texpected removeNextPending to return an empty Runnable" << '\n';
       return false;
     }
 
-    std::cout << "\t\t\t\tadd 2 expired tasks and 1 not.." << std::endl;
+    std::cout << "\t\t\t\tadd 2 expired tasks and 1 not.." << '\n';
 
     shared_ptr<ThreadManagerTests::Task> expiredTask(
       new ThreadManagerTests::Task(doneMonitor, activeCount, 0));
@@ -509,28 +509,28 @@
     EXPECT(threadManager->pendingTaskCount(), 3);
     EXPECT(threadManager->expiredTaskCount(), 0);
 
-    std::cout << "\t\t\t\tremove expired tasks.." << std::endl;
+    std::cout << "\t\t\t\tremove expired tasks.." << '\n';
 
     if (!m_expired.empty()) {
-      std::cerr << "\t\t\t\t\texpected m_expired to be empty" << std::endl;
+      std::cerr << "\t\t\t\t\texpected m_expired to be empty" << '\n';
       return false;
     }
 
     threadManager->removeExpiredTasks();
 
     if (m_expired.size() != 2) {
-      std::cerr << "\t\t\t\t\texpected m_expired to be set" << std::endl;
+      std::cerr << "\t\t\t\t\texpected m_expired to be set" << '\n';
       return false;
     }
 
     if (m_expired.front() != expiredTask) {
-      std::cerr << "\t\t\t\t\texpected m_expired[0] to be the expired task" << std::endl;
+      std::cerr << "\t\t\t\t\texpected m_expired[0] to be the expired task" << '\n';
       return false;
     }
     m_expired.pop_front();
 
     if (m_expired.front() != expiredTask) {
-      std::cerr << "\t\t\t\t\texpected m_expired[1] to be the expired task" << std::endl;
+      std::cerr << "\t\t\t\t\texpected m_expired[1] to be the expired task" << '\n';
       return false;
     }
 
@@ -543,23 +543,23 @@
     EXPECT(threadManager->pendingTaskCount(), 0);
     EXPECT(threadManager->expiredTaskCount(), 2);
 
-    std::cout << "\t\t\t\tadd expired task (again).." << std::endl;
+    std::cout << "\t\t\t\tadd expired task (again).." << '\n';
 
     threadManager->add(expiredTask, 0, 1);  // expires in 1ms
     sleep_(50);  // make sure enough time elapses for it to expire - the shortest expiration time is 1ms
 
-    std::cout << "\t\t\t\tadd worker to consume expired task.." << std::endl;
+    std::cout << "\t\t\t\tadd worker to consume expired task.." << '\n';
 
     threadManager->addWorker();
     sleep_(100);  // make sure it has time to spin up and expire the task
 
     if (m_expired.empty()) {
-      std::cerr << "\t\t\t\t\texpected m_expired to be set" << std::endl;
+      std::cerr << "\t\t\t\t\texpected m_expired to be set" << '\n';
       return false;
     }
 
     if (m_expired.front() != expiredTask) {
-      std::cerr << "\t\t\t\t\texpected m_expired to be the expired task" << std::endl;
+      std::cerr << "\t\t\t\t\texpected m_expired to be the expired task" << '\n';
       return false;
     }
 
@@ -570,16 +570,16 @@
     EXPECT(threadManager->pendingTaskCount(), 0);
     EXPECT(threadManager->expiredTaskCount(), 3);
 
-    std::cout << "\t\t\t\ttry to remove too many workers" << std::endl;
+    std::cout << "\t\t\t\ttry to remove too many workers" << '\n';
     try {
       threadManager->removeWorker(2);
-      std::cerr << "\t\t\t\t\texpected InvalidArgumentException" << std::endl;
+      std::cerr << "\t\t\t\t\texpected InvalidArgumentException" << '\n';
       return false;
     } catch (const InvalidArgumentException&) {
       /* expected */
     }
 
-    std::cout << "\t\t\t\tremove worker.. " << std::endl;
+    std::cout << "\t\t\t\tremove worker.. " << '\n';
 
     threadManager->removeWorker();
 
@@ -588,7 +588,7 @@
     EXPECT(threadManager->pendingTaskCount(), 0);
     EXPECT(threadManager->expiredTaskCount(), 3);
 
-    std::cout << "\t\t\t\tadd blocking task.. " << std::endl;
+    std::cout << "\t\t\t\tadd blocking task.. " << '\n';
 
     threadManager->add(blockingTask);
 
@@ -596,7 +596,7 @@
     EXPECT(threadManager->idleWorkerCount(), 0);
     EXPECT(threadManager->pendingTaskCount(), 1);
 
-    std::cout << "\t\t\t\tadd worker.. " << std::endl;
+    std::cout << "\t\t\t\tadd worker.. " << '\n';
 
     threadManager->addWorker();
     {
@@ -610,7 +610,7 @@
     EXPECT(threadManager->idleWorkerCount(), 0);
     EXPECT(threadManager->pendingTaskCount(), 0);
 
-    std::cout << "\t\t\t\tunblock task and remove worker.. " << std::endl;
+    std::cout << "\t\t\t\tunblock task and remove worker.. " << '\n';
 
     {
       Synchronized s(blockMonitor);
@@ -623,7 +623,7 @@
     EXPECT(threadManager->idleWorkerCount(), 0);
     EXPECT(threadManager->pendingTaskCount(), 0);
 
-    std::cout << "\t\t\t\tcleanup.. " << std::endl;
+    std::cout << "\t\t\t\tcleanup.. " << '\n';
 
     blockingTask.reset();
     threadManager.reset();
diff --git a/lib/cpp/test/concurrency/TimerManagerTests.h b/lib/cpp/test/concurrency/TimerManagerTests.h
index 2d1a262..9a53232 100644
--- a/lib/cpp/test/concurrency/TimerManagerTests.h
+++ b/lib/cpp/test/concurrency/TimerManagerTests.h
@@ -46,7 +46,7 @@
         _success(false),
         _done(false) {}
 
-    ~Task() override { std::cerr << this << std::endl; }
+    ~Task() override { std::cerr << this << '\n'; }
 
     void run() override {
 
@@ -84,7 +84,7 @@
       timerManager.threadFactory(shared_ptr<ThreadFactory>(new ThreadFactory()));
       timerManager.start();
       if (timerManager.state() != TimerManager::STARTED) {
-        std::cerr << "timerManager is not in the STARTED state, but should be" << std::endl;
+        std::cerr << "timerManager is not in the STARTED state, but should be" << '\n';
         return false;
       }
 
@@ -104,15 +104,15 @@
       }
 
       if (!task->_done) {
-        std::cerr << "task is not done, but it should have executed" << std::endl;
+        std::cerr << "task is not done, but it should have executed" << '\n';
         return false;
       }
 
-      std::cout << "\t\t\t" << (task->_success ? "Success" : "Failure") << "!" << std::endl;
+      std::cout << "\t\t\t" << (task->_success ? "Success" : "Failure") << "!" << '\n';
     }
 
     if (orphanTask->_done) {
-      std::cerr << "orphan task is done, but it should not have executed" << std::endl;
+      std::cerr << "orphan task is done, but it should not have executed" << '\n';
       return false;
     }
 
diff --git a/lib/d/Makefile.am b/lib/d/Makefile.am
index 0137217..6f014c8 100644
--- a/lib/d/Makefile.am
+++ b/lib/d/Makefile.am
@@ -192,6 +192,9 @@
 precross: all-local
 	$(MAKE) -C test precross
 
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
 EXTRA_DIST = \
 	src \
 	test \
diff --git a/lib/d/test/Makefile.am b/lib/d/test/Makefile.am
index 44364f9..28f3f3e 100644
--- a/lib/d/test/Makefile.am
+++ b/lib/d/test/Makefile.am
@@ -38,6 +38,8 @@
 $(thrift_test_gen): $(top_srcdir)/test/v0.16/ThriftTest.thrift
 	$(THRIFT) --gen d $<
 
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
 
 # The actual test targets.
 # There just must be some way to reassign a variable without warnings in
diff --git a/lib/dart/Makefile.am b/lib/dart/Makefile.am
index bd12a92..74f1404 100644
--- a/lib/dart/Makefile.am
+++ b/lib/dart/Makefile.am
@@ -28,6 +28,9 @@
 
 check-local: all
 
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
 dist-hook:
 	$(RM) -r $(distdir)/.pub
 	find $(distdir) -type d -name ".dart_tool" | xargs $(RM) -r
diff --git a/lib/delphi/src/Thrift.Collections.pas b/lib/delphi/src/Thrift.Collections.pas
index 2cb2395..0500d49 100644
--- a/lib/delphi/src/Thrift.Collections.pas
+++ b/lib/delphi/src/Thrift.Collections.pas
@@ -191,127 +191,105 @@
     function ToString : string;  override;
   end;
 
-  IThriftHashSet<TValue> = interface(IThriftContainer)
-    ['{0923A3B5-D4D4-48A8-91AD-40238E2EAD66}']
-    function GetEnumerator: TEnumerator<TValue>;
-    function GetIsReadOnly: Boolean;
+  IThriftHashSet<T> = interface(IThriftContainer)
+    ['{733E2B57-C374-4359-BBD5-2B9CD8DF737C}']
+    function GetEnumerator: TEnumerator<T>;
     function GetCount: Integer;
     property Count: Integer read GetCount;
-    property IsReadOnly: Boolean read GetIsReadOnly;
-    procedure Add( const item: TValue);
+    function Add( const item: T) : Boolean;
     procedure Clear;
-    function Contains( const item: TValue): Boolean;
-    procedure CopyTo(var A: TArray<TValue>; arrayIndex: Integer);
-    function Remove( const item: TValue ): Boolean;
+    function Contains( const item: T): Boolean;
+    function Remove( const item: T): Boolean;
   end;
 
   // compatibility
-  IHashSet<TValue> = interface( IThriftHashSet<TValue>)
+  IHashSet<T> = interface( IThriftHashSet<T>)
     ['{C3CF557F-21D9-4524-B899-D3145B0389BB}']
   end deprecated 'use IThriftHashSet<T>';
 
 
   {$WARN SYMBOL_DEPRECATED OFF}
-  TThriftHashSetImpl<TValue> = class( TInterfacedObject, IHashSet<TValue>, IThriftHashSet<TValue>, IThriftContainer, ISupportsToString)
+  TThriftHashSetImpl<T> = class( TInterfacedObject, IHashSet<T>, IThriftHashSet<T>, IThriftContainer, ISupportsToString)
   {$WARN SYMBOL_DEPRECATED DEFAULT}
   strict private
-    FDictionary : IThriftDictionary<TValue,Integer>;
-    FIsReadOnly: Boolean;
+    FDictionary : TDictionary<T,Byte>;  // there is no THashSet<T> in older Delphi versions
   strict protected
-    function GetEnumerator: TEnumerator<TValue>;
-    function GetIsReadOnly: Boolean;
+    function GetEnumerator: TEnumerator<T>;
     function GetCount: Integer;
     property Count: Integer read GetCount;
-    property IsReadOnly: Boolean read FIsReadOnly;
-    procedure Add( const item: TValue);
+    function Add( const item: T) : Boolean;
     procedure Clear;
-    function Contains( const item: TValue): Boolean;
-    procedure CopyTo(var A: TArray<TValue>; arrayIndex: Integer);
-    function Remove( const item: TValue ): Boolean;
+    function Contains( const item: T): Boolean;
+    function Remove( const item: T): Boolean;
   public
     constructor Create( const aCapacity: Integer = 0);  overload;
-    constructor Create( const aCapacity: Integer; const aComparer : IEqualityComparer<TValue>);  overload;
+    constructor Create( const aCapacity: Integer; const aComparer : IEqualityComparer<T>);  overload;
+    destructor Destroy; override;
     function ToString : string;  override;
   end;
 
   // compatibility
-  THashSetImpl<TValue> = class( TThriftHashSetImpl<TValue>)
+  THashSetImpl<T> = class( TThriftHashSetImpl<T>)
   end deprecated 'use TThriftHashSetImpl<T>';
 
 implementation
 
-{ TThriftHashSetImpl<TValue>. }
+{ TThriftHashSetImpl<T>. }
 
-procedure TThriftHashSetImpl<TValue>.Add( const item: TValue);
+function TThriftHashSetImpl<T>.Add( const item: T) : Boolean;
 begin
-  if not FDictionary.ContainsKey(item) then
-  begin
-    FDictionary.Add( item, 0);
-  end;
+  result := not FDictionary.ContainsKey(item);
+  if result then FDictionary.Add( item, 0);
 end;
 
-procedure TThriftHashSetImpl<TValue>.Clear;
+procedure TThriftHashSetImpl<T>.Clear;
 begin
   FDictionary.Clear;
 end;
 
-function TThriftHashSetImpl<TValue>.Contains( const item: TValue): Boolean;
+function TThriftHashSetImpl<T>.Contains( const item: T): Boolean;
 begin
   Result := FDictionary.ContainsKey(item);
 end;
 
-procedure TThriftHashSetImpl<TValue>.CopyTo(var A: TArray<TValue>; arrayIndex: Integer);
-var
-  i : Integer;
-  Enumlator : TEnumerator<TValue>;
-begin
-  Enumlator := GetEnumerator;
-  while Enumlator.MoveNext do
-  begin
-    A[arrayIndex] := Enumlator.Current;
-    Inc(arrayIndex);
-  end;
-end;
-
-constructor TThriftHashSetImpl<TValue>.Create( const aCapacity: Integer);
+constructor TThriftHashSetImpl<T>.Create( const aCapacity: Integer);
 begin
   inherited Create;
-  FDictionary := TThriftDictionaryImpl<TValue,Integer>.Create( aCapacity);
+  FDictionary := TDictionary<T,Byte>.Create( aCapacity);
 end;
 
-constructor TThriftHashSetImpl<TValue>.Create( const aCapacity: Integer; const aComparer : IEqualityComparer<TValue>);
+constructor TThriftHashSetImpl<T>.Create( const aCapacity: Integer; const aComparer : IEqualityComparer<T>);
 begin
   inherited Create;
-  FDictionary := TThriftDictionaryImpl<TValue,Integer>.Create( aCapacity, aComparer);
+  FDictionary := TDictionary<T,Byte>.Create( aCapacity, aComparer);
 end;
 
-function TThriftHashSetImpl<TValue>.GetCount: Integer;
+
+destructor TThriftHashSetImpl<T>.Destroy;
+begin
+  FDictionary.Free;
+  inherited Destroy;
+end;
+
+
+function TThriftHashSetImpl<T>.GetCount: Integer;
 begin
   Result := FDictionary.Count;
 end;
 
-function TThriftHashSetImpl<TValue>.GetEnumerator: TEnumerator<TValue>;
+function TThriftHashSetImpl<T>.GetEnumerator: TEnumerator<T>;
 begin
   Result := FDictionary.Keys.GetEnumerator;
 end;
 
-function TThriftHashSetImpl<TValue>.GetIsReadOnly: Boolean;
+function TThriftHashSetImpl<T>.Remove( const item: T): Boolean;
 begin
-  Result := FIsReadOnly;
+  Result := FDictionary.ContainsKey( item);
+  if Result then FDictionary.Remove( item );
 end;
 
-function TThriftHashSetImpl<TValue>.Remove( const item: TValue): Boolean;
-begin
-  Result := False;
-  if FDictionary.ContainsKey( item ) then
-  begin
-    FDictionary.Remove( item );
-    Result := not FDictionary.ContainsKey( item );
-  end;
-end;
-
-function TThriftHashSetImpl<TValue>.ToString : string;
-var elm : TValue;
+function TThriftHashSetImpl<T>.ToString : string;
+var elm : T;
     sb : TThriftStringBuilder;
     first : Boolean;
 begin
@@ -323,7 +301,7 @@
       then first := FALSE
       else sb.Append(', ');
 
-      sb.Append( StringUtils<TValue>.ToString(elm));
+      sb.Append( StringUtils<T>.ToString(elm));
     end;
     sb.Append('}');
     Result := sb.ToString;
diff --git a/lib/delphi/src/Thrift.Protocol.Compact.pas b/lib/delphi/src/Thrift.Protocol.Compact.pas
index 80f1ce5..a8ad53a 100644
--- a/lib/delphi/src/Thrift.Protocol.Compact.pas
+++ b/lib/delphi/src/Thrift.Protocol.Compact.pas
@@ -176,6 +176,7 @@
     procedure WriteI64( const i64: Int64); override;
     procedure WriteDouble( const dub: Double); override;
     procedure WriteBinary( const b: TBytes); overload; override;
+    procedure WriteBinary( const bytes : IThriftBytes); overload; override;
     procedure WriteUuid( const uuid: TGuid); override;
 
   private  // unit visible stuff
@@ -542,6 +543,14 @@
   Transport.Write( b);
 end;
 
+
+procedure TCompactProtocolImpl.WriteBinary( const bytes : IThriftBytes);
+begin
+  WriteVarint32( Cardinal(bytes.Count));
+  Transport.Write( bytes.QueryRawDataPtr, 0, bytes.Count);
+end;
+
+
 procedure TCompactProtocolImpl.WriteUuid( const uuid: TGuid);
 var network : TGuid;  // in network order (Big Endian)
 begin
diff --git a/lib/delphi/src/Thrift.Protocol.pas b/lib/delphi/src/Thrift.Protocol.pas
index f5cb454..7cfc2ae 100644
--- a/lib/delphi/src/Thrift.Protocol.pas
+++ b/lib/delphi/src/Thrift.Protocol.pas
@@ -28,6 +28,7 @@
   Classes,
   SysUtils,
   Contnrs,
+  Math,
   Thrift.Exception,
   Thrift.Stream,
   Thrift.Utils,
@@ -231,7 +232,7 @@
     procedure WriteI64( const i64: Int64);
     procedure WriteDouble( const d: Double);
     procedure WriteString( const s: string );
-    procedure WriteAnsiString( const s: AnsiString);
+    procedure WriteAnsiString( const s: AnsiString);  deprecated 'AnsiString routines are deprecated, see THRIFT-5750';
     procedure WriteBinary( const b: TBytes); overload;
     procedure WriteBinary( const b: IThriftBytes); overload;
     procedure WriteUuid( const uuid: TGuid);
@@ -258,7 +259,7 @@
     function ReadBinaryCOM : IThriftBytes;
     function ReadUuid: TGuid;
     function ReadString: string;
-    function ReadAnsiString: AnsiString;
+    function ReadAnsiString: AnsiString;  deprecated 'AnsiString routines are deprecated, see THRIFT-5750';
 
     function  NextRecursionLevel : IProtocolRecursionTracker;
     procedure IncrementRecursionDepth;
@@ -310,7 +311,6 @@
     procedure WriteI64( const i64: Int64); virtual; abstract;
     procedure WriteDouble( const d: Double); virtual; abstract;
     procedure WriteString( const s: string ); virtual;
-    procedure WriteAnsiString( const s: AnsiString); virtual;
     procedure WriteBinary( const b: TBytes); overload; virtual; abstract;
     procedure WriteUuid( const b: TGuid); virtual; abstract;
 
@@ -335,7 +335,6 @@
     function ReadBinary: TBytes; virtual; abstract;
     function ReadUuid: TGuid; virtual; abstract;
     function ReadString: string; virtual;
-    function ReadAnsiString: AnsiString; virtual;
 
     // provide generic implementation for all derived classes
     procedure WriteBinary( const bytes : IThriftBytes); overload; virtual;
@@ -343,6 +342,13 @@
 
     property  Transport: ITransport read GetTransport;
 
+  private
+    // THRIFT-5750 unit visible, but no longer protected - awaiting final removal
+    // - Note that you can implement whavetever you want in your derived class, but no longer inherit
+    // - The function can still be called via IProtocol until final removal
+    function ReadAnsiString: AnsiString; virtual;  //deprecated;
+    procedure WriteAnsiString( const s: AnsiString); virtual; //deprecated;
+
   public
     constructor Create( const aTransport : ITransport); virtual;
   end;
@@ -388,6 +394,7 @@
     constructor Create; overload;
     constructor Create( const bytes : TBytes); overload;
     constructor Create( var bytes : TBytes; const aTakeOwnership : Boolean = FALSE); overload;
+    constructor Create( const pData : Pointer; const nCount : Integer); overload;
 
     function ToString : string; override;
   end;
@@ -441,6 +448,7 @@
     procedure WriteI64( const i64: Int64); override;
     procedure WriteDouble( const d: Double); override;
     procedure WriteBinary( const b: TBytes); override;
+    procedure WriteBinary( const bytes : IThriftBytes); overload; override;
     procedure WriteUuid( const uuid: TGuid); override;
 
     function ReadMessageBegin: TThriftMessage; override;
@@ -505,8 +513,8 @@
     procedure WriteI64( const i64: Int64); override;
     procedure WriteDouble( const d: Double); override;
     procedure WriteString( const s: string ); override;
-    procedure WriteAnsiString( const s: AnsiString); override;
     procedure WriteBinary( const b: TBytes); override;
+    procedure WriteBinary( const bytes : IThriftBytes); overload; override;
     procedure WriteUuid( const uuid: TGuid); override;
 
     function ReadMessageBegin: TThriftMessage; override;
@@ -530,7 +538,15 @@
     function ReadBinary: TBytes; override;
     function ReadUuid: TGuid; override;
     function ReadString: string; override;
-    function ReadAnsiString: AnsiString; override;
+
+  private
+    // THRIFT-5750 unit visible, but no longer protected - awaiting final removal
+    // - Note that you can implement whavetever you want in your derived class, but no longer inherit
+    // - The function can still be called via IProtocol until final removal
+    {$WARN SYMBOL_DEPRECATED OFF}
+    function ReadAnsiString: AnsiString; override;  deprecated;
+    procedure WriteAnsiString( const s: AnsiString); override;  deprecated;
+    {$WARN SYMBOL_DEPRECATED DEFAULT}
   end;
 
 
@@ -747,6 +763,8 @@
 
 
 procedure TProtocolImpl.WriteBinary( const bytes : IThriftBytes);
+// This implementation works, but is rather inefficient due to the extra memory allocation
+// Consider overwriting this for your transport implementation
 var tmp : TBytes;
 begin
   SetLength( tmp, bytes.Count);
@@ -802,6 +820,13 @@
 end;
 
 
+constructor TThriftBytesImpl.Create( const pData : Pointer; const nCount : Integer);
+begin
+  SetLength(FData, Max(nCount,0));
+  if Length(FData) > 0 then Move( pData^, FData[0], Length(FData));
+end;
+
+
 function TThriftBytesImpl.ToString : string;
 var sb : TThriftStringBuilder;
 begin
@@ -1105,6 +1130,14 @@
   if iLen > 0 then FTrans.Write(b, 0, iLen);
 end;
 
+procedure TBinaryProtocolImpl.WriteBinary( const bytes : IThriftBytes);
+var iLen : Integer;
+begin
+  iLen := bytes.Count;
+  WriteI32( iLen);
+  if iLen > 0 then FTrans.Write( bytes.QueryRawDataPtr, 0, iLen);
+end;
+
 procedure TBinaryProtocolImpl.WriteUuid( const uuid: TGuid);
 var network : TGuid;  // in network order (Big Endian)
 begin
@@ -1499,7 +1532,9 @@
 
 procedure TProtocolDecorator.WriteAnsiString( const s: AnsiString);
 begin
+  {$WARN SYMBOL_DEPRECATED OFF}
   FWrappedProtocol.WriteAnsiString( s);
+  {$WARN SYMBOL_DEPRECATED DEFAULT}
 end;
 
 
@@ -1509,6 +1544,12 @@
 end;
 
 
+procedure TProtocolDecorator.WriteBinary( const bytes : IThriftBytes);
+begin
+  FWrappedProtocol.WriteBinary( bytes);
+end;
+
+
 procedure TProtocolDecorator.WriteUuid( const uuid: TGuid);
 begin
   FWrappedProtocol.WriteUuid( uuid);
@@ -1643,7 +1684,9 @@
 
 function TProtocolDecorator.ReadAnsiString: AnsiString;
 begin
+  {$WARN SYMBOL_DEPRECATED OFF}
   result := FWrappedProtocol.ReadAnsiString;
+  {$WARN SYMBOL_DEPRECATED DEFAULT}
 end;
 
 
diff --git a/lib/delphi/test/client.dpr b/lib/delphi/test/client.dpr
index eaeeee0..db62995 100644
--- a/lib/delphi/test/client.dpr
+++ b/lib/delphi/test/client.dpr
@@ -24,9 +24,13 @@
 
 uses
   SysUtils,
-  DataFactory in 'Performance\DataFactory.pas',
-  PerfTests in 'Performance\PerfTests.pas',
-  TestClient in 'TestClient.pas',
+  ConsoleHelper in 'ConsoleHelper.pas',
+  TestConstants in 'testsuite\TestConstants.pas',
+  TestClient in 'testsuite\client\TestClient.pas',
+  TestLogger in 'testsuite\client\TestLogger.pas',
+  UnitTests in 'testsuite\client\UnitTests.pas',
+  PerfTests in 'testsuite\client\Performance\PerfTests.pas',
+  DataFactory in 'testsuite\client\Performance\DataFactory.pas',
   Thrift.Test in 'gen-delphi\Thrift.Test.pas',
   Thrift in '..\src\Thrift.pas',
   Thrift.Transport in '..\src\Thrift.Transport.pas',
diff --git a/lib/delphi/test/client.dproj b/lib/delphi/test/client.dproj
index ae6683d..ae31ba0 100644
--- a/lib/delphi/test/client.dproj
+++ b/lib/delphi/test/client.dproj
@@ -50,9 +50,13 @@
 			<DelphiCompile Include="client.dpr">
 				<MainSource>MainSource</MainSource>
 			</DelphiCompile>
-			<DCCReference Include="Performance\DataFactory.pas"/>
-			<DCCReference Include="Performance\PerfTests.pas"/>
-			<DCCReference Include="TestClient.pas"/>
+			<DCCReference Include="ConsoleHelper.pas"/>
+			<DCCReference Include="testsuite\TestConstants.pas"/>
+			<DCCReference Include="testsuite\client\TestClient.pas"/>
+			<DCCReference Include="testsuite\client\TestLogger.pas"/>
+			<DCCReference Include="testsuite\client\UnitTests.pas"/>
+			<DCCReference Include="testsuite\client\Performance\PerfTests.pas"/>
+			<DCCReference Include="testsuite\client\Performance\DataFactory.pas"/>
 			<DCCReference Include="gen-delphi\Thrift.Test.pas"/>
 			<DCCReference Include="..\src\Thrift.pas"/>
 			<DCCReference Include="..\src\Thrift.Transport.pas"/>
@@ -125,7 +129,7 @@
 						<VersionInfoKeys Name="Comments"/>
 					</VersionInfoKeys>
 					<Parameters>
-						<Parameters Name="RunParams">--protocol=compact  </Parameters>
+						<Parameters Name="RunParams">--protocol=compact</Parameters>
 					</Parameters>
 				</Delphi.Personality>
 				<Platforms>
diff --git a/lib/delphi/test/serializer/TestSerializer.Tests.pas b/lib/delphi/test/serializer/TestSerializer.Tests.pas
index 6ed1a48..e6a309e 100644
--- a/lib/delphi/test/serializer/TestSerializer.Tests.pas
+++ b/lib/delphi/test/serializer/TestSerializer.Tests.pas
@@ -81,6 +81,7 @@
 
     procedure Test_Serializer_Deserializer;
     procedure Test_COM_Types;
+    procedure Test_ThriftBytesCTORs;
     procedure Test_OneOfEach(     const method : TMethod; const factory : TFactoryPair; const stream : TFileStream);
     procedure Test_CompactStruct( const method : TMethod; const factory : TFactoryPair; const stream : TFileStream);
 
@@ -325,11 +326,28 @@
 end;
 
 
+procedure TTestSerializer.Test_ThriftBytesCTORs;
+var one, two : IThriftBytes;
+    bytes : TBytes;
+    sAscii : AnsiString;
+begin
+  sAscii := 'ABC/xzy';
+  bytes  := TEncoding.ASCII.GetBytes(string(sAscii));
+
+  one := TThriftBytesImpl.Create( PAnsiChar(sAscii), Length(sAscii));
+  two := TThriftBytesImpl.Create( bytes, TRUE);
+
+  ASSERT( one.Count = two.Count);
+  ASSERT( CompareMem( one.QueryRawDataPtr, two.QueryRawDataPtr, one.Count));
+end;
+
+
 procedure TTestSerializer.RunTests;
 begin
   try
     Test_Serializer_Deserializer;
     Test_COM_Types;
+    Test_ThriftBytesCTORs;
   except
     on e:Exception do begin
       Writeln( e.ClassName+': '+ e.Message);
diff --git a/lib/delphi/test/server.dpr b/lib/delphi/test/server.dpr
index 7994281..0cab02f 100644
--- a/lib/delphi/test/server.dpr
+++ b/lib/delphi/test/server.dpr
@@ -23,8 +23,9 @@
 
 uses
   SysUtils,
-  TestServer in 'TestServer.pas',
-  TestServerEvents in 'TestServerEvents.pas',
+  TestConstants in 'testsuite\TestConstants.pas',
+  TestServer in 'testsuite\server\TestServer.pas',
+  TestServerEvents in 'testsuite\server\TestServerEvents.pas',
   Thrift.Test in 'gen-delphi\Thrift.Test.pas',
   Thrift in '..\src\Thrift.pas',
   Thrift.Exception in '..\src\Thrift.Exception.pas',
diff --git a/lib/delphi/test/server.dproj b/lib/delphi/test/server.dproj
index 8e9b99d..37ef9c9 100644
--- a/lib/delphi/test/server.dproj
+++ b/lib/delphi/test/server.dproj
@@ -50,8 +50,9 @@
 			<DelphiCompile Include="server.dpr">
 				<MainSource>MainSource</MainSource>
 			</DelphiCompile>
-			<DCCReference Include="TestServer.pas"/>
-			<DCCReference Include="TestServerEvents.pas"/>
+			<DCCReference Include="testsuite\TestConstants.pas"/>
+			<DCCReference Include="testsuite\server\TestServer.pas"/>
+			<DCCReference Include="testsuite\server\TestServerEvents.pas"/>
 			<DCCReference Include="gen-delphi\Thrift.Test.pas"/>
 			<DCCReference Include="..\src\Thrift.pas"/>
 			<DCCReference Include="..\src\Thrift.Exception.pas"/>
diff --git a/lib/delphi/test/TestConstants.pas b/lib/delphi/test/testsuite/TestConstants.pas
similarity index 85%
rename from lib/delphi/test/TestConstants.pas
rename to lib/delphi/test/testsuite/TestConstants.pas
index 9ac4808..e51b600 100644
--- a/lib/delphi/test/TestConstants.pas
+++ b/lib/delphi/test/testsuite/TestConstants.pas
@@ -55,6 +55,18 @@
 
   TLayeredTransports = set of TLayeredTransport;
 
+  {$SCOPEDENUMS ON}
+  TTestSize = (
+    Empty,           // Edge case: the zero-length empty binary
+    Normal,          // Fairly small array of usual size (256 bytes)
+    ByteArrayTest,   // THRIFT-4454 Large writes/reads may cause range check errors in debug mode
+    PipeWriteLimit,  // THRIFT-4372 Pipe write operations across a network are limited to 65,535 bytes per write.
+    FifteenMB        // quite a bit of data, but still below the default max frame size
+  );
+  {$SCOPEDENUMS OFF}
+
+
+
 const
   PROTOCOL_CLASSES : array[TKnownProtocol] of TProtocolImplClass = (
     TBinaryProtocolImpl,
@@ -151,6 +163,8 @@
 
 function BytesToHex( const bytes : TBytes) : string;
 
+function PrepareBinaryData( aRandomDist : Boolean; aSize : TTestSize) : TBytes;
+
 
 implementation
 
@@ -165,4 +179,38 @@
 end;
 
 
+function PrepareBinaryData( aRandomDist : Boolean; aSize : TTestSize) : TBytes;
+var i : Integer;
+begin
+  case aSize of
+    TTestSize.Empty          : SetLength( result, 0);
+    TTestSize.Normal         : SetLength( result, $100);
+    TTestSize.ByteArrayTest  : SetLength( result, SizeOf(TByteArray) + 128);
+    TTestSize.PipeWriteLimit : SetLength( result, 65535 + 128);
+    TTestSize.FifteenMB      : SetLength( result, 15 * 1024 * 1024);
+  else
+    raise EArgumentException.Create('aSize');
+  end;
+
+  ASSERT( Low(result) = 0);
+  if Length(result) = 0 then Exit;
+
+  // linear distribution, unless random is requested
+  if not aRandomDist then begin
+    for i := Low(result) to High(result) do begin
+      result[i] := i mod $100;
+    end;
+    Exit;
+  end;
+
+  // random distribution of all 256 values
+  FillChar( result[0], Length(result) * SizeOf(result[0]), $0);
+  for i := Low(result) to High(result) do begin
+    result[i] := Byte( Random($100));
+  end;
+end;
+
+
+
+
 end.
diff --git a/lib/delphi/test/Performance/DataFactory.pas b/lib/delphi/test/testsuite/client/Performance/DataFactory.pas
similarity index 100%
rename from lib/delphi/test/Performance/DataFactory.pas
rename to lib/delphi/test/testsuite/client/Performance/DataFactory.pas
diff --git a/lib/delphi/test/Performance/PerfTests.pas b/lib/delphi/test/testsuite/client/Performance/PerfTests.pas
similarity index 100%
rename from lib/delphi/test/Performance/PerfTests.pas
rename to lib/delphi/test/testsuite/client/Performance/PerfTests.pas
diff --git a/lib/delphi/test/TestClient.pas b/lib/delphi/test/testsuite/client/TestClient.pas
similarity index 80%
rename from lib/delphi/test/TestClient.pas
rename to lib/delphi/test/testsuite/client/TestClient.pas
index 1b09d3c..aca6441 100644
--- a/lib/delphi/test/TestClient.pas
+++ b/lib/delphi/test/testsuite/client/TestClient.pas
@@ -39,8 +39,10 @@
   DateUtils,
   Generics.Collections,
   TestConstants,
+  TestLogger,
   ConsoleHelper,
   PerfTests,
+  UnitTests,
   Thrift,
   Thrift.Protocol.Compact,
   Thrift.Protocol.JSON,
@@ -82,25 +84,6 @@
   end;
 
   TClientThread = class( TThread )
-  private type
-    TTestGroup = (
-      test_Unknown,
-      test_BaseTypes,
-      test_Structs,
-      test_Containers,
-      test_Exceptions
-      // new values here
-    );
-    TTestGroups = set of TTestGroup;
-
-    TTestSize = (
-      Empty,           // Edge case: the zero-length empty binary
-      Normal,          // Fairly small array of usual size (256 bytes)
-      ByteArrayTest,   // THRIFT-4454 Large writes/reads may cause range check errors in debug mode
-      PipeWriteLimit,  // THRIFT-4372 Pipe write operations across a network are limited to 65,535 bytes per write.
-      FifteenMB        // quite a bit of data, but still below the default max frame size
-    );
-
   strict private
     FSetup : TTestSetup;
     FTransport : ITransport;
@@ -109,18 +92,7 @@
 
     FThreadNo : Integer;
     FConsole : TThreadConsole;
-
-    // test reporting, will be refactored out into separate class later
-    FTestGroup : string;
-    FCurrentTest : TTestGroup;
-    FSuccesses : Integer;
-    FErrors : TStringList;
-    FFailed : TTestGroups;
-    FExecuted : TTestGroups;
-    procedure StartTestGroup( const aGroup : string; const aTest : TTestGroup);
-    procedure Expect( aTestResult : Boolean; const aTestInfo : string);
-    procedure ReportResults;
-    function  CalculateExitCode : Byte;
+    FLogger : ITestLogger;
 
     procedure ClientTest;
     {$IFDEF SupportsAsync}
@@ -131,14 +103,13 @@
     procedure ShutdownProtocolTransportStack;
     function  InitializeHttpTransport( const aTimeoutSetting : Integer; const aConfig : IThriftConfiguration = nil) : IHTTPClient;
 
-    procedure JSONProtocolReadWriteTest;
-    function  PrepareBinaryData( aRandomDist : Boolean; aSize : TTestSize) : TBytes;
     {$IFDEF StressTest}
     procedure StressTest(const client : TThriftTest.Iface);
     {$ENDIF}
-    {$IFDEF Win64}
-    procedure UseInterlockedExchangeAdd64;
-    {$ENDIF}
+
+    procedure StartTestGroup( const aGroup : string; const aTest : TClientTestGroup); inline;
+    procedure Expect( aTestResult : Boolean; const aTestInfo : string); inline;
+    function CalculateExitCode : Byte;
 
   strict protected
     procedure Execute; override;
@@ -174,7 +145,7 @@
    EXITCODE_FAILBIT_CONTAINERS = $04;
    EXITCODE_FAILBIT_EXCEPTIONS = $08;
 
-   MAP_FAILURES_TO_EXITCODE_BITS : array[TClientThread.TTestGroup] of Byte = (
+   MAP_FAILURES_TO_EXITCODE_BITS : array[TClientTestGroup] of Byte = (
      EXITCODE_SUCCESS,  // no bits here
      EXITCODE_FAILBIT_BASETYPES,
      EXITCODE_FAILBIT_STRUCTS,
@@ -1052,260 +1023,26 @@
 {$ENDIF}
 
 
-function TClientThread.PrepareBinaryData( aRandomDist : Boolean; aSize : TTestSize) : TBytes;
-var i : Integer;
+procedure TClientThread.StartTestGroup( const aGroup : string; const aTest : TClientTestGroup);
 begin
-  case aSize of
-    Empty          : SetLength( result, 0);
-    Normal         : SetLength( result, $100);
-    ByteArrayTest  : SetLength( result, SizeOf(TByteArray) + 128);
-    PipeWriteLimit : SetLength( result, 65535 + 128);
-    FifteenMB      : SetLength( result, 15 * 1024 * 1024);
-  else
-    raise EArgumentException.Create('aSize');
-  end;
-
-  ASSERT( Low(result) = 0);
-  if Length(result) = 0 then Exit;
-
-  // linear distribution, unless random is requested
-  if not aRandomDist then begin
-    for i := Low(result) to High(result) do begin
-      result[i] := i mod $100;
-    end;
-    Exit;
-  end;
-
-  // random distribution of all 256 values
-  FillChar( result[0], Length(result) * SizeOf(result[0]), $0);
-  for i := Low(result) to High(result) do begin
-    result[i] := Byte( Random($100));
-  end;
-end;
-
-
-{$IFDEF Win64}
-procedure TClientThread.UseInterlockedExchangeAdd64;
-var a,b : Int64;
-begin
-  a := 1;
-  b := 2;
-  Thrift.Utils.InterlockedExchangeAdd64( a,b);
-  Expect( a = 3, 'InterlockedExchangeAdd64');
-end;
-{$ENDIF}
-
-
-procedure TClientThread.JSONProtocolReadWriteTest;
-// Tests only then read/write procedures of the JSON protocol
-// All tests succeed, if we can read what we wrote before
-// Note that passing this test does not imply, that our JSON is really compatible to what
-// other clients or servers expect as the real JSON. This is beyond the scope of this test.
-var prot   : IProtocol;
-    stm    : TStringStream;
-    list   : TThriftList;
-    config : IThriftConfiguration;
-    binary, binRead, emptyBinary : TBytes;
-    i,iErr : Integer;
-const
-  TEST_SHORT   = ShortInt( $FE);
-  TEST_SMALL   = SmallInt( $FEDC);
-  TEST_LONG    = LongInt( $FEDCBA98);
-  TEST_I64     = Int64( $FEDCBA9876543210);
-  TEST_DOUBLE  = -1.234e-56;
-  DELTA_DOUBLE = TEST_DOUBLE * 1e-14;
-  TEST_STRING  = 'abc-'#$00E4#$00f6#$00fc; // german umlauts (en-us: "funny chars")
-  // Test THRIFT-2336 and THRIFT-3404 with U+1D11E (G Clef symbol) and 'Русское Название';
-  G_CLEF_AND_CYRILLIC_TEXT = #$1d11e' '#$0420#$0443#$0441#$0441#$043a#$043e#$0435' '#$041d#$0430#$0437#$0432#$0430#$043d#$0438#$0435;
-  G_CLEF_AND_CYRILLIC_JSON = '"\ud834\udd1e \u0420\u0443\u0441\u0441\u043a\u043e\u0435 \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435"';
-  // test both possible solidus encodings
-  SOLIDUS_JSON_DATA = '"one/two\/three"';
-  SOLIDUS_EXCPECTED = 'one/two/three';
-begin
-  stm  := TStringStream.Create;
-  try
-    StartTestGroup( 'JsonProtocolTest', test_Unknown);
-
-    config := TThriftConfigurationImpl.Create;
-
-    // prepare binary data
-    binary := PrepareBinaryData( FALSE, Normal);
-    SetLength( emptyBinary, 0); // empty binary data block
-
-    // output setup
-    prot := TJSONProtocolImpl.Create(
-              TStreamTransportImpl.Create(
-                nil, TThriftStreamAdapterDelphi.Create( stm, FALSE), config));
-
-    // write
-    Init( list, TType.String_, 9);
-    prot.WriteListBegin( list);
-    prot.WriteBool( TRUE);
-    prot.WriteBool( FALSE);
-    prot.WriteByte( TEST_SHORT);
-    prot.WriteI16( TEST_SMALL);
-    prot.WriteI32( TEST_LONG);
-    prot.WriteI64( TEST_I64);
-    prot.WriteDouble( TEST_DOUBLE);
-    prot.WriteString( TEST_STRING);
-    prot.WriteBinary( binary);
-    prot.WriteString( '');  // empty string
-    prot.WriteBinary( emptyBinary); // empty binary data block
-    prot.WriteListEnd;
-
-    // input setup
-    Expect( stm.Position = stm.Size, 'Stream position/length after write');
-    stm.Position := 0;
-    prot := TJSONProtocolImpl.Create(
-              TStreamTransportImpl.Create(
-                TThriftStreamAdapterDelphi.Create( stm, FALSE), nil, config));
-
-    // read and compare
-    list := prot.ReadListBegin;
-    Expect( list.ElementType = TType.String_, 'list element type');
-    Expect( list.Count = 9, 'list element count');
-    Expect( prot.ReadBool, 'WriteBool/ReadBool: TRUE');
-    Expect( not prot.ReadBool, 'WriteBool/ReadBool: FALSE');
-    Expect( prot.ReadByte   = TEST_SHORT,  'WriteByte/ReadByte');
-    Expect( prot.ReadI16    = TEST_SMALL,  'WriteI16/ReadI16');
-    Expect( prot.ReadI32    = TEST_LONG,   'WriteI32/ReadI32');
-    Expect( prot.ReadI64    = TEST_I64,    'WriteI64/ReadI64');
-    Expect( abs(prot.ReadDouble-TEST_DOUBLE) < abs(DELTA_DOUBLE), 'WriteDouble/ReadDouble');
-    Expect( prot.ReadString = TEST_STRING, 'WriteString/ReadString');
-    binRead := prot.ReadBinary;
-    Expect( Length(prot.ReadString) = 0, 'WriteString/ReadString (empty string)');
-    Expect( Length(prot.ReadBinary) = 0, 'empty WriteBinary/ReadBinary (empty data block)');
-    prot.ReadListEnd;
-
-    // test binary data
-    Expect( Length(binary) = Length(binRead), 'Binary data length check');
-    iErr := -1;
-    for i := Low(binary) to High(binary) do begin
-      if binary[i] <> binRead[i] then begin
-        iErr := i;
-        Break;
-      end;
-    end;
-    if iErr < 0
-    then Expect( TRUE,  'Binary data check ('+IntToStr(Length(binary))+' Bytes)')
-    else Expect( FALSE, 'Binary data check at offset '+IntToStr(iErr));
-
-    Expect( stm.Position = stm.Size, 'Stream position after read');
-
-
-    // Solidus can be encoded in two ways. Make sure we can read both
-    stm.Position := 0;
-    stm.Size     := 0;
-    stm.WriteString(SOLIDUS_JSON_DATA);
-    stm.Position := 0;
-    prot := TJSONProtocolImpl.Create(
-              TStreamTransportImpl.Create(
-                TThriftStreamAdapterDelphi.Create( stm, FALSE), nil, config));
-    Expect( prot.ReadString = SOLIDUS_EXCPECTED, 'Solidus encoding');
-
-
-    // Widechars should work too. Do they?
-    // After writing, we ensure that we are able to read it back
-    // We can't assume hex-encoding, since (nearly) any Unicode char is valid JSON
-    stm.Position := 0;
-    stm.Size     := 0;
-    prot := TJSONProtocolImpl.Create(
-              TStreamTransportImpl.Create(
-                nil, TThriftStreamAdapterDelphi.Create( stm, FALSE), config));
-    prot.WriteString( G_CLEF_AND_CYRILLIC_TEXT);
-    stm.Position := 0;
-    prot := TJSONProtocolImpl.Create(
-              TStreamTransportImpl.Create(
-                TThriftStreamAdapterDelphi.Create( stm, FALSE), nil, config));
-    Expect( prot.ReadString = G_CLEF_AND_CYRILLIC_TEXT, 'Writing JSON with chars > 8 bit');
-
-    // Widechars should work with hex-encoding too. Do they?
-    stm.Position := 0;
-    stm.Size     := 0;
-    stm.WriteString( G_CLEF_AND_CYRILLIC_JSON);
-    stm.Position := 0;
-    prot := TJSONProtocolImpl.Create(
-              TStreamTransportImpl.Create(
-                TThriftStreamAdapterDelphi.Create( stm, FALSE), nil, config));
-    Expect( prot.ReadString = G_CLEF_AND_CYRILLIC_TEXT, 'Reading JSON with chars > 8 bit');
-
-
-  finally
-    stm.Free;
-    prot := nil;  //-> Release
-    StartTestGroup( '', test_Unknown);  // no more tests here
-  end;
-end;
-
-
-procedure TClientThread.StartTestGroup( const aGroup : string; const aTest : TTestGroup);
-begin
-  FTestGroup := aGroup;
-  FCurrentTest := aTest;
-
-  Include( FExecuted, aTest);
-
-  if FTestGroup <> '' then begin
-    Console.WriteLine('');
-    Console.WriteLine( aGroup+' tests');
-    Console.WriteLine( StringOfChar('-',60));
-  end;
+  FLogger.StartTestGroup( aGroup, aTest);
 end;
 
 
 procedure TClientThread.Expect( aTestResult : Boolean; const aTestInfo : string);
 begin
-  if aTestResult  then begin
-    Inc(FSuccesses);
-    Console.WriteLine( aTestInfo+': passed');
-  end
-  else begin
-    FErrors.Add( FTestGroup+': '+aTestInfo);
-    Include( FFailed, FCurrentTest);
-    Console.WriteLine( aTestInfo+': *** FAILED ***');
-
-    // We have a failed test!
-    // -> issue DebugBreak ONLY if a debugger is attached,
-    // -> unhandled DebugBreaks would cause Windows to terminate the app otherwise
-    if IsDebuggerPresent
-    then {$IFDEF CPUX64} DebugBreak {$ELSE} asm int 3 end {$ENDIF};
-  end;
-end;
-
-
-procedure TClientThread.ReportResults;
-var nTotal : Integer;
-    sLine : string;
-begin
-  // prevent us from stupid DIV/0 errors
-  nTotal := FSuccesses + FErrors.Count;
-  if nTotal = 0 then begin
-    Console.WriteLine('No results logged');
-    Exit;
-  end;
-
-  Console.WriteLine('');
-  Console.WriteLine( StringOfChar('=',60));
-  Console.WriteLine( IntToStr(nTotal)+' tests performed');
-  Console.WriteLine( IntToStr(FSuccesses)+' tests succeeded ('+IntToStr(round(100*FSuccesses/nTotal))+'%)');
-  Console.WriteLine( IntToStr(FErrors.Count)+' tests failed ('+IntToStr(round(100*FErrors.Count/nTotal))+'%)');
-  Console.WriteLine( StringOfChar('=',60));
-  if FErrors.Count > 0 then begin
-    Console.WriteLine('FAILED TESTS:');
-    for sLine in FErrors do Console.WriteLine('- '+sLine);
-    Console.WriteLine( StringOfChar('=',60));
-    InterlockedIncrement( ExitCode);  // return <> 0 on errors
-  end;
-  Console.WriteLine('');
+  FLogger.Expect( aTestResult, aTestInfo);
 end;
 
 
 function TClientThread.CalculateExitCode : Byte;
-var test : TTestGroup;
+var test : TClientTestGroup;
+    failed, executed : TClientTestGroups;
 begin
   result := EXITCODE_SUCCESS;
-  for test := Low(TTestGroup) to High(TTestGroup) do begin
-    if (test in FFailed) or not (test in FExecuted)
+  FLogger.QueryTestStats( failed, executed);
+  for test := Low(TClientTestGroup) to High(TClientTestGroup) do begin
+    if (test in failed) or not (test in executed)
     then result := result or MAP_FAILURES_TO_EXITCODE_BITS[test];
   end;
 end;
@@ -1318,12 +1055,7 @@
   FNumIterations := aNumIteration;
 
   FConsole := TThreadConsole.Create( Self, aLogThreadID);
-  FCurrentTest := test_Unknown;
-
-  // error list: keep correct order, allow for duplicates
-  FErrors := TStringList.Create;
-  FErrors.Sorted := FALSE;
-  FErrors.Duplicates := dupAccept;
+  FLogger := TTestLoggerImpl.Create;
 
   inherited Create( TRUE);
 end;
@@ -1331,7 +1063,7 @@
 destructor TClientThread.Destroy;
 begin
   FreeAndNil( FConsole);
-  FreeAndNil( FErrors);
+  FLogger := nil; //-> Release
   inherited;
 end;
 
@@ -1341,10 +1073,9 @@
 begin
   // perform all tests
   try
-    {$IFDEF Win64}
-    UseInterlockedExchangeAdd64;
-    {$ENDIF}
-    JSONProtocolReadWriteTest;
+    // builtin (quick) unit tests on one thread only
+    if ThreadNo = 0
+    then TQuickUnitTests.Execute(FLogger);
 
     // must be run in the context of the thread
     InitializeProtocolTransportStack;
@@ -1357,7 +1088,7 @@
       end;
 
       // report the outcome
-      ReportResults;
+      FLogger.ReportResults;
       SetReturnValue( CalculateExitCode);
 
     finally
diff --git a/lib/delphi/test/testsuite/client/TestLogger.pas b/lib/delphi/test/testsuite/client/TestLogger.pas
new file mode 100644
index 0000000..10ddfc7
--- /dev/null
+++ b/lib/delphi/test/testsuite/client/TestLogger.pas
@@ -0,0 +1,193 @@
+﻿(*
+ * 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.
+ *)
+
+unit TestLogger;
+
+{$I ../src/Thrift.Defines.inc}
+
+interface
+
+uses
+  Classes, Windows, SysUtils, Math, ActiveX, ComObj,
+  {$IFDEF SupportsAsync} System.Threading, {$ENDIF}
+  DateUtils,
+  Generics.Collections,
+  TestConstants,
+  ConsoleHelper,
+  Thrift,
+  Thrift.Protocol.Compact,
+  Thrift.Protocol.JSON,
+  Thrift.Protocol,
+  Thrift.Transport.Pipes,
+  Thrift.Transport.WinHTTP,
+  Thrift.Transport.MsxmlHTTP,
+  Thrift.Transport,
+  Thrift.Stream,
+  Thrift.Test,
+  Thrift.WinHTTP,
+  Thrift.Utils,
+  Thrift.Configuration,
+  Thrift.Collections;
+
+
+type
+  TClientTestGroup = (
+    test_Unknown,
+    test_BaseTypes,
+    test_Structs,
+    test_Containers,
+    test_Exceptions
+    // new values here
+  );
+  TClientTestGroups = set of TClientTestGroup;
+
+
+  ITestLogger = interface
+    ['{26693ED5-1469-48AD-B1F3-04281B053DD4}']
+    procedure StartTestGroup( const aGroup : string; const aTest : TClientTestGroup);
+    procedure Expect( aTestResult : Boolean; const aTestInfo : string);
+    procedure QueryTestStats( out failed, executed : TClientTestGroups);
+    procedure ReportResults;
+  end;
+
+
+  // test reporting helper
+  TTestLoggerImpl = class( TInterfacedObject, ITestLogger)
+  strict private
+    FTestGroup : string;
+    FCurrentTest : TClientTestGroup;
+    FSuccesses : Integer;
+    FErrors : TStringList;
+    FFailed : TClientTestGroups;
+    FExecuted : TClientTestGroups;
+
+  strict protected
+    // ITestLogger = interface
+    procedure StartTestGroup( const aGroup : string; const aTest : TClientTestGroup);
+    procedure Expect( aTestResult : Boolean; const aTestInfo : string);
+    procedure QueryTestStats( out failed, executed : TClientTestGroups);
+    procedure ReportResults;
+
+  public
+    constructor Create;
+    destructor Destroy;  override;
+
+  end;
+
+
+implementation
+
+
+constructor TTestLoggerImpl.Create;
+begin
+  inherited Create;
+  FCurrentTest := test_Unknown;
+
+  // error list: keep correct order, allow for duplicates
+  FErrors := TStringList.Create;
+  FErrors.Sorted := FALSE;
+  FErrors.Duplicates := dupAccept;
+end;
+
+
+destructor TTestLoggerImpl.Destroy;
+begin
+  try
+    FreeAndNil( FErrors);
+  finally
+    inherited Destroy;
+  end;
+end;
+
+
+procedure TTestLoggerImpl.StartTestGroup( const aGroup : string; const aTest : TClientTestGroup);
+begin
+  FTestGroup := aGroup;
+  FCurrentTest := aTest;
+
+  Include( FExecuted, aTest);
+
+  if FTestGroup <> '' then begin
+    Console.WriteLine('');
+    Console.WriteLine( aGroup+' tests');
+    Console.WriteLine( StringOfChar('-',60));
+  end;
+end;
+
+
+procedure TTestLoggerImpl.Expect( aTestResult : Boolean; const aTestInfo : string);
+begin
+  if aTestResult  then begin
+    Inc(FSuccesses);
+    Console.WriteLine( aTestInfo+': passed');
+  end
+  else begin
+    FErrors.Add( FTestGroup+': '+aTestInfo);
+    Include( FFailed, FCurrentTest);
+    Console.WriteLine( aTestInfo+': *** FAILED ***');
+
+    // We have a failed test!
+    // -> issue DebugBreak ONLY if a debugger is attached,
+    // -> unhandled DebugBreaks would cause Windows to terminate the app otherwise
+    if IsDebuggerPresent
+    then {$IFDEF CPUX64} DebugBreak {$ELSE} asm int 3 end {$ENDIF};
+  end;
+end;
+
+
+procedure TTestLoggerImpl.QueryTestStats( out failed, executed : TClientTestGroups);
+begin
+  failed := FFailed;
+  executed := FExecuted;
+end;
+
+
+
+procedure TTestLoggerImpl.ReportResults;
+var nTotal : Integer;
+    sLine : string;
+begin
+  // prevent us from stupid DIV/0 errors
+  nTotal := FSuccesses + FErrors.Count;
+  if nTotal = 0 then begin
+    Console.WriteLine('No results logged');
+    Exit;
+  end;
+
+  Console.WriteLine('');
+  Console.WriteLine( StringOfChar('=',60));
+  Console.WriteLine( IntToStr(nTotal)+' tests performed');
+  Console.WriteLine( IntToStr(FSuccesses)+' tests succeeded ('+IntToStr(round(100*FSuccesses/nTotal))+'%)');
+  Console.WriteLine( IntToStr(FErrors.Count)+' tests failed ('+IntToStr(round(100*FErrors.Count/nTotal))+'%)');
+  Console.WriteLine( StringOfChar('=',60));
+  if FErrors.Count > 0 then begin
+    Console.WriteLine('FAILED TESTS:');
+    for sLine in FErrors do Console.WriteLine('- '+sLine);
+    Console.WriteLine( StringOfChar('=',60));
+    InterlockedIncrement( ExitCode);  // return <> 0 on errors
+  end;
+  Console.WriteLine('');
+end;
+
+
+
+
+
+
+end.
diff --git a/lib/delphi/test/testsuite/client/UnitTests.pas b/lib/delphi/test/testsuite/client/UnitTests.pas
new file mode 100644
index 0000000..3726c87
--- /dev/null
+++ b/lib/delphi/test/testsuite/client/UnitTests.pas
@@ -0,0 +1,350 @@
+﻿(*
+ * 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.
+ *)
+
+unit UnitTests;
+
+{$I ../src/Thrift.Defines.inc}
+
+interface
+
+uses
+  Classes, Windows, SysUtils, Math, ActiveX, ComObj,
+  {$IFDEF SupportsAsync} System.Threading, {$ENDIF}
+  DateUtils,
+  Generics.Collections,
+  TestConstants,
+  TestLogger,
+  ConsoleHelper,
+  Thrift,
+  Thrift.Protocol.Compact,
+  Thrift.Protocol.JSON,
+  Thrift.Protocol,
+  Thrift.Transport.Pipes,
+  Thrift.Transport.WinHTTP,
+  Thrift.Transport.MsxmlHTTP,
+  Thrift.Transport,
+  Thrift.Stream,
+  Thrift.Test,
+  Thrift.WinHTTP,
+  Thrift.Utils,
+  Thrift.Configuration,
+  Thrift.Collections;
+
+type
+  TQuickUnitTests = class sealed
+  strict private
+    FLogger : ITestLogger;
+
+  strict protected
+    // Helper
+    procedure StartTestGroup( const aGroup : string; const aTest : TClientTestGroup); inline;
+    procedure Expect( aTestResult : Boolean; const aTestInfo : string); inline;
+
+    // Test impl
+    procedure JSONProtocolReadWriteTest;
+    procedure HashSetTest;
+    {$IFDEF Win64}
+    procedure UseInterlockedExchangeAdd64;
+    {$ENDIF}
+
+    // main execution part
+    constructor Create( const logger : ITestLogger); reintroduce;
+    procedure Execute;  overload;
+  public
+    destructor Destroy; override;
+
+    class procedure Execute( const logger : ITestLogger); overload; static;
+  end;
+
+
+implementation
+
+
+constructor TQuickUnitTests.Create( const logger : ITestLogger);
+begin
+  inherited Create;
+  FLogger := logger;
+end;
+
+
+destructor TQuickUnitTests.Destroy;
+begin
+  try
+    FLogger := nil; //-> Release
+  finally
+    inherited Destroy;
+  end;
+end;
+
+
+class procedure TQuickUnitTests.Execute( const logger : ITestLogger);
+var instance : TQuickUnitTests;
+begin
+  instance := TQuickUnitTests.Create(logger);
+  try
+    instance.Execute;
+  finally
+    instance.Free;
+  end;
+end;
+
+
+procedure TQuickUnitTests.Execute;
+begin
+  {$IFDEF Win64}
+  UseInterlockedExchangeAdd64;
+  {$ENDIF}
+
+  JSONProtocolReadWriteTest;
+  HashSetTest;
+end;
+
+
+procedure TQuickUnitTests.StartTestGroup( const aGroup : string; const aTest : TClientTestGroup);
+begin
+  FLogger.StartTestGroup( aGroup, aTest);
+end;
+
+
+procedure TQuickUnitTests.Expect( aTestResult : Boolean; const aTestInfo : string);
+begin
+  FLogger.Expect( aTestResult, aTestInfo);
+end;
+
+
+{$IFDEF Win64}
+procedure TQuickUnitTests.UseInterlockedExchangeAdd64;
+var a,b : Int64;
+begin
+  a := 1;
+  b := 2;
+  Thrift.Utils.InterlockedExchangeAdd64( a,b);
+  Expect( a = 3, 'InterlockedExchangeAdd64');
+end;
+{$ENDIF}
+
+
+procedure TQuickUnitTests.JSONProtocolReadWriteTest;
+// Tests only then read/write procedures of the JSON protocol
+// All tests succeed, if we can read what we wrote before
+// Note that passing this test does not imply, that our JSON is really compatible to what
+// other clients or servers expect as the real JSON. This is beyond the scope of this test.
+var prot   : IProtocol;
+    stm    : TStringStream;
+    list   : TThriftList;
+    config : IThriftConfiguration;
+    binary, binRead, emptyBinary : TBytes;
+    i,iErr : Integer;
+const
+  TEST_SHORT   = ShortInt( $FE);
+  TEST_SMALL   = SmallInt( $FEDC);
+  TEST_LONG    = LongInt( $FEDCBA98);
+  TEST_I64     = Int64( $FEDCBA9876543210);
+  TEST_DOUBLE  = -1.234e-56;
+  DELTA_DOUBLE = TEST_DOUBLE * 1e-14;
+  TEST_STRING  = 'abc-'#$00E4#$00f6#$00fc; // german umlauts (en-us: "funny chars")
+  // Test THRIFT-2336 and THRIFT-3404 with U+1D11E (G Clef symbol) and 'Русское Название';
+  G_CLEF_AND_CYRILLIC_TEXT = #$1d11e' '#$0420#$0443#$0441#$0441#$043a#$043e#$0435' '#$041d#$0430#$0437#$0432#$0430#$043d#$0438#$0435;
+  G_CLEF_AND_CYRILLIC_JSON = '"\ud834\udd1e \u0420\u0443\u0441\u0441\u043a\u043e\u0435 \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435"';
+  // test both possible solidus encodings
+  SOLIDUS_JSON_DATA = '"one/two\/three"';
+  SOLIDUS_EXCPECTED = 'one/two/three';
+begin
+  stm  := TStringStream.Create;
+  try
+    FLogger.StartTestGroup( 'JsonProtocolTest', test_Unknown);
+
+    config := TThriftConfigurationImpl.Create;
+
+    // prepare binary data
+    binary := PrepareBinaryData( FALSE, TTestSize.Normal);
+    SetLength( emptyBinary, 0); // empty binary data block
+
+    // output setup
+    prot := TJSONProtocolImpl.Create(
+              TStreamTransportImpl.Create(
+                nil, TThriftStreamAdapterDelphi.Create( stm, FALSE), config));
+
+    // write
+    Init( list, TType.String_, 9);
+    prot.WriteListBegin( list);
+    prot.WriteBool( TRUE);
+    prot.WriteBool( FALSE);
+    prot.WriteByte( TEST_SHORT);
+    prot.WriteI16( TEST_SMALL);
+    prot.WriteI32( TEST_LONG);
+    prot.WriteI64( TEST_I64);
+    prot.WriteDouble( TEST_DOUBLE);
+    prot.WriteString( TEST_STRING);
+    prot.WriteBinary( binary);
+    prot.WriteString( '');  // empty string
+    prot.WriteBinary( emptyBinary); // empty binary data block
+    prot.WriteListEnd;
+
+    // input setup
+    Expect( stm.Position = stm.Size, 'Stream position/length after write');
+    stm.Position := 0;
+    prot := TJSONProtocolImpl.Create(
+              TStreamTransportImpl.Create(
+                TThriftStreamAdapterDelphi.Create( stm, FALSE), nil, config));
+
+    // read and compare
+    list := prot.ReadListBegin;
+    Expect( list.ElementType = TType.String_, 'list element type');
+    Expect( list.Count = 9, 'list element count');
+    Expect( prot.ReadBool, 'WriteBool/ReadBool: TRUE');
+    Expect( not prot.ReadBool, 'WriteBool/ReadBool: FALSE');
+    Expect( prot.ReadByte   = TEST_SHORT,  'WriteByte/ReadByte');
+    Expect( prot.ReadI16    = TEST_SMALL,  'WriteI16/ReadI16');
+    Expect( prot.ReadI32    = TEST_LONG,   'WriteI32/ReadI32');
+    Expect( prot.ReadI64    = TEST_I64,    'WriteI64/ReadI64');
+    Expect( abs(prot.ReadDouble-TEST_DOUBLE) < abs(DELTA_DOUBLE), 'WriteDouble/ReadDouble');
+    Expect( prot.ReadString = TEST_STRING, 'WriteString/ReadString');
+    binRead := prot.ReadBinary;
+    Expect( Length(prot.ReadString) = 0, 'WriteString/ReadString (empty string)');
+    Expect( Length(prot.ReadBinary) = 0, 'empty WriteBinary/ReadBinary (empty data block)');
+    prot.ReadListEnd;
+
+    // test binary data
+    Expect( Length(binary) = Length(binRead), 'Binary data length check');
+    iErr := -1;
+    for i := Low(binary) to High(binary) do begin
+      if binary[i] <> binRead[i] then begin
+        iErr := i;
+        Break;
+      end;
+    end;
+    if iErr < 0
+    then Expect( TRUE,  'Binary data check ('+IntToStr(Length(binary))+' Bytes)')
+    else Expect( FALSE, 'Binary data check at offset '+IntToStr(iErr));
+
+    Expect( stm.Position = stm.Size, 'Stream position after read');
+
+
+    // Solidus can be encoded in two ways. Make sure we can read both
+    stm.Position := 0;
+    stm.Size     := 0;
+    stm.WriteString(SOLIDUS_JSON_DATA);
+    stm.Position := 0;
+    prot := TJSONProtocolImpl.Create(
+              TStreamTransportImpl.Create(
+                TThriftStreamAdapterDelphi.Create( stm, FALSE), nil, config));
+    Expect( prot.ReadString = SOLIDUS_EXCPECTED, 'Solidus encoding');
+
+
+    // Widechars should work too. Do they?
+    // After writing, we ensure that we are able to read it back
+    // We can't assume hex-encoding, since (nearly) any Unicode char is valid JSON
+    stm.Position := 0;
+    stm.Size     := 0;
+    prot := TJSONProtocolImpl.Create(
+              TStreamTransportImpl.Create(
+                nil, TThriftStreamAdapterDelphi.Create( stm, FALSE), config));
+    prot.WriteString( G_CLEF_AND_CYRILLIC_TEXT);
+    stm.Position := 0;
+    prot := TJSONProtocolImpl.Create(
+              TStreamTransportImpl.Create(
+                TThriftStreamAdapterDelphi.Create( stm, FALSE), nil, config));
+    FLogger.Expect( prot.ReadString = G_CLEF_AND_CYRILLIC_TEXT, 'Writing JSON with chars > 8 bit');
+
+    // Widechars should work with hex-encoding too. Do they?
+    stm.Position := 0;
+    stm.Size     := 0;
+    stm.WriteString( G_CLEF_AND_CYRILLIC_JSON);
+    stm.Position := 0;
+    prot := TJSONProtocolImpl.Create(
+              TStreamTransportImpl.Create(
+                TThriftStreamAdapterDelphi.Create( stm, FALSE), nil, config));
+    FLogger.Expect( prot.ReadString = G_CLEF_AND_CYRILLIC_TEXT, 'Reading JSON with chars > 8 bit');
+
+
+  finally
+    stm.Free;
+    prot := nil;  //-> Release
+    FLogger.StartTestGroup( '', test_Unknown);  // no more tests here
+  end;
+end;
+
+
+procedure TQuickUnitTests.HashSetTest;
+var container : IThriftHashSet<Integer>;
+    testdata : array of Integer;
+    i : Integer;
+const
+  TEST_COUNT = 4096;
+begin
+  StartTestGroup( 'IThriftHashSet<T> implementation', test_Containers);
+
+  // prepare test data
+  SetLength( testdata, 5);
+  testdata[0] := -2;
+  testdata[1] := 0;
+  testdata[2] := 42;
+  testdata[3] := MaxInt;
+  testdata[4] := Low(Integer);
+
+  // first insert
+  container := TThriftHashSetImpl<Integer>.Create;
+  for i in testdata do begin
+    Expect( container.Add( i), 'add first '+IntToStr(i));
+    Expect( container.Contains( i), 'contains '+IntToStr(i));
+  end;
+  Expect( container.Count = Length(testdata), 'container size');
+
+  // insert again
+  for i in testdata do begin
+    Expect( not container.Add( i), 'add second '+IntToStr(i));
+    Expect( container.Contains( i), 'contains '+IntToStr(i));
+  end;
+  Expect( container.Count = Length(testdata), 'container size');
+
+  // remove
+  for i in testdata do begin
+    Expect( container.Remove( i), 'first remove '+IntToStr(i));
+    Expect( not container.Contains( i), 'not contains '+IntToStr(i));
+  end;
+  Expect( container.Count = 0, 'container size');
+
+  // remove again
+  for i in testdata do begin
+    Expect( not container.Remove( i), 'second remove '+IntToStr(i));
+    Expect( not container.Contains( i), 'not contains '+IntToStr(i));
+  end;
+  Expect( container.Count = 0, 'container size');
+
+  // append and clear
+  for i := 0 to TEST_COUNT-1 do begin
+    container.Add(-i);
+    container.Add(+i);
+  end;
+  Expect( container.Count = 2*TEST_COUNT-1, 'container size check');
+  Expect( not container.Contains( -TEST_COUNT), 'element not contained');
+  Expect( not container.Contains( TEST_COUNT), 'element not contained');
+  container.Clear;
+  Expect( container.Count = 0, 'count=0 after clear');
+end;
+
+
+
+
+
+
+
+
+end.
diff --git a/lib/delphi/test/TestServer.pas b/lib/delphi/test/testsuite/server/TestServer.pas
similarity index 100%
rename from lib/delphi/test/TestServer.pas
rename to lib/delphi/test/testsuite/server/TestServer.pas
diff --git a/lib/delphi/test/TestServerEvents.pas b/lib/delphi/test/testsuite/server/TestServerEvents.pas
similarity index 100%
rename from lib/delphi/test/TestServerEvents.pas
rename to lib/delphi/test/testsuite/server/TestServerEvents.pas
diff --git a/lib/erl/Makefile.am b/lib/erl/Makefile.am
index 23ebb77..4259a1f 100644
--- a/lib/erl/Makefile.am
+++ b/lib/erl/Makefile.am
@@ -78,6 +78,9 @@
 	$(RM) -r $(distdir)/test/gen-erl/
 	$(RM)    $(distdir)/$(THRIFT_OMIT_FILE)
 
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
 EXTRA_DIST = \
 	include \
 	src \
diff --git a/lib/go/Makefile.am b/lib/go/Makefile.am
index 18b6b75..3bfefbc 100644
--- a/lib/go/Makefile.am
+++ b/lib/go/Makefile.am
@@ -48,6 +48,9 @@
 all-local:
 	$(GO) build $(GOBUILDEXTRA) ./thrift
 
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
 EXTRA_DIST = \
 	thrift \
 	coding_standards.md \
diff --git a/lib/go/test/Makefile.am b/lib/go/test/Makefile.am
index cb8928b..d76f248 100644
--- a/lib/go/test/Makefile.am
+++ b/lib/go/test/Makefile.am
@@ -62,7 +62,8 @@
 				ProcessorMiddlewareTest.thrift \
 				ClientMiddlewareExceptionTest.thrift \
 				ValidateTest.thrift \
-				ForwardType.thrift
+				ForwardType.thrift \
+				StringParseAllocationTest.thrift
 	mkdir -p gopath/src
 	grep -v list.*map.*list.*map $(THRIFTTEST) | grep -v 'set<Insanity>' > ThriftTest.thrift
 	$(THRIFT) $(THRIFTARGS) -r IncludesTest.thrift
@@ -98,6 +99,7 @@
 	$(THRIFT) $(THRIFTARGS) ClientMiddlewareExceptionTest.thrift
 	$(THRIFT) $(THRIFTARGS) ValidateTest.thrift
 	$(THRIFT) $(THRIFTARGS) ForwardType.thrift
+	$(THRIFT) $(THRIFTARGS) StringParseAllocationTest.thrift
 	ln -nfs ../../tests gopath/src/tests
 	cp -r ./dontexportrwtest gopath/src
 	touch gopath
@@ -134,10 +136,15 @@
 client: stubs
 	$(GO) run TestClient.go
 
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
 EXTRA_DIST = \
 	dontexportrwtest \
 	tests \
 	common \
+	go.mod \
+	go.sum \
 	BinaryKeyTest.thrift \
 	ClientMiddlewareExceptionTest.thrift \
 	ConflictArgNamesTest.thrift \
@@ -169,6 +176,7 @@
 	RefAnnotationFieldsTest.thrift \
 	RequiredFieldTest.thrift \
 	ServicesTest.thrift \
+	StringParseAllocationTest.thrift \
 	TypedefFieldTest.thrift \
 	UnionBinaryTest.thrift \
 	UnionDefaultValueTest.thrift \
diff --git a/lib/go/test/StringParseAllocationTest.thrift b/lib/go/test/StringParseAllocationTest.thrift
new file mode 100644
index 0000000..0ede9a5
--- /dev/null
+++ b/lib/go/test/StringParseAllocationTest.thrift
@@ -0,0 +1,22 @@
+/*
+ * 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.
+ */
+
+struct StringStruct {
+  1: required string example
+}
diff --git a/lib/go/test/fuzz/Makefile.am b/lib/go/test/fuzz/Makefile.am
index 9677f4f..a481e95 100644
--- a/lib/go/test/fuzz/Makefile.am
+++ b/lib/go/test/fuzz/Makefile.am
@@ -27,6 +27,9 @@
 clean-local:
 	$(RM) -rf gopathfuzz gen-go
 
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
 EXTRA_DIST = \
 	fuzz.go \
 	fuzz_test.go \
diff --git a/lib/go/test/tests/header_zlib_test.go b/lib/go/test/tests/header_zlib_test.go
new file mode 100644
index 0000000..cf2f849
--- /dev/null
+++ b/lib/go/test/tests/header_zlib_test.go
@@ -0,0 +1,206 @@
+/*
+ * 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.
+ */
+
+package tests
+
+import (
+	"context"
+	"errors"
+	"io"
+	"net"
+	"sync/atomic"
+	"testing"
+	"time"
+
+	"github.com/apache/thrift/lib/go/test/gopath/src/servicestest"
+	"github.com/apache/thrift/lib/go/thrift"
+)
+
+type zlibTestHandler struct {
+	servicestest.AServ
+
+	tb   testing.TB
+	text string
+}
+
+func (z zlibTestHandler) Stringfunc_1int_1s(ctx context.Context, i int64, s string) (string, error) {
+	if s != z.text {
+		z.tb.Errorf("string arg got %q want %q", s, z.text)
+	}
+	return z.text, nil
+}
+
+type countingProxy struct {
+	// Need to fill when constructing
+	tb         testing.TB
+	remoteAddr net.Addr
+
+	// internal states
+	listener      net.Listener
+	clientWritten atomic.Int64
+	serverWritten atomic.Int64
+}
+
+func (cp *countingProxy) getAndResetCounters() (req, resp int64) {
+	req = cp.clientWritten.Swap(0)
+	resp = cp.serverWritten.Swap(0)
+	return req, resp
+}
+
+func (cp *countingProxy) serve() {
+	cp.tb.Helper()
+
+	listener, err := net.Listen("tcp", ":0")
+	if err != nil {
+		cp.tb.Fatalf("Failed to listen proxy: %v", err)
+	}
+	go func() {
+		for {
+			client, err := listener.Accept()
+			if err != nil {
+				if !errors.Is(err, io.EOF) && !errors.Is(err, net.ErrClosed) {
+					cp.tb.Errorf("proxy accept error: %v", err)
+				}
+				return
+			}
+			server, err := net.Dial(cp.remoteAddr.Network(), cp.remoteAddr.String())
+			if err != nil {
+				cp.tb.Logf("proxy failed to dial server %v: %v", cp.remoteAddr, err)
+			}
+			proxy := func(read, write net.Conn, count *atomic.Int64) {
+				var buf [1024]byte
+				for {
+					n, err := read.Read(buf[:])
+					if n > 0 {
+						count.Add(int64(n))
+						if _, err := write.Write(buf[:n]); err != nil {
+							cp.tb.Errorf("proxy write error: %v", err)
+						}
+					}
+					if err != nil {
+						if !errors.Is(err, io.EOF) && !errors.Is(err, net.ErrClosed) {
+							cp.tb.Errorf("proxy read error: %v", err)
+						}
+						read.Close()
+						write.Close()
+						return
+					}
+				}
+			}
+			// Read from client
+			go proxy(client, server, &cp.clientWritten)
+			// Read from server
+			go proxy(server, client, &cp.serverWritten)
+		}
+	}()
+	cp.listener = listener
+}
+
+func TestTHeaderZlibClient(t *testing.T) {
+	// Some text that zlib should be able to compress
+	const text = `Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.`
+
+	socket, err := thrift.NewTServerSocket(":0")
+	if err != nil {
+		t.Fatalf("Failed to create server socket: %v", err)
+	}
+	// Call listen to reserve a port and check for any issues early
+	if err := socket.Listen(); err != nil {
+		t.Fatalf("Failed to listen server socket: %v", err)
+	}
+	server := thrift.NewTSimpleServer4(
+		servicestest.NewAServProcessor(zlibTestHandler{
+			tb:   t,
+			text: text,
+		}),
+		socket,
+		thrift.NewTHeaderTransportFactoryConf(nil, nil),
+		thrift.NewTHeaderProtocolFactoryConf(nil),
+	)
+	go server.Serve()
+	// give the server a little time to start serving
+	time.Sleep(10 * time.Millisecond)
+	t.Cleanup(func() {
+		server.Stop()
+	})
+	t.Logf("server running on %v", socket.Addr())
+
+	proxy := countingProxy{
+		tb:         t,
+		remoteAddr: socket.Addr(),
+	}
+	proxy.serve()
+	t.Cleanup(func() {
+		proxy.listener.Close()
+	})
+	t.Logf("proxy running on %v", proxy.listener.Addr())
+
+	clientRoundtrip := func(cfg *thrift.TConfiguration) {
+		t.Helper()
+
+		socket := thrift.NewTSocketConf(proxy.listener.Addr().String(), cfg)
+		if err := socket.Open(); err != nil {
+			t.Errorf("failed to open socket: %v", err)
+			return
+		}
+		defer socket.Close()
+		protoFactory := thrift.NewTHeaderProtocolFactoryConf(cfg)
+		client := thrift.NewTStandardClient(
+			protoFactory.GetProtocol(socket),
+			protoFactory.GetProtocol(socket),
+		)
+		c := servicestest.NewAServClient(client)
+		got, err := c.Stringfunc_1int_1s(context.Background(), 0, text)
+		if err != nil {
+			t.Errorf("Stringfunc_1int_1s call failed: %v", err)
+			return
+		}
+		if got != text {
+			t.Errorf("Stringfunc_1int_1s got %q want %q", got, text)
+		}
+	}
+
+	clientRoundtrip(nil)
+	nozlibReq, nozlibResp := proxy.getAndResetCounters()
+	t.Logf("nozlib request size: %d, response size: %d", nozlibReq, nozlibResp)
+
+	clientRoundtrip(&thrift.TConfiguration{
+		THeaderTransforms: []thrift.THeaderTransformID{thrift.TransformZlib},
+	})
+	zlibReq, zlibResp := proxy.getAndResetCounters()
+	t.Logf("zlib request size: %d, response size: %d", zlibReq, zlibResp)
+
+	if zlibReq >= nozlibReq {
+		t.Errorf("zlib request size %d >= nozlib request size %d", zlibReq, nozlibReq)
+	}
+	if zlibResp >= nozlibResp {
+		t.Errorf("zlib response size %d >= nozlib response size %d", zlibResp, nozlibResp)
+	}
+
+	clientRoundtrip(nil)
+	nozlibReq2, nozlibResp2 := proxy.getAndResetCounters()
+	t.Logf("nozlib2 request size: %d, response size: %d", nozlibReq, nozlibResp)
+
+	if nozlibReq2 != nozlibReq {
+		t.Errorf("nozlib request 2 size %d != nozlib request size %d", nozlibReq2, nozlibReq)
+	}
+	if nozlibResp2 != nozlibResp {
+		t.Errorf("nozlib response 2 size %d != nozlib response size %d", nozlibResp2, nozlibResp)
+	}
+}
diff --git a/lib/go/test/tests/string_parse_allocation_test.go b/lib/go/test/tests/string_parse_allocation_test.go
new file mode 100644
index 0000000..12790c4
--- /dev/null
+++ b/lib/go/test/tests/string_parse_allocation_test.go
@@ -0,0 +1,62 @@
+/*
+ * 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.
+ */
+
+package tests
+
+import (
+	"context"
+	"fmt"
+	"strings"
+	"testing"
+
+	"github.com/apache/thrift/lib/go/test/gopath/src/stringparseallocationtest"
+	"github.com/apache/thrift/lib/go/thrift"
+)
+
+func TestSimpleJsonStringParse_Allocations(t *testing.T) {
+	byteAllocationLimit := 100 * 1024 // 100 KB
+	res := testing.Benchmark(BenchmarkSimpleJsonStringParse_Allocations)
+	if res.AllocedBytesPerOp() > int64(byteAllocationLimit) {
+		t.Errorf("Total memory allocation size too high: %d (> %d)", res.AllocedBytesPerOp(), byteAllocationLimit)
+	}
+}
+
+func BenchmarkSimpleJsonStringParse_Allocations(b *testing.B) {
+	b.ReportAllocs()
+	b.StopTimer()
+	numEscapedQuotes := 1000
+	var sb strings.Builder
+	for i := 0; i < numEscapedQuotes; i++ {
+		sb.WriteString(`\"`)
+	}
+
+	testString := fmt.Sprintf(`{"1": {"str": "this is a test with %d of escaped quotes %s"}}`, numEscapedQuotes, sb.String())
+	stringStruct := stringparseallocationtest.NewStringStruct()
+	transport := thrift.NewTMemoryBuffer()
+	p := thrift.NewTJSONProtocol(transport)
+
+	for i := 0; i < b.N; i++ {
+		transport.Reset()
+		transport.WriteString(testString)
+		transport.Flush(context.Background())
+		b.StartTimer()
+		_ = stringStruct.Read(context.Background(), p)
+		b.StopTimer()
+	}
+}
diff --git a/lib/go/thrift/configuration.go b/lib/go/thrift/configuration.go
index de27edd..a9565d3 100644
--- a/lib/go/thrift/configuration.go
+++ b/lib/go/thrift/configuration.go
@@ -56,47 +56,47 @@
 //
 // For example, say you want to migrate this old code into using TConfiguration:
 //
-//     sccket, err := thrift.NewTSocketTimeout("host:port", time.Second, time.Second)
-//     transFactory := thrift.NewTFramedTransportFactoryMaxLength(
-//         thrift.NewTTransportFactory(),
-//         1024 * 1024 * 256,
-//     )
-//     protoFactory := thrift.NewTBinaryProtocolFactory(true, true)
+//	socket, err := thrift.NewTSocketTimeout("host:port", time.Second, time.Second)
+//	transFactory := thrift.NewTFramedTransportFactoryMaxLength(
+//	    thrift.NewTTransportFactory(),
+//	    1024 * 1024 * 256,
+//	)
+//	protoFactory := thrift.NewTBinaryProtocolFactory(true, true)
 //
 // This is the wrong way to do it because in the end the TConfiguration used by
 // socket and transFactory will be overwritten by the one used by protoFactory
 // because of TConfiguration propagation:
 //
-//     // bad example, DO NOT USE
-//     sccket := thrift.NewTSocketConf("host:port", &thrift.TConfiguration{
-//         ConnectTimeout: time.Second,
-//         SocketTimeout:  time.Second,
-//     })
-//     transFactory := thrift.NewTFramedTransportFactoryConf(
-//         thrift.NewTTransportFactory(),
-//         &thrift.TConfiguration{
-//             MaxFrameSize: 1024 * 1024 * 256,
-//         },
-//     )
-//     protoFactory := thrift.NewTBinaryProtocolFactoryConf(&thrift.TConfiguration{
-//         TBinaryStrictRead:  thrift.BoolPtr(true),
-//         TBinaryStrictWrite: thrift.BoolPtr(true),
-//     })
+//	// bad example, DO NOT USE
+//	socket := thrift.NewTSocketConf("host:port", &thrift.TConfiguration{
+//	    ConnectTimeout: time.Second,
+//	    SocketTimeout:  time.Second,
+//	})
+//	transFactory := thrift.NewTFramedTransportFactoryConf(
+//	    thrift.NewTTransportFactory(),
+//	    &thrift.TConfiguration{
+//	        MaxFrameSize: 1024 * 1024 * 256,
+//	    },
+//	)
+//	protoFactory := thrift.NewTBinaryProtocolFactoryConf(&thrift.TConfiguration{
+//	    TBinaryStrictRead:  thrift.BoolPtr(true),
+//	    TBinaryStrictWrite: thrift.BoolPtr(true),
+//	})
 //
 // This is the correct way to do it:
 //
-//     conf := &thrift.TConfiguration{
-//         ConnectTimeout: time.Second,
-//         SocketTimeout:  time.Second,
+//	conf := &thrift.TConfiguration{
+//	    ConnectTimeout: time.Second,
+//	    SocketTimeout:  time.Second,
 //
-//         MaxFrameSize: 1024 * 1024 * 256,
+//	    MaxFrameSize: 1024 * 1024 * 256,
 //
-//         TBinaryStrictRead:  thrift.BoolPtr(true),
-//         TBinaryStrictWrite: thrift.BoolPtr(true),
-//     }
-//     sccket := thrift.NewTSocketConf("host:port", conf)
-//     transFactory := thrift.NewTFramedTransportFactoryConf(thrift.NewTTransportFactory(), conf)
-//     protoFactory := thrift.NewTBinaryProtocolFactoryConf(conf)
+//	    TBinaryStrictRead:  thrift.BoolPtr(true),
+//	    TBinaryStrictWrite: thrift.BoolPtr(true),
+//	}
+//	socket := thrift.NewTSocketConf("host:port", conf)
+//	transFactory := thrift.NewTFramedTransportFactoryConf(thrift.NewTTransportFactory(), conf)
+//	protoFactory := thrift.NewTBinaryProtocolFactoryConf(conf)
 //
 // [1]: https://github.com/apache/thrift/blob/master/doc/specs/thrift-tconfiguration.md
 type TConfiguration struct {
@@ -132,6 +132,8 @@
 	// THeaderProtocolIDPtr and THeaderProtocolIDPtrMust helper functions
 	// are provided to help filling this value.
 	THeaderProtocolID *THeaderProtocolID
+	// The write transforms to be applied to THeaderTransport.
+	THeaderTransforms []THeaderTransformID
 
 	// Used internally by deprecated constructors, to avoid overriding
 	// underlying TTransport/TProtocol's cfg by accidental propagations.
@@ -245,6 +247,18 @@
 	return protoID
 }
 
+// GetTHeaderTransforms returns the THeaderTransformIDs to be applied on
+// THeaderTransport writing.
+//
+// It's nil-safe. If tc is nil, empty slice will be returned (meaning no
+// transforms to be applied).
+func (tc *TConfiguration) GetTHeaderTransforms() []THeaderTransformID {
+	if tc == nil {
+		return nil
+	}
+	return tc.THeaderTransforms
+}
+
 // THeaderProtocolIDPtr validates and returns the pointer to id.
 //
 // If id is not a valid THeaderProtocolID, a pointer to THeaderProtocolDefault
diff --git a/lib/go/thrift/header_protocol.go b/lib/go/thrift/header_protocol.go
index 36777b4..bec84b8 100644
--- a/lib/go/thrift/header_protocol.go
+++ b/lib/go/thrift/header_protocol.go
@@ -119,6 +119,11 @@
 }
 
 // AddTransform add a transform for writing.
+//
+// Deprecated: This only applies to the next message written, and the next read
+// message will cause write transforms to be reset from what's configured in
+// TConfiguration. For sticky transforms, use TConfiguration.THeaderTransforms
+// instead.
 func (p *THeaderProtocol) AddTransform(transform THeaderTransformID) error {
 	return p.transport.AddTransform(transform)
 }
diff --git a/lib/go/thrift/header_protocol_test.go b/lib/go/thrift/header_protocol_test.go
index 48a69bf..dfd84f8 100644
--- a/lib/go/thrift/header_protocol_test.go
+++ b/lib/go/thrift/header_protocol_test.go
@@ -39,4 +39,24 @@
 			}))
 		},
 	)
+
+	t.Run(
+		"binary-zlib",
+		func(t *testing.T) {
+			ReadWriteProtocolTest(t, NewTHeaderProtocolFactoryConf(&TConfiguration{
+				THeaderProtocolID: THeaderProtocolIDPtrMust(THeaderProtocolBinary),
+				THeaderTransforms: []THeaderTransformID{TransformZlib},
+			}))
+		},
+	)
+
+	t.Run(
+		"compact-zlib",
+		func(t *testing.T) {
+			ReadWriteProtocolTest(t, NewTHeaderProtocolFactoryConf(&TConfiguration{
+				THeaderProtocolID: THeaderProtocolIDPtrMust(THeaderProtocolCompact),
+				THeaderTransforms: []THeaderTransformID{TransformZlib},
+			}))
+		},
+	)
 }
diff --git a/lib/go/thrift/header_transport.go b/lib/go/thrift/header_transport.go
index 3aea5a9..8148796 100644
--- a/lib/go/thrift/header_transport.go
+++ b/lib/go/thrift/header_transport.go
@@ -128,7 +128,7 @@
 //
 // If you don't know the closers capacity beforehand, just use
 //
-//     &TransformReader{Reader: baseReader}
+//	&TransformReader{Reader: baseReader}
 //
 // instead would be sufficient.
 func NewTransformReaderWithCapacity(baseReader io.Reader, capacity int) *TransformReader {
@@ -151,6 +151,11 @@
 }
 
 // AddTransform adds a transform.
+//
+// Deprecated: This only applies to the next message written, and the next read
+// message will cause write transforms to be reset from what's configured in
+// TConfiguration. For sticky transforms, use TConfiguration.THeaderTransforms
+// instead.
 func (tr *TransformReader) AddTransform(id THeaderTransformID) error {
 	switch id {
 	default:
@@ -206,6 +211,25 @@
 	return nil
 }
 
+var zlibDefaultLevelWriterPool = newPool(
+	func() *zlib.Writer {
+		return zlib.NewWriter(nil)
+	},
+	nil,
+)
+
+type zlibPoolCloser struct {
+	writer *zlib.Writer
+}
+
+func (z *zlibPoolCloser) Close() error {
+	defer func() {
+		z.writer.Reset(nil)
+		zlibDefaultLevelWriterPool.put(&z.writer)
+	}()
+	return z.writer.Close()
+}
+
 // AddTransform adds a transform.
 func (tw *TransformWriter) AddTransform(id THeaderTransformID) error {
 	switch id {
@@ -217,9 +241,12 @@
 	case TransformNone:
 		// no-op
 	case TransformZlib:
-		writeCloser := zlib.NewWriter(tw.Writer)
+		writeCloser := zlibDefaultLevelWriterPool.get()
+		writeCloser.Reset(tw.Writer)
 		tw.Writer = writeCloser
-		tw.closers = append(tw.closers, writeCloser)
+		tw.closers = append(tw.closers, &zlibPoolCloser{
+			writer: writeCloser,
+		})
 	}
 	return nil
 }
@@ -300,11 +327,12 @@
 	}
 	PropagateTConfiguration(trans, conf)
 	return &THeaderTransport{
-		transport:    trans,
-		reader:       bufio.NewReader(trans),
-		writeHeaders: make(THeaderMap),
-		protocolID:   conf.GetTHeaderProtocolID(),
-		cfg:          conf,
+		transport:       trans,
+		reader:          bufio.NewReader(trans),
+		writeHeaders:    make(THeaderMap),
+		writeTransforms: conf.GetTHeaderTransforms(),
+		protocolID:      conf.GetTHeaderProtocolID(),
+		cfg:             conf,
 	}
 }
 
@@ -449,6 +477,11 @@
 	}
 	t.protocolID = THeaderProtocolID(protoID)
 
+	// Reset writeTransforms to the ones from cfg, as we are going to add
+	// compression transforms from what we read, we don't want to accumulate
+	// different transforms read from different requests
+	t.writeTransforms = t.cfg.GetTHeaderTransforms()
+
 	var transformCount int32
 	transformCount, err = hp.readVarint32()
 	if err != nil {
@@ -466,7 +499,16 @@
 			if err != nil {
 				return err
 			}
-			transformIDs[i] = THeaderTransformID(id)
+			tID := THeaderTransformID(id)
+			transformIDs[i] = tID
+
+			// For compression transforms, we should also add them
+			// to writeTransforms so that the response (assuming we
+			// are reading a request) would do the same compression.
+			switch tID {
+			case TransformZlib:
+				t.addWriteTransformsDedupe(tID)
+			}
 		}
 		// The transform IDs on the wire was added based on the order of
 		// writing, so on the reading side we need to reverse the order.
@@ -544,7 +586,7 @@
 			// the last Read finished the frame, do endOfFrame
 			// handling here.
 			err = t.endOfFrame()
-		} else if err == io.EOF {
+		} else if errors.Is(err, io.EOF) {
 			err = t.endOfFrame()
 			if err != nil {
 				return
@@ -726,6 +768,9 @@
 }
 
 // AddTransform add a transform for writing.
+//
+// NOTE: This is provided as a low-level API, but in general you should use
+// TConfiguration.THeaderTransforms to set transforms for writing instead.
 func (t *THeaderTransport) AddTransform(transform THeaderTransformID) error {
 	if !supportedTransformIDs[transform] {
 		return NewTProtocolExceptionWithType(
@@ -758,6 +803,17 @@
 	}
 }
 
+// addWriteTransformsDedupe adds id to writeTransforms only if it's not already
+// there.
+func (t *THeaderTransport) addWriteTransformsDedupe(id THeaderTransformID) {
+	for _, existingID := range t.writeTransforms {
+		if existingID == id {
+			return
+		}
+	}
+	t.writeTransforms = append(t.writeTransforms, id)
+}
+
 // SetTConfiguration implements TConfigurationSetter.
 func (t *THeaderTransport) SetTConfiguration(cfg *TConfiguration) {
 	PropagateTConfiguration(t.transport, cfg)
diff --git a/lib/go/thrift/simple_json_protocol.go b/lib/go/thrift/simple_json_protocol.go
index 8b1284f..f7fe68c 100644
--- a/lib/go/thrift/simple_json_protocol.go
+++ b/lib/go/thrift/simple_json_protocol.go
@@ -30,6 +30,7 @@
 	"io"
 	"math"
 	"strconv"
+	"strings"
 )
 
 type _ParseContext int
@@ -922,15 +923,7 @@
 	if err != nil {
 		return "", NewTProtocolException(err)
 	}
-	l := len(line)
-	// count number of escapes to see if we need to keep going
-	i := 1
-	for ; i < l; i++ {
-		if line[l-i-1] != '\\' {
-			break
-		}
-	}
-	if i&0x01 == 1 {
+	if endsWithoutEscapedQuote(line) {
 		v, ok := jsonUnquote(string(JSON_QUOTE) + line)
 		if !ok {
 			return "", NewTProtocolException(err)
@@ -951,27 +944,29 @@
 }
 
 func (p *TSimpleJSONProtocol) ParseQuotedStringBody() (string, error) {
-	line, err := p.reader.ReadString(JSON_QUOTE)
-	if err != nil {
-		return "", NewTProtocolException(err)
+	var sb strings.Builder
+
+	for {
+		line, err := p.reader.ReadString(JSON_QUOTE)
+		if err != nil {
+			return "", NewTProtocolException(err)
+		}
+		sb.WriteString(line)
+		if endsWithoutEscapedQuote(line) {
+			return sb.String(), nil
+		}
 	}
-	l := len(line)
-	// count number of escapes to see if we need to keep going
+}
+
+func endsWithoutEscapedQuote(s string) bool {
+	l := len(s)
 	i := 1
 	for ; i < l; i++ {
-		if line[l-i-1] != '\\' {
+		if s[l-i-1] != '\\' {
 			break
 		}
 	}
-	if i&0x01 == 1 {
-		return line, nil
-	}
-	s, err := p.ParseQuotedStringBody()
-	if err != nil {
-		return "", NewTProtocolException(err)
-	}
-	v := line + s
-	return v, nil
+	return i&0x01 == 1
 }
 
 func (p *TSimpleJSONProtocol) ParseBase64EncodedBody() ([]byte, error) {
@@ -1200,7 +1195,7 @@
 	for continueFor {
 		c, err := p.reader.ReadByte()
 		if err != nil {
-			if err == io.EOF {
+			if errors.Is(err, io.EOF) {
 				break
 			}
 			return NUMERIC_NULL, NewTProtocolException(err)
diff --git a/lib/haxe/test/Makefile.am b/lib/haxe/test/Makefile.am
index 2b8b245..8c658ae 100644
--- a/lib/haxe/test/Makefile.am
+++ b/lib/haxe/test/Makefile.am
@@ -69,6 +69,9 @@
 	$(BIN_CPP)
 	php -f $(BIN_PHP)
 
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
 EXTRA_DIST = \
              src \
              cpp.hxml \
diff --git a/lib/java/Makefile.am b/lib/java/Makefile.am
index 1dd42a7..fc63af4 100644
--- a/lib/java/Makefile.am
+++ b/lib/java/Makefile.am
@@ -56,6 +56,9 @@
 		-Pthrift.version=$(PACKAGE_VERSION) \
 		--console=plain
 
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
 EXTRA_DIST = \
 	build.gradle \
 	gradle.properties \
diff --git a/lib/java/src/main/java/org/apache/thrift/AsyncProcessFunction.java b/lib/java/src/main/java/org/apache/thrift/AsyncProcessFunction.java
index c7c4be3..4e65ae6 100644
--- a/lib/java/src/main/java/org/apache/thrift/AsyncProcessFunction.java
+++ b/lib/java/src/main/java/org/apache/thrift/AsyncProcessFunction.java
@@ -23,20 +23,22 @@
 import org.apache.thrift.protocol.TProtocol;
 import org.apache.thrift.server.AbstractNonblockingServer;
 
-public abstract class AsyncProcessFunction<I, T extends TBase, R> {
+public abstract class AsyncProcessFunction<I, T extends TBase, R, A extends TBase> {
   final String methodName;
 
   public AsyncProcessFunction(String methodName) {
     this.methodName = methodName;
   }
 
-  protected abstract boolean isOneway();
+  public abstract boolean isOneway();
 
   public abstract void start(I iface, T args, AsyncMethodCallback<R> resultHandler)
       throws TException;
 
   public abstract T getEmptyArgsInstance();
 
+  public abstract A getEmptyResultInstance();
+
   public abstract AsyncMethodCallback<R> getResultHandler(
       final AbstractNonblockingServer.AsyncFrameBuffer fb, int seqid);
 
diff --git a/lib/java/src/main/java/org/apache/thrift/ProcessFunction.java b/lib/java/src/main/java/org/apache/thrift/ProcessFunction.java
index 7399342..ac99d8e 100644
--- a/lib/java/src/main/java/org/apache/thrift/ProcessFunction.java
+++ b/lib/java/src/main/java/org/apache/thrift/ProcessFunction.java
@@ -8,7 +8,7 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public abstract class ProcessFunction<I, T extends TBase> {
+public abstract class ProcessFunction<I, T extends TBase, A extends TBase> {
   private final String methodName;
 
   private static final Logger LOGGER = LoggerFactory.getLogger(ProcessFunction.class.getName());
@@ -81,12 +81,15 @@
     return false;
   }
 
-  protected abstract boolean isOneway();
+  public abstract boolean isOneway();
 
-  public abstract TBase getResult(I iface, T args) throws TException;
+  public abstract TBase<?, ?> getResult(I iface, T args) throws TException;
 
   public abstract T getEmptyArgsInstance();
 
+  /** Returns null when this is a oneWay function. */
+  public abstract A getEmptyResultInstance();
+
   public String getMethodName() {
     return methodName;
   }
diff --git a/lib/java/src/main/java/org/apache/thrift/TBaseAsyncProcessor.java b/lib/java/src/main/java/org/apache/thrift/TBaseAsyncProcessor.java
index 266f0c0..eedb8cb 100644
--- a/lib/java/src/main/java/org/apache/thrift/TBaseAsyncProcessor.java
+++ b/lib/java/src/main/java/org/apache/thrift/TBaseAsyncProcessor.java
@@ -30,15 +30,17 @@
   protected final Logger LOGGER = LoggerFactory.getLogger(getClass().getName());
 
   final I iface;
-  final Map<String, AsyncProcessFunction<I, ? extends TBase, ?>> processMap;
+  final Map<String, AsyncProcessFunction<I, ? extends TBase, ?, ? extends TBase>> processMap;
 
   public TBaseAsyncProcessor(
-      I iface, Map<String, AsyncProcessFunction<I, ? extends TBase, ?>> processMap) {
+      I iface,
+      Map<String, AsyncProcessFunction<I, ? extends TBase, ?, ? extends TBase>> processMap) {
     this.iface = iface;
     this.processMap = processMap;
   }
 
-  public Map<String, AsyncProcessFunction<I, ? extends TBase, ?>> getProcessMapView() {
+  public Map<String, AsyncProcessFunction<I, ? extends TBase, ?, ? extends TBase>>
+      getProcessMapView() {
     return Collections.unmodifiableMap(processMap);
   }
 
diff --git a/lib/java/src/main/java/org/apache/thrift/TBaseProcessor.java b/lib/java/src/main/java/org/apache/thrift/TBaseProcessor.java
index 05cd7b8..2cd805f 100644
--- a/lib/java/src/main/java/org/apache/thrift/TBaseProcessor.java
+++ b/lib/java/src/main/java/org/apache/thrift/TBaseProcessor.java
@@ -10,15 +10,16 @@
 
 public abstract class TBaseProcessor<I> implements TProcessor {
   private final I iface;
-  private final Map<String, ProcessFunction<I, ? extends TBase>> processMap;
+  private final Map<String, ProcessFunction<I, ? extends TBase, ? extends TBase>> processMap;
 
   protected TBaseProcessor(
-      I iface, Map<String, ProcessFunction<I, ? extends TBase>> processFunctionMap) {
+      I iface,
+      Map<String, ProcessFunction<I, ? extends TBase, ? extends TBase>> processFunctionMap) {
     this.iface = iface;
     this.processMap = processFunctionMap;
   }
 
-  public Map<String, ProcessFunction<I, ? extends TBase>> getProcessMapView() {
+  public Map<String, ProcessFunction<I, ? extends TBase, ? extends TBase>> getProcessMapView() {
     return Collections.unmodifiableMap(processMap);
   }
 
diff --git a/lib/java/src/main/java/org/apache/thrift/server/AbstractNonblockingServer.java b/lib/java/src/main/java/org/apache/thrift/server/AbstractNonblockingServer.java
index 954aaeb..a573f0c 100644
--- a/lib/java/src/main/java/org/apache/thrift/server/AbstractNonblockingServer.java
+++ b/lib/java/src/main/java/org/apache/thrift/server/AbstractNonblockingServer.java
@@ -248,7 +248,7 @@
     protected final TNonblockingTransport trans_;
 
     // the SelectionKey that corresponds to our transport
-    protected final SelectionKey selectionKey_;
+    protected SelectionKey selectionKey_;
 
     // the SelectThread that owns the registration of our transport
     protected final AbstractSelectThread selectThread_;
@@ -303,6 +303,14 @@
     }
 
     /**
+     * Sets the selection key (this is not thread safe).
+     * @param selectionKey the new key to set.
+     */
+    public void setSelectionKey(SelectionKey selectionKey) {
+      selectionKey_ = selectionKey;
+    }
+
+    /**
      * Give this FrameBuffer a chance to read. The selector loop should have received a read event
      * for this FrameBuffer.
      *
@@ -375,7 +383,11 @@
         // modify our selection key directly.
         if (buffer_.remaining() == 0) {
           // get rid of the read select interests
-          selectionKey_.interestOps(0);
+          if (selectionKey_.isValid()) {
+            selectionKey_.interestOps(0);
+          } else {
+            LOGGER.warn("SelectionKey was invalidated during read");
+          }
           state_ = FrameBufferState.READ_FRAME_COMPLETE;
         }
 
@@ -415,8 +427,12 @@
       switch (state_) {
         case AWAITING_REGISTER_WRITE:
           // set the OP_WRITE interest
-          selectionKey_.interestOps(SelectionKey.OP_WRITE);
-          state_ = FrameBufferState.WRITING;
+          if (selectionKey_.isValid()) {
+            selectionKey_.interestOps(SelectionKey.OP_WRITE);
+            state_ = FrameBufferState.WRITING;
+          } else {
+            LOGGER.warn("SelectionKey was invalidated before write");
+          }
           break;
         case AWAITING_REGISTER_READ:
           prepareRead();
@@ -520,7 +536,11 @@
     private void prepareRead() {
       // we can set our interest directly without using the queue because
       // we're in the select thread.
-      selectionKey_.interestOps(SelectionKey.OP_READ);
+      if (selectionKey_.isValid()) {
+        selectionKey_.interestOps(SelectionKey.OP_READ);
+      } else {
+        LOGGER.warn("SelectionKey was invalidated before read");
+      }
       // get ready for another go-around
       buffer_ = ByteBuffer.allocate(4);
       state_ = FrameBufferState.READING_FRAME_SIZE;
diff --git a/lib/java/src/main/java/org/apache/thrift/server/TSaslNonblockingServer.java b/lib/java/src/main/java/org/apache/thrift/server/TSaslNonblockingServer.java
index 6f22d8b..8c899d5 100644
--- a/lib/java/src/main/java/org/apache/thrift/server/TSaslNonblockingServer.java
+++ b/lib/java/src/main/java/org/apache/thrift/server/TSaslNonblockingServer.java
@@ -255,7 +255,7 @@
         } else if (selected.isWritable()) {
           saslHandler.handleWrite();
         } else {
-          LOGGER.error("Invalid intrest op " + selected.interestOps());
+          LOGGER.error("Invalid interest op " + selected.interestOps());
           closeChannel(selected);
           continue;
         }
diff --git a/lib/java/src/main/java/org/apache/thrift/server/TThreadedSelectorServer.java b/lib/java/src/main/java/org/apache/thrift/server/TThreadedSelectorServer.java
index 86b8dfd..2a95fe1 100644
--- a/lib/java/src/main/java/org/apache/thrift/server/TThreadedSelectorServer.java
+++ b/lib/java/src/main/java/org/apache/thrift/server/TThreadedSelectorServer.java
@@ -626,16 +626,23 @@
         LOGGER.error("Create new Selector error.", e);
       }
 
-      for (SelectionKey key : oldSelector.selectedKeys()) {
-        if (!key.isValid() && key.readyOps() == 0) continue;
+      for (SelectionKey key : oldSelector.keys()) {
+        if (!key.isValid() || key.interestOps() == 0 || key.channel().keyFor(newSelector) != null) {
+          continue;
+        }
         SelectableChannel channel = key.channel();
         Object attachment = key.attachment();
 
+        int interestOps = key.interestOps();
+        SelectionKey newKey;
         try {
           if (attachment == null) {
-            channel.register(newSelector, key.readyOps());
+            newKey = channel.register(newSelector, interestOpts);
           } else {
-            channel.register(newSelector, key.readyOps(), attachment);
+            newKey = channel.register(newSelector, interestOpts, attachment);
+            if (attachment instanceof FrameBuffer) {
+              ((FrameBuffer) attachment.setSelectionKey(newKey);
+            }
           }
         } catch (ClosedChannelException e) {
           LOGGER.error("Register new selector key error.", e);
diff --git a/lib/js/Makefile.am b/lib/js/Makefile.am
index 4906d7d..9b7dfb6 100644
--- a/lib/js/Makefile.am
+++ b/lib/js/Makefile.am
@@ -52,6 +52,9 @@
 	$(RM) -r $(distdir)/test/build/
 	$(RM) -r $(distdir)/test/gen-*/
 
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
 EXTRA_DIST = \
 	coding_standards.md \
 	Gruntfile.js \
diff --git a/lib/js/package-lock.json b/lib/js/package-lock.json
index 8802661..562e38f 100644
--- a/lib/js/package-lock.json
+++ b/lib/js/package-lock.json
@@ -6,7 +6,7 @@
   "packages": {
     "": {
       "name": "thrift",
-      "version": "0.20.0",
+      "version": "0.21.0",
       "license": "Apache-2.0",
       "devDependencies": {
         "browserify": "~16.5",
@@ -235,12 +235,12 @@
       }
     },
     "node_modules/braces": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
-      "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+      "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
       "dev": true,
       "dependencies": {
-        "fill-range": "^7.0.1"
+        "fill-range": "^7.1.1"
       },
       "engines": {
         "node": ">=8"
@@ -1225,9 +1225,9 @@
       }
     },
     "node_modules/fill-range": {
-      "version": "7.0.1",
-      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
-      "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+      "version": "7.1.1",
+      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+      "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
       "dev": true,
       "dependencies": {
         "to-regex-range": "^5.0.1"
@@ -3926,9 +3926,9 @@
       "dev": true
     },
     "node_modules/ws": {
-      "version": "6.2.2",
-      "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz",
-      "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==",
+      "version": "6.2.3",
+      "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz",
+      "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==",
       "dev": true,
       "dependencies": {
         "async-limiter": "~1.0.0"
diff --git a/lib/js/test/Makefile.am b/lib/js/test/Makefile.am
index 14927c4..8a817b3 100644
--- a/lib/js/test/Makefile.am
+++ b/lib/js/test/Makefile.am
@@ -24,6 +24,9 @@
 	ANT=$(ANT) ; if test -z "$$ANT" ; then ANT=: ; fi ; \
 	$$ANT $(ANT_FLAGS) clean
 
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
 check-local: all
 	$(ANT) $(ANT_FLAGS) test
 
diff --git a/lib/json/Makefile.am b/lib/json/Makefile.am
index 6c8c0ce..3c7aa8f 100644
--- a/lib/json/Makefile.am
+++ b/lib/json/Makefile.am
@@ -28,6 +28,9 @@
 dist-hook:
 	$(RM) -r $(distdir)/test/build/
 
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
 EXTRA_DIST = \
     schema.json \
     test
diff --git a/lib/json/test/Makefile.am b/lib/json/test/Makefile.am
index bb87a52..16bcfae 100644
--- a/lib/json/test/Makefile.am
+++ b/lib/json/test/Makefile.am
@@ -20,6 +20,9 @@
 check:
 	$(ANT) $(ANT_FLAGS) test
 
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
 # Make sure this doesn't fail if ant is not configured.
 clean-local:
 	ANT=$(ANT) ; if test -z "$$ANT" ; then ANT=: ; fi ; \
diff --git a/lib/kotlin/Makefile.am b/lib/kotlin/Makefile.am
index 720f823..e5685cf 100644
--- a/lib/kotlin/Makefile.am
+++ b/lib/kotlin/Makefile.am
@@ -40,6 +40,9 @@
 		-Pthrift.compiler=$(THRIFT) \
 		--console=plain
 
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
 EXTRA_DIST = \
 	build.gradle.kts \
 	CMakeLists.txt \
diff --git a/lib/kotlin/build.gradle.kts b/lib/kotlin/build.gradle.kts
index 5c9929b..6b1c7c9 100644
--- a/lib/kotlin/build.gradle.kts
+++ b/lib/kotlin/build.gradle.kts
@@ -29,7 +29,7 @@
 dependencies {
     implementation(platform("org.jetbrains.kotlin:kotlin-bom"))
     implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
-    implementation("org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:1.7.3")
+    implementation("org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:1.8.1")
     implementation("org.apache.thrift:libthrift:INCLUDED")
     testImplementation(kotlin("test"))
 }
diff --git a/lib/kotlin/settings.gradle.kts b/lib/kotlin/settings.gradle.kts
index 294cd83..6bbfd7f 100644
--- a/lib/kotlin/settings.gradle.kts
+++ b/lib/kotlin/settings.gradle.kts
@@ -18,7 +18,7 @@
  */
 pluginManagement {
     plugins {
-        kotlin("jvm") version "1.9.22"
+        kotlin("jvm") version "1.9.23"
         id("com.ncorti.ktfmt.gradle") version "0.12.0"
     }
 }
diff --git a/lib/lua/Makefile.am b/lib/lua/Makefile.am
index 3b272f5..ae67d94 100644
--- a/lib/lua/Makefile.am
+++ b/lib/lua/Makefile.am
@@ -57,6 +57,9 @@
 liblualongnumber_la_LDFLAGS = $(AM_LDFLAGS)
 liblualongnumber_la_LIBADD = $(LUA_LIB) -lm
 
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
 EXTRA_DIST = \
 		coding_standards.md \
 		TBinaryProtocol.lua \
diff --git a/lib/netstd/Benchmarks/Thrift.Benchmarks/Thrift.Benchmarks.csproj b/lib/netstd/Benchmarks/Thrift.Benchmarks/Thrift.Benchmarks.csproj
index a8543a3..fefaaad 100644
--- a/lib/netstd/Benchmarks/Thrift.Benchmarks/Thrift.Benchmarks.csproj
+++ b/lib/netstd/Benchmarks/Thrift.Benchmarks/Thrift.Benchmarks.csproj
@@ -28,7 +28,7 @@
   </PropertyGroup>
 
   <ItemGroup>
-    <PackageReference Include="BenchmarkDotNet" Version="0.13.10" />
+    <PackageReference Include="BenchmarkDotNet" Version="0.13.12" />
   </ItemGroup>
 
   <ItemGroup>
diff --git a/lib/netstd/Makefile.am b/lib/netstd/Makefile.am
index 47b3803..bad1d69 100644
--- a/lib/netstd/Makefile.am
+++ b/lib/netstd/Makefile.am
@@ -17,13 +17,15 @@
 # under the License.
 #
 
-SUBDIRS = . 
+SUBDIRS = .
 
 all-local:
 	$(DOTNETCORE) build -c Release
 
 check-local:
-	$(DOTNETCORE) test Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift.PublicInterfaces.Compile.Tests.csproj
+	$(DOTNETCORE) test Tests/Thrift.Compile.Tests/Thrift.Compile.net8/Thrift.Compile.net8.csproj
+	$(DOTNETCORE) test Tests/Thrift.Compile.Tests/Thrift.Compile.net6/Thrift.Compile.net6.csproj
+	$(DOTNETCORE) test Tests/Thrift.Compile.Tests/Thrift.Compile.netstd2/Thrift.Compile.netstd2.csproj
 	$(DOTNETCORE) test Tests/Thrift.Tests/Thrift.Tests.csproj
 	$(DOTNETCORE) test Tests/Thrift.IntegrationTests/Thrift.IntegrationTests.csproj
 
@@ -36,8 +38,15 @@
 	$(RM) -r Tests/Thrift.Tests/obj
 	$(RM) -r Tests/Thrift.IntegrationTests/bin
 	$(RM) -r Tests/Thrift.IntegrationTests/obj
-	$(RM) -r Tests/Thrift.PublicInterfaces.Compile.Tests/bin
-	$(RM) -r Tests/Thrift.PublicInterfaces.Compile.Tests/obj
+	$(RM) -r Tests/Thrift.Compile.Tests/Thrift.Compile.net8/bin
+	$(RM) -r Tests/Thrift.Compile.Tests/Thrift.Compile.net8/obj
+	$(RM) -r Tests/Thrift.Compile.Tests/Thrift.Compile.net6/bin
+	$(RM) -r Tests/Thrift.Compile.Tests/Thrift.Compile.net6/obj
+	$(RM) -r Tests/Thrift.Compile.Tests/Thrift.Compile.netstd2/bin
+	$(RM) -r Tests/Thrift.Compile.Tests/Thrift.Compile.netstd2/obj
+
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
 
 EXTRA_DIST = \
 	README.md \
@@ -45,11 +54,13 @@
 	Benchmarks/Thrift.Benchmarks \
 	Tests/Thrift.IntegrationTests/Protocols \
 	Tests/Thrift.IntegrationTests/Thrift.IntegrationTests.csproj \
-	Tests/Thrift.PublicInterfaces.Compile.Tests \
-	Tests/Thrift.PublicInterfaces.Compile.Tests/CassandraTest.thrift \
-	Tests/Thrift.PublicInterfaces.Compile.Tests/optional_required_default.thrift \
-	Tests/Thrift.PublicInterfaces.Compile.Tests/Properties/AssemblyInfo.cs \
-	Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift.PublicInterfaces.Compile.Tests.csproj \
+	Tests/Thrift.Compile.Tests \
+	Tests/Thrift.Compile.Tests/CassandraTest.thrift \
+	Tests/Thrift.Compile.Tests/optional_required_default.thrift \
+	Tests/Thrift.Compile.Tests/Properties/AssemblyInfo.cs \
+	Tests/Thrift.Compile.Tests/Thrift.Compile.Tests/Thrift.Compile.net8/Thrift.Compile.net8.csproj \
+	Tests/Thrift.Compile.Tests/Thrift.Compile.Tests/Thrift.Compile.net6/Thrift.Compile.net6.csproj \
+	Tests/Thrift.Compile.Tests/Thrift.Compile.Tests/Thrift.Compile.netstd2/Thrift.Compile.netstd2.csproj \
 	Tests/Thrift.Tests/Collections \
 	Tests/Thrift.Tests/DataModel \
 	Tests/Thrift.Tests/Protocols \
@@ -74,4 +85,3 @@
 	build.sh \
 	runtests.cmd \
 	runtests.sh
-	
diff --git a/lib/netstd/README.md b/lib/netstd/README.md
index d554e38..912ea01 100644
--- a/lib/netstd/README.md
+++ b/lib/netstd/README.md
@@ -5,13 +5,14 @@
 # Build the library
 
 ## How to build on Windows
-- Get Thrift IDL compiler executable, add to some folder and add path to this folder into PATH variable
+- Get Thrift IDL compiler executable, add to some folder and add path to this folder into PATH variable. 
+- Alternatively, build from source by using the cmake target "copy-thrift-compiler", which places the binary to a suitable place.
 - Open the Thrift.sln project with Visual Studio and build.
 or 
 - Build with scripts
 
 ## How to build on Unix/Linux
-- Ensure you have .NET Core SDK 3.1 (LTS) installed, or use the [Ubuntu docker image](../../build/docker/README.md)
+- Ensure you have a suitable .NET Core SDK installed, or use the [Ubuntu docker image](../../build/docker/README.md)
 - Follow common automake build practice: `./ bootstrap && ./ configure && make`
 
 ## Known issues
diff --git a/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/CassandraTest.thrift b/lib/netstd/Tests/Thrift.Compile.Tests/CassandraTest.thrift
similarity index 100%
rename from lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/CassandraTest.thrift
rename to lib/netstd/Tests/Thrift.Compile.Tests/CassandraTest.thrift
diff --git a/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/GlobalSuppressions.cs b/lib/netstd/Tests/Thrift.Compile.Tests/GlobalSuppressions.cs
similarity index 100%
rename from lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/GlobalSuppressions.cs
rename to lib/netstd/Tests/Thrift.Compile.Tests/GlobalSuppressions.cs
diff --git a/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Impl/Thrift5253/MyService.cs b/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net6/Impl/Thrift5253/MyService.cs
similarity index 97%
copy from lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Impl/Thrift5253/MyService.cs
copy to lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net6/Impl/Thrift5253/MyService.cs
index f423376..4a2f40d 100644
--- a/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Impl/Thrift5253/MyService.cs
+++ b/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net6/Impl/Thrift5253/MyService.cs
@@ -22,7 +22,7 @@
 using System.Threading.Tasks;
 using Thrift5253;
 
-namespace Thrift.PublicInterfaces.Compile.Tests.Impl.Thrift5253
+namespace Thrift.Compile.net6.Impl.Thrift5253
 {
     class MyServiceImpl : MyService.IAsync
     {
diff --git a/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net6/Properties/AssemblyInfo.cs b/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net6/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..1d612f6
--- /dev/null
+++ b/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net6/Properties/AssemblyInfo.cs
@@ -0,0 +1,40 @@
+﻿// 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: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("The Apache Software Foundation")]
+[assembly: AssemblyProduct("Thrift")]
+[assembly: AssemblyCopyright("The Apache Software Foundation")]
+[assembly: AssemblyTrademark("")]
+
+// 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("dbc2c69a-93f1-45f4-8ecf-36ef13fc3482")]
\ No newline at end of file
diff --git a/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift.PublicInterfaces.Compile.Tests.csproj b/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net6/Thrift.Compile.net6.csproj
similarity index 71%
copy from lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift.PublicInterfaces.Compile.Tests.csproj
copy to lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net6/Thrift.Compile.net6.csproj
index 5745bd9..bcbed7e 100644
--- a/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift.PublicInterfaces.Compile.Tests.csproj
+++ b/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net6/Thrift.Compile.net6.csproj
@@ -7,9 +7,9 @@
     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
@@ -21,11 +21,11 @@
   <PropertyGroup>
     <ThriftVersion>0.21.0</ThriftVersion>
     <ThriftVersionOutput>Thrift version $(ThriftVersion)</ThriftVersionOutput>
-    <TargetFramework>net8.0</TargetFramework>
+    <TargetFramework>net6.0</TargetFramework>
     <LangVersion>latestMajor</LangVersion>
     <Version>$(ThriftVersion).0</Version>
-    <AssemblyName>Thrift.PublicInterfaces.Compile.Tests</AssemblyName>
-    <PackageId>Thrift.PublicInterfaces.Compile.Tests</PackageId>
+    <AssemblyName>Thrift.Compile.net6</AssemblyName>
+    <PackageId>Thrift.Compile.net6</PackageId>
     <GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute>
     <GenerateAssemblyCompanyAttribute>false</GenerateAssemblyCompanyAttribute>
     <GenerateAssemblyProductAttribute>false</GenerateAssemblyProductAttribute>
@@ -34,11 +34,13 @@
   </PropertyGroup>
 
   <ItemGroup>
-    <ProjectReference Include="../../Thrift/Thrift.csproj" />
+    <ProjectReference Include="../../../Thrift/Thrift.csproj" />
   </ItemGroup>
 
   <ItemGroup>
-    <PackageReference Include="System.ServiceModel.Primitives" Version="6.2.0" />
+    <PackageReference Include="System.Formats.Asn1" Version="6.0.1" />
+    <PackageReference Include="System.Security.Cryptography.Pkcs" Version="6.0.4" />
+    <PackageReference Include="System.ServiceModel.Primitives" Version="6.0.0" />
   </ItemGroup>
 
   <ItemGroup>
@@ -46,19 +48,22 @@
   </ItemGroup>
 
   <Target Name="PreBuild" BeforeTargets="_GenerateRestoreProjectSpec;Restore;Compile">
+    <CreateProperty Condition="'$(OS)' == 'Windows_NT'" Value=".exe">
+      <Output TaskParameter="Value" PropertyName="EXECUTABLE_SUFFIX" />
+    </CreateProperty>
     <!-- Check on the path -->
-    <Exec Condition="'$(OS)' == 'Windows_NT'" Command="where thrift" ConsoleToMSBuild="true">
+    <Exec Condition="'$(OS)' == 'Windows_NT'" Command="where thrift" ConsoleToMSBuild="true" IgnoreExitCode="true">
       <Output TaskParameter="ConsoleOutput" PropertyName="PathToThrift" />
     </Exec>
-    <Exec Condition="'$(OS)' != 'Windows_NT'" Command="which thrift || true" ConsoleToMSBuild="true">
+    <Exec Condition="'$(OS)' != 'Windows_NT'" Command="which thrift" ConsoleToMSBuild="true" IgnoreExitCode="true">
       <Output TaskParameter="ConsoleOutput" PropertyName="PathToThrift" />
     </Exec>
     <!-- Check in the current directory -->
-    <CreateProperty Condition="Exists('thrift')" Value="thrift">
+    <CreateProperty Condition="Exists('thrift$(EXECUTABLE_SUFFIX)')" Value="thrift$(EXECUTABLE_SUFFIX)">
       <Output TaskParameter="Value" PropertyName="PathToThrift" />
     </CreateProperty>
     <!-- Check for the root projects output -->
-    <CreateProperty Condition="Exists('$(ProjectDir)/../../../../compiler/cpp/thrift')" Value="$(ProjectDir)/../../../../compiler/cpp/thrift">
+    <CreateProperty Condition="Exists('$(ProjectDir)/../../../../../compiler/cpp/thrift$(EXECUTABLE_SUFFIX)')" Value="$(ProjectDir)/../../../../../compiler/cpp/thrift$(EXECUTABLE_SUFFIX)">
       <Output TaskParameter="Value" PropertyName="PathToThrift" />
     </CreateProperty>
     <Error Condition="!Exists('$(PathToThrift)')" Text="Thrift executable could not be found." />
@@ -69,14 +74,17 @@
     <Error Condition="$('$(ThriftBinaryVersion)'::StartsWith('$(ThriftVersionOutput)')) == true" Text="Thrift version returned: '$(ThriftBinaryVersion)' is not equal to the projects version '$(ThriftVersionOutput)'." />
     <Message Importance="high" Text="Generating tests with thrift binary: '$(PathToThrift)'" />
     <!-- Generate the thrift test files -->
-    <Exec Command="$(PathToThrift) -gen netstd:wcf,union,serial,net8 -r ./CassandraTest.thrift" />
-    <Exec Command="$(PathToThrift) -gen netstd:wcf,union,serial,net8 -r ./optional_required_default.thrift" />
-    <Exec Command="$(PathToThrift) -gen netstd:wcf,union,serial,net8 -r ./name_conflicts.thrift" />
-    <Exec Command="$(PathToThrift) -gen netstd:wcf,union,serial,net8 -r ./../../../../test/ThriftTest.thrift" />
-    <Exec Command="$(PathToThrift) -gen netstd:wcf,union,serial,net8 -r ./../../../../contrib/fb303/if/fb303.thrift" />
-    <Exec Command="$(PathToThrift) -gen netstd:wcf,union,serial,net8 -r ./Thrift5253.thrift" />
-    <Exec Command="$(PathToThrift) -gen netstd:wcf,union,serial,net8 -r ./Thrift5320.thrift" />
-    <Exec Command="$(PathToThrift) -gen netstd:wcf,union,serial,net8 -r ./Thrift5382.thrift" />
+    <Exec Command="$(PathToThrift) -gen netstd:wcf,union,serial,net6 -r ../CassandraTest.thrift" />
+    <Exec Command="$(PathToThrift) -gen netstd:wcf,union,serial,net6 -r ../optional_required_default.thrift" />
+    <Exec Command="$(PathToThrift) -gen netstd:wcf,union,serial,net6 -r ../name_conflicts.thrift" />
+    <Exec Command="$(PathToThrift) -gen netstd:wcf,union,serial,net6 -r ../../../../../test/ThriftTest.thrift" />
+    <Exec Command="$(PathToThrift) -gen netstd:wcf,union,serial,net6 -r ../../../../../contrib/fb303/if/fb303.thrift" />
+    <Exec Command="$(PathToThrift) -gen netstd:wcf,union,serial,net6 -r ../Thrift5253.thrift" />
+    <Exec Command="$(PathToThrift) -gen netstd:wcf,union,serial,net6 -r ../Thrift5320.thrift" />
+    <Exec Command="$(PathToThrift) -gen netstd:wcf,union,serial,net6 -r ../Thrift5382.thrift" />
+    <Exec Command="$(PathToThrift) -gen netstd:wcf,union,serial,net6 -r ../Thrift5795.thrift" />
+    <!-- special options (see ticket) -->
+    <Exec Command="$(PathToThrift) -gen netstd:net6                  -r ../Thrift5794.thrift" />
   </Target>
 
 </Project>
diff --git a/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Impl/Thrift5253/MyService.cs b/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net8/Impl/Thrift5253/MyService.cs
similarity index 97%
rename from lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Impl/Thrift5253/MyService.cs
rename to lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net8/Impl/Thrift5253/MyService.cs
index f423376..f192c7f 100644
--- a/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Impl/Thrift5253/MyService.cs
+++ b/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net8/Impl/Thrift5253/MyService.cs
@@ -22,7 +22,7 @@
 using System.Threading.Tasks;
 using Thrift5253;
 
-namespace Thrift.PublicInterfaces.Compile.Tests.Impl.Thrift5253
+namespace Thrift.Compile.net8.Impl.Thrift5253
 {
     class MyServiceImpl : MyService.IAsync
     {
diff --git a/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net8/Properties/AssemblyInfo.cs b/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net8/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..5bd3c6f
--- /dev/null
+++ b/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net8/Properties/AssemblyInfo.cs
@@ -0,0 +1,40 @@
+﻿// 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: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("The Apache Software Foundation")]
+[assembly: AssemblyProduct("Thrift")]
+[assembly: AssemblyCopyright("The Apache Software Foundation")]
+[assembly: AssemblyTrademark("")]
+
+// 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("1b468b7a-a53b-46de-90da-5f9ad7707ef4")]
\ No newline at end of file
diff --git a/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift.PublicInterfaces.Compile.Tests.csproj b/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net8/Thrift.Compile.net8.csproj
similarity index 74%
rename from lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift.PublicInterfaces.Compile.Tests.csproj
rename to lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net8/Thrift.Compile.net8.csproj
index 5745bd9..16b86ce 100644
--- a/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift.PublicInterfaces.Compile.Tests.csproj
+++ b/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.net8/Thrift.Compile.net8.csproj
@@ -7,9 +7,9 @@
     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
@@ -24,8 +24,8 @@
     <TargetFramework>net8.0</TargetFramework>
     <LangVersion>latestMajor</LangVersion>
     <Version>$(ThriftVersion).0</Version>
-    <AssemblyName>Thrift.PublicInterfaces.Compile.Tests</AssemblyName>
-    <PackageId>Thrift.PublicInterfaces.Compile.Tests</PackageId>
+    <AssemblyName>Thrift.Compile.net8</AssemblyName>
+    <PackageId>Thrift.Compile.net8</PackageId>
     <GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute>
     <GenerateAssemblyCompanyAttribute>false</GenerateAssemblyCompanyAttribute>
     <GenerateAssemblyProductAttribute>false</GenerateAssemblyProductAttribute>
@@ -34,11 +34,11 @@
   </PropertyGroup>
 
   <ItemGroup>
-    <ProjectReference Include="../../Thrift/Thrift.csproj" />
+    <ProjectReference Include="../../../Thrift/Thrift.csproj" />
   </ItemGroup>
 
   <ItemGroup>
-    <PackageReference Include="System.ServiceModel.Primitives" Version="6.2.0" />
+    <PackageReference Include="System.ServiceModel.Primitives" Version="8.0.0" />
   </ItemGroup>
 
   <ItemGroup>
@@ -46,19 +46,22 @@
   </ItemGroup>
 
   <Target Name="PreBuild" BeforeTargets="_GenerateRestoreProjectSpec;Restore;Compile">
+    <CreateProperty Condition="'$(OS)' == 'Windows_NT'" Value=".exe">
+      <Output TaskParameter="Value" PropertyName="EXECUTABLE_SUFFIX" />
+    </CreateProperty>
     <!-- Check on the path -->
-    <Exec Condition="'$(OS)' == 'Windows_NT'" Command="where thrift" ConsoleToMSBuild="true">
+    <Exec Condition="'$(OS)' == 'Windows_NT'" Command="where thrift" ConsoleToMSBuild="true" IgnoreExitCode="true">
       <Output TaskParameter="ConsoleOutput" PropertyName="PathToThrift" />
     </Exec>
-    <Exec Condition="'$(OS)' != 'Windows_NT'" Command="which thrift || true" ConsoleToMSBuild="true">
+    <Exec Condition="'$(OS)' != 'Windows_NT'" Command="which thrift" ConsoleToMSBuild="true" IgnoreExitCode="true">
       <Output TaskParameter="ConsoleOutput" PropertyName="PathToThrift" />
     </Exec>
     <!-- Check in the current directory -->
-    <CreateProperty Condition="Exists('thrift')" Value="thrift">
+    <CreateProperty Condition="Exists('thrift$(EXECUTABLE_SUFFIX)')" Value="thrift$(EXECUTABLE_SUFFIX)">
       <Output TaskParameter="Value" PropertyName="PathToThrift" />
     </CreateProperty>
     <!-- Check for the root projects output -->
-    <CreateProperty Condition="Exists('$(ProjectDir)/../../../../compiler/cpp/thrift')" Value="$(ProjectDir)/../../../../compiler/cpp/thrift">
+    <CreateProperty Condition="Exists('$(ProjectDir)/../../../../../compiler/cpp/thrift$(EXECUTABLE_SUFFIX)')" Value="$(ProjectDir)/../../../../../compiler/cpp/thrift$(EXECUTABLE_SUFFIX)">
       <Output TaskParameter="Value" PropertyName="PathToThrift" />
     </CreateProperty>
     <Error Condition="!Exists('$(PathToThrift)')" Text="Thrift executable could not be found." />
@@ -69,14 +72,17 @@
     <Error Condition="$('$(ThriftBinaryVersion)'::StartsWith('$(ThriftVersionOutput)')) == true" Text="Thrift version returned: '$(ThriftBinaryVersion)' is not equal to the projects version '$(ThriftVersionOutput)'." />
     <Message Importance="high" Text="Generating tests with thrift binary: '$(PathToThrift)'" />
     <!-- Generate the thrift test files -->
-    <Exec Command="$(PathToThrift) -gen netstd:wcf,union,serial,net8 -r ./CassandraTest.thrift" />
-    <Exec Command="$(PathToThrift) -gen netstd:wcf,union,serial,net8 -r ./optional_required_default.thrift" />
-    <Exec Command="$(PathToThrift) -gen netstd:wcf,union,serial,net8 -r ./name_conflicts.thrift" />
-    <Exec Command="$(PathToThrift) -gen netstd:wcf,union,serial,net8 -r ./../../../../test/ThriftTest.thrift" />
-    <Exec Command="$(PathToThrift) -gen netstd:wcf,union,serial,net8 -r ./../../../../contrib/fb303/if/fb303.thrift" />
-    <Exec Command="$(PathToThrift) -gen netstd:wcf,union,serial,net8 -r ./Thrift5253.thrift" />
-    <Exec Command="$(PathToThrift) -gen netstd:wcf,union,serial,net8 -r ./Thrift5320.thrift" />
-    <Exec Command="$(PathToThrift) -gen netstd:wcf,union,serial,net8 -r ./Thrift5382.thrift" />
+    <Exec Command="$(PathToThrift) -gen netstd:wcf,union,serial,net8 -r ../CassandraTest.thrift" />
+    <Exec Command="$(PathToThrift) -gen netstd:wcf,union,serial,net8 -r ../optional_required_default.thrift" />
+    <Exec Command="$(PathToThrift) -gen netstd:wcf,union,serial,net8 -r ../name_conflicts.thrift" />
+    <Exec Command="$(PathToThrift) -gen netstd:wcf,union,serial,net8 -r ../../../../../test/ThriftTest.thrift" />
+    <Exec Command="$(PathToThrift) -gen netstd:wcf,union,serial,net8 -r ../../../../../contrib/fb303/if/fb303.thrift" />
+    <Exec Command="$(PathToThrift) -gen netstd:wcf,union,serial,net8 -r ../Thrift5253.thrift" />
+    <Exec Command="$(PathToThrift) -gen netstd:wcf,union,serial,net8 -r ../Thrift5320.thrift" />
+    <Exec Command="$(PathToThrift) -gen netstd:wcf,union,serial,net8 -r ../Thrift5382.thrift" />
+    <Exec Command="$(PathToThrift) -gen netstd:wcf,union,serial,net8 -r ../Thrift5795.thrift" />
+    <!-- special options (see ticket) -->
+    <Exec Command="$(PathToThrift) -gen netstd:net8                  -r ../Thrift5794.thrift" />
   </Target>
 
 </Project>
diff --git a/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Impl/Thrift5253/MyService.cs b/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.netstd2/Impl/Thrift5253/MyService.cs
similarity index 77%
copy from lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Impl/Thrift5253/MyService.cs
copy to lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.netstd2/Impl/Thrift5253/MyService.cs
index f423376..cbdc497 100644
--- a/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Impl/Thrift5253/MyService.cs
+++ b/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.netstd2/Impl/Thrift5253/MyService.cs
@@ -22,32 +22,32 @@
 using System.Threading.Tasks;
 using Thrift5253;
 
-namespace Thrift.PublicInterfaces.Compile.Tests.Impl.Thrift5253
+namespace Thrift.Compile.netstd2.Impl.Thrift5253
 {
     class MyServiceImpl : MyService.IAsync
     {
-        public Task<AsyncProcessor> AsyncProcessor_(AsyncProcessor? input, CancellationToken cancellationToken = default)
+        public Task<AsyncProcessor> AsyncProcessor_(AsyncProcessor input, CancellationToken cancellationToken = default)
         {
             return Task.FromResult(new AsyncProcessor() { Foo = input?.Foo ?? 0 });
         }
 
-        public Task<BrokenResult> Broken(BrokenArgs? input, CancellationToken cancellationToken = default)
+        public Task<BrokenResult> Broken(BrokenArgs input, CancellationToken cancellationToken = default)
         {
             return Task.FromResult(new BrokenResult() { Foo = input?.Foo ?? 0 });
         }
 
-        public Task<Client> Client_(Client? input, CancellationToken cancellationToken = default)
+        public Task<Client> Client_(Client input, CancellationToken cancellationToken = default)
         {
             _ = cancellationToken;
             return Task.FromResult(new Client() { Foo = input?.Foo ?? 0 });
         }
 
-        public Task<IAsync> IAsync_(IAsync? input, CancellationToken cancellationToken = default)
+        public Task<IAsync> IAsync_(IAsync input, CancellationToken cancellationToken = default)
         {
             return Task.FromResult(new IAsync() { Foo = input?.Foo ?? 0 });
         }
 
-        public Task<InternalStructs> InternalStructs_(InternalStructs? input, CancellationToken cancellationToken = default)
+        public Task<InternalStructs> InternalStructs_(InternalStructs input, CancellationToken cancellationToken = default)
         {
             return Task.FromResult(new InternalStructs() { Foo = input?.Foo ?? 0 });
         }
@@ -62,7 +62,7 @@
             return Task.CompletedTask;
         }
 
-        public Task<WorksRslt> Works(WorksArrrgs? input, CancellationToken cancellationToken = default)
+        public Task<WorksRslt> Works(WorksArrrgs input, CancellationToken cancellationToken = default)
         {
             return Task.FromResult(new WorksRslt() { Foo = input?.Foo ?? 0 });
         }
diff --git a/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Properties/AssemblyInfo.cs b/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.netstd2/Properties/AssemblyInfo.cs
similarity index 100%
rename from lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Properties/AssemblyInfo.cs
rename to lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.netstd2/Properties/AssemblyInfo.cs
diff --git a/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift.PublicInterfaces.Compile.Tests.csproj b/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.netstd2/Thrift.Compile.netstd2.csproj
similarity index 63%
copy from lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift.PublicInterfaces.Compile.Tests.csproj
copy to lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.netstd2/Thrift.Compile.netstd2.csproj
index 5745bd9..cc2b5e4 100644
--- a/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift.PublicInterfaces.Compile.Tests.csproj
+++ b/lib/netstd/Tests/Thrift.Compile.Tests/Thrift.Compile.netstd2/Thrift.Compile.netstd2.csproj
@@ -7,9 +7,9 @@
     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
@@ -21,24 +21,19 @@
   <PropertyGroup>
     <ThriftVersion>0.21.0</ThriftVersion>
     <ThriftVersionOutput>Thrift version $(ThriftVersion)</ThriftVersionOutput>
-    <TargetFramework>net8.0</TargetFramework>
+    <TargetFramework>netstandard2.0</TargetFramework>
     <LangVersion>latestMajor</LangVersion>
     <Version>$(ThriftVersion).0</Version>
-    <AssemblyName>Thrift.PublicInterfaces.Compile.Tests</AssemblyName>
-    <PackageId>Thrift.PublicInterfaces.Compile.Tests</PackageId>
+    <AssemblyName>Thrift.Compile.netstd2</AssemblyName>
+    <PackageId>Thrift.Compile.netstd2</PackageId>
     <GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute>
     <GenerateAssemblyCompanyAttribute>false</GenerateAssemblyCompanyAttribute>
     <GenerateAssemblyProductAttribute>false</GenerateAssemblyProductAttribute>
-    <GenerateAssemblyCopyrightAttribute>false</GenerateAssemblyCopyrightAttribute>
-    <Nullable>enable</Nullable>
+    <GenerateAssemblyCopyrightAttribute>false</GenerateAssemblyCopyrightAttribute>    
   </PropertyGroup>
 
   <ItemGroup>
-    <ProjectReference Include="../../Thrift/Thrift.csproj" />
-  </ItemGroup>
-
-  <ItemGroup>
-    <PackageReference Include="System.ServiceModel.Primitives" Version="6.2.0" />
+    <ProjectReference Include="../../../Thrift/Thrift.csproj" />
   </ItemGroup>
 
   <ItemGroup>
@@ -46,19 +41,22 @@
   </ItemGroup>
 
   <Target Name="PreBuild" BeforeTargets="_GenerateRestoreProjectSpec;Restore;Compile">
+    <CreateProperty Condition="'$(OS)' == 'Windows_NT'" Value=".exe">
+      <Output TaskParameter="Value" PropertyName="EXECUTABLE_SUFFIX" />
+    </CreateProperty>
     <!-- Check on the path -->
-    <Exec Condition="'$(OS)' == 'Windows_NT'" Command="where thrift" ConsoleToMSBuild="true">
+    <Exec Condition="'$(OS)' == 'Windows_NT'" Command="where thrift" ConsoleToMSBuild="true" IgnoreExitCode="true">
       <Output TaskParameter="ConsoleOutput" PropertyName="PathToThrift" />
     </Exec>
-    <Exec Condition="'$(OS)' != 'Windows_NT'" Command="which thrift || true" ConsoleToMSBuild="true">
+    <Exec Condition="'$(OS)' != 'Windows_NT'" Command="which thrift" ConsoleToMSBuild="true" IgnoreExitCode="true">
       <Output TaskParameter="ConsoleOutput" PropertyName="PathToThrift" />
     </Exec>
     <!-- Check in the current directory -->
-    <CreateProperty Condition="Exists('thrift')" Value="thrift">
+    <CreateProperty Condition="Exists('thrift$(EXECUTABLE_SUFFIX)')" Value="thrift$(EXECUTABLE_SUFFIX)">
       <Output TaskParameter="Value" PropertyName="PathToThrift" />
     </CreateProperty>
     <!-- Check for the root projects output -->
-    <CreateProperty Condition="Exists('$(ProjectDir)/../../../../compiler/cpp/thrift')" Value="$(ProjectDir)/../../../../compiler/cpp/thrift">
+    <CreateProperty Condition="Exists('$(ProjectDir)/../../../../../compiler/cpp/thrift$(EXECUTABLE_SUFFIX)')" Value="$(ProjectDir)/../../../../../compiler/cpp/thrift$(EXECUTABLE_SUFFIX)">
       <Output TaskParameter="Value" PropertyName="PathToThrift" />
     </CreateProperty>
     <Error Condition="!Exists('$(PathToThrift)')" Text="Thrift executable could not be found." />
@@ -69,14 +67,17 @@
     <Error Condition="$('$(ThriftBinaryVersion)'::StartsWith('$(ThriftVersionOutput)')) == true" Text="Thrift version returned: '$(ThriftBinaryVersion)' is not equal to the projects version '$(ThriftVersionOutput)'." />
     <Message Importance="high" Text="Generating tests with thrift binary: '$(PathToThrift)'" />
     <!-- Generate the thrift test files -->
-    <Exec Command="$(PathToThrift) -gen netstd:wcf,union,serial,net8 -r ./CassandraTest.thrift" />
-    <Exec Command="$(PathToThrift) -gen netstd:wcf,union,serial,net8 -r ./optional_required_default.thrift" />
-    <Exec Command="$(PathToThrift) -gen netstd:wcf,union,serial,net8 -r ./name_conflicts.thrift" />
-    <Exec Command="$(PathToThrift) -gen netstd:wcf,union,serial,net8 -r ./../../../../test/ThriftTest.thrift" />
-    <Exec Command="$(PathToThrift) -gen netstd:wcf,union,serial,net8 -r ./../../../../contrib/fb303/if/fb303.thrift" />
-    <Exec Command="$(PathToThrift) -gen netstd:wcf,union,serial,net8 -r ./Thrift5253.thrift" />
-    <Exec Command="$(PathToThrift) -gen netstd:wcf,union,serial,net8 -r ./Thrift5320.thrift" />
-    <Exec Command="$(PathToThrift) -gen netstd:wcf,union,serial,net8 -r ./Thrift5382.thrift" />
+    <Exec Command="$(PathToThrift) -gen netstd:union,serial -r ../CassandraTest.thrift" />
+    <Exec Command="$(PathToThrift) -gen netstd:union,serial -r ../optional_required_default.thrift" />
+    <Exec Command="$(PathToThrift) -gen netstd:union,serial -r ../name_conflicts.thrift" />
+    <Exec Command="$(PathToThrift) -gen netstd:union,serial -r ../../../../../test/ThriftTest.thrift" />
+    <Exec Command="$(PathToThrift) -gen netstd:union,serial -r ../../../../../contrib/fb303/if/fb303.thrift" />
+    <Exec Command="$(PathToThrift) -gen netstd:union,serial -r ../Thrift5253.thrift" />
+    <Exec Command="$(PathToThrift) -gen netstd:union,serial -r ../Thrift5320.thrift" />
+    <Exec Command="$(PathToThrift) -gen netstd:union,serial -r ../Thrift5382.thrift" />
+    <Exec Command="$(PathToThrift) -gen netstd:union,serial -r ../Thrift5795.thrift" />
+    <!-- special options (see ticket) -->
+    <Exec Command="$(PathToThrift) -gen netstd                  -r ../Thrift5794.thrift" />
   </Target>
 
 </Project>
diff --git a/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift5253.thrift b/lib/netstd/Tests/Thrift.Compile.Tests/Thrift5253.thrift
similarity index 100%
rename from lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift5253.thrift
rename to lib/netstd/Tests/Thrift.Compile.Tests/Thrift5253.thrift
diff --git a/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift5320.enum.thrift b/lib/netstd/Tests/Thrift.Compile.Tests/Thrift5320.enum.thrift
similarity index 100%
rename from lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift5320.enum.thrift
rename to lib/netstd/Tests/Thrift.Compile.Tests/Thrift5320.enum.thrift
diff --git a/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift5320.exception.thrift b/lib/netstd/Tests/Thrift.Compile.Tests/Thrift5320.exception.thrift
similarity index 100%
rename from lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift5320.exception.thrift
rename to lib/netstd/Tests/Thrift.Compile.Tests/Thrift5320.exception.thrift
diff --git a/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift5320.struct.thrift b/lib/netstd/Tests/Thrift.Compile.Tests/Thrift5320.struct.thrift
similarity index 100%
rename from lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift5320.struct.thrift
rename to lib/netstd/Tests/Thrift.Compile.Tests/Thrift5320.struct.thrift
diff --git a/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift5320.thrift b/lib/netstd/Tests/Thrift.Compile.Tests/Thrift5320.thrift
similarity index 100%
rename from lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift5320.thrift
rename to lib/netstd/Tests/Thrift.Compile.Tests/Thrift5320.thrift
diff --git a/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift5382.objs.thrift b/lib/netstd/Tests/Thrift.Compile.Tests/Thrift5382.objs.thrift
similarity index 100%
rename from lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift5382.objs.thrift
rename to lib/netstd/Tests/Thrift.Compile.Tests/Thrift5382.objs.thrift
diff --git a/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift5382.thrift b/lib/netstd/Tests/Thrift.Compile.Tests/Thrift5382.thrift
similarity index 100%
rename from lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift5382.thrift
rename to lib/netstd/Tests/Thrift.Compile.Tests/Thrift5382.thrift
diff --git a/lib/netstd/Tests/Thrift.Compile.Tests/Thrift5794.thrift b/lib/netstd/Tests/Thrift.Compile.Tests/Thrift5794.thrift
new file mode 100644
index 0000000..7263360
--- /dev/null
+++ b/lib/netstd/Tests/Thrift.Compile.Tests/Thrift5794.thrift
@@ -0,0 +1,35 @@
+/*
+ * 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.
+ */
+
+// Testcase for THRIFT-5794 uncompilable code generated w/o net8 option
+
+namespace * Thrift5794.net6
+
+struct foo {
+  1: double a;
+  2: double b;
+  3: double c;
+}
+
+struct bar {
+  1: required double a;
+  2: required double b;
+  3: double c;
+}
+
diff --git a/lib/netstd/Tests/Thrift.Compile.Tests/Thrift5795.thrift b/lib/netstd/Tests/Thrift.Compile.Tests/Thrift5795.thrift
new file mode 100644
index 0000000..7bad8d7
--- /dev/null
+++ b/lib/netstd/Tests/Thrift.Compile.Tests/Thrift5795.thrift
@@ -0,0 +1,28 @@
+/*
+ * 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.
+ */
+
+// Testcase for THRIFT-5795 namespace not properly escaped
+
+namespace * Thrift5795.default
+
+
+struct foo {
+  1: double bar;
+}
+
diff --git a/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/name_conflicts.enum.thrift b/lib/netstd/Tests/Thrift.Compile.Tests/name_conflicts.enum.thrift
similarity index 100%
rename from lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/name_conflicts.enum.thrift
rename to lib/netstd/Tests/Thrift.Compile.Tests/name_conflicts.enum.thrift
diff --git a/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/name_conflicts.thrift b/lib/netstd/Tests/Thrift.Compile.Tests/name_conflicts.thrift
similarity index 100%
rename from lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/name_conflicts.thrift
rename to lib/netstd/Tests/Thrift.Compile.Tests/name_conflicts.thrift
diff --git a/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/optional_required_default.thrift b/lib/netstd/Tests/Thrift.Compile.Tests/optional_required_default.thrift
similarity index 100%
rename from lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/optional_required_default.thrift
rename to lib/netstd/Tests/Thrift.Compile.Tests/optional_required_default.thrift
diff --git a/lib/netstd/Tests/Thrift.IntegrationTests/Thrift.IntegrationTests.csproj b/lib/netstd/Tests/Thrift.IntegrationTests/Thrift.IntegrationTests.csproj
index 5602f91..2cb6349 100644
--- a/lib/netstd/Tests/Thrift.IntegrationTests/Thrift.IntegrationTests.csproj
+++ b/lib/netstd/Tests/Thrift.IntegrationTests/Thrift.IntegrationTests.csproj
@@ -35,11 +35,11 @@
   </PropertyGroup>
 
   <ItemGroup>
-    <PackageReference Include="CompareNETObjects" Version="4.82.0" />
-    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0" />
-    <PackageReference Include="MSTest.TestAdapter" Version="3.1.1" />
-    <PackageReference Include="MSTest.TestFramework" Version="3.1.1" />
-    <PackageReference Include="System.ServiceModel.Primitives" Version="6.2.0" />
+    <PackageReference Include="CompareNETObjects" Version="4.83.0" />
+    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.9.0" />
+    <PackageReference Include="MSTest.TestAdapter" Version="3.3.1" />
+    <PackageReference Include="MSTest.TestFramework" Version="3.3.1" />
+    <PackageReference Include="System.ServiceModel.Primitives" Version="8.0.0" />
   </ItemGroup>
   <ItemGroup>
     <ProjectReference Include="..\..\Thrift\Thrift.csproj" />
diff --git a/lib/netstd/Tests/Thrift.Tests/Thrift.Tests.csproj b/lib/netstd/Tests/Thrift.Tests/Thrift.Tests.csproj
index 7f9dcb7..089064b 100644
--- a/lib/netstd/Tests/Thrift.Tests/Thrift.Tests.csproj
+++ b/lib/netstd/Tests/Thrift.Tests/Thrift.Tests.csproj
@@ -26,16 +26,16 @@
   </PropertyGroup>
 
   <ItemGroup>
-    <PackageReference Include="CompareNETObjects" Version="4.82.0" />
-    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0" />
-    <PackageReference Include="MSTest.TestAdapter" Version="3.1.1" />
-    <PackageReference Include="MSTest.TestFramework" Version="3.1.1" />
+    <PackageReference Include="CompareNETObjects" Version="4.83.0" />
+    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.9.0" />
+    <PackageReference Include="MSTest.TestAdapter" Version="3.3.1" />
+    <PackageReference Include="MSTest.TestFramework" Version="3.3.1" />
     <PackageReference Include="NSubstitute" Version="5.1.0" />
   </ItemGroup>
 
   <ItemGroup>
     <ProjectReference Include="..\..\Thrift\Thrift.csproj" />
-    <ProjectReference Include="..\Thrift.PublicInterfaces.Compile.Tests\Thrift.PublicInterfaces.Compile.Tests.csproj" />
+    <ProjectReference Include="..\Thrift.Compile.Tests\Thrift.Compile.net8\Thrift.Compile.net8.csproj" />
   </ItemGroup>
 
   <ItemGroup>
diff --git a/lib/netstd/Thrift.sln b/lib/netstd/Thrift.sln
index 58c76ce..dbd4b67 100644
--- a/lib/netstd/Thrift.sln
+++ b/lib/netstd/Thrift.sln
@@ -1,6 +1,6 @@
 Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio Version 16
-VisualStudioVersion = 16.0.29905.134
+# Visual Studio Version 17
+VisualStudioVersion = 17.9.34728.123
 MinimumVisualStudioVersion = 10.0.40219.1
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{ED5A45B0-07D1-4507-96B7-83FBD3D031CA}"
 EndProject
@@ -10,11 +10,15 @@
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Thrift.Tests", "Tests\Thrift.Tests\Thrift.Tests.csproj", "{0790D388-1A3C-4423-8CF2-C97074A8B68B}"
 EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Thrift.PublicInterfaces.Compile.Tests", "Tests\Thrift.PublicInterfaces.Compile.Tests\Thrift.PublicInterfaces.Compile.Tests.csproj", "{A6AE021D-61CB-4D84-A103-0B663C62AE2C}"
-EndProject
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Benchmarks", "Benchmarks", "{BF7B896B-8BB6-447C-84F8-26871882A14A}"
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Thrift.Benchmarks", "Benchmarks\Thrift.Benchmarks\Thrift.Benchmarks.csproj", "{D0559DFF-6632-446C-9EFC-C750DA20B1D9}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Thrift.Benchmarks", "Benchmarks\Thrift.Benchmarks\Thrift.Benchmarks.csproj", "{D0559DFF-6632-446C-9EFC-C750DA20B1D9}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Thrift.Compile.net6", "Tests\Thrift.Compile.Tests\Thrift.Compile.net6\Thrift.Compile.net6.csproj", "{2AFCF575-381C-46CA-8006-D5762365F0E3}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Thrift.Compile.netstd2", "Tests\Thrift.Compile.Tests\Thrift.Compile.netstd2\Thrift.Compile.netstd2.csproj", "{58F72FB9-09F5-4D0F-B0B4-36605670BF72}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Thrift.Compile.net8", "Tests\Thrift.Compile.Tests\Thrift.Compile.net8\Thrift.Compile.net8.csproj", "{9A3E11C0-72FD-4DA0-8E61-C7746E751DF7}"
 EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -62,18 +66,6 @@
 		{0790D388-1A3C-4423-8CF2-C97074A8B68B}.Release|x64.Build.0 = Release|Any CPU
 		{0790D388-1A3C-4423-8CF2-C97074A8B68B}.Release|x86.ActiveCfg = Release|Any CPU
 		{0790D388-1A3C-4423-8CF2-C97074A8B68B}.Release|x86.Build.0 = Release|Any CPU
-		{A6AE021D-61CB-4D84-A103-0B663C62AE2C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{A6AE021D-61CB-4D84-A103-0B663C62AE2C}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{A6AE021D-61CB-4D84-A103-0B663C62AE2C}.Debug|x64.ActiveCfg = Debug|Any CPU
-		{A6AE021D-61CB-4D84-A103-0B663C62AE2C}.Debug|x64.Build.0 = Debug|Any CPU
-		{A6AE021D-61CB-4D84-A103-0B663C62AE2C}.Debug|x86.ActiveCfg = Debug|Any CPU
-		{A6AE021D-61CB-4D84-A103-0B663C62AE2C}.Debug|x86.Build.0 = Debug|Any CPU
-		{A6AE021D-61CB-4D84-A103-0B663C62AE2C}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{A6AE021D-61CB-4D84-A103-0B663C62AE2C}.Release|Any CPU.Build.0 = Release|Any CPU
-		{A6AE021D-61CB-4D84-A103-0B663C62AE2C}.Release|x64.ActiveCfg = Release|Any CPU
-		{A6AE021D-61CB-4D84-A103-0B663C62AE2C}.Release|x64.Build.0 = Release|Any CPU
-		{A6AE021D-61CB-4D84-A103-0B663C62AE2C}.Release|x86.ActiveCfg = Release|Any CPU
-		{A6AE021D-61CB-4D84-A103-0B663C62AE2C}.Release|x86.Build.0 = Release|Any CPU
 		{D0559DFF-6632-446C-9EFC-C750DA20B1D9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{D0559DFF-6632-446C-9EFC-C750DA20B1D9}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{D0559DFF-6632-446C-9EFC-C750DA20B1D9}.Debug|x64.ActiveCfg = Debug|Any CPU
@@ -86,6 +78,42 @@
 		{D0559DFF-6632-446C-9EFC-C750DA20B1D9}.Release|x64.Build.0 = Release|Any CPU
 		{D0559DFF-6632-446C-9EFC-C750DA20B1D9}.Release|x86.ActiveCfg = Release|Any CPU
 		{D0559DFF-6632-446C-9EFC-C750DA20B1D9}.Release|x86.Build.0 = Release|Any CPU
+		{2AFCF575-381C-46CA-8006-D5762365F0E3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{2AFCF575-381C-46CA-8006-D5762365F0E3}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{2AFCF575-381C-46CA-8006-D5762365F0E3}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{2AFCF575-381C-46CA-8006-D5762365F0E3}.Debug|x64.Build.0 = Debug|Any CPU
+		{2AFCF575-381C-46CA-8006-D5762365F0E3}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{2AFCF575-381C-46CA-8006-D5762365F0E3}.Debug|x86.Build.0 = Debug|Any CPU
+		{2AFCF575-381C-46CA-8006-D5762365F0E3}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{2AFCF575-381C-46CA-8006-D5762365F0E3}.Release|Any CPU.Build.0 = Release|Any CPU
+		{2AFCF575-381C-46CA-8006-D5762365F0E3}.Release|x64.ActiveCfg = Release|Any CPU
+		{2AFCF575-381C-46CA-8006-D5762365F0E3}.Release|x64.Build.0 = Release|Any CPU
+		{2AFCF575-381C-46CA-8006-D5762365F0E3}.Release|x86.ActiveCfg = Release|Any CPU
+		{2AFCF575-381C-46CA-8006-D5762365F0E3}.Release|x86.Build.0 = Release|Any CPU
+		{58F72FB9-09F5-4D0F-B0B4-36605670BF72}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{58F72FB9-09F5-4D0F-B0B4-36605670BF72}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{58F72FB9-09F5-4D0F-B0B4-36605670BF72}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{58F72FB9-09F5-4D0F-B0B4-36605670BF72}.Debug|x64.Build.0 = Debug|Any CPU
+		{58F72FB9-09F5-4D0F-B0B4-36605670BF72}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{58F72FB9-09F5-4D0F-B0B4-36605670BF72}.Debug|x86.Build.0 = Debug|Any CPU
+		{58F72FB9-09F5-4D0F-B0B4-36605670BF72}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{58F72FB9-09F5-4D0F-B0B4-36605670BF72}.Release|Any CPU.Build.0 = Release|Any CPU
+		{58F72FB9-09F5-4D0F-B0B4-36605670BF72}.Release|x64.ActiveCfg = Release|Any CPU
+		{58F72FB9-09F5-4D0F-B0B4-36605670BF72}.Release|x64.Build.0 = Release|Any CPU
+		{58F72FB9-09F5-4D0F-B0B4-36605670BF72}.Release|x86.ActiveCfg = Release|Any CPU
+		{58F72FB9-09F5-4D0F-B0B4-36605670BF72}.Release|x86.Build.0 = Release|Any CPU
+		{9A3E11C0-72FD-4DA0-8E61-C7746E751DF7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{9A3E11C0-72FD-4DA0-8E61-C7746E751DF7}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{9A3E11C0-72FD-4DA0-8E61-C7746E751DF7}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{9A3E11C0-72FD-4DA0-8E61-C7746E751DF7}.Debug|x64.Build.0 = Debug|Any CPU
+		{9A3E11C0-72FD-4DA0-8E61-C7746E751DF7}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{9A3E11C0-72FD-4DA0-8E61-C7746E751DF7}.Debug|x86.Build.0 = Debug|Any CPU
+		{9A3E11C0-72FD-4DA0-8E61-C7746E751DF7}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{9A3E11C0-72FD-4DA0-8E61-C7746E751DF7}.Release|Any CPU.Build.0 = Release|Any CPU
+		{9A3E11C0-72FD-4DA0-8E61-C7746E751DF7}.Release|x64.ActiveCfg = Release|Any CPU
+		{9A3E11C0-72FD-4DA0-8E61-C7746E751DF7}.Release|x64.Build.0 = Release|Any CPU
+		{9A3E11C0-72FD-4DA0-8E61-C7746E751DF7}.Release|x86.ActiveCfg = Release|Any CPU
+		{9A3E11C0-72FD-4DA0-8E61-C7746E751DF7}.Release|x86.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
@@ -93,8 +121,10 @@
 	GlobalSection(NestedProjects) = preSolution
 		{837F4084-AAD7-45F5-BC96-10E05A669DB4} = {ED5A45B0-07D1-4507-96B7-83FBD3D031CA}
 		{0790D388-1A3C-4423-8CF2-C97074A8B68B} = {ED5A45B0-07D1-4507-96B7-83FBD3D031CA}
-		{A6AE021D-61CB-4D84-A103-0B663C62AE2C} = {ED5A45B0-07D1-4507-96B7-83FBD3D031CA}
 		{D0559DFF-6632-446C-9EFC-C750DA20B1D9} = {BF7B896B-8BB6-447C-84F8-26871882A14A}
+		{2AFCF575-381C-46CA-8006-D5762365F0E3} = {ED5A45B0-07D1-4507-96B7-83FBD3D031CA}
+		{58F72FB9-09F5-4D0F-B0B4-36605670BF72} = {ED5A45B0-07D1-4507-96B7-83FBD3D031CA}
+		{9A3E11C0-72FD-4DA0-8E61-C7746E751DF7} = {ED5A45B0-07D1-4507-96B7-83FBD3D031CA}
 	EndGlobalSection
 	GlobalSection(ExtensibilityGlobals) = postSolution
 		SolutionGuid = {FD20BC4A-0109-41D8-8C0C-893E784D7EF9}
diff --git a/lib/netstd/Thrift/Protocol/TBinaryProtocol.cs b/lib/netstd/Thrift/Protocol/TBinaryProtocol.cs
index 6389184..186d220 100644
--- a/lib/netstd/Thrift/Protocol/TBinaryProtocol.cs
+++ b/lib/netstd/Thrift/Protocol/TBinaryProtocol.cs
@@ -475,7 +475,13 @@
             protected readonly bool StrictRead;
             protected readonly bool StrictWrite;
 
-            public Factory(bool strictRead = false, bool strictWrite = true)
+            // emtpy default CTOR required
+            public Factory()
+                : this(false, true)
+            {
+            }
+
+            public Factory(bool strictRead, bool strictWrite)
             {
                 StrictRead = strictRead;
                 StrictWrite = strictWrite;
diff --git a/lib/netstd/Thrift/Thrift.csproj b/lib/netstd/Thrift/Thrift.csproj
index 3aa16d2..587a92e 100644
--- a/lib/netstd/Thrift/Thrift.csproj
+++ b/lib/netstd/Thrift/Thrift.csproj
@@ -19,7 +19,7 @@
   -->
 
   <PropertyGroup>
-    <TargetFrameworks>netstandard2.1;netstandard2.0;net6.0;net7.0;net8.0</TargetFrameworks>
+    <TargetFrameworks>netstandard2.1;netstandard2.0;net6.0;net8.0</TargetFrameworks>
     <AssemblyName>Thrift</AssemblyName>
     <PackageId>ApacheThrift</PackageId>
     <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
@@ -52,7 +52,7 @@
     <PackageTags>Apache Thrift RPC</PackageTags>
     <PackageReleaseNotes>https://github.com/apache/thrift/blob/0.21.0/CHANGES.md</PackageReleaseNotes>
 	<PackageReadmeFile>README.md</PackageReadmeFile>
-    <Copyright>Copyright 2023 The Apache Software Foundation</Copyright>
+    <Copyright>Copyright 2024 The Apache Software Foundation</Copyright>
   </PropertyGroup>
 
   <ItemGroup>
@@ -62,7 +62,7 @@
     <PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="8.0.0" />
     <PackageReference Include="System.IO.Pipes" Version="[4.3,)" />
     <PackageReference Include="System.IO.Pipes.AccessControl" Version="5.0.0" Condition="'$(TargetFramework.StartsWith(`netstandard2.`))' == 'true'" />
-    <PackageReference Include="System.Net.Http.WinHttpHandler" Version="8.0.0" />
+    <PackageReference Include="System.Net.Http.WinHttpHandler" Version="8.0.1" />
     <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" />
@@ -89,7 +89,7 @@
 	
 	<ItemGroup Condition="'$(TargetFramework)' == 'net8.0'">
 		<PackageReference Include="Microsoft.AspNetCore.Components.Web">
-			<Version>8.0.0</Version>
+			<Version>8.0.7</Version>
 		</PackageReference>
 	</ItemGroup>
 
diff --git a/lib/netstd/Thrift/Transport/Client/THttpTransport.cs b/lib/netstd/Thrift/Transport/Client/THttpTransport.cs
index 1ab1caf..e724665 100644
--- a/lib/netstd/Thrift/Transport/Client/THttpTransport.cs
+++ b/lib/netstd/Thrift/Transport/Client/THttpTransport.cs
@@ -25,6 +25,8 @@
 using System.Threading;
 using System.Threading.Tasks;
 
+#pragma warning disable IDE0079  // unneeded suppression -> all except net8
+#pragma warning disable IDE0301  // simplify collection init -> net8 only
 
 namespace Thrift.Transport.Client
 {
diff --git a/lib/nodejs/Makefile.am b/lib/nodejs/Makefile.am
index 6691579..9503f04 100644
--- a/lib/nodejs/Makefile.am
+++ b/lib/nodejs/Makefile.am
@@ -37,6 +37,9 @@
 	$(RM) -r test/episodic-code-generation-test/gen*
 	$(RM) -r test/episodic-code-generation-test/node_modules
 
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
 EXTRA_DIST = \
 	examples \
 	lib \
diff --git a/lib/nodejs/lib/thrift/framed_transport.js b/lib/nodejs/lib/thrift/framed_transport.js
index 9a50a73..058d230 100644
--- a/lib/nodejs/lib/thrift/framed_transport.js
+++ b/lib/nodejs/lib/thrift/framed_transport.js
@@ -35,30 +35,27 @@
 Object.setPrototypeOf(TFramedTransport.prototype, THeaderTransport.prototype);
 
 TFramedTransport.receiver = function(callback, seqid) {
-  var residual = [];
+  var residual = new Buffer(0);
 
   return function(data) {
-    // push received data to residual
-    for(var i = 0; i < data.length; ++i) {
-      residual.push(data[i])
-    }
+    residual = Buffer.concat([residual, Buffer.from(data)]);
 
     while (residual.length > 0) {
       if (residual.length < 4) {
         // Not enough bytes to continue, save and resume on next packet
         return;
       }
-      // get single package sieze
-      var frameSize = binary.readI32(Buffer.from(residual.slice(0, 4)), 0);
+      // Get single package size
+      var frameSize = binary.readI32(residual, 0);
       // Not enough bytes to continue, save and resume on next packet
       if (residual.length < 4 + frameSize) {
         return;
       }
 
-      // splice first 4 bytes
-      residual.splice(0, 4)
-      // get package data
-      var frame = Buffer.from(residual.splice(0, frameSize));
+      // Get package data
+      var frame = residual.subarray(4, 4 + frameSize);
+      // Remove processed data from residual
+      residual = residual.subarray(4 + frameSize);
       callback(new TFramedTransport(frame), seqid);
     }
   };
diff --git a/lib/nodejs/test/header.test.js b/lib/nodejs/test/header.test.js
index 99bb832..12f1557 100644
--- a/lib/nodejs/test/header.test.js
+++ b/lib/nodejs/test/header.test.js
@@ -100,6 +100,18 @@
     assert.equals(otherHeaders.foo, undefined);
     assert.equals(otherHeaders.otherfoo, "baz");
     assert.end();
+  },
+  "Should handle large messages without crashing": function(assert) {
+    const callback = function() {};
+    const onData = TFramedTransport.receiver(callback);
+
+    const largeChunkSize = 2 * 100 * 1024 * 1024;
+    const largeChunk = Buffer.alloc(largeChunkSize, "A");
+    const sizeBuffer = new Buffer(4);
+    sizeBuffer.writeInt32BE(largeChunkSize + 4, 0);
+    onData(Buffer.concat([sizeBuffer, largeChunk]));
+
+    assert.end();
   }
 };
 
diff --git a/lib/nodejs/test/testAll.sh b/lib/nodejs/test/testAll.sh
index 37b6b43..144832e 100755
--- a/lib/nodejs/test/testAll.sh
+++ b/lib/nodejs/test/testAll.sh
@@ -118,6 +118,7 @@
 # unit tests
 
 node ${DIR}/binary.test.js || TESTOK=1
+node ${DIR}/header.test.js || TESTOK=1
 node ${DIR}/int64.test.js || TESTOK=1
 node ${DIR}/deep-constructor.test.js || TESTOK=1
 
diff --git a/lib/nodets/Makefile.am b/lib/nodets/Makefile.am
index 02d0c11..ac2aa6e 100644
--- a/lib/nodets/Makefile.am
+++ b/lib/nodets/Makefile.am
@@ -41,6 +41,9 @@
 	$(RM) -r $(top_srcdir)/node_modules
 	$(RM) -r test-compiled
 
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
 EXTRA_DIST = \
 	test \
 	coding_standards.md
diff --git a/lib/perl/Makefile.am b/lib/perl/Makefile.am
index 8b72436..9d762b4 100644
--- a/lib/perl/Makefile.am
+++ b/lib/perl/Makefile.am
@@ -36,6 +36,9 @@
 	$(RM) Makefile-perl.mk.old
 	$(RM) -r gen-perl gen-perl2
 
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
 EXTRA_DIST = \
 	coding_standards.md \
 	build-cpan-dist.sh \
diff --git a/lib/perl/t/Makefile.am b/lib/perl/t/Makefile.am
index de03971..7e9d8a0 100644
--- a/lib/perl/t/Makefile.am
+++ b/lib/perl/t/Makefile.am
@@ -17,4 +17,7 @@
 # under the License.
 #
 
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
 EXTRA_DIST = memory_buffer.t processor.t multiplex.t
diff --git a/lib/php/Makefile.am b/lib/php/Makefile.am
index 91944c4..3851294 100644
--- a/lib/php/Makefile.am
+++ b/lib/php/Makefile.am
@@ -134,6 +134,8 @@
 clean-local:
 	if [ -f src/ext/thrift_protocol/Makefile ]; then cd src/ext/thrift_protocol/ && $(MAKE) clean; fi
 
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
 
 EXTRA_DIST = \
 	lib \
@@ -150,17 +152,7 @@
 	thrift_protocol.ini \
 	README.apache.md \
 	README.md \
-	test/Fixtures.php \
-	test/TestValidators.thrift \
-	test/JsonSerialize/JsonSerializeTest.php \
-	test/Protocol/BinarySerializerTest.php \
-	test/Protocol/TJSONProtocolFixtures.php \
-	test/Protocol/TJSONProtocolTest.php \
-	test/Protocol/TSimpleJSONProtocolFixtures.php \
-	test/Protocol/TSimpleJSONProtocolTest.php \
-	test/Validator/BaseValidatorTest.php \
-	test/Validator/ValidatorTest.php \
-	test/Validator/ValidatorTestOop.php
+	test
 
 
 MAINTAINERCLEANFILES = \
diff --git a/lib/php/lib/Factory/TFramedTransportFactory.php b/lib/php/lib/Factory/TFramedTransportFactory.php
index 485fca5..c0adfd0 100644
--- a/lib/php/lib/Factory/TFramedTransportFactory.php
+++ b/lib/php/lib/Factory/TFramedTransportFactory.php
@@ -1,5 +1,24 @@
 <?php
 
+/*
+ * 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\Factory;
 
 use Thrift\Transport\TFramedTransport;
@@ -7,7 +26,7 @@
 
 class TFramedTransportFactory implements TTransportFactoryInterface
 {
-    public static function getTransport(TTransport $transport)
+    public function getTransport(TTransport $transport)
     {
         return new TFramedTransport($transport);
     }
diff --git a/lib/php/lib/Factory/TTransportFactory.php b/lib/php/lib/Factory/TTransportFactory.php
index 98ead95..4c0abd0 100644
--- a/lib/php/lib/Factory/TTransportFactory.php
+++ b/lib/php/lib/Factory/TTransportFactory.php
@@ -1,5 +1,24 @@
 <?php
 
+/*
+ * 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\Factory;
 
 use Thrift\Transport\TTransport;
@@ -7,11 +26,10 @@
 class TTransportFactory implements TTransportFactoryInterface
 {
     /**
-     * @static
      * @param TTransport $transport
      * @return TTransport
      */
-    public static function getTransport(TTransport $transport)
+    public function getTransport(TTransport $transport)
     {
         return $transport;
     }
diff --git a/lib/php/lib/Factory/TTransportFactoryInterface.php b/lib/php/lib/Factory/TTransportFactoryInterface.php
index 614cea8..1c49067 100644
--- a/lib/php/lib/Factory/TTransportFactoryInterface.php
+++ b/lib/php/lib/Factory/TTransportFactoryInterface.php
@@ -1,5 +1,24 @@
 <?php
 
+/*
+ * 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\Factory;
 
 use Thrift\Transport\TTransport;
@@ -7,9 +26,8 @@
 interface TTransportFactoryInterface
 {
     /**
-     * @static
      * @param TTransport $transport
      * @return TTransport
      */
-    public static function getTransport(TTransport $transport);
+    public function getTransport(TTransport $transport);
 }
diff --git a/lib/php/lib/Protocol/TCompactProtocol.php b/lib/php/lib/Protocol/TCompactProtocol.php
index 1af2a27..ebe32e5 100644
--- a/lib/php/lib/Protocol/TCompactProtocol.php
+++ b/lib/php/lib/Protocol/TCompactProtocol.php
@@ -154,6 +154,7 @@
             $shift += 7;
         }
 
+        #unreachable statement
         return $idx;
     }
 
diff --git a/lib/php/lib/Protocol/TJSONProtocol.php b/lib/php/lib/Protocol/TJSONProtocol.php
index e1412cc..cfd3c8b 100644
--- a/lib/php/lib/Protocol/TJSONProtocol.php
+++ b/lib/php/lib/Protocol/TJSONProtocol.php
@@ -23,6 +23,7 @@
 
 namespace Thrift\Protocol;
 
+use Thrift\Exception\TException;
 use Thrift\Type\TType;
 use Thrift\Exception\TProtocolException;
 use Thrift\Protocol\JSON\BaseContext;
@@ -186,8 +187,6 @@
         $this->reader_ = new LookaheadReader($this);
     }
 
-    private $tmpbuf_ = array(4);
-
     public function readJSONSyntaxChar($b)
     {
         $ch = $this->reader_->read();
@@ -197,68 +196,6 @@
         }
     }
 
-    private function hexVal($s)
-    {
-        for ($i = 0; $i < strlen($s); $i++) {
-            $ch = substr($s, $i, 1);
-
-            if (!($ch >= "a" && $ch <= "f") && !($ch >= "0" && $ch <= "9")) {
-                throw new TProtocolException("Expected hex character " . $ch, TProtocolException::INVALID_DATA);
-            }
-        }
-
-        return hexdec($s);
-    }
-
-    private function hexChar($val)
-    {
-        return dechex($val);
-    }
-
-    private function hasJSONUnescapedUnicode()
-    {
-        if (PHP_MAJOR_VERSION > 5 || (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION >= 4)) {
-            return true;
-        }
-
-        return false;
-    }
-
-    private function unescapedUnicode($str)
-    {
-        if ($this->hasJSONUnescapedUnicode()) {
-            return json_encode($str, JSON_UNESCAPED_UNICODE);
-        }
-
-        $json = json_encode($str);
-
-        /*
-         * Unescaped character outside the Basic Multilingual Plane
-         * High surrogate: 0xD800 - 0xDBFF
-         * Low surrogate: 0xDC00 - 0xDFFF
-         */
-        $json = preg_replace_callback(
-            '/\\\\u(d[89ab][0-9a-f]{2})\\\\u(d[cdef][0-9a-f]{2})/i',
-            function ($matches) {
-                return mb_convert_encoding(pack('H*', $matches[1] . $matches[2]), 'UTF-8', 'UTF-16BE');
-            },
-            $json
-        );
-
-        /*
-         * Unescaped characters within the Basic Multilingual Plane
-         */
-        $json = preg_replace_callback(
-            '/\\\\u([0-9a-f]{4})/i',
-            function ($matches) {
-                return mb_convert_encoding(pack('H*', $matches[1]), 'UTF-8', 'UTF-16BE');
-            },
-            $json
-        );
-
-        return $json;
-    }
-
     private function writeJSONString($b)
     {
         $this->context_->write();
@@ -267,7 +204,7 @@
             $this->trans_->write(self::QUOTE);
         }
 
-        $this->trans_->write($this->unescapedUnicode($b));
+        $this->trans_->write(json_encode($b, JSON_UNESCAPED_UNICODE));
 
         if (is_numeric($b) && $this->context_->escapeNum()) {
             $this->trans_->write(self::QUOTE);
@@ -297,6 +234,7 @@
             $this->trans_->write(self::QUOTE);
         }
 
+        #TODO add compatibility with NAN and INF
         $this->trans_->write(json_encode($num));
 
         if ($this->context_->escapeNum()) {
@@ -304,14 +242,6 @@
         }
     }
 
-    private function writeJSONBase64($data)
-    {
-        $this->context_->write();
-        $this->trans_->write(self::QUOTE);
-        $this->trans_->write(json_encode(base64_encode($data)));
-        $this->trans_->write(self::QUOTE);
-    }
-
     private function writeJSONObjectStart()
     {
         $this->context_->write();
@@ -481,18 +411,6 @@
         }
     }
 
-    private function readJSONBase64()
-    {
-        $arr = $this->readJSONString(false);
-        $data = base64_decode($arr, true);
-
-        if ($data === false) {
-            throw new TProtocolException("Invalid base64 data " . $arr, TProtocolException::INVALID_DATA);
-        }
-
-        return $data;
-    }
-
     private function readJSONObjectStart()
     {
         $this->context_->read();
diff --git a/lib/php/lib/Protocol/TProtocol.php b/lib/php/lib/Protocol/TProtocol.php
index f7b581f..0de2cf5 100644
--- a/lib/php/lib/Protocol/TProtocol.php
+++ b/lib/php/lib/Protocol/TProtocol.php
@@ -181,7 +181,7 @@
      * The skip function is a utility to parse over unrecognized date without
      * causing corruption.
      *
-     * @param TType $type What type is it
+     * @param int $type What type is it (defined in TType::class)
      */
     public function skip($type)
     {
diff --git a/lib/php/lib/Protocol/TSimpleJSONProtocol.php b/lib/php/lib/Protocol/TSimpleJSONProtocol.php
index 1cf1f64..22f1742 100644
--- a/lib/php/lib/Protocol/TSimpleJSONProtocol.php
+++ b/lib/php/lib/Protocol/TSimpleJSONProtocol.php
@@ -115,6 +115,7 @@
             $this->trans_->write(self::QUOTE);
         }
 
+        #TODO add compatibility with NAN and INF
         $this->trans_->write(json_encode((float)$num));
 
         if ($isMapKey) {
diff --git a/lib/php/lib/Server/TSSLServerSocket.php b/lib/php/lib/Server/TSSLServerSocket.php
index ac589b7..e377897 100644
--- a/lib/php/lib/Server/TSSLServerSocket.php
+++ b/lib/php/lib/Server/TSSLServerSocket.php
@@ -49,6 +49,10 @@
     {
         $ssl_host = $this->getSSLHost($host);
         parent::__construct($ssl_host, $port);
+        // Initialize a stream context if not provided
+        if ($context === null) {
+            $context = stream_context_create();
+        }
         $this->context_ = $context;
     }
 
diff --git a/lib/php/lib/Server/TServerTransport.php b/lib/php/lib/Server/TServerTransport.php
index 15a27af..82ee752 100644
--- a/lib/php/lib/Server/TServerTransport.php
+++ b/lib/php/lib/Server/TServerTransport.php
@@ -3,6 +3,7 @@
 namespace Thrift\Server;
 
 use Thrift\Exception\TTransportException;
+use Thrift\Transport\TTransport;
 
 /**
  * Generic class for Server agent.
diff --git a/lib/php/lib/Transport/TBufferedTransport.php b/lib/php/lib/Transport/TBufferedTransport.php
index 253c5ac..e3a40a4 100644
--- a/lib/php/lib/Transport/TBufferedTransport.php
+++ b/lib/php/lib/Transport/TBufferedTransport.php
@@ -1,4 +1,5 @@
 <?php
+
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements. See the NOTICE file
diff --git a/lib/php/lib/Transport/TCurlClient.php b/lib/php/lib/Transport/TCurlClient.php
index 2087433..709798e 100644
--- a/lib/php/lib/Transport/TCurlClient.php
+++ b/lib/php/lib/Transport/TCurlClient.php
@@ -1,4 +1,5 @@
 <?php
+
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements. See the NOTICE file
@@ -227,7 +228,6 @@
             register_shutdown_function(array('Thrift\\Transport\\TCurlClient', 'closeCurlHandle'));
             self::$curlHandle = curl_init();
             curl_setopt(self::$curlHandle, CURLOPT_RETURNTRANSFER, true);
-            curl_setopt(self::$curlHandle, CURLOPT_BINARYTRANSFER, true);
             curl_setopt(self::$curlHandle, CURLOPT_USERAGENT, 'PHP/TCurlClient');
             curl_setopt(self::$curlHandle, CURLOPT_CUSTOMREQUEST, 'POST');
             curl_setopt(self::$curlHandle, CURLOPT_FOLLOWLOCATION, true);
@@ -238,9 +238,11 @@
         $fullUrl = $this->scheme_ . "://" . $host . $this->uri_;
 
         $headers = array();
-        $defaultHeaders = array('Accept' => 'application/x-thrift',
+        $defaultHeaders = array(
+            'Accept' => 'application/x-thrift',
             'Content-Type' => 'application/x-thrift',
-            'Content-Length' => TStringFuncFactory::create()->strlen($this->request_));
+            'Content-Length' => TStringFuncFactory::create()->strlen($this->request_)
+        );
         foreach (array_merge($defaultHeaders, $this->headers_) as $key => $value) {
             $headers[] = "$key: $value";
         }
@@ -292,10 +294,11 @@
     {
         try {
             if (self::$curlHandle) {
-                curl_close(self::$curlHandle);
+                curl_close(self::$curlHandle); #This function has no effect. Prior to PHP 8.0.0, this function was used to close the resource.
                 self::$curlHandle = null;
             }
         } catch (\Exception $x) {
+            #it's not possible to throw an exception by calling a function that has no effect
             error_log('There was an error closing the curl handle: ' . $x->getMessage());
         }
     }
diff --git a/lib/php/lib/Transport/THttpClient.php b/lib/php/lib/Transport/THttpClient.php
index 4d6be32..0f767f4 100644
--- a/lib/php/lib/Transport/THttpClient.php
+++ b/lib/php/lib/Transport/THttpClient.php
@@ -1,4 +1,5 @@
 <?php
+
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements. See the NOTICE file
@@ -212,11 +213,14 @@
         $host = $this->host_ . ($this->port_ != 80 ? ':' . $this->port_ : '');
 
         $headers = array();
-        $defaultHeaders = array('Host' => $host,
+        $defaultHeaders = array(
+            'Host' => $host,
             'Accept' => 'application/x-thrift',
             'User-Agent' => 'PHP/THttpClient',
             'Content-Type' => 'application/x-thrift',
-            'Content-Length' => TStringFuncFactory::create()->strlen($this->buf_));
+            'Content-Length' => TStringFuncFactory::create()->strlen($this->buf_)
+        );
+
         foreach (array_merge($defaultHeaders, $this->headers_) as $key => $value) {
             $headers[] = "$key: $value";
         }
@@ -225,10 +229,12 @@
 
         $baseHttpOptions = isset($options["http"]) ? $options["http"] : array();
 
-        $httpOptions = $baseHttpOptions + array('method' => 'POST',
+        $httpOptions = $baseHttpOptions + array(
+            'method' => 'POST',
             'header' => implode("\r\n", $headers),
             'max_redirects' => 1,
-            'content' => $this->buf_);
+            'content' => $this->buf_
+        );
         if ($this->timeout_ > 0) {
             $httpOptions['timeout'] = $this->timeout_;
         }
diff --git a/lib/php/lib/Transport/TMemoryBuffer.php b/lib/php/lib/Transport/TMemoryBuffer.php
index fee03a2..e5da9da 100644
--- a/lib/php/lib/Transport/TMemoryBuffer.php
+++ b/lib/php/lib/Transport/TMemoryBuffer.php
@@ -1,4 +1,5 @@
 <?php
+
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements. See the NOTICE file
@@ -35,6 +36,8 @@
  */
 class TMemoryBuffer extends TTransport
 {
+    protected $buf_ = '';
+
     /**
      * Constructor. Optionally pass an initial value
      * for the buffer.
@@ -44,8 +47,6 @@
         $this->buf_ = $buf;
     }
 
-    protected $buf_ = '';
-
     public function isOpen()
     {
         return true;
diff --git a/lib/php/lib/Transport/TPhpStream.php b/lib/php/lib/Transport/TPhpStream.php
index 42823ff..2350b96 100644
--- a/lib/php/lib/Transport/TPhpStream.php
+++ b/lib/php/lib/Transport/TPhpStream.php
@@ -1,4 +1,5 @@
 <?php
+
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements. See the NOTICE file
@@ -53,7 +54,7 @@
     public function open()
     {
         if ($this->read_) {
-            $this->inStream_ = @fopen(self::inStreamName(), 'r');
+            $this->inStream_ = @fopen($this->inStreamName(), 'r');
             if (!is_resource($this->inStream_)) {
                 throw new TException('TPhpStream: Could not open php://input');
             }
@@ -113,7 +114,7 @@
         @fflush($this->outStream_);
     }
 
-    private static function inStreamName()
+    private function inStreamName()
     {
         if (php_sapi_name() == 'cli') {
             return 'php://stdin';
diff --git a/lib/php/lib/Transport/TSSLSocket.php b/lib/php/lib/Transport/TSSLSocket.php
index b4a0adb..16956e7 100644
--- a/lib/php/lib/Transport/TSSLSocket.php
+++ b/lib/php/lib/Transport/TSSLSocket.php
@@ -36,7 +36,7 @@
     /**
      * Remote port
      *
-     * @var resource
+     * @var null|resource
      */
     protected $context_ = null;
 
@@ -57,6 +57,10 @@
     ) {
         $this->host_ = $this->getSSLHost($host);
         $this->port_ = $port;
+        // Initialize a stream context if not provided
+        if ($context === null) {
+            $context = stream_context_create();
+        }
         $this->context_ = $context;
         $this->debugHandler_ = $debugHandler ? $debugHandler : 'error_log';
     }
@@ -87,7 +91,8 @@
             throw new TTransportException('Socket already connected', TTransportException::ALREADY_OPEN);
         }
 
-        if (empty($this->host_)) {
+        $host = parse_url($this->host_, PHP_URL_HOST);
+        if (empty($host)) {
             throw new TTransportException('Cannot open null host', TTransportException::NOT_OPEN);
         }
 
diff --git a/lib/php/lib/Transport/TSocket.php b/lib/php/lib/Transport/TSocket.php
index 8fe60fd..fb74fdb 100644
--- a/lib/php/lib/Transport/TSocket.php
+++ b/lib/php/lib/Transport/TSocket.php
@@ -252,8 +252,10 @@
 
         if (function_exists('socket_import_stream') && function_exists('socket_set_option')) {
             // warnings silenced due to bug https://bugs.php.net/bug.php?id=70939
-            $socket = @socket_import_stream($this->handle_);
-            @socket_set_option($socket, SOL_TCP, TCP_NODELAY, 1);
+            $socket = socket_import_stream($this->handle_);
+            if ($socket !== false) {
+                @socket_set_option($socket, SOL_TCP, TCP_NODELAY, 1);
+            }
         }
     }
 
diff --git a/lib/php/lib/Transport/TSocketPool.php b/lib/php/lib/Transport/TSocketPool.php
index 307885f..312e023 100644
--- a/lib/php/lib/Transport/TSocketPool.php
+++ b/lib/php/lib/Transport/TSocketPool.php
@@ -1,4 +1,5 @@
 <?php
+
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements. See the NOTICE file
@@ -25,24 +26,6 @@
 use Thrift\Exception\TException;
 
 /**
- * This library makes use of APCu cache to make hosts as down in a web
- * environment. If you are running from the CLI or on a system without APCu
- * installed, then these null functions will step in and act like cache
- * misses.
- */
-if (!function_exists('apcu_fetch')) {
-    function apcu_fetch($key)
-    {
-        return false;
-    }
-
-    function apcu_store($key, $var, $ttl = 0)
-    {
-        return false;
-    }
-}
-
-/**
  * Sockets implementation of the TTransport interface that allows connection
  * to a pool of servers.
  *
@@ -92,6 +75,12 @@
     private $alwaysTryLast_ = true;
 
     /**
+     * Use apcu cache
+     * @var bool
+     */
+    private $useApcuCache;
+
+    /**
      * Socket pool constructor
      *
      * @param array $hosts List of remote hostnames
@@ -116,9 +105,13 @@
         }
 
         foreach ($hosts as $key => $host) {
-            $this->servers_ [] = array('host' => $host,
-                'port' => $ports[$key]);
+            $this->servers_ [] = array(
+                'host' => $host,
+                'port' => $ports[$key]
+            );
         }
+
+        $this->useApcuCache = function_exists('apcu_fetch');
     }
 
     /**
@@ -206,7 +199,7 @@
             $failtimeKey = 'thrift_failtime:' . $host . ':' . $port . '~';
 
             // Cache miss? Assume it's OK
-            $lastFailtime = apcu_fetch($failtimeKey);
+            $lastFailtime = $this->apcuFetch($failtimeKey);
             if ($lastFailtime === false) {
                 $lastFailtime = 0;
             }
@@ -251,7 +244,7 @@
 
                         // Only clear the failure counts if required to do so
                         if ($lastFailtime > 0) {
-                            apcu_store($failtimeKey, 0);
+                            $this->apcuStore($failtimeKey, 0);
                         }
 
                         // Successful connection, return now
@@ -265,7 +258,7 @@
                 $consecfailsKey = 'thrift_consecfails:' . $host . ':' . $port . '~';
 
                 // Ignore cache misses
-                $consecfails = apcu_fetch($consecfailsKey);
+                $consecfails = $this->apcuFetch($consecfailsKey);
                 if ($consecfails === false) {
                     $consecfails = 0;
                 }
@@ -284,12 +277,12 @@
                         );
                     }
                     // Store the failure time
-                    apcu_store($failtimeKey, time());
+                    $this->apcuStore($failtimeKey, time());
 
                     // Clear the count of consecutive failures
-                    apcu_store($consecfailsKey, 0);
+                    $this->apcuStore($consecfailsKey, 0);
                 } else {
-                    apcu_store($consecfailsKey, $consecfails);
+                    $this->apcuStore($consecfailsKey, $consecfails);
                 }
             }
         }
@@ -307,4 +300,20 @@
         }
         throw new TException($error);
     }
+
+    /**
+     * This library makes use of APCu cache to make hosts as down in a web
+     * environment. If you are running from the CLI or on a system without APCu
+     * installed, then these null functions will step in and act like cache
+     * misses.
+     */
+    private function apcuFetch($key, &$success = null)
+    {
+        return $this->useApcuCache ? apcu_fetch($key, $success) : false;
+    }
+
+    private function apcuStore($key, $var, $ttl = 0)
+    {
+        return $this->useApcuCache ? apcu_store($key, $var, $ttl) : false;
+    }
 }
diff --git a/lib/php/phpunit.xml b/lib/php/phpunit.xml
index 53b3f35..58e8f5d 100644
--- a/lib/php/phpunit.xml
+++ b/lib/php/phpunit.xml
@@ -18,7 +18,7 @@
  under the License.
 -->
 <phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         bootstrap="../../vendor/autoload.php"
+         bootstrap="test/bootstrap.php"
          cacheResult="false"
          colors="true"
          convertErrorsToExceptions="true"
@@ -28,15 +28,17 @@
          stopOnFailure="true"
          processIsolation="true"
          xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/9.3/phpunit.xsd">
-    <coverage includeUncoveredFiles="true">
-        <include>
-            <directory suffix=".php">./src</directory>
+    <filter>
+        <whitelist processUncoveredFilesFromWhitelist="true">
             <directory suffix=".php">./lib</directory>
-        </include>
-    </coverage>
+        </whitelist>
+    </filter>
     <testsuites>
-        <testsuite name="Thrift PHP Test Suite">
+        <testsuite name="Thrift PHP Unit Test Suite">
             <directory>./test/Unit</directory>
         </testsuite>
+        <testsuite name="Thrift PHP Integration Test Suite">
+            <directory>./test/Integration</directory>
+        </testsuite>
     </testsuites>
 </phpunit>
diff --git a/lib/php/test/Fixtures/Fixtures.php b/lib/php/test/Fixtures/Fixtures.php
deleted file mode 100644
index eb348fc..0000000
--- a/lib/php/test/Fixtures/Fixtures.php
+++ /dev/null
@@ -1,194 +0,0 @@
-<?php
-
-/*
- * 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.
- *
- * @package thrift.test
- */
-
-namespace Test\Thrift\Fixtures;
-
-use ThriftTest\Xtruct;
-use ThriftTest\Xtruct2;
-use ThriftTest\Numberz;
-use ThriftTest\Insanity;
-
-class Fixtures
-{
-    public static $bufsize = 8192; //big enough to read biggest serialized Fixture arg.
-    public static $testArgs = array();
-
-    public static function populateTestArgs()
-    {
-        self::$testArgs['testString1'] = "Afrikaans, Alemannisch, Aragonés, العربية, مصرى, Asturianu, Aymar aru, Azərbaycan, Башҡорт, Boarisch, Žemaitėška, Беларуская, Беларуская (тарашкевіца), Български, Bamanankan, বাংলা, Brezhoneg, Bosanski, Català, Mìng-dĕ̤ng-ngṳ̄, Нохчийн, Cebuano, ᏣᎳᎩ, Česky, Словѣ́ньскъ / ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ, Чӑвашла, Cymraeg, Dansk, Zazaki, ދިވެހިބަސް, Ελληνικά, Emiliàn e rumagnòl, English, Esperanto, Español, Eesti, Euskara, فارسی, Suomi, Võro, Føroyskt, Français, Arpetan, Furlan, Frysk, Gaeilge, 贛語, Gàidhlig, Galego, Avañe'ẽ, ગુજરાતી, Gaelg, עברית, हिन्दी, Fiji Hindi, Hrvatski, Kreyòl ayisyen, Magyar, Հայերեն, Interlingua, Bahasa Indonesia, Ilokano, Ido, Íslenska, Italiano, 日本語, Lojban, Basa Jawa, ქართული, Kongo, Kalaallisut, ಕನ್ನಡ, 한국어, Къарачай-Малкъар, Ripoarisch, Kurdî, Коми, Kernewek, Кыргызча, Latina, Ladino, Lëtzebuergesch, Limburgs, Lingála, ລາວ, Lietuvių, Latviešu, Basa Banyumasan, Malagasy, Македонски, മലയാളം, मराठी, Bahasa Melayu, مازِرونی, Nnapulitano, Nedersaksisch, नेपाल भाषा, Nederlands, ‪Norsk (nynorsk)‬, ‪Norsk (bokmål)‬, Nouormand, Diné bizaad, Occitan, Иронау, Papiamentu, Deitsch, Norfuk / Pitkern, Polski, پنجابی, پښتو, Português, Runa Simi, Rumantsch, Romani, Română, Русский, Саха тыла, Sardu, Sicilianu, Scots, Sámegiella, Simple English, Slovenčina, Slovenščina, Српски / Srpski, Seeltersk, Svenska, Kiswahili, தமிழ், తెలుగు, Тоҷикӣ, ไทย, Türkmençe, Tagalog, Türkçe, Татарча/Tatarça, Українська, اردو, Tiếng Việt, Volapük, Walon, Winaray, 吴语, isiXhosa, ייִדיש, Yorùbá, Zeêuws, 中文, Bân-lâm-gú, 粵語";
-
-        self::$testArgs['testString2'] =
-            "quote: \\\" backslash:" .
-            " forwardslash-escaped: \\/ " .
-            " backspace: \b formfeed: \f newline: \n return: \r tab: " .
-            " now-all-of-them-together: \"\\\/\b\n\r\t" .
-            " now-a-bunch-of-junk: !@#\$%&()(&%$#{}{}<><><";
-
-        self::$testArgs['testString3'] =
-            "string that ends in double-backslash \\\\";
-
-        self::$testArgs['testUnicodeStringWithNonBMP'] =
-            "สวัสดี/𝒯";
-
-        self::$testArgs['testDouble'] = 3.1415926535898;
-
-        // TODO: add testBinary() call
-
-        self::$testArgs['testByte'] = 0x01;
-
-        self::$testArgs['testI32'] = pow(2, 30);
-
-        if (PHP_INT_SIZE == 8) {
-            self::$testArgs['testI64'] = pow(2, 60);
-        } else {
-            self::$testArgs['testI64'] = "1152921504606847000";
-        }
-
-        self::$testArgs['testStruct'] =
-            new Xtruct(
-                array(
-                    'string_thing' => 'worked',
-                    'byte_thing' => 0x01,
-                    'i32_thing' => pow(2, 30),
-                    'i64_thing' => self::$testArgs['testI64']
-                )
-            );
-
-        self::$testArgs['testNestNested'] =
-            new Xtruct(
-                array(
-                    'string_thing' => 'worked',
-                    'byte_thing' => 0x01,
-                    'i32_thing' => pow(2, 30),
-                    'i64_thing' => self::$testArgs['testI64']
-                )
-            );
-
-        self::$testArgs['testNest'] =
-            new Xtruct2(
-                array(
-                    'byte_thing' => 0x01,
-                    'struct_thing' => self::$testArgs['testNestNested'],
-                    'i32_thing' => pow(2, 15)
-                )
-            );
-
-        self::$testArgs['testMap'] =
-            array(
-                7 => 77,
-                8 => 88,
-                9 => 99
-            );
-
-        self::$testArgs['testStringMap'] =
-            array(
-                "a" => "123",
-                "a b" => "with spaces ",
-                "same" => "same",
-                "0" => "numeric key",
-                "longValue" => self::$testArgs['testString1'],
-                self::$testArgs['testString1'] => "long key"
-            );
-
-        self::$testArgs['testSet'] = array(1 => true, 5 => true, 6 => true);
-
-        self::$testArgs['testList'] = array(1, 2, 3);
-
-        self::$testArgs['testEnum'] = Numberz::ONE;
-
-        self::$testArgs['testTypedef'] = 69;
-
-        self::$testArgs['testMapMapExpectedResult'] =
-            array(
-                4 => array(
-                    1 => 1,
-                    2 => 2,
-                    3 => 3,
-                    4 => 4,
-                ),
-                -4 => array(
-                    -4 => -4,
-                    -3 => -3,
-                    -2 => -2,
-                    -1 => -1
-                )
-            );
-
-        // testInsanity ... takes a few steps to set up!
-
-        $xtruct1 =
-            new Xtruct(
-                array(
-                    'string_thing' => 'Goodbye4',
-                    'byte_thing' => 4,
-                    'i32_thing' => 4,
-                    'i64_thing' => 4
-                )
-            );
-
-        $xtruct2 =
-            new Xtruct(
-                array(
-                    'string_thing' => 'Hello2',
-                    'byte_thing' => 2,
-                    'i32_thing' => 2,
-                    'i64_thing' => 2
-                )
-            );
-
-        $userMap =
-            array(
-                Numberz::FIVE => 5,
-                Numberz::EIGHT => 8
-            );
-
-        $insanity2 =
-            new Insanity(
-                array(
-                    'userMap' => $userMap,
-                    'xtructs' => array($xtruct1, $xtruct2)
-                )
-            );
-
-        $insanity3 = $insanity2;
-
-        $insanity6 =
-            new Insanity(
-                array(
-                    'userMap' => null,
-                    'xtructs' => null
-                )
-            );
-
-        self::$testArgs['testInsanityExpectedResult'] =
-            array(
-                "1" => array(
-                    Numberz::TWO => $insanity2,
-                    Numberz::THREE => $insanity3
-                ),
-                "2" => array(
-                    Numberz::SIX => $insanity6
-                )
-            );
-    }
-}
diff --git a/lib/php/test/Fixtures/TJSONProtocolFixtures.php b/lib/php/test/Fixtures/TJSONProtocolFixtures.php
deleted file mode 100644
index 81ada77..0000000
--- a/lib/php/test/Fixtures/TJSONProtocolFixtures.php
+++ /dev/null
@@ -1,74 +0,0 @@
-<?php
-
-/*
- * 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.
- *
- * @package thrift.test
- */
-
-namespace Test\Thrift\Fixtures;
-
-class TJSONProtocolFixtures
-{
-    public static $testArgsJSON = array();
-
-    public static function populateTestArgsJSON()
-    {
-        self::$testArgsJSON['testVoid'] = '{}';
-
-        self::$testArgsJSON['testString1'] = '{"1":{"str":"Afrikaans, Alemannisch, Aragonés, العربية, مصرى, Asturianu, Aymar aru, Azərbaycan, Башҡорт, Boarisch, Žemaitėška, Беларуская, Беларуская (тарашкевіца), Български, Bamanankan, বাংলা, Brezhoneg, Bosanski, Català, Mìng-dĕ̤ng-ngṳ̄, Нохчийн, Cebuano, ᏣᎳᎩ, Česky, Словѣ́ньскъ \/ ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ, Чӑвашла, Cymraeg, Dansk, Zazaki, ދިވެހިބަސް, Ελληνικά, Emiliàn e rumagnòl, English, Esperanto, Español, Eesti, Euskara, فارسی, Suomi, Võro, Føroyskt, Français, Arpetan, Furlan, Frysk, Gaeilge, 贛語, Gàidhlig, Galego, Avañe\'ẽ, ગુજરાતી, Gaelg, עברית, हिन्दी, Fiji Hindi, Hrvatski, Kreyòl ayisyen, Magyar, Հայերեն, Interlingua, Bahasa Indonesia, Ilokano, Ido, Íslenska, Italiano, 日本語, Lojban, Basa Jawa, ქართული, Kongo, Kalaallisut, ಕನ್ನಡ, 한국어, Къарачай-Малкъар, Ripoarisch, Kurdî, Коми, Kernewek, Кыргызча, Latina, Ladino, Lëtzebuergesch, Limburgs, Lingála, ລາວ, Lietuvių, Latviešu, Basa Banyumasan, Malagasy, Македонски, മലയാളം, मराठी, Bahasa Melayu, مازِرونی, Nnapulitano, Nedersaksisch, नेपाल भाषा, Nederlands, ‪Norsk (nynorsk)‬, ‪Norsk (bokmål)‬, Nouormand, Diné bizaad, Occitan, Иронау, Papiamentu, Deitsch, Norfuk \/ Pitkern, Polski, پنجابی, پښتو, Português, Runa Simi, Rumantsch, Romani, Română, Русский, Саха тыла, Sardu, Sicilianu, Scots, Sámegiella, Simple English, Slovenčina, Slovenščina, Српски \/ Srpski, Seeltersk, Svenska, Kiswahili, தமிழ், తెలుగు, Тоҷикӣ, ไทย, Türkmençe, Tagalog, Türkçe, Татарча\/Tatarça, Українська, اردو, Tiếng Việt, Volapük, Walon, Winaray, 吴语, isiXhosa, ייִדיש, Yorùbá, Zeêuws, 中文, Bân-lâm-gú, 粵語"}}';
-
-        self::$testArgsJSON['testString2'] = '{"1":{"str":"quote: \\\\\" backslash: forwardslash-escaped: \\\\\/  backspace: \\\\b formfeed: \f newline: \n return: \r tab:  now-all-of-them-together: \"\\\\\\\\\/\\\\b\n\r\t now-a-bunch-of-junk: !@#$%&()(&%$#{}{}<><><"}}';
-
-        self::$testArgsJSON['testString3'] = '{"1":{"str":"string that ends in double-backslash \\\\\\\\"}}';
-
-        self::$testArgsJSON['testUnicodeStringWithNonBMP'] = '{"1":{"str":"สวัสดี\/𝒯"}}';
-
-        self::$testArgsJSON['testDouble'] = '{"1":{"dbl":3.1415926535898}}';
-
-        self::$testArgsJSON['testByte'] = '{"1":{"i8":1}}';
-
-        self::$testArgsJSON['testI32'] = '{"1":{"i32":1073741824}}';
-
-        if (PHP_INT_SIZE == 8) {
-            self::$testArgsJSON['testI64'] = '{"1":{"i64":' . pow(2, 60) . '}}';
-            self::$testArgsJSON['testStruct'] = '{"1":{"rec":{"1":{"str":"worked"},"4":{"i8":1},"9":{"i32":1073741824},"11":{"i64":' . pow(2, 60) . '}}}}';
-            self::$testArgsJSON['testNest'] = '{"1":{"rec":{"1":{"i8":1},"2":{"rec":{"1":{"str":"worked"},"4":{"i8":1},"9":{"i32":1073741824},"11":{"i64":' . pow(2, 60) . '}}},"3":{"i32":32768}}}}';
-        } else {
-            self::$testArgsJSON['testI64'] = '{"1":{"i64":1152921504606847000}}';
-            self::$testArgsJSON['testStruct'] = '{"1":{"rec":{"1":{"str":"worked"},"4":{"i8":1},"9":{"i32":1073741824},"11":{"i64":1152921504606847000}}}}';
-            self::$testArgsJSON['testNest'] = '{"1":{"rec":{"1":{"i8":1},"2":{"rec":{"1":{"str":"worked"},"4":{"i8":1},"9":{"i32":1073741824},"11":{"i64":1152921504606847000}}},"3":{"i32":32768}}}}';
-        }
-
-        self::$testArgsJSON['testMap'] = '{"1":{"map":["i32","i32",3,{"7":77,"8":88,"9":99}]}}';
-
-        self::$testArgsJSON['testStringMap'] = '{"1":{"map":["str","str",6,{"a":"123","a b":"with spaces ","same":"same","0":"numeric key","longValue":"Afrikaans, Alemannisch, Aragon\u00e9s, \u0627\u0644\u0639\u0631\u0628\u064a\u0629, \u0645\u0635\u0631\u0649, Asturianu, Aymar aru, Az\u0259rbaycan, \u0411\u0430\u0448\u04a1\u043e\u0440\u0442, Boarisch, \u017demait\u0117\u0161ka, \u0411\u0435\u043b\u0430\u0440\u0443\u0441\u043a\u0430\u044f, \u0411\u0435\u043b\u0430\u0440\u0443\u0441\u043a\u0430\u044f (\u0442\u0430\u0440\u0430\u0448\u043a\u0435\u0432\u0456\u0446\u0430), \u0411\u044a\u043b\u0433\u0430\u0440\u0441\u043a\u0438, Bamanankan, \u09ac\u09be\u0982\u09b2\u09be, Brezhoneg, Bosanski, Catal\u00e0, M\u00ecng-d\u0115\u0324ng-ng\u1e73\u0304, \u041d\u043e\u0445\u0447\u0438\u0439\u043d, Cebuano, \u13e3\u13b3\u13a9, \u010cesky, \u0421\u043b\u043e\u0432\u0463\u0301\u043d\u044c\u0441\u043a\u044a \/ \u2c14\u2c0e\u2c11\u2c02\u2c21\u2c10\u2c20\u2c14\u2c0d\u2c1f, \u0427\u04d1\u0432\u0430\u0448\u043b\u0430, Cymraeg, Dansk, Zazaki, \u078b\u07a8\u0788\u07ac\u0780\u07a8\u0784\u07a6\u0790\u07b0, \u0395\u03bb\u03bb\u03b7\u03bd\u03b9\u03ba\u03ac, Emili\u00e0n e rumagn\u00f2l, English, Esperanto, Espa\u00f1ol, Eesti, Euskara, \u0641\u0627\u0631\u0633\u06cc, Suomi, V\u00f5ro, F\u00f8royskt, Fran\u00e7ais, Arpetan, Furlan, Frysk, Gaeilge, \u8d1b\u8a9e, G\u00e0idhlig, Galego, Ava\u00f1e\'\u1ebd, \u0a97\u0ac1\u0a9c\u0ab0\u0abe\u0aa4\u0ac0, Gaelg, \u05e2\u05d1\u05e8\u05d9\u05ea, \u0939\u093f\u0928\u094d\u0926\u0940, Fiji Hindi, Hrvatski, Krey\u00f2l ayisyen, Magyar, \u0540\u0561\u0575\u0565\u0580\u0565\u0576, Interlingua, Bahasa Indonesia, Ilokano, Ido, \u00cdslenska, Italiano, \u65e5\u672c\u8a9e, Lojban, Basa Jawa, \u10e5\u10d0\u10e0\u10d7\u10e3\u10da\u10d8, Kongo, Kalaallisut, \u0c95\u0ca8\u0ccd\u0ca8\u0ca1, \ud55c\uad6d\uc5b4, \u041a\u044a\u0430\u0440\u0430\u0447\u0430\u0439-\u041c\u0430\u043b\u043a\u044a\u0430\u0440, Ripoarisch, Kurd\u00ee, \u041a\u043e\u043c\u0438, Kernewek, \u041a\u044b\u0440\u0433\u044b\u0437\u0447\u0430, Latina, Ladino, L\u00ebtzebuergesch, Limburgs, Ling\u00e1la, \u0ea5\u0eb2\u0ea7, Lietuvi\u0173, Latvie\u0161u, Basa Banyumasan, Malagasy, \u041c\u0430\u043a\u0435\u0434\u043e\u043d\u0441\u043a\u0438, \u0d2e\u0d32\u0d2f\u0d3e\u0d33\u0d02, \u092e\u0930\u093e\u0920\u0940, Bahasa Melayu, \u0645\u0627\u0632\u0650\u0631\u0648\u0646\u06cc, Nnapulitano, Nedersaksisch, \u0928\u0947\u092a\u093e\u0932 \u092d\u093e\u0937\u093e, Nederlands, \u202aNorsk (nynorsk)\u202c, \u202aNorsk (bokm\u00e5l)\u202c, Nouormand, Din\u00e9 bizaad, Occitan, \u0418\u0440\u043e\u043d\u0430\u0443, Papiamentu, Deitsch, Norfuk \/ Pitkern, Polski, \u067e\u0646\u062c\u0627\u0628\u06cc, \u067e\u069a\u062a\u0648, Portugu\u00eas, Runa Simi, Rumantsch, Romani, Rom\u00e2n\u0103, \u0420\u0443\u0441\u0441\u043a\u0438\u0439, \u0421\u0430\u0445\u0430 \u0442\u044b\u043b\u0430, Sardu, Sicilianu, Scots, S\u00e1megiella, Simple English, Sloven\u010dina, Sloven\u0161\u010dina, \u0421\u0440\u043f\u0441\u043a\u0438 \/ Srpski, Seeltersk, Svenska, Kiswahili, \u0ba4\u0bae\u0bbf\u0bb4\u0bcd, \u0c24\u0c46\u0c32\u0c41\u0c17\u0c41, \u0422\u043e\u04b7\u0438\u043a\u04e3, \u0e44\u0e17\u0e22, T\u00fcrkmen\u00e7e, Tagalog, T\u00fcrk\u00e7e, \u0422\u0430\u0442\u0430\u0440\u0447\u0430\/Tatar\u00e7a, \u0423\u043a\u0440\u0430\u0457\u043d\u0441\u044c\u043a\u0430, \u0627\u0631\u062f\u0648, Ti\u1ebfng Vi\u1ec7t, Volap\u00fck, Walon, Winaray, \u5434\u8bed, isiXhosa, \u05d9\u05d9\u05b4\u05d3\u05d9\u05e9, Yor\u00f9b\u00e1, Ze\u00eauws, \u4e2d\u6587, B\u00e2n-l\u00e2m-g\u00fa, \u7cb5\u8a9e","Afrikaans, Alemannisch, Aragon\u00e9s, \u0627\u0644\u0639\u0631\u0628\u064a\u0629, \u0645\u0635\u0631\u0649, Asturianu, Aymar aru, Az\u0259rbaycan, \u0411\u0430\u0448\u04a1\u043e\u0440\u0442, Boarisch, \u017demait\u0117\u0161ka, \u0411\u0435\u043b\u0430\u0440\u0443\u0441\u043a\u0430\u044f, \u0411\u0435\u043b\u0430\u0440\u0443\u0441\u043a\u0430\u044f (\u0442\u0430\u0440\u0430\u0448\u043a\u0435\u0432\u0456\u0446\u0430), \u0411\u044a\u043b\u0433\u0430\u0440\u0441\u043a\u0438, Bamanankan, \u09ac\u09be\u0982\u09b2\u09be, Brezhoneg, Bosanski, Catal\u00e0, M\u00ecng-d\u0115\u0324ng-ng\u1e73\u0304, \u041d\u043e\u0445\u0447\u0438\u0439\u043d, Cebuano, \u13e3\u13b3\u13a9, \u010cesky, \u0421\u043b\u043e\u0432\u0463\u0301\u043d\u044c\u0441\u043a\u044a \/ \u2c14\u2c0e\u2c11\u2c02\u2c21\u2c10\u2c20\u2c14\u2c0d\u2c1f, \u0427\u04d1\u0432\u0430\u0448\u043b\u0430, Cymraeg, Dansk, Zazaki, \u078b\u07a8\u0788\u07ac\u0780\u07a8\u0784\u07a6\u0790\u07b0, \u0395\u03bb\u03bb\u03b7\u03bd\u03b9\u03ba\u03ac, Emili\u00e0n e rumagn\u00f2l, English, Esperanto, Espa\u00f1ol, Eesti, Euskara, \u0641\u0627\u0631\u0633\u06cc, Suomi, V\u00f5ro, F\u00f8royskt, Fran\u00e7ais, Arpetan, Furlan, Frysk, Gaeilge, \u8d1b\u8a9e, G\u00e0idhlig, Galego, Ava\u00f1e\'\u1ebd, \u0a97\u0ac1\u0a9c\u0ab0\u0abe\u0aa4\u0ac0, Gaelg, \u05e2\u05d1\u05e8\u05d9\u05ea, \u0939\u093f\u0928\u094d\u0926\u0940, Fiji Hindi, Hrvatski, Krey\u00f2l ayisyen, Magyar, \u0540\u0561\u0575\u0565\u0580\u0565\u0576, Interlingua, Bahasa Indonesia, Ilokano, Ido, \u00cdslenska, Italiano, \u65e5\u672c\u8a9e, Lojban, Basa Jawa, \u10e5\u10d0\u10e0\u10d7\u10e3\u10da\u10d8, Kongo, Kalaallisut, \u0c95\u0ca8\u0ccd\u0ca8\u0ca1, \ud55c\uad6d\uc5b4, \u041a\u044a\u0430\u0440\u0430\u0447\u0430\u0439-\u041c\u0430\u043b\u043a\u044a\u0430\u0440, Ripoarisch, Kurd\u00ee, \u041a\u043e\u043c\u0438, Kernewek, \u041a\u044b\u0440\u0433\u044b\u0437\u0447\u0430, Latina, Ladino, L\u00ebtzebuergesch, Limburgs, Ling\u00e1la, \u0ea5\u0eb2\u0ea7, Lietuvi\u0173, Latvie\u0161u, Basa Banyumasan, Malagasy, \u041c\u0430\u043a\u0435\u0434\u043e\u043d\u0441\u043a\u0438, \u0d2e\u0d32\u0d2f\u0d3e\u0d33\u0d02, \u092e\u0930\u093e\u0920\u0940, Bahasa Melayu, \u0645\u0627\u0632\u0650\u0631\u0648\u0646\u06cc, Nnapulitano, Nedersaksisch, \u0928\u0947\u092a\u093e\u0932 \u092d\u093e\u0937\u093e, Nederlands, \u202aNorsk (nynorsk)\u202c, \u202aNorsk (bokm\u00e5l)\u202c, Nouormand, Din\u00e9 bizaad, Occitan, \u0418\u0440\u043e\u043d\u0430\u0443, Papiamentu, Deitsch, Norfuk \/ Pitkern, Polski, \u067e\u0646\u062c\u0627\u0628\u06cc, \u067e\u069a\u062a\u0648, Portugu\u00eas, Runa Simi, Rumantsch, Romani, Rom\u00e2n\u0103, \u0420\u0443\u0441\u0441\u043a\u0438\u0439, \u0421\u0430\u0445\u0430 \u0442\u044b\u043b\u0430, Sardu, Sicilianu, Scots, S\u00e1megiella, Simple English, Sloven\u010dina, Sloven\u0161\u010dina, \u0421\u0440\u043f\u0441\u043a\u0438 \/ Srpski, Seeltersk, Svenska, Kiswahili, \u0ba4\u0bae\u0bbf\u0bb4\u0bcd, \u0c24\u0c46\u0c32\u0c41\u0c17\u0c41, \u0422\u043e\u04b7\u0438\u043a\u04e3, \u0e44\u0e17\u0e22, T\u00fcrkmen\u00e7e, Tagalog, T\u00fcrk\u00e7e, \u0422\u0430\u0442\u0430\u0440\u0447\u0430\/Tatar\u00e7a, \u0423\u043a\u0440\u0430\u0457\u043d\u0441\u044c\u043a\u0430, \u0627\u0631\u062f\u0648, Ti\u1ebfng Vi\u1ec7t, Volap\u00fck, Walon, Winaray, \u5434\u8bed, isiXhosa, \u05d9\u05d9\u05b4\u05d3\u05d9\u05e9, Yor\u00f9b\u00e1, Ze\u00eauws, \u4e2d\u6587, B\u00e2n-l\u00e2m-g\u00fa, \u7cb5\u8a9e":"long key"}]}}';
-
-        self::$testArgsJSON['testSet'] = '{"1":{"set":["i32",3,1,5,6]}}';
-
-        self::$testArgsJSON['testList'] = '{"1":{"lst":["i32",3,1,2,3]}}';
-
-        self::$testArgsJSON['testEnum'] = '{"1":{"i32":1}}';
-
-        self::$testArgsJSON['testTypedef'] = '{"1":{"i64":69}}';
-
-        self::$testArgsJSON['testMapMap'] = '{"0":{"map":["i32","map",2,{"4":["i32","i32",4,{"1":1,"2":2,"3":3,"4":4}],"-4":["i32","i32",4,{"-4":-4,"-3":-3,"-2":-2,"-1":-1}]}]}}';
-
-        self::$testArgsJSON['testInsanity'] = '{"0":{"map":["i64","map",2,{"1":["i32","rec",2,{"2":{"1":{"map":["i32","i64",2,{"5":5,"8":8}]},"2":{"lst":["rec",2,{"1":{"str":"Goodbye4"},"4":{"i8":4},"9":{"i32":4},"11":{"i64":4}},{"1":{"str":"Hello2"},"4":{"i8":2},"9":{"i32":2},"11":{"i64":2}}]}},"3":{"1":{"map":["i32","i64",2,{"5":5,"8":8}]},"2":{"lst":["rec",2,{"1":{"str":"Goodbye4"},"4":{"i8":4},"9":{"i32":4},"11":{"i64":4}},{"1":{"str":"Hello2"},"4":{"i8":2},"9":{"i32":2},"11":{"i64":2}}]}}}],"2":["i32","rec",1,{"6":{}}]}]}}';
-    }
-}
diff --git a/lib/php/test/Fixtures/TSimpleJSONProtocolFixtures.php b/lib/php/test/Fixtures/TSimpleJSONProtocolFixtures.php
deleted file mode 100644
index 448eb61..0000000
--- a/lib/php/test/Fixtures/TSimpleJSONProtocolFixtures.php
+++ /dev/null
@@ -1,67 +0,0 @@
-<?php
-
-/*
- * 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.
- *
- * @package thrift.test
- */
-
-namespace Test\Thrift\Fixtures;
-
-class TSimpleJSONProtocolFixtures
-{
-    public static $testArgsJSON = array();
-
-    public static function populateTestArgsSimpleJSON()
-    {
-        self::$testArgsJSON['testVoid'] = '{}';
-
-        self::$testArgsJSON['testString1'] = '{"thing":"Afrikaans, Alemannisch, Aragon\u00e9s, \u0627\u0644\u0639\u0631\u0628\u064a\u0629, \u0645\u0635\u0631\u0649, Asturianu, Aymar aru, Az\u0259rbaycan, \u0411\u0430\u0448\u04a1\u043e\u0440\u0442, Boarisch, \u017demait\u0117\u0161ka, \u0411\u0435\u043b\u0430\u0440\u0443\u0441\u043a\u0430\u044f, \u0411\u0435\u043b\u0430\u0440\u0443\u0441\u043a\u0430\u044f (\u0442\u0430\u0440\u0430\u0448\u043a\u0435\u0432\u0456\u0446\u0430), \u0411\u044a\u043b\u0433\u0430\u0440\u0441\u043a\u0438, Bamanankan, \u09ac\u09be\u0982\u09b2\u09be, Brezhoneg, Bosanski, Catal\u00e0, M\u00ecng-d\u0115\u0324ng-ng\u1e73\u0304, \u041d\u043e\u0445\u0447\u0438\u0439\u043d, Cebuano, \u13e3\u13b3\u13a9, \u010cesky, \u0421\u043b\u043e\u0432\u0463\u0301\u043d\u044c\u0441\u043a\u044a \/ \u2c14\u2c0e\u2c11\u2c02\u2c21\u2c10\u2c20\u2c14\u2c0d\u2c1f, \u0427\u04d1\u0432\u0430\u0448\u043b\u0430, Cymraeg, Dansk, Zazaki, \u078b\u07a8\u0788\u07ac\u0780\u07a8\u0784\u07a6\u0790\u07b0, \u0395\u03bb\u03bb\u03b7\u03bd\u03b9\u03ba\u03ac, Emili\u00e0n e rumagn\u00f2l, English, Esperanto, Espa\u00f1ol, Eesti, Euskara, \u0641\u0627\u0631\u0633\u06cc, Suomi, V\u00f5ro, F\u00f8royskt, Fran\u00e7ais, Arpetan, Furlan, Frysk, Gaeilge, \u8d1b\u8a9e, G\u00e0idhlig, Galego, Ava\u00f1e\'\u1ebd, \u0a97\u0ac1\u0a9c\u0ab0\u0abe\u0aa4\u0ac0, Gaelg, \u05e2\u05d1\u05e8\u05d9\u05ea, \u0939\u093f\u0928\u094d\u0926\u0940, Fiji Hindi, Hrvatski, Krey\u00f2l ayisyen, Magyar, \u0540\u0561\u0575\u0565\u0580\u0565\u0576, Interlingua, Bahasa Indonesia, Ilokano, Ido, \u00cdslenska, Italiano, \u65e5\u672c\u8a9e, Lojban, Basa Jawa, \u10e5\u10d0\u10e0\u10d7\u10e3\u10da\u10d8, Kongo, Kalaallisut, \u0c95\u0ca8\u0ccd\u0ca8\u0ca1, \ud55c\uad6d\uc5b4, \u041a\u044a\u0430\u0440\u0430\u0447\u0430\u0439-\u041c\u0430\u043b\u043a\u044a\u0430\u0440, Ripoarisch, Kurd\u00ee, \u041a\u043e\u043c\u0438, Kernewek, \u041a\u044b\u0440\u0433\u044b\u0437\u0447\u0430, Latina, Ladino, L\u00ebtzebuergesch, Limburgs, Ling\u00e1la, \u0ea5\u0eb2\u0ea7, Lietuvi\u0173, Latvie\u0161u, Basa Banyumasan, Malagasy, \u041c\u0430\u043a\u0435\u0434\u043e\u043d\u0441\u043a\u0438, \u0d2e\u0d32\u0d2f\u0d3e\u0d33\u0d02, \u092e\u0930\u093e\u0920\u0940, Bahasa Melayu, \u0645\u0627\u0632\u0650\u0631\u0648\u0646\u06cc, Nnapulitano, Nedersaksisch, \u0928\u0947\u092a\u093e\u0932 \u092d\u093e\u0937\u093e, Nederlands, \u202aNorsk (nynorsk)\u202c, \u202aNorsk (bokm\u00e5l)\u202c, Nouormand, Din\u00e9 bizaad, Occitan, \u0418\u0440\u043e\u043d\u0430\u0443, Papiamentu, Deitsch, Norfuk \/ Pitkern, Polski, \u067e\u0646\u062c\u0627\u0628\u06cc, \u067e\u069a\u062a\u0648, Portugu\u00eas, Runa Simi, Rumantsch, Romani, Rom\u00e2n\u0103, \u0420\u0443\u0441\u0441\u043a\u0438\u0439, \u0421\u0430\u0445\u0430 \u0442\u044b\u043b\u0430, Sardu, Sicilianu, Scots, S\u00e1megiella, Simple English, Sloven\u010dina, Sloven\u0161\u010dina, \u0421\u0440\u043f\u0441\u043a\u0438 \/ Srpski, Seeltersk, Svenska, Kiswahili, \u0ba4\u0bae\u0bbf\u0bb4\u0bcd, \u0c24\u0c46\u0c32\u0c41\u0c17\u0c41, \u0422\u043e\u04b7\u0438\u043a\u04e3, \u0e44\u0e17\u0e22, T\u00fcrkmen\u00e7e, Tagalog, T\u00fcrk\u00e7e, \u0422\u0430\u0442\u0430\u0440\u0447\u0430\/Tatar\u00e7a, \u0423\u043a\u0440\u0430\u0457\u043d\u0441\u044c\u043a\u0430, \u0627\u0631\u062f\u0648, Ti\u1ebfng Vi\u1ec7t, Volap\u00fck, Walon, Winaray, \u5434\u8bed, isiXhosa, \u05d9\u05d9\u05b4\u05d3\u05d9\u05e9, Yor\u00f9b\u00e1, Ze\u00eauws, \u4e2d\u6587, B\u00e2n-l\u00e2m-g\u00fa, \u7cb5\u8a9e"}';
-
-        self::$testArgsJSON['testString2'] = '{"thing":"quote: \\\\\" backslash: forwardslash-escaped: \\\\\/  backspace: \\\\b formfeed: \f newline: \n return: \r tab:  now-all-of-them-together: \"\\\\\\\\\/\\\\b\n\r\t now-a-bunch-of-junk: !@#$%&()(&%$#{}{}<><><"}';
-
-        self::$testArgsJSON['testDouble'] = '{"thing":3.1415926535898}';
-
-        self::$testArgsJSON['testByte'] = '{"thing":1}';
-
-        self::$testArgsJSON['testI32'] = '{"thing":1073741824}';
-
-        if (PHP_INT_SIZE == 8) {
-            self::$testArgsJSON['testI64'] = '{"thing":' . pow(2, 60) . '}';
-            self::$testArgsJSON['testStruct'] = '{"thing":{"string_thing":"worked","byte_thing":1,"i32_thing":1073741824,"i64_thing":' . pow(2, 60) . '}}';
-            self::$testArgsJSON['testNest'] = '{"thing":{"byte_thing":1,"struct_thing":{"string_thing":"worked","byte_thing":1,"i32_thing":1073741824,"i64_thing":' . pow(2, 60) . '},"i32_thing":32768}}';
-        } else {
-            self::$testArgsJSON['testI64'] = '{"thing":1152921504606847000}';
-
-            self::$testArgsJSON['testStruct'] = '{"thing":{"string_thing":"worked","byte_thing":1,"i32_thing":1073741824,"i64_thing":1152921504606847000}}';
-            self::$testArgsJSON['testNest'] = '{"thing":{"byte_thing":1,"struct_thing":{"string_thing":"worked","byte_thing":1,"i32_thing":1073741824,"i64_thing":1152921504606847000},"i32_thing":32768}}';
-        }
-
-        self::$testArgsJSON['testMap'] = '{"thing":{"7":77,"8":88,"9":99}}';
-
-        self::$testArgsJSON['testStringMap'] = '{"thing":{"a":"123","a b":"with spaces ","same":"same","0":"numeric key","longValue":"Afrikaans, Alemannisch, Aragon\u00e9s, \u0627\u0644\u0639\u0631\u0628\u064a\u0629, \u0645\u0635\u0631\u0649, Asturianu, Aymar aru, Az\u0259rbaycan, \u0411\u0430\u0448\u04a1\u043e\u0440\u0442, Boarisch, \u017demait\u0117\u0161ka, \u0411\u0435\u043b\u0430\u0440\u0443\u0441\u043a\u0430\u044f, \u0411\u0435\u043b\u0430\u0440\u0443\u0441\u043a\u0430\u044f (\u0442\u0430\u0440\u0430\u0448\u043a\u0435\u0432\u0456\u0446\u0430), \u0411\u044a\u043b\u0433\u0430\u0440\u0441\u043a\u0438, Bamanankan, \u09ac\u09be\u0982\u09b2\u09be, Brezhoneg, Bosanski, Catal\u00e0, M\u00ecng-d\u0115\u0324ng-ng\u1e73\u0304, \u041d\u043e\u0445\u0447\u0438\u0439\u043d, Cebuano, \u13e3\u13b3\u13a9, \u010cesky, \u0421\u043b\u043e\u0432\u0463\u0301\u043d\u044c\u0441\u043a\u044a \/ \u2c14\u2c0e\u2c11\u2c02\u2c21\u2c10\u2c20\u2c14\u2c0d\u2c1f, \u0427\u04d1\u0432\u0430\u0448\u043b\u0430, Cymraeg, Dansk, Zazaki, \u078b\u07a8\u0788\u07ac\u0780\u07a8\u0784\u07a6\u0790\u07b0, \u0395\u03bb\u03bb\u03b7\u03bd\u03b9\u03ba\u03ac, Emili\u00e0n e rumagn\u00f2l, English, Esperanto, Espa\u00f1ol, Eesti, Euskara, \u0641\u0627\u0631\u0633\u06cc, Suomi, V\u00f5ro, F\u00f8royskt, Fran\u00e7ais, Arpetan, Furlan, Frysk, Gaeilge, \u8d1b\u8a9e, G\u00e0idhlig, Galego, Ava\u00f1e\'\u1ebd, \u0a97\u0ac1\u0a9c\u0ab0\u0abe\u0aa4\u0ac0, Gaelg, \u05e2\u05d1\u05e8\u05d9\u05ea, \u0939\u093f\u0928\u094d\u0926\u0940, Fiji Hindi, Hrvatski, Krey\u00f2l ayisyen, Magyar, \u0540\u0561\u0575\u0565\u0580\u0565\u0576, Interlingua, Bahasa Indonesia, Ilokano, Ido, \u00cdslenska, Italiano, \u65e5\u672c\u8a9e, Lojban, Basa Jawa, \u10e5\u10d0\u10e0\u10d7\u10e3\u10da\u10d8, Kongo, Kalaallisut, \u0c95\u0ca8\u0ccd\u0ca8\u0ca1, \ud55c\uad6d\uc5b4, \u041a\u044a\u0430\u0440\u0430\u0447\u0430\u0439-\u041c\u0430\u043b\u043a\u044a\u0430\u0440, Ripoarisch, Kurd\u00ee, \u041a\u043e\u043c\u0438, Kernewek, \u041a\u044b\u0440\u0433\u044b\u0437\u0447\u0430, Latina, Ladino, L\u00ebtzebuergesch, Limburgs, Ling\u00e1la, \u0ea5\u0eb2\u0ea7, Lietuvi\u0173, Latvie\u0161u, Basa Banyumasan, Malagasy, \u041c\u0430\u043a\u0435\u0434\u043e\u043d\u0441\u043a\u0438, \u0d2e\u0d32\u0d2f\u0d3e\u0d33\u0d02, \u092e\u0930\u093e\u0920\u0940, Bahasa Melayu, \u0645\u0627\u0632\u0650\u0631\u0648\u0646\u06cc, Nnapulitano, Nedersaksisch, \u0928\u0947\u092a\u093e\u0932 \u092d\u093e\u0937\u093e, Nederlands, \u202aNorsk (nynorsk)\u202c, \u202aNorsk (bokm\u00e5l)\u202c, Nouormand, Din\u00e9 bizaad, Occitan, \u0418\u0440\u043e\u043d\u0430\u0443, Papiamentu, Deitsch, Norfuk \/ Pitkern, Polski, \u067e\u0646\u062c\u0627\u0628\u06cc, \u067e\u069a\u062a\u0648, Portugu\u00eas, Runa Simi, Rumantsch, Romani, Rom\u00e2n\u0103, \u0420\u0443\u0441\u0441\u043a\u0438\u0439, \u0421\u0430\u0445\u0430 \u0442\u044b\u043b\u0430, Sardu, Sicilianu, Scots, S\u00e1megiella, Simple English, Sloven\u010dina, Sloven\u0161\u010dina, \u0421\u0440\u043f\u0441\u043a\u0438 \/ Srpski, Seeltersk, Svenska, Kiswahili, \u0ba4\u0bae\u0bbf\u0bb4\u0bcd, \u0c24\u0c46\u0c32\u0c41\u0c17\u0c41, \u0422\u043e\u04b7\u0438\u043a\u04e3, \u0e44\u0e17\u0e22, T\u00fcrkmen\u00e7e, Tagalog, T\u00fcrk\u00e7e, \u0422\u0430\u0442\u0430\u0440\u0447\u0430\/Tatar\u00e7a, \u0423\u043a\u0440\u0430\u0457\u043d\u0441\u044c\u043a\u0430, \u0627\u0631\u062f\u0648, Ti\u1ebfng Vi\u1ec7t, Volap\u00fck, Walon, Winaray, \u5434\u8bed, isiXhosa, \u05d9\u05d9\u05b4\u05d3\u05d9\u05e9, Yor\u00f9b\u00e1, Ze\u00eauws, \u4e2d\u6587, B\u00e2n-l\u00e2m-g\u00fa, \u7cb5\u8a9e","Afrikaans, Alemannisch, Aragon\u00e9s, \u0627\u0644\u0639\u0631\u0628\u064a\u0629, \u0645\u0635\u0631\u0649, Asturianu, Aymar aru, Az\u0259rbaycan, \u0411\u0430\u0448\u04a1\u043e\u0440\u0442, Boarisch, \u017demait\u0117\u0161ka, \u0411\u0435\u043b\u0430\u0440\u0443\u0441\u043a\u0430\u044f, \u0411\u0435\u043b\u0430\u0440\u0443\u0441\u043a\u0430\u044f (\u0442\u0430\u0440\u0430\u0448\u043a\u0435\u0432\u0456\u0446\u0430), \u0411\u044a\u043b\u0433\u0430\u0440\u0441\u043a\u0438, Bamanankan, \u09ac\u09be\u0982\u09b2\u09be, Brezhoneg, Bosanski, Catal\u00e0, M\u00ecng-d\u0115\u0324ng-ng\u1e73\u0304, \u041d\u043e\u0445\u0447\u0438\u0439\u043d, Cebuano, \u13e3\u13b3\u13a9, \u010cesky, \u0421\u043b\u043e\u0432\u0463\u0301\u043d\u044c\u0441\u043a\u044a \/ \u2c14\u2c0e\u2c11\u2c02\u2c21\u2c10\u2c20\u2c14\u2c0d\u2c1f, \u0427\u04d1\u0432\u0430\u0448\u043b\u0430, Cymraeg, Dansk, Zazaki, \u078b\u07a8\u0788\u07ac\u0780\u07a8\u0784\u07a6\u0790\u07b0, \u0395\u03bb\u03bb\u03b7\u03bd\u03b9\u03ba\u03ac, Emili\u00e0n e rumagn\u00f2l, English, Esperanto, Espa\u00f1ol, Eesti, Euskara, \u0641\u0627\u0631\u0633\u06cc, Suomi, V\u00f5ro, F\u00f8royskt, Fran\u00e7ais, Arpetan, Furlan, Frysk, Gaeilge, \u8d1b\u8a9e, G\u00e0idhlig, Galego, Ava\u00f1e\'\u1ebd, \u0a97\u0ac1\u0a9c\u0ab0\u0abe\u0aa4\u0ac0, Gaelg, \u05e2\u05d1\u05e8\u05d9\u05ea, \u0939\u093f\u0928\u094d\u0926\u0940, Fiji Hindi, Hrvatski, Krey\u00f2l ayisyen, Magyar, \u0540\u0561\u0575\u0565\u0580\u0565\u0576, Interlingua, Bahasa Indonesia, Ilokano, Ido, \u00cdslenska, Italiano, \u65e5\u672c\u8a9e, Lojban, Basa Jawa, \u10e5\u10d0\u10e0\u10d7\u10e3\u10da\u10d8, Kongo, Kalaallisut, \u0c95\u0ca8\u0ccd\u0ca8\u0ca1, \ud55c\uad6d\uc5b4, \u041a\u044a\u0430\u0440\u0430\u0447\u0430\u0439-\u041c\u0430\u043b\u043a\u044a\u0430\u0440, Ripoarisch, Kurd\u00ee, \u041a\u043e\u043c\u0438, Kernewek, \u041a\u044b\u0440\u0433\u044b\u0437\u0447\u0430, Latina, Ladino, L\u00ebtzebuergesch, Limburgs, Ling\u00e1la, \u0ea5\u0eb2\u0ea7, Lietuvi\u0173, Latvie\u0161u, Basa Banyumasan, Malagasy, \u041c\u0430\u043a\u0435\u0434\u043e\u043d\u0441\u043a\u0438, \u0d2e\u0d32\u0d2f\u0d3e\u0d33\u0d02, \u092e\u0930\u093e\u0920\u0940, Bahasa Melayu, \u0645\u0627\u0632\u0650\u0631\u0648\u0646\u06cc, Nnapulitano, Nedersaksisch, \u0928\u0947\u092a\u093e\u0932 \u092d\u093e\u0937\u093e, Nederlands, \u202aNorsk (nynorsk)\u202c, \u202aNorsk (bokm\u00e5l)\u202c, Nouormand, Din\u00e9 bizaad, Occitan, \u0418\u0440\u043e\u043d\u0430\u0443, Papiamentu, Deitsch, Norfuk \/ Pitkern, Polski, \u067e\u0646\u062c\u0627\u0628\u06cc, \u067e\u069a\u062a\u0648, Portugu\u00eas, Runa Simi, Rumantsch, Romani, Rom\u00e2n\u0103, \u0420\u0443\u0441\u0441\u043a\u0438\u0439, \u0421\u0430\u0445\u0430 \u0442\u044b\u043b\u0430, Sardu, Sicilianu, Scots, S\u00e1megiella, Simple English, Sloven\u010dina, Sloven\u0161\u010dina, \u0421\u0440\u043f\u0441\u043a\u0438 \/ Srpski, Seeltersk, Svenska, Kiswahili, \u0ba4\u0bae\u0bbf\u0bb4\u0bcd, \u0c24\u0c46\u0c32\u0c41\u0c17\u0c41, \u0422\u043e\u04b7\u0438\u043a\u04e3, \u0e44\u0e17\u0e22, T\u00fcrkmen\u00e7e, Tagalog, T\u00fcrk\u00e7e, \u0422\u0430\u0442\u0430\u0440\u0447\u0430\/Tatar\u00e7a, \u0423\u043a\u0440\u0430\u0457\u043d\u0441\u044c\u043a\u0430, \u0627\u0631\u062f\u0648, Ti\u1ebfng Vi\u1ec7t, Volap\u00fck, Walon, Winaray, \u5434\u8bed, isiXhosa, \u05d9\u05d9\u05b4\u05d3\u05d9\u05e9, Yor\u00f9b\u00e1, Ze\u00eauws, \u4e2d\u6587, B\u00e2n-l\u00e2m-g\u00fa, \u7cb5\u8a9e":"long key"}}';
-
-        self::$testArgsJSON['testSet'] = '{"thing":[1,5,6]}';
-
-        self::$testArgsJSON['testList'] = '{"thing":[1,2,3]}';
-
-        self::$testArgsJSON['testEnum'] = '{"thing":1}';
-
-        self::$testArgsJSON['testTypedef'] = '{"thing":69}';
-    }
-}
diff --git a/lib/php/test/Unit/BaseValidatorTest.php b/lib/php/test/Integration/BaseValidatorTest.php
similarity index 75%
rename from lib/php/test/Unit/BaseValidatorTest.php
rename to lib/php/test/Integration/BaseValidatorTest.php
index 4404e72..ae9d584 100644
--- a/lib/php/test/Unit/BaseValidatorTest.php
+++ b/lib/php/test/Integration/BaseValidatorTest.php
@@ -19,7 +19,7 @@
  * under the License.
  */
 
-namespace Test\Thrift\Unit;
+namespace Test\Thrift\Integration;
 
 use PHPUnit\Framework\TestCase;
 use Thrift\Exception\TProtocolException;
@@ -28,38 +28,41 @@
 
 abstract class BaseValidatorTest extends TestCase
 {
+    abstract public function getNsGlobal();
+
     public function testEmptyStructValidator()
     {
-        $this->assertNoReadValidator('ThriftTest\EmptyStruct');
-        $this->assertNoWriteValidator('ThriftTest\EmptyStruct');
+        $this->assertNoReadValidator($this->getNsGlobal() . '\ThriftTest\EmptyStruct');
+        $this->assertNoWriteValidator($this->getNsGlobal() . '\ThriftTest\EmptyStruct');
     }
 
     public function testBonkValidator()
     {
-        $this->assertNoReadValidator('ThriftTest\Bonk');
-        $this->assertHasWriteValidator('ThriftTest\Bonk');
+        $this->assertNoReadValidator($this->getNsGlobal() . '\ThriftTest\Bonk');
+        $this->assertHasWriteValidator($this->getNsGlobal() . '\ThriftTest\Bonk');
     }
 
     public function testStructAValidator()
     {
-        $this->assertHasReadValidator('ThriftTest\StructA');
-        $this->assertHasWriteValidator('ThriftTest\StructA');
+        $this->assertHasReadValidator($this->getNsGlobal() . '\ThriftTest\StructA');
+        $this->assertHasWriteValidator($this->getNsGlobal() . '\ThriftTest\StructA');
     }
 
     public function testUnionOfStringsValidator()
     {
-        $this->assertNoWriteValidator('TestValidators\UnionOfStrings');
+        $this->assertNoWriteValidator($this->getNsGlobal() . '\TestValidators\UnionOfStrings');
     }
 
     public function testServiceResultValidator()
     {
-        $this->assertNoReadValidator('TestValidators\TestService_test_result');
-        $this->assertNoWriteValidator('TestValidators\TestService_test_result');
+        $this->assertNoReadValidator($this->getNsGlobal() . '\TestValidators\TestService_test_result');
+        $this->assertNoWriteValidator($this->getNsGlobal() . '\TestValidators\TestService_test_result');
     }
 
     public function testReadEmpty()
     {
-        $bonk = new \ThriftTest\Bonk();
+        $className = $this->getNsGlobal() . '\ThriftTest\Bonk';
+        $bonk = new $className();
         $transport = new TMemoryBuffer("\000");
         $protocol = new TBinaryProtocol($transport);
         $bonk->read($protocol);
@@ -68,7 +71,8 @@
 
     public function testWriteEmpty()
     {
-        $bonk = new \ThriftTest\Bonk();
+        $className = $this->getNsGlobal() . '\ThriftTest\Bonk';
+        $bonk = new $className();
         $transport = new TMemoryBuffer();
         $protocol = new TBinaryProtocol($transport);
         try {
@@ -83,7 +87,8 @@
     public function testWriteWithMissingRequired()
     {
         // Check that we are not able to write StructA with a missing required field
-        $structa = new \ThriftTest\StructA();
+        $className = $this->getNsGlobal() . '\ThriftTest\StructA';
+        $structa = new $className();
         $transport = new TMemoryBuffer();
         $protocol = new TBinaryProtocol($transport);
 
@@ -100,7 +105,8 @@
     {
         $transport = new TMemoryBuffer(base64_decode('CwABAAAAA2FiYwA='));
         $protocol = new TBinaryProtocol($transport);
-        $structa = new \ThriftTest\StructA();
+        $className = $this->getNsGlobal() . '\ThriftTest\StructA';
+        $structa = new $className();
         $structa->read($protocol);
         $this->assertEquals("abc", $structa->s);
     }
@@ -109,7 +115,8 @@
     {
         $transport = new TMemoryBuffer();
         $protocol = new TBinaryProtocol($transport);
-        $structa = new \ThriftTest\StructA();
+        $className = $this->getNsGlobal() . '\ThriftTest\StructA';
+        $structa = new $className();
         $structa->s = "abc";
         $structa->write($protocol);
         $writeResult = base64_encode($transport->getBuffer());
diff --git a/lib/php/test/Integration/Lib/ClassLoader/ThriftClassLoaderTest.php b/lib/php/test/Integration/Lib/ClassLoader/ThriftClassLoaderTest.php
new file mode 100644
index 0000000..a43f5c6
--- /dev/null
+++ b/lib/php/test/Integration/Lib/ClassLoader/ThriftClassLoaderTest.php
@@ -0,0 +1,139 @@
+<?php
+
+/*
+ * 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 Test\Thrift\Integration\Lib\ClassLoader;
+
+use phpmock\phpunit\PHPMock;
+use PHPUnit\Framework\TestCase;
+use Thrift\ClassLoader\ThriftClassLoader;
+
+/***
+ * This test depends on running the compiler against the ./Resources/ThriftTest.thrift file:
+ * lib/php/test$ ../../../compiler/cpp/thrift --gen php:classmap,server,rest,nsglobal="Classmap" -r  --out ./Resources/packages/phpcm ./Resources/ThriftTest.thrift
+ */
+class ThriftClassLoaderTest extends TestCase
+{
+    use PHPMock;
+
+    /**
+     * @dataProvider registerDefinitionDataProvider
+     */
+    public function testRegisterDefinition(
+        $definitions,
+        $class,
+        $checkInterfaceExist = false,
+        $useApcu = false,
+        $apcuPrefix = null
+    ) {
+        $this->getFunctionMock('Thrift\ClassLoader', 'apcu_fetch')
+             ->expects($useApcu ? $this->any() : $this->never())
+             ->with($apcuPrefix . $class)
+             ->willReturn(false);
+
+        $this->getFunctionMock('Thrift\ClassLoader', 'apcu_store')
+            ->expects($useApcu ? $this->any() : $this->never())
+             ->with($apcuPrefix . $class, $this->anything())
+             ->willReturn(true);
+
+        $loader = new ThriftClassLoader($useApcu, $apcuPrefix);
+        foreach ($definitions as $namespace => $paths) {
+            $loader->registerDefinition($namespace, $paths);
+        }
+        $loader->register();
+
+        $loader->loadClass($class);
+        if ($checkInterfaceExist) {
+            $this->assertTrue(interface_exists($class, false), "->loadClass() loads '$class'");
+        } else {
+            $this->assertTrue(class_exists($class, false), "->loadClass() loads '$class'");
+        }
+    }
+
+    public function registerDefinitionDataProvider()
+    {
+        yield 'loadType' => [
+            'definitions' => [
+                'Classmap' => __DIR__ . '/../../../Resources/packages/phpcm',
+            ],
+            'class' => 'Classmap\ThriftTest\Xtruct',
+        ];
+        yield 'loadInterface' => [
+            'definitions' => [
+                'Classmap' => __DIR__ . '/../../../Resources/packages/phpcm',
+            ],
+            'class' => '\Classmap\ThriftTest\ThriftTestIf',
+            'checkInterfaceExist' => true,
+        ];
+        yield 'loadClient' => [
+            'definitions' => [
+                'Classmap' => __DIR__ . '/../../../Resources/packages/phpcm',
+            ],
+            'class' => '\Classmap\ThriftTest\ThriftTestClient',
+        ];
+        yield 'loadProcessor' => [
+            'definitions' => [
+                'Classmap' => __DIR__ . '/../../../Resources/packages/phpcm',
+            ],
+            'class' => '\Classmap\ThriftTest\ThriftTestProcessor',
+        ];
+        yield 'loadRest' => [
+            'definitions' => [
+                'Classmap' => __DIR__ . '/../../../Resources/packages/phpcm',
+            ],
+            'class' => '\Classmap\ThriftTest\ThriftTestRest',
+        ];
+        yield 'load_args' => [
+            'definitions' => [
+                'Classmap' => __DIR__ . '/../../../Resources/packages/phpcm',
+            ],
+            'class' => '\Classmap\ThriftTest\ThriftTest_testVoid_args',
+        ];
+        yield 'load_result' => [
+            'definitions' => [
+                'Classmap' => __DIR__ . '/../../../Resources/packages/phpcm',
+            ],
+            'class' => '\Classmap\ThriftTest\ThriftTest_testVoid_result',
+        ];
+        yield 'pathAsArray' => [
+            'definitions' => [
+                'Classmap' => [__DIR__ . '/../../../Resources/packages/phpcm'],
+            ],
+            'class' => 'Classmap\ThriftTest\Xtruct',
+        ];
+        yield 'severalDefinitions' => [
+            'definitions' => [
+                'Classmap\ThriftTest' => [__DIR__ . '/../../../Resources/packages/phpcm'],
+                'Classmap\TestValidators' => [__DIR__ . '/../../../Resources/packages/phpcm'],
+            ],
+            'class' => '\Classmap\TestValidators\TestServiceClient',
+        ];
+        yield 'useApcu' => [
+            'definitions' => [
+                'Classmap\ThriftTest' => [__DIR__ . '/../../../Resources/packages/phpcm'],
+                'Classmap\TestValidators' => [__DIR__ . '/../../../Resources/packages/phpcm'],
+            ],
+            'class' => '\Classmap\TestValidators\TestServiceClient',
+            'checkInterfaceExist' => false,
+            'useApcu' => true,
+            'apcuPrefix' => 'APCU_PREFIX',
+        ];
+    }
+}
diff --git a/lib/php/test/Integration/Lib/Protocol/TJSONProtocolTest.php b/lib/php/test/Integration/Lib/Protocol/TJSONProtocolTest.php
new file mode 100644
index 0000000..515cbdb
--- /dev/null
+++ b/lib/php/test/Integration/Lib/Protocol/TJSONProtocolTest.php
@@ -0,0 +1,646 @@
+<?php
+
+/*
+ * 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 Test\Thrift\Integration\Lib\Protocol;
+
+use PHPUnit\Framework\TestCase;
+use Thrift\Protocol\TJSONProtocol;
+use Thrift\Transport\TMemoryBuffer;
+use Basic\ThriftTest\Insanity;
+use Basic\ThriftTest\Numberz;
+use Basic\ThriftTest\Xtruct;
+use Basic\ThriftTest\Xtruct2;
+
+/***
+ * This test suite depends on running the compiler against the ./Resources/ThriftTest.thrift file:
+ * lib/php/test$ ../../../compiler/cpp/thrift --gen php:nsglobal="Basic" -r  --out ./Resources/packages/php ./Resources/ThriftTest.thrift
+ */
+class TJSONProtocolTest extends TestCase
+{
+    private const BUFFER_SIZE = 8192; //big enough to read biggest serialized Fixture arg.
+
+    private $transport;
+    private $protocol;
+
+    public static function setUpBeforeClass(): void
+    {
+        if (!is_dir(__DIR__ . '/../../../Resources/packages/php')) {
+            self::fail(
+                'Before running Integration test suite, you must run the Thrift compiler against the ThriftTest.thrift file in the ./Resources directory.'
+            );
+        }
+    }
+
+    public function setUp(): void
+    {
+        $this->transport = new TMemoryBuffer();
+        $this->protocol = new TJSONProtocol($this->transport);
+        $this->transport->open();
+    }
+
+    public function testMessageReadWrite()
+    {
+        $input = new TJSONProtocol(new TMemoryBuffer('[1,"testString",1,0,{"0":{"str":"successResponse"}}]'));
+        $service = new \Basic\ThriftTest\ThriftTestClient($input, $this->protocol);
+        $result = $service->testString('test');
+        $this->assertSame('successResponse', $result);
+    }
+
+    /**
+     * @dataProvider writeDataProvider
+     */
+    public function testWrite(
+        $argsClassName,
+        $argsValues,
+        $expected
+    ) {
+        $args = new $argsClassName($argsValues);
+        $args->write($this->protocol);
+
+        $actual = $this->transport->read(self::BUFFER_SIZE);
+
+        $this->assertEquals($expected, $actual);
+    }
+
+    public function writeDataProvider()
+    {
+        if (!is_dir(__DIR__ . '/../../../Resources/packages/php')) {
+            throw new \RuntimeException(
+                'Before running Integration test suite, you must run the Thrift compiler against the ThriftTest.thrift file in the ./Resources directory.'
+            );
+        }
+
+        yield 'void' => [
+            'argsClassName' => \Basic\ThriftTest\ThriftTest_testVoid_args::class,
+            'argsValues' => [],
+            'expected' => '{}',
+        ];
+        yield 'bool true' => [
+            'argsClassName' => \Basic\ThriftTest\ThriftTest_testBool_args::class,
+            'argsValues' => [
+                'thing' => true,
+            ],
+            'expected' => '{"1":{"tf":1}}',
+        ];
+        yield 'bool false' => [
+            'argsClassName' => \Basic\ThriftTest\ThriftTest_testBool_args::class,
+            'argsValues' => [
+                'thing' => false,
+            ],
+            'expected' => '{"1":{"tf":0}}',
+        ];
+        yield 'string1' => [
+            'argsClassName' => \Basic\ThriftTest\ThriftTest_testString_args::class,
+            'argsValues' => [
+                'thing' => "Afrikaans, Alemannisch, Aragonés, العربية, مصرى, Asturianu, Aymar aru, Azərbaycan, Башҡорт, Boarisch, Žemaitėška, Беларуская, Беларуская (тарашкевіца), Български, Bamanankan, বাংলা, Brezhoneg, Bosanski, Català, Mìng-dĕ̤ng-ngṳ̄, Нохчийн, Cebuano, ᏣᎳᎩ, Česky, Словѣ́ньскъ / ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ, Чӑвашла, Cymraeg, Dansk, Zazaki, ދިވެހިބަސް, Ελληνικά, Emiliàn e rumagnòl, English, Esperanto, Español, Eesti, Euskara, فارسی, Suomi, Võro, Føroyskt, Français, Arpetan, Furlan, Frysk, Gaeilge, 贛語, Gàidhlig, Galego, Avañe'ẽ, ગુજરાતી, Gaelg, עברית, हिन्दी, Fiji Hindi, Hrvatski, Kreyòl ayisyen, Magyar, Հայերեն, Interlingua, Bahasa Indonesia, Ilokano, Ido, Íslenska, Italiano, 日本語, Lojban, Basa Jawa, ქართული, Kongo, Kalaallisut, ಕನ್ನಡ, 한국어, Къарачай-Малкъар, Ripoarisch, Kurdî, Коми, Kernewek, Кыргызча, Latina, Ladino, Lëtzebuergesch, Limburgs, Lingála, ລາວ, Lietuvių, Latviešu, Basa Banyumasan, Malagasy, Македонски, മലയാളം, मराठी, Bahasa Melayu, مازِرونی, Nnapulitano, Nedersaksisch, नेपाल भाषा, Nederlands, ‪Norsk (nynorsk)‬, ‪Norsk (bokmål)‬, Nouormand, Diné bizaad, Occitan, Иронау, Papiamentu, Deitsch, Norfuk / Pitkern, Polski, پنجابی, پښتو, Português, Runa Simi, Rumantsch, Romani, Română, Русский, Саха тыла, Sardu, Sicilianu, Scots, Sámegiella, Simple English, Slovenčina, Slovenščina, Српски / Srpski, Seeltersk, Svenska, Kiswahili, தமிழ், తెలుగు, Тоҷикӣ, ไทย, Türkmençe, Tagalog, Türkçe, Татарча/Tatarça, Українська, اردو, Tiếng Việt, Volapük, Walon, Winaray, 吴语, isiXhosa, ייִדיש, Yorùbá, Zeêuws, 中文, Bân-lâm-gú, 粵語",
+            ],
+            'expected' => '{"1":{"str":"Afrikaans, Alemannisch, Aragonés, العربية, مصرى, Asturianu, Aymar aru, Azərbaycan, Башҡорт, Boarisch, Žemaitėška, Беларуская, Беларуская (тарашкевіца), Български, Bamanankan, বাংলা, Brezhoneg, Bosanski, Català, Mìng-dĕ̤ng-ngṳ̄, Нохчийн, Cebuano, ᏣᎳᎩ, Česky, Словѣ́ньскъ \/ ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ, Чӑвашла, Cymraeg, Dansk, Zazaki, ދިވެހިބަސް, Ελληνικά, Emiliàn e rumagnòl, English, Esperanto, Español, Eesti, Euskara, فارسی, Suomi, Võro, Føroyskt, Français, Arpetan, Furlan, Frysk, Gaeilge, 贛語, Gàidhlig, Galego, Avañe\'ẽ, ગુજરાતી, Gaelg, עברית, हिन्दी, Fiji Hindi, Hrvatski, Kreyòl ayisyen, Magyar, Հայերեն, Interlingua, Bahasa Indonesia, Ilokano, Ido, Íslenska, Italiano, 日本語, Lojban, Basa Jawa, ქართული, Kongo, Kalaallisut, ಕನ್ನಡ, 한국어, Къарачай-Малкъар, Ripoarisch, Kurdî, Коми, Kernewek, Кыргызча, Latina, Ladino, Lëtzebuergesch, Limburgs, Lingála, ລາວ, Lietuvių, Latviešu, Basa Banyumasan, Malagasy, Македонски, മലയാളം, मराठी, Bahasa Melayu, مازِرونی, Nnapulitano, Nedersaksisch, नेपाल भाषा, Nederlands, ‪Norsk (nynorsk)‬, ‪Norsk (bokmål)‬, Nouormand, Diné bizaad, Occitan, Иронау, Papiamentu, Deitsch, Norfuk \/ Pitkern, Polski, پنجابی, پښتو, Português, Runa Simi, Rumantsch, Romani, Română, Русский, Саха тыла, Sardu, Sicilianu, Scots, Sámegiella, Simple English, Slovenčina, Slovenščina, Српски \/ Srpski, Seeltersk, Svenska, Kiswahili, தமிழ், తెలుగు, Тоҷикӣ, ไทย, Türkmençe, Tagalog, Türkçe, Татарча\/Tatarça, Українська, اردو, Tiếng Việt, Volapük, Walon, Winaray, 吴语, isiXhosa, ייִדיש, Yorùbá, Zeêuws, 中文, Bân-lâm-gú, 粵語"}}',
+        ];
+        yield 'string2' => [
+            'argsClassName' => \Basic\ThriftTest\ThriftTest_testString_args::class,
+            'argsValues' => [
+                'thing' => "quote: \\\" backslash:" .
+                    " forwardslash-escaped: \\/ " .
+                    " backspace: \b formfeed: \f newline: \n return: \r tab: " .
+                    " now-all-of-them-together: \"\\\/\b\n\r\t" .
+                    " now-a-bunch-of-junk: !@#\$%&()(&%$#{}{}<><><",
+            ],
+            'expected' => '{"1":{"str":"quote: \\\\\" backslash: forwardslash-escaped: \\\\\/  backspace: \\\\b formfeed: \f newline: \n return: \r tab:  now-all-of-them-together: \"\\\\\\\\\/\\\\b\n\r\t now-a-bunch-of-junk: !@#$%&()(&%$#{}{}<><><"}}',
+        ];
+        yield 'string3' => [
+            'argsClassName' => \Basic\ThriftTest\ThriftTest_testString_args::class,
+            'argsValues' => [
+                'thing' => "string that ends in double-backslash \\\\",
+            ],
+            'expected' => '{"1":{"str":"string that ends in double-backslash \\\\\\\\"}}',
+        ];
+        yield 'string4 testUnicodeStringWithNonBMP' => [
+            'argsClassName' => \Basic\ThriftTest\ThriftTest_testString_args::class,
+            'argsValues' => [
+                'thing' => "สวัสดี/𝒯",
+            ],
+            'expected' => '{"1":{"str":"สวัสดี\/𝒯"}}',
+        ];
+        yield 'double' => [
+            'argsClassName' => \Basic\ThriftTest\ThriftTest_testDouble_args::class,
+            'argsValues' => [
+                'thing' => 3.1415926535898,
+            ],
+            'expected' => '{"1":{"dbl":3.1415926535898}}',
+        ];
+        #TODO Should be fixed in future
+        yield 'double Nan' => [
+            'argsClassName' => \Basic\ThriftTest\ThriftTest_testDouble_args::class,
+            'argsValues' => [
+                'thing' => NAN,
+            ],
+            'expected' => '{"1":{"dbl":}}',
+        ];
+        #TODO Should be fixed in future
+        yield 'double Infinity' => [
+            'argsClassName' => \Basic\ThriftTest\ThriftTest_testDouble_args::class,
+            'argsValues' => [
+                'thing' => INF,
+            ],
+            'expected' => '{"1":{"dbl":}}',
+        ];
+        yield 'byte' => [
+            'argsClassName' => \Basic\ThriftTest\ThriftTest_testByte_args::class,
+            'argsValues' => [
+                'thing' => 0x01,
+            ],
+            'expected' => '{"1":{"i8":1}}',
+        ];
+        yield 'i32' => [
+            'argsClassName' => \Basic\ThriftTest\ThriftTest_testI32_args::class,
+            'argsValues' => [
+                'thing' => pow(2, 30),
+            ],
+            'expected' => '{"1":{"i32":1073741824}}',
+        ];
+        if (PHP_INT_SIZE == 8) {
+            yield 'i64_64Architecture' => [
+                'argsClassName' => \Basic\ThriftTest\ThriftTest_testI64_args::class,
+                'argsValues' => [
+                    'thing' => pow(2, 60),
+                ],
+                'expected' => '{"1":{"i64":' . pow(2, 60) . '}}',
+            ];
+            yield 'struct_64Architecture' => [
+                'argsClassName' => \Basic\ThriftTest\ThriftTest_testStruct_args::class,
+                'argsValues' => [
+                    'thing' => new Xtruct(
+                        [
+                            'string_thing' => 'worked',
+                            'byte_thing' => 0x01,
+                            'i32_thing' => pow(2, 30),
+                            'i64_thing' => pow(2, 60),
+                        ]
+                    ),
+                ],
+                'expected' => '{"1":{"rec":{"1":{"str":"worked"},"4":{"i8":1},"9":{"i32":1073741824},"11":{"i64":' . pow(2, 60) . '}}}}',
+            ];
+            yield 'nest_64Architecture' => [
+                'argsClassName' => \Basic\ThriftTest\ThriftTest_testNest_args::class,
+                'argsValues' => [
+                    'thing' => new Xtruct2(
+                        [
+                            'byte_thing' => 0x01,
+                            'struct_thing' => new Xtruct(
+                                [
+                                    'string_thing' => 'worked',
+                                    'byte_thing' => 0x01,
+                                    'i32_thing' => pow(2, 30),
+                                    'i64_thing' => pow(2, 60),
+                                ]
+                            ),
+                            'i32_thing' => pow(2, 15),
+                        ]
+                    ),
+                ],
+                'expected' => '{"1":{"rec":{"1":{"i8":1},"2":{"rec":{"1":{"str":"worked"},"4":{"i8":1},"9":{"i32":1073741824},"11":{"i64":' . pow(2, 60) . '}}},"3":{"i32":32768}}}}',
+            ];
+        } else {
+            yield 'i64_32Architecture' => [
+                'argsClassName' => \Basic\ThriftTest\ThriftTest_testI64_args::class,
+                'argsValues' => [
+                    'thing' => "1152921504606847000",
+                ],
+                'expected' => '{"1":{"i64":1152921504606847000}}',
+            ];
+            yield 'struct_32Architecture' => [
+                'argsClassName' => \Basic\ThriftTest\ThriftTest_testStruct_args::class,
+                'argsValues' => [
+                    'thing' => new Xtruct(
+                        [
+                            'string_thing' => 'worked',
+                            'byte_thing' => 0x01,
+                            'i32_thing' => pow(2, 30),
+                            'i64_thing' => pow(2, 60),
+                        ]
+                    ),
+                ],
+                'expected' => '{"1":{"rec":{"1":{"str":"worked"},"4":{"i8":1},"9":{"i32":1073741824},"11":{"i64":1152921504606847000}}}}',
+            ];
+            yield 'nest_32Architecture' => [
+                'argsClassName' => \Basic\ThriftTest\ThriftTest_testNest_args::class,
+                'argsValues' => [
+                    'thing' => new Xtruct2(
+                        [
+                            'byte_thing' => 0x01,
+                            'struct_thing' => new Xtruct(
+                                [
+                                    'string_thing' => 'worked',
+                                    'byte_thing' => 0x01,
+                                    'i32_thing' => pow(2, 30),
+                                    'i64_thing' => '1152921504606847000',
+                                ]
+                            ),
+                            'i32_thing' => pow(2, 15),
+                        ]
+                    ),
+                ],
+                'expected' => '{"1":{"rec":{"1":{"i8":1},"2":{"rec":{"1":{"str":"worked"},"4":{"i8":1},"9":{"i32":1073741824},"11":{"i64":1152921504606847000}}},"3":{"i32":32768}}}}',
+            ];
+        }
+        yield 'map' => [
+            'argsClassName' => \Basic\ThriftTest\ThriftTest_testMap_args::class,
+            'argsValues' => [
+                'thing' => [
+                    7 => 77,
+                    8 => 88,
+                    9 => 99,
+                ],
+            ],
+            'expected' => '{"1":{"map":["i32","i32",3,{"7":77,"8":88,"9":99}]}}',
+        ];
+        yield 'stringMap' => [
+            'argsClassName' => \Basic\ThriftTest\ThriftTest_testStringMap_args::class,
+            'argsValues' => [
+                'thing' => [
+                    "a" => "123",
+                    "a b" => "with spaces ",
+                    "same" => "same",
+                    "0" => "numeric key",
+                    "longValue" => "Afrikaans, Alemannisch, Aragonés, العربية, مصرى, Asturianu, Aymar aru, Azərbaycan, Башҡорт, Boarisch, Žemaitėška, Беларуская, Беларуская (тарашкевіца), Български, Bamanankan, বাংলা, Brezhoneg, Bosanski, Català, Mìng-dĕ̤ng-ngṳ̄, Нохчийн, Cebuano, ᏣᎳᎩ, Česky, Словѣ́ньскъ / ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ, Чӑвашла, Cymraeg, Dansk, Zazaki, ދިވެހިބަސް, Ελληνικά, Emiliàn e rumagnòl, English, Esperanto, Español, Eesti, Euskara, فارسی, Suomi, Võro, Føroyskt, Français, Arpetan, Furlan, Frysk, Gaeilge, 贛語, Gàidhlig, Galego, Avañe'ẽ, ગુજરાતી, Gaelg, עברית, हिन्दी, Fiji Hindi, Hrvatski, Kreyòl ayisyen, Magyar, Հայերեն, Interlingua, Bahasa Indonesia, Ilokano, Ido, Íslenska, Italiano, 日本語, Lojban, Basa Jawa, ქართული, Kongo, Kalaallisut, ಕನ್ನಡ, 한국어, Къарачай-Малкъар, Ripoarisch, Kurdî, Коми, Kernewek, Кыргызча, Latina, Ladino, Lëtzebuergesch, Limburgs, Lingála, ລາວ, Lietuvių, Latviešu, Basa Banyumasan, Malagasy, Македонски, മലയാളം, मराठी, Bahasa Melayu, مازِرونی, Nnapulitano, Nedersaksisch, नेपाल भाषा, Nederlands, ‪Norsk (nynorsk)‬, ‪Norsk (bokmål)‬, Nouormand, Diné bizaad, Occitan, Иронау, Papiamentu, Deitsch, Norfuk / Pitkern, Polski, پنجابی, پښتو, Português, Runa Simi, Rumantsch, Romani, Română, Русский, Саха тыла, Sardu, Sicilianu, Scots, Sámegiella, Simple English, Slovenčina, Slovenščina, Српски / Srpski, Seeltersk, Svenska, Kiswahili, தமிழ், తెలుగు, Тоҷикӣ, ไทย, Türkmençe, Tagalog, Türkçe, Татарча/Tatarça, Українська, اردو, Tiếng Việt, Volapük, Walon, Winaray, 吴语, isiXhosa, ייִדיש, Yorùbá, Zeêuws, 中文, Bân-lâm-gú, 粵語",
+                    "Afrikaans, Alemannisch, Aragonés, العربية, مصرى, Asturianu, Aymar aru, Azərbaycan, Башҡорт, Boarisch, Žemaitėška, Беларуская, Беларуская (тарашкевіца), Български, Bamanankan, বাংলা, Brezhoneg, Bosanski, Català, Mìng-dĕ̤ng-ngṳ̄, Нохчийн, Cebuano, ᏣᎳᎩ, Česky, Словѣ́ньскъ / ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ, Чӑвашла, Cymraeg, Dansk, Zazaki, ދިވެހިބަސް, Ελληνικά, Emiliàn e rumagnòl, English, Esperanto, Español, Eesti, Euskara, فارسی, Suomi, Võro, Føroyskt, Français, Arpetan, Furlan, Frysk, Gaeilge, 贛語, Gàidhlig, Galego, Avañe'ẽ, ગુજરાતી, Gaelg, עברית, हिन्दी, Fiji Hindi, Hrvatski, Kreyòl ayisyen, Magyar, Հայերեն, Interlingua, Bahasa Indonesia, Ilokano, Ido, Íslenska, Italiano, 日本語, Lojban, Basa Jawa, ქართული, Kongo, Kalaallisut, ಕನ್ನಡ, 한국어, Къарачай-Малкъар, Ripoarisch, Kurdî, Коми, Kernewek, Кыргызча, Latina, Ladino, Lëtzebuergesch, Limburgs, Lingála, ລາວ, Lietuvių, Latviešu, Basa Banyumasan, Malagasy, Македонски, മലയാളം, मराठी, Bahasa Melayu, مازِرونی, Nnapulitano, Nedersaksisch, नेपाल भाषा, Nederlands, ‪Norsk (nynorsk)‬, ‪Norsk (bokmål)‬, Nouormand, Diné bizaad, Occitan, Иронау, Papiamentu, Deitsch, Norfuk / Pitkern, Polski, پنجابی, پښتو, Português, Runa Simi, Rumantsch, Romani, Română, Русский, Саха тыла, Sardu, Sicilianu, Scots, Sámegiella, Simple English, Slovenčina, Slovenščina, Српски / Srpski, Seeltersk, Svenska, Kiswahili, தமிழ், తెలుగు, Тоҷикӣ, ไทย, Türkmençe, Tagalog, Türkçe, Татарча/Tatarça, Українська, اردو, Tiếng Việt, Volapük, Walon, Winaray, 吴语, isiXhosa, ייִדיש, Yorùbá, Zeêuws, 中文, Bân-lâm-gú, 粵語" => "long key",
+                ],
+            ],
+            'expected' => '{"1":{"map":["str","str",6,{"a":"123","a b":"with spaces ","same":"same","0":"numeric key","longValue":"Afrikaans, Alemannisch, Aragonés, العربية, مصرى, Asturianu, Aymar aru, Azərbaycan, Башҡорт, Boarisch, Žemaitėška, Беларуская, Беларуская (тарашкевіца), Български, Bamanankan, বাংলা, Brezhoneg, Bosanski, Català, Mìng-dĕ̤ng-ngṳ̄, Нохчийн, Cebuano, ᏣᎳᎩ, Česky, Словѣ́ньскъ \/ ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ, Чӑвашла, Cymraeg, Dansk, Zazaki, ދިވެހިބަސް, Ελληνικά, Emiliàn e rumagnòl, English, Esperanto, Español, Eesti, Euskara, فارسی, Suomi, Võro, Føroyskt, Français, Arpetan, Furlan, Frysk, Gaeilge, 贛語, Gàidhlig, Galego, Avañe\'ẽ, ગુજરાતી, Gaelg, עברית, हिन्दी, Fiji Hindi, Hrvatski, Kreyòl ayisyen, Magyar, Հայերեն, Interlingua, Bahasa Indonesia, Ilokano, Ido, Íslenska, Italiano, 日本語, Lojban, Basa Jawa, ქართული, Kongo, Kalaallisut, ಕನ್ನಡ, 한국어, Къарачай-Малкъар, Ripoarisch, Kurdî, Коми, Kernewek, Кыргызча, Latina, Ladino, Lëtzebuergesch, Limburgs, Lingála, ລາວ, Lietuvių, Latviešu, Basa Banyumasan, Malagasy, Македонски, മലയാളം, मराठी, Bahasa Melayu, مازِرونی, Nnapulitano, Nedersaksisch, नेपाल भाषा, Nederlands, ‪Norsk (nynorsk)‬, ‪Norsk (bokmål)‬, Nouormand, Diné bizaad, Occitan, Иронау, Papiamentu, Deitsch, Norfuk \/ Pitkern, Polski, پنجابی, پښتو, Português, Runa Simi, Rumantsch, Romani, Română, Русский, Саха тыла, Sardu, Sicilianu, Scots, Sámegiella, Simple English, Slovenčina, Slovenščina, Српски \/ Srpski, Seeltersk, Svenska, Kiswahili, தமிழ், తెలుగు, Тоҷикӣ, ไทย, Türkmençe, Tagalog, Türkçe, Татарча\/Tatarça, Українська, اردو, Tiếng Việt, Volapük, Walon, Winaray, 吴语, isiXhosa, ייִדיש, Yorùbá, Zeêuws, 中文, Bân-lâm-gú, 粵語","Afrikaans, Alemannisch, Aragonés, العربية, مصرى, Asturianu, Aymar aru, Azərbaycan, Башҡорт, Boarisch, Žemaitėška, Беларуская, Беларуская (тарашкевіца), Български, Bamanankan, বাংলা, Brezhoneg, Bosanski, Català, Mìng-dĕ̤ng-ngṳ̄, Нохчийн, Cebuano, ᏣᎳᎩ, Česky, Словѣ́ньскъ \/ ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ, Чӑвашла, Cymraeg, Dansk, Zazaki, ދިވެހިބަސް, Ελληνικά, Emiliàn e rumagnòl, English, Esperanto, Español, Eesti, Euskara, فارسی, Suomi, Võro, Føroyskt, Français, Arpetan, Furlan, Frysk, Gaeilge, 贛語, Gàidhlig, Galego, Avañe\'ẽ, ગુજરાતી, Gaelg, עברית, हिन्दी, Fiji Hindi, Hrvatski, Kreyòl ayisyen, Magyar, Հայերեն, Interlingua, Bahasa Indonesia, Ilokano, Ido, Íslenska, Italiano, 日本語, Lojban, Basa Jawa, ქართული, Kongo, Kalaallisut, ಕನ್ನಡ, 한국어, Къарачай-Малкъар, Ripoarisch, Kurdî, Коми, Kernewek, Кыргызча, Latina, Ladino, Lëtzebuergesch, Limburgs, Lingála, ລາວ, Lietuvių, Latviešu, Basa Banyumasan, Malagasy, Македонски, മലയാളം, मराठी, Bahasa Melayu, مازِرونی, Nnapulitano, Nedersaksisch, नेपाल भाषा, Nederlands, ‪Norsk (nynorsk)‬, ‪Norsk (bokmål)‬, Nouormand, Diné bizaad, Occitan, Иронау, Papiamentu, Deitsch, Norfuk \/ Pitkern, Polski, پنجابی, پښتو, Português, Runa Simi, Rumantsch, Romani, Română, Русский, Саха тыла, Sardu, Sicilianu, Scots, Sámegiella, Simple English, Slovenčina, Slovenščina, Српски \/ Srpski, Seeltersk, Svenska, Kiswahili, தமிழ், తెలుగు, Тоҷикӣ, ไทย, Türkmençe, Tagalog, Türkçe, Татарча\/Tatarça, Українська, اردو, Tiếng Việt, Volapük, Walon, Winaray, 吴语, isiXhosa, ייִדיש, Yorùbá, Zeêuws, 中文, Bân-lâm-gú, 粵語":"long key"}]}}',
+        ];
+        yield 'set' => [
+            'argsClassName' => \Basic\ThriftTest\ThriftTest_testSet_args::class,
+            'argsValues' => [
+                'thing' => [1 => true, 5 => true, 6 => true],
+            ],
+            'expected' => '{"1":{"set":["i32",3,1,5,6]}}',
+        ];
+        yield 'list' => [
+            'argsClassName' => \Basic\ThriftTest\ThriftTest_testList_args::class,
+            'argsValues' => [
+                'thing' => [1, 2, 3],
+            ],
+            'expected' =>  '{"1":{"lst":["i32",3,1,2,3]}}',
+        ];
+        yield 'enum' => [
+            'argsClassName' => \Basic\ThriftTest\ThriftTest_testEnum_args::class,
+            'argsValues' => [
+                'thing' => \Basic\ThriftTest\Numberz::SIX,
+            ],
+            'expected' => '{"1":{"i32":6}}',
+        ];
+        yield 'typedef' => [
+            'argsClassName' => \Basic\ThriftTest\ThriftTest_testTypedef_args::class,
+            'argsValues' => [
+                'thing' => 69,
+            ],
+            'expected' => '{"1":{"i64":69}}',
+        ];
+    }
+
+    /**
+     * @dataProvider readDataProvider
+     */
+    public function testRead(
+        $buffer,
+        $argsClassName,
+        $argsPropertyName,
+        $expectedValue,
+        $expectedResult
+    ): void {
+        $this->transport->write($buffer);
+        $args = new $argsClassName();
+        $result = $args->read($this->protocol);
+
+        $this->assertEquals($expectedResult, $result);
+
+        if (is_null($argsPropertyName)) {
+            $this->assertNull($argsPropertyName);
+        } elseif (is_float($expectedValue) && is_nan($expectedValue)) {
+            $this->assertNan($args->{$argsPropertyName});
+        } elseif (is_float($expectedValue) && is_infinite($expectedValue)) {
+            $this->assertEquals($expectedValue, $args->{$argsPropertyName});
+        } else {
+            $this->assertEquals($expectedValue, $args->{$argsPropertyName});
+        }
+    }
+
+    public function readDataProvider()
+    {
+        yield 'void' => [
+            'buffer' => '{}',
+            'argsClassName' => \Basic\ThriftTest\ThriftTest_testVoid_args::class,
+            'argsPropertyName' => null,
+            'expectedValue' => null,
+            'expectedResult' => 0,
+        ];
+        yield 'bool true' => [
+            'buffer' => '{"1":{"tf":1}}',
+            'argsClassName' => \Basic\ThriftTest\ThriftTest_testBool_args::class,
+            'argsPropertyName' => 'thing',
+            'expectedValue' => true,
+            'expectedResult' => 1,
+        ];
+        yield 'bool false' => [
+            'buffer' => '{"1":{"tf":0}}',
+            'argsClassName' => \Basic\ThriftTest\ThriftTest_testBool_args::class,
+            'argsPropertyName' => 'thing',
+            'expectedValue' => false,
+            'expectedResult' => 1,
+        ];
+        yield 'string1' => [
+            'buffer' => '{"1":{"str":"Afrikaans, Alemannisch, Aragonés, العربية, مصرى, Asturianu, Aymar aru, Azərbaycan, Башҡорт, Boarisch, Žemaitėška, Беларуская, Беларуская (тарашкевіца), Български, Bamanankan, বাংলা, Brezhoneg, Bosanski, Català, Mìng-dĕ̤ng-ngṳ̄, Нохчийн, Cebuano, ᏣᎳᎩ, Česky, Словѣ́ньскъ \/ ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ, Чӑвашла, Cymraeg, Dansk, Zazaki, ދިވެހިބަސް, Ελληνικά, Emiliàn e rumagnòl, English, Esperanto, Español, Eesti, Euskara, فارسی, Suomi, Võro, Føroyskt, Français, Arpetan, Furlan, Frysk, Gaeilge, 贛語, Gàidhlig, Galego, Avañe\'ẽ, ગુજરાતી, Gaelg, עברית, हिन्दी, Fiji Hindi, Hrvatski, Kreyòl ayisyen, Magyar, Հայերեն, Interlingua, Bahasa Indonesia, Ilokano, Ido, Íslenska, Italiano, 日本語, Lojban, Basa Jawa, ქართული, Kongo, Kalaallisut, ಕನ್ನಡ, 한국어, Къарачай-Малкъар, Ripoarisch, Kurdî, Коми, Kernewek, Кыргызча, Latina, Ladino, Lëtzebuergesch, Limburgs, Lingála, ລາວ, Lietuvių, Latviešu, Basa Banyumasan, Malagasy, Македонски, മലയാളം, मराठी, Bahasa Melayu, مازِرونی, Nnapulitano, Nedersaksisch, नेपाल भाषा, Nederlands, ‪Norsk (nynorsk)‬, ‪Norsk (bokmål)‬, Nouormand, Diné bizaad, Occitan, Иронау, Papiamentu, Deitsch, Norfuk \/ Pitkern, Polski, پنجابی, پښتو, Português, Runa Simi, Rumantsch, Romani, Română, Русский, Саха тыла, Sardu, Sicilianu, Scots, Sámegiella, Simple English, Slovenčina, Slovenščina, Српски \/ Srpski, Seeltersk, Svenska, Kiswahili, தமிழ், తెలుగు, Тоҷикӣ, ไทย, Türkmençe, Tagalog, Türkçe, Татарча\/Tatarça, Українська, اردو, Tiếng Việt, Volapük, Walon, Winaray, 吴语, isiXhosa, ייִדיש, Yorùbá, Zeêuws, 中文, Bân-lâm-gú, 粵語"}}',
+            'argsClassName' => \Basic\ThriftTest\ThriftTest_testString_args::class,
+            'argsPropertyName' => 'thing',
+            'expectedValue' => "Afrikaans, Alemannisch, Aragonés, العربية, مصرى, Asturianu, Aymar aru, Azərbaycan, Башҡорт, Boarisch, Žemaitėška, Беларуская, Беларуская (тарашкевіца), Български, Bamanankan, বাংলা, Brezhoneg, Bosanski, Català, Mìng-dĕ̤ng-ngṳ̄, Нохчийн, Cebuano, ᏣᎳᎩ, Česky, Словѣ́ньскъ / ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ, Чӑвашла, Cymraeg, Dansk, Zazaki, ދިވެހިބަސް, Ελληνικά, Emiliàn e rumagnòl, English, Esperanto, Español, Eesti, Euskara, فارسی, Suomi, Võro, Føroyskt, Français, Arpetan, Furlan, Frysk, Gaeilge, 贛語, Gàidhlig, Galego, Avañe'ẽ, ગુજરાતી, Gaelg, עברית, हिन्दी, Fiji Hindi, Hrvatski, Kreyòl ayisyen, Magyar, Հայերեն, Interlingua, Bahasa Indonesia, Ilokano, Ido, Íslenska, Italiano, 日本語, Lojban, Basa Jawa, ქართული, Kongo, Kalaallisut, ಕನ್ನಡ, 한국어, Къарачай-Малкъар, Ripoarisch, Kurdî, Коми, Kernewek, Кыргызча, Latina, Ladino, Lëtzebuergesch, Limburgs, Lingála, ລາວ, Lietuvių, Latviešu, Basa Banyumasan, Malagasy, Македонски, മലയാളം, मराठी, Bahasa Melayu, مازِرونی, Nnapulitano, Nedersaksisch, नेपाल भाषा, Nederlands, ‪Norsk (nynorsk)‬, ‪Norsk (bokmål)‬, Nouormand, Diné bizaad, Occitan, Иронау, Papiamentu, Deitsch, Norfuk / Pitkern, Polski, پنجابی, پښتو, Português, Runa Simi, Rumantsch, Romani, Română, Русский, Саха тыла, Sardu, Sicilianu, Scots, Sámegiella, Simple English, Slovenčina, Slovenščina, Српски / Srpski, Seeltersk, Svenska, Kiswahili, தமிழ், తెలుగు, Тоҷикӣ, ไทย, Türkmençe, Tagalog, Türkçe, Татарча/Tatarça, Українська, اردو, Tiếng Việt, Volapük, Walon, Winaray, 吴语, isiXhosa, ייִדיש, Yorùbá, Zeêuws, 中文, Bân-lâm-gú, 粵語",
+            'expectedResult' => 1,
+        ];
+        yield 'string2' => [
+            'buffer' => '{"1":{"str":"quote: \\\\\" backslash: forwardslash-escaped: \\\\\/  backspace: \\\\b formfeed: \f newline: \n return: \r tab:  now-all-of-them-together: \"\\\\\\\\\/\\\\b\n\r\t now-a-bunch-of-junk: !@#$%&()(&%$#{}{}<><><"}}',
+            'argsClassName' => \Basic\ThriftTest\ThriftTest_testString_args::class,
+            'argsPropertyName' => 'thing',
+            'expectedValue' => "quote: \\\" backslash:" .
+                " forwardslash-escaped: \\/ " .
+                " backspace: \b formfeed: \f newline: \n return: \r tab: " .
+                " now-all-of-them-together: \"\\\/\b\n\r\t" .
+                " now-a-bunch-of-junk: !@#\$%&()(&%$#{}{}<><><",
+            'expectedResult' => 1,
+        ];
+        yield 'string3' => [
+            'buffer' => '{"1":{"str":"string that ends in double-backslash \\\\\\\\"}}',
+            'argsClassName' => \Basic\ThriftTest\ThriftTest_testString_args::class,
+            'argsPropertyName' => 'thing',
+            'expectedValue' => "string that ends in double-backslash \\\\",
+            'expectedResult' => 1,
+        ];
+        yield 'string4' => [
+            'buffer' => '{"1":{"str":"สวัสดี\/𝒯"}}',
+            'argsClassName' => \Basic\ThriftTest\ThriftTest_testString_args::class,
+            'argsPropertyName' => 'thing',
+            'expectedValue' => "สวัสดี/𝒯",
+            'expectedResult' => 1,
+        ];
+        yield 'double' => [
+            'buffer' => '{"1":{"dbl":3.1415926535898}}',
+            'argsClassName' => \Basic\ThriftTest\ThriftTest_testDouble_args::class,
+            'argsPropertyName' => 'thing',
+            'expectedValue' => 3.1415926535898,
+            'expectedResult' => 1,
+        ];
+        yield 'double Nan' => [
+            'buffer' => '{"1":{"dbl":"NaN"}}',
+            'argsClassName' => \Basic\ThriftTest\ThriftTest_testDouble_args::class,
+            'argsPropertyName' => 'thing',
+            'expectedValue' => NAN,
+            'expectedResult' => 1,
+        ];
+        yield 'double Infinity' => [
+            'buffer' => '{"1":{"dbl":"Infinity"}}',
+            'argsClassName' => \Basic\ThriftTest\ThriftTest_testDouble_args::class,
+            'argsPropertyName' => 'thing',
+            'expectedValue' => INF,
+            'expectedResult' => 1,
+        ];
+        yield 'byte' => [
+            'buffer' => '{"1":{"i8":1}}',
+            'argsClassName' => \Basic\ThriftTest\ThriftTest_testByte_args::class,
+            'argsPropertyName' => 'thing',
+            'expectedValue' => 0x01,
+            'expectedResult' => 1,
+        ];
+        yield 'i32' => [
+            'buffer' => '{"1":{"i32":1073741824}}',
+            'argsClassName' => \Basic\ThriftTest\ThriftTest_testI32_args::class,
+            'argsPropertyName' => 'thing',
+            'expectedValue' => pow(2, 30),
+            'expectedResult' => 1,
+        ];
+        if (PHP_INT_SIZE == 8) {
+            yield 'i64_64Architecture' => [
+                'buffer' => '{"1":{"i64":' . pow(2, 60) . '}}',
+                'argsClassName' => \Basic\ThriftTest\ThriftTest_testI64_args::class,
+                'argsPropertyName' => 'thing',
+                'expectedValue' => pow(2, 60),
+                'expectedResult' => 1,
+            ];
+            yield 'struct_64Architecture' => [
+                'buffer' => '{"1":{"rec":{"1":{"str":"worked"},"4":{"i8":1},"9":{"i32":1073741824},"11":{"i64":' . pow(2, 60) . '}}}}',
+                'argsClassName' => \Basic\ThriftTest\ThriftTest_testStruct_args::class,
+                'argsPropertyName' => 'thing',
+                'expectedValue' => new Xtruct(
+                    array(
+                        'string_thing' => 'worked',
+                        'byte_thing' => 0x01,
+                        'i32_thing' => pow(2, 30),
+                        'i64_thing' => pow(2, 60),
+                    )
+                ),
+                'expectedResult' => 4,
+            ];
+            yield 'nest_64Architecture' => [
+                'buffer' => '{"1":{"rec":{"1":{"i8":1},"2":{"rec":{"1":{"str":"worked"},"4":{"i8":1},"9":{"i32":1073741824},"11":{"i64":' . pow(2, 60) . '}}},"3":{"i32":32768}}}}',
+                'argsClassName' => \Basic\ThriftTest\ThriftTest_testNest_args::class,
+                'argsPropertyName' => 'thing',
+                'expectedValue' => new Xtruct2(
+                    array(
+                        'byte_thing' => 0x01,
+                        'struct_thing' => new Xtruct(
+                            array(
+                                'string_thing' => 'worked',
+                                'byte_thing' => 0x01,
+                                'i32_thing' => pow(2, 30),
+                                'i64_thing' => pow(2, 60),
+                            )
+                        ),
+                        'i32_thing' => pow(2, 15)
+                    )
+                ),
+                'expectedResult' => 6,
+            ];
+        } else {
+            yield 'i64_32Architecture' => [
+                'buffer' => '{"1":{"i64":1152921504606847000}}',
+                'argsClassName' => \Basic\ThriftTest\ThriftTest_testI64_args::class,
+                'argsPropertyName' => 'thing',
+                'expectedValue' => "1152921504606847000",
+                'expectedResult' => 1,
+            ];
+            yield 'struct_32Architecture' => [
+                'buffer' => '{"1":{"rec":{"1":{"str":"worked"},"4":{"i8":1},"9":{"i32":1073741824},"11":{"i64":1152921504606847000}}}}',
+                'argsClassName' => \Basic\ThriftTest\ThriftTest_testStruct_args::class,
+                'expectedValue' => new Xtruct(
+                    array(
+                        'string_thing' => 'worked',
+                        'byte_thing' => 0x01,
+                        'i32_thing' => pow(2, 30),
+                        'i64_thing' => "1152921504606847000",
+                    )
+                ),
+                'expectedResult' => 4,
+            ];
+            yield 'nest_32Architecture' => [
+                'buffer' => '{"1":{"rec":{"1":{"i8":1},"2":{"rec":{"1":{"str":"worked"},"4":{"i8":1},"9":{"i32":1073741824},"11":{"i64":1152921504606847000}}},"3":{"i32":32768}}}}',
+                'argsClassName' => \Basic\ThriftTest\ThriftTest_testNest_args::class,
+                'argsPropertyName' => 'thing',
+                'expectedValue' => new Xtruct2(
+                    array(
+                        'byte_thing' => 0x01,
+                        'struct_thing' => new Xtruct(
+                            array(
+                                'string_thing' => 'worked',
+                                'byte_thing' => 0x01,
+                                'i32_thing' => pow(2, 30),
+                                'i64_thing' => "1152921504606847000",
+                            )
+                        ),
+                        'i32_thing' => pow(2, 15)
+                    )
+                ),
+                'expectedResult' => 6,
+            ];
+        }
+        yield 'map' => [
+            'buffer' => '{"1":{"map":["i32","i32",3,{"7":77,"8":88,"9":99}]}}',
+            'argsClassName' => \Basic\ThriftTest\ThriftTest_testMap_args::class,
+            'argsPropertyName' => 'thing',
+            'expectedValue' => [
+                7 => 77,
+                8 => 88,
+                9 => 99
+            ],
+            'expectedResult' => 6,
+        ];
+        yield 'stringMap' => [
+            'buffer' => '{"1":{"map":["str","str",6,{"a":"123","a b":"with spaces ","same":"same","0":"numeric key","longValue":"Afrikaans, Alemannisch, Aragon\u00e9s, \u0627\u0644\u0639\u0631\u0628\u064a\u0629, \u0645\u0635\u0631\u0649, Asturianu, Aymar aru, Az\u0259rbaycan, \u0411\u0430\u0448\u04a1\u043e\u0440\u0442, Boarisch, \u017demait\u0117\u0161ka, \u0411\u0435\u043b\u0430\u0440\u0443\u0441\u043a\u0430\u044f, \u0411\u0435\u043b\u0430\u0440\u0443\u0441\u043a\u0430\u044f (\u0442\u0430\u0440\u0430\u0448\u043a\u0435\u0432\u0456\u0446\u0430), \u0411\u044a\u043b\u0433\u0430\u0440\u0441\u043a\u0438, Bamanankan, \u09ac\u09be\u0982\u09b2\u09be, Brezhoneg, Bosanski, Catal\u00e0, M\u00ecng-d\u0115\u0324ng-ng\u1e73\u0304, \u041d\u043e\u0445\u0447\u0438\u0439\u043d, Cebuano, \u13e3\u13b3\u13a9, \u010cesky, \u0421\u043b\u043e\u0432\u0463\u0301\u043d\u044c\u0441\u043a\u044a \/ \u2c14\u2c0e\u2c11\u2c02\u2c21\u2c10\u2c20\u2c14\u2c0d\u2c1f, \u0427\u04d1\u0432\u0430\u0448\u043b\u0430, Cymraeg, Dansk, Zazaki, \u078b\u07a8\u0788\u07ac\u0780\u07a8\u0784\u07a6\u0790\u07b0, \u0395\u03bb\u03bb\u03b7\u03bd\u03b9\u03ba\u03ac, Emili\u00e0n e rumagn\u00f2l, English, Esperanto, Espa\u00f1ol, Eesti, Euskara, \u0641\u0627\u0631\u0633\u06cc, Suomi, V\u00f5ro, F\u00f8royskt, Fran\u00e7ais, Arpetan, Furlan, Frysk, Gaeilge, \u8d1b\u8a9e, G\u00e0idhlig, Galego, Ava\u00f1e\'\u1ebd, \u0a97\u0ac1\u0a9c\u0ab0\u0abe\u0aa4\u0ac0, Gaelg, \u05e2\u05d1\u05e8\u05d9\u05ea, \u0939\u093f\u0928\u094d\u0926\u0940, Fiji Hindi, Hrvatski, Krey\u00f2l ayisyen, Magyar, \u0540\u0561\u0575\u0565\u0580\u0565\u0576, Interlingua, Bahasa Indonesia, Ilokano, Ido, \u00cdslenska, Italiano, \u65e5\u672c\u8a9e, Lojban, Basa Jawa, \u10e5\u10d0\u10e0\u10d7\u10e3\u10da\u10d8, Kongo, Kalaallisut, \u0c95\u0ca8\u0ccd\u0ca8\u0ca1, \ud55c\uad6d\uc5b4, \u041a\u044a\u0430\u0440\u0430\u0447\u0430\u0439-\u041c\u0430\u043b\u043a\u044a\u0430\u0440, Ripoarisch, Kurd\u00ee, \u041a\u043e\u043c\u0438, Kernewek, \u041a\u044b\u0440\u0433\u044b\u0437\u0447\u0430, Latina, Ladino, L\u00ebtzebuergesch, Limburgs, Ling\u00e1la, \u0ea5\u0eb2\u0ea7, Lietuvi\u0173, Latvie\u0161u, Basa Banyumasan, Malagasy, \u041c\u0430\u043a\u0435\u0434\u043e\u043d\u0441\u043a\u0438, \u0d2e\u0d32\u0d2f\u0d3e\u0d33\u0d02, \u092e\u0930\u093e\u0920\u0940, Bahasa Melayu, \u0645\u0627\u0632\u0650\u0631\u0648\u0646\u06cc, Nnapulitano, Nedersaksisch, \u0928\u0947\u092a\u093e\u0932 \u092d\u093e\u0937\u093e, Nederlands, \u202aNorsk (nynorsk)\u202c, \u202aNorsk (bokm\u00e5l)\u202c, Nouormand, Din\u00e9 bizaad, Occitan, \u0418\u0440\u043e\u043d\u0430\u0443, Papiamentu, Deitsch, Norfuk \/ Pitkern, Polski, \u067e\u0646\u062c\u0627\u0628\u06cc, \u067e\u069a\u062a\u0648, Portugu\u00eas, Runa Simi, Rumantsch, Romani, Rom\u00e2n\u0103, \u0420\u0443\u0441\u0441\u043a\u0438\u0439, \u0421\u0430\u0445\u0430 \u0442\u044b\u043b\u0430, Sardu, Sicilianu, Scots, S\u00e1megiella, Simple English, Sloven\u010dina, Sloven\u0161\u010dina, \u0421\u0440\u043f\u0441\u043a\u0438 \/ Srpski, Seeltersk, Svenska, Kiswahili, \u0ba4\u0bae\u0bbf\u0bb4\u0bcd, \u0c24\u0c46\u0c32\u0c41\u0c17\u0c41, \u0422\u043e\u04b7\u0438\u043a\u04e3, \u0e44\u0e17\u0e22, T\u00fcrkmen\u00e7e, Tagalog, T\u00fcrk\u00e7e, \u0422\u0430\u0442\u0430\u0440\u0447\u0430\/Tatar\u00e7a, \u0423\u043a\u0440\u0430\u0457\u043d\u0441\u044c\u043a\u0430, \u0627\u0631\u062f\u0648, Ti\u1ebfng Vi\u1ec7t, Volap\u00fck, Walon, Winaray, \u5434\u8bed, isiXhosa, \u05d9\u05d9\u05b4\u05d3\u05d9\u05e9, Yor\u00f9b\u00e1, Ze\u00eauws, \u4e2d\u6587, B\u00e2n-l\u00e2m-g\u00fa, \u7cb5\u8a9e","Afrikaans, Alemannisch, Aragon\u00e9s, \u0627\u0644\u0639\u0631\u0628\u064a\u0629, \u0645\u0635\u0631\u0649, Asturianu, Aymar aru, Az\u0259rbaycan, \u0411\u0430\u0448\u04a1\u043e\u0440\u0442, Boarisch, \u017demait\u0117\u0161ka, \u0411\u0435\u043b\u0430\u0440\u0443\u0441\u043a\u0430\u044f, \u0411\u0435\u043b\u0430\u0440\u0443\u0441\u043a\u0430\u044f (\u0442\u0430\u0440\u0430\u0448\u043a\u0435\u0432\u0456\u0446\u0430), \u0411\u044a\u043b\u0433\u0430\u0440\u0441\u043a\u0438, Bamanankan, \u09ac\u09be\u0982\u09b2\u09be, Brezhoneg, Bosanski, Catal\u00e0, M\u00ecng-d\u0115\u0324ng-ng\u1e73\u0304, \u041d\u043e\u0445\u0447\u0438\u0439\u043d, Cebuano, \u13e3\u13b3\u13a9, \u010cesky, \u0421\u043b\u043e\u0432\u0463\u0301\u043d\u044c\u0441\u043a\u044a \/ \u2c14\u2c0e\u2c11\u2c02\u2c21\u2c10\u2c20\u2c14\u2c0d\u2c1f, \u0427\u04d1\u0432\u0430\u0448\u043b\u0430, Cymraeg, Dansk, Zazaki, \u078b\u07a8\u0788\u07ac\u0780\u07a8\u0784\u07a6\u0790\u07b0, \u0395\u03bb\u03bb\u03b7\u03bd\u03b9\u03ba\u03ac, Emili\u00e0n e rumagn\u00f2l, English, Esperanto, Espa\u00f1ol, Eesti, Euskara, \u0641\u0627\u0631\u0633\u06cc, Suomi, V\u00f5ro, F\u00f8royskt, Fran\u00e7ais, Arpetan, Furlan, Frysk, Gaeilge, \u8d1b\u8a9e, G\u00e0idhlig, Galego, Ava\u00f1e\'\u1ebd, \u0a97\u0ac1\u0a9c\u0ab0\u0abe\u0aa4\u0ac0, Gaelg, \u05e2\u05d1\u05e8\u05d9\u05ea, \u0939\u093f\u0928\u094d\u0926\u0940, Fiji Hindi, Hrvatski, Krey\u00f2l ayisyen, Magyar, \u0540\u0561\u0575\u0565\u0580\u0565\u0576, Interlingua, Bahasa Indonesia, Ilokano, Ido, \u00cdslenska, Italiano, \u65e5\u672c\u8a9e, Lojban, Basa Jawa, \u10e5\u10d0\u10e0\u10d7\u10e3\u10da\u10d8, Kongo, Kalaallisut, \u0c95\u0ca8\u0ccd\u0ca8\u0ca1, \ud55c\uad6d\uc5b4, \u041a\u044a\u0430\u0440\u0430\u0447\u0430\u0439-\u041c\u0430\u043b\u043a\u044a\u0430\u0440, Ripoarisch, Kurd\u00ee, \u041a\u043e\u043c\u0438, Kernewek, \u041a\u044b\u0440\u0433\u044b\u0437\u0447\u0430, Latina, Ladino, L\u00ebtzebuergesch, Limburgs, Ling\u00e1la, \u0ea5\u0eb2\u0ea7, Lietuvi\u0173, Latvie\u0161u, Basa Banyumasan, Malagasy, \u041c\u0430\u043a\u0435\u0434\u043e\u043d\u0441\u043a\u0438, \u0d2e\u0d32\u0d2f\u0d3e\u0d33\u0d02, \u092e\u0930\u093e\u0920\u0940, Bahasa Melayu, \u0645\u0627\u0632\u0650\u0631\u0648\u0646\u06cc, Nnapulitano, Nedersaksisch, \u0928\u0947\u092a\u093e\u0932 \u092d\u093e\u0937\u093e, Nederlands, \u202aNorsk (nynorsk)\u202c, \u202aNorsk (bokm\u00e5l)\u202c, Nouormand, Din\u00e9 bizaad, Occitan, \u0418\u0440\u043e\u043d\u0430\u0443, Papiamentu, Deitsch, Norfuk \/ Pitkern, Polski, \u067e\u0646\u062c\u0627\u0628\u06cc, \u067e\u069a\u062a\u0648, Portugu\u00eas, Runa Simi, Rumantsch, Romani, Rom\u00e2n\u0103, \u0420\u0443\u0441\u0441\u043a\u0438\u0439, \u0421\u0430\u0445\u0430 \u0442\u044b\u043b\u0430, Sardu, Sicilianu, Scots, S\u00e1megiella, Simple English, Sloven\u010dina, Sloven\u0161\u010dina, \u0421\u0440\u043f\u0441\u043a\u0438 \/ Srpski, Seeltersk, Svenska, Kiswahili, \u0ba4\u0bae\u0bbf\u0bb4\u0bcd, \u0c24\u0c46\u0c32\u0c41\u0c17\u0c41, \u0422\u043e\u04b7\u0438\u043a\u04e3, \u0e44\u0e17\u0e22, T\u00fcrkmen\u00e7e, Tagalog, T\u00fcrk\u00e7e, \u0422\u0430\u0442\u0430\u0440\u0447\u0430\/Tatar\u00e7a, \u0423\u043a\u0440\u0430\u0457\u043d\u0441\u044c\u043a\u0430, \u0627\u0631\u062f\u0648, Ti\u1ebfng Vi\u1ec7t, Volap\u00fck, Walon, Winaray, \u5434\u8bed, isiXhosa, \u05d9\u05d9\u05b4\u05d3\u05d9\u05e9, Yor\u00f9b\u00e1, Ze\u00eauws, \u4e2d\u6587, B\u00e2n-l\u00e2m-g\u00fa, \u7cb5\u8a9e":"long key"}]}}',
+            'argsClassName' => \Basic\ThriftTest\ThriftTest_testStringMap_args::class,
+            'argsPropertyName' => 'thing',
+            'expectedValue' => [
+                "a" => "123",
+                "a b" => "with spaces ",
+                "same" => "same",
+                "0" => "numeric key",
+                "longValue" => "Afrikaans, Alemannisch, Aragonés, العربية, مصرى, Asturianu, Aymar aru, Azərbaycan, Башҡорт, Boarisch, Žemaitėška, Беларуская, Беларуская (тарашкевіца), Български, Bamanankan, বাংলা, Brezhoneg, Bosanski, Català, Mìng-dĕ̤ng-ngṳ̄, Нохчийн, Cebuano, ᏣᎳᎩ, Česky, Словѣ́ньскъ / ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ, Чӑвашла, Cymraeg, Dansk, Zazaki, ދިވެހިބަސް, Ελληνικά, Emiliàn e rumagnòl, English, Esperanto, Español, Eesti, Euskara, فارسی, Suomi, Võro, Føroyskt, Français, Arpetan, Furlan, Frysk, Gaeilge, 贛語, Gàidhlig, Galego, Avañe'ẽ, ગુજરાતી, Gaelg, עברית, हिन्दी, Fiji Hindi, Hrvatski, Kreyòl ayisyen, Magyar, Հայերեն, Interlingua, Bahasa Indonesia, Ilokano, Ido, Íslenska, Italiano, 日本語, Lojban, Basa Jawa, ქართული, Kongo, Kalaallisut, ಕನ್ನಡ, 한국어, Къарачай-Малкъар, Ripoarisch, Kurdî, Коми, Kernewek, Кыргызча, Latina, Ladino, Lëtzebuergesch, Limburgs, Lingála, ລາວ, Lietuvių, Latviešu, Basa Banyumasan, Malagasy, Македонски, മലയാളം, मराठी, Bahasa Melayu, مازِرونی, Nnapulitano, Nedersaksisch, नेपाल भाषा, Nederlands, ‪Norsk (nynorsk)‬, ‪Norsk (bokmål)‬, Nouormand, Diné bizaad, Occitan, Иронау, Papiamentu, Deitsch, Norfuk / Pitkern, Polski, پنجابی, پښتو, Português, Runa Simi, Rumantsch, Romani, Română, Русский, Саха тыла, Sardu, Sicilianu, Scots, Sámegiella, Simple English, Slovenčina, Slovenščina, Српски / Srpski, Seeltersk, Svenska, Kiswahili, தமிழ், తెలుగు, Тоҷикӣ, ไทย, Türkmençe, Tagalog, Türkçe, Татарча/Tatarça, Українська, اردو, Tiếng Việt, Volapük, Walon, Winaray, 吴语, isiXhosa, ייִדיש, Yorùbá, Zeêuws, 中文, Bân-lâm-gú, 粵語",
+                "Afrikaans, Alemannisch, Aragonés, العربية, مصرى, Asturianu, Aymar aru, Azərbaycan, Башҡорт, Boarisch, Žemaitėška, Беларуская, Беларуская (тарашкевіца), Български, Bamanankan, বাংলা, Brezhoneg, Bosanski, Català, Mìng-dĕ̤ng-ngṳ̄, Нохчийн, Cebuano, ᏣᎳᎩ, Česky, Словѣ́ньскъ / ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ, Чӑвашла, Cymraeg, Dansk, Zazaki, ދިވެހިބަސް, Ελληνικά, Emiliàn e rumagnòl, English, Esperanto, Español, Eesti, Euskara, فارسی, Suomi, Võro, Føroyskt, Français, Arpetan, Furlan, Frysk, Gaeilge, 贛語, Gàidhlig, Galego, Avañe'ẽ, ગુજરાતી, Gaelg, עברית, हिन्दी, Fiji Hindi, Hrvatski, Kreyòl ayisyen, Magyar, Հայերեն, Interlingua, Bahasa Indonesia, Ilokano, Ido, Íslenska, Italiano, 日本語, Lojban, Basa Jawa, ქართული, Kongo, Kalaallisut, ಕನ್ನಡ, 한국어, Къарачай-Малкъар, Ripoarisch, Kurdî, Коми, Kernewek, Кыргызча, Latina, Ladino, Lëtzebuergesch, Limburgs, Lingála, ລາວ, Lietuvių, Latviešu, Basa Banyumasan, Malagasy, Македонски, മലയാളം, मराठी, Bahasa Melayu, مازِرونی, Nnapulitano, Nedersaksisch, नेपाल भाषा, Nederlands, ‪Norsk (nynorsk)‬, ‪Norsk (bokmål)‬, Nouormand, Diné bizaad, Occitan, Иронау, Papiamentu, Deitsch, Norfuk / Pitkern, Polski, پنجابی, پښتو, Português, Runa Simi, Rumantsch, Romani, Română, Русский, Саха тыла, Sardu, Sicilianu, Scots, Sámegiella, Simple English, Slovenčina, Slovenščina, Српски / Srpski, Seeltersk, Svenska, Kiswahili, தமிழ், తెలుగు, Тоҷикӣ, ไทย, Türkmençe, Tagalog, Türkçe, Татарча/Tatarça, Українська, اردو, Tiếng Việt, Volapük, Walon, Winaray, 吴语, isiXhosa, ייִדיש, Yorùbá, Zeêuws, 中文, Bân-lâm-gú, 粵語" => "long key"
+            ],
+            'expectedResult' => 12,
+        ];
+        yield 'set' => [
+            'buffer' => '{"1":{"set":["i32",3,1,5,6]}}',
+            'argsClassName' => \Basic\ThriftTest\ThriftTest_testSet_args::class,
+            'argsPropertyName' => 'thing',
+            'expectedValue' => [1 => true, 5 => true, 6 => true],
+            'expectedResult' => 4,
+        ];
+        yield 'list' => [
+            'buffer' => '{"1":{"lst":["i32",3,1,2,3]}}',
+            'argsClassName' => \Basic\ThriftTest\ThriftTest_testList_args::class,
+            'argsPropertyName' => 'thing',
+            'expectedValue' => [1, 2, 3],
+            'expectedResult' => 4,
+        ];
+        yield 'enum' => [
+            'buffer' => '{"1":{"i32":6}}',
+            'argsClassName' => \Basic\ThriftTest\ThriftTest_testEnum_args::class,
+            'argsPropertyName' => 'thing',
+            'expectedValue' => Numberz::SIX,
+            'expectedResult' => 1,
+        ];
+        yield 'typedef' => [
+            'buffer' => '{"1":{"i64":69}}',
+            'argsClassName' => \Basic\ThriftTest\ThriftTest_testTypedef_args::class,
+            'argsPropertyName' => 'thing',
+            'expectedValue' => 69,
+            'expectedResult' => 1,
+        ];
+        yield 'mapmap' => [
+            'buffer' => '{"0":{"map":["i32","map",2,{"4":["i32","i32",4,{"1":1,"2":2,"3":3,"4":4}],"-4":["i32","i32",4,{"-4":-4,"-3":-3,"-2":-2,"-1":-1}]}]}}',
+            'argsClassName' => \Basic\ThriftTest\ThriftTest_testMapMap_result::class,
+            'argsPropertyName' => 'success',
+            'expectedValue' => [
+                4 => [
+                    1 => 1,
+                    2 => 2,
+                    3 => 3,
+                    4 => 4,
+                ],
+                -4 => [
+                    -4 => -4,
+                    -3 => -3,
+                    -2 => -2,
+                    -1 => -1
+                ]
+            ],
+            'expectedResult' => 18,
+        ];
+
+        $xtruct1 = new Xtruct(
+            [
+                'string_thing' => 'Goodbye4',
+                'byte_thing' => 4,
+                'i32_thing' => 4,
+                'i64_thing' => 4,
+            ]
+        );
+
+        $xtruct2 = new Xtruct(
+            [
+                'string_thing' => 'Hello2',
+                'byte_thing' => 2,
+                'i32_thing' => 2,
+                'i64_thing' => 2,
+            ]
+        );
+
+        $userMap = [Numberz::FIVE => 5, Numberz::EIGHT => 8];
+
+        $insanity2 = new Insanity(
+            [
+                'userMap' => $userMap,
+                'xtructs' => [$xtruct1, $xtruct2],
+            ]
+        );
+
+        $insanity3 = $insanity2;
+
+        $insanity6 =
+            new Insanity(
+                [
+                    'userMap' => null,
+                    'xtructs' => null,
+                ]
+            );
+        yield 'insanity' => [
+            'buffer' => '{"0":{"map":["i64","map",2,{"1":["i32","rec",2,{"2":{"1":{"map":["i32","i64",2,{"5":5,"8":8}]},"2":{"lst":["rec",2,{"1":{"str":"Goodbye4"},"4":{"i8":4},"9":{"i32":4},"11":{"i64":4}},{"1":{"str":"Hello2"},"4":{"i8":2},"9":{"i32":2},"11":{"i64":2}}]}},"3":{"1":{"map":["i32","i64",2,{"5":5,"8":8}]},"2":{"lst":["rec",2,{"1":{"str":"Goodbye4"},"4":{"i8":4},"9":{"i32":4},"11":{"i64":4}},{"1":{"str":"Hello2"},"4":{"i8":2},"9":{"i32":2},"11":{"i64":2}}]}}}],"2":["i32","rec",1,{"6":{}}]}]}}',
+            'argsClassName' => \Basic\ThriftTest\ThriftTest_testInsanity_result::class,
+            'argsPropertyName' => 'success',
+            'expectedValue' => [
+                "1" => [
+                    Numberz::TWO => $insanity2,
+                    Numberz::THREE => $insanity3,
+                ],
+                "2" => [
+                    Numberz::SIX => $insanity6,
+                ],
+            ],
+            'expectedResult' => 31,
+        ];
+    }
+}
diff --git a/lib/php/test/Integration/Lib/Protocol/TSimpleJSONProtocolTest.php b/lib/php/test/Integration/Lib/Protocol/TSimpleJSONProtocolTest.php
new file mode 100644
index 0000000..e108ffc
--- /dev/null
+++ b/lib/php/test/Integration/Lib/Protocol/TSimpleJSONProtocolTest.php
@@ -0,0 +1,319 @@
+<?php
+
+/*
+ * 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 Test\Thrift\Integration\Lib\Protocol;
+
+use PHPUnit\Framework\TestCase;
+use Thrift\Protocol\TJSONProtocol;
+use Thrift\Protocol\TSimpleJSONProtocol;
+use Thrift\Transport\TMemoryBuffer;
+use Basic\ThriftTest\Xtruct;
+use Basic\ThriftTest\Xtruct2;
+
+/***
+ * This test suite depends on running the compiler against the ./Resources/ThriftTest.thrift file:
+ * lib/php/test$ ../../../compiler/cpp/thrift --gen php:nsglobal="Basic" -r  --out ./Resources/packages/php ./Resources/ThriftTest.thrift
+ */
+class TSimpleJSONProtocolTest extends TestCase
+{
+    private const BUFFER_SIZE = 8192; //big enough to read biggest serialized Fixture arg.
+
+    private $transport;
+    private $protocol;
+
+    public static function setUpBeforeClass(): void
+    {
+        if (!is_dir(__DIR__ . '/../../../Resources/packages/php')) {
+            self::fail(
+                'Before running Integration test suite, you must run the Thrift compiler against the ThriftTest.thrift file in the ./Resources directory.'
+            );
+        }
+    }
+
+    public function setUp(): void
+    {
+        $this->transport = new TMemoryBuffer();
+        $this->protocol = new TSimpleJSONProtocol($this->transport);
+        $this->transport->open();
+    }
+
+    public function testMessageWrite()
+    {
+        $input = new TJSONProtocol(new TMemoryBuffer('[1,"testString",1,0,{"0":{"str":"successResponse"}}]'));
+        $service = new \Basic\ThriftTest\ThriftTestClient($input, $this->protocol);
+        $result = $service->testString('test');
+        $this->assertSame('successResponse', $result);
+        $this->assertSame('["testString",1,0,{"thing":"test"}]', $this->protocol->getTransport()->getBuffer());
+    }
+
+    /**
+     * @dataProvider writeDataProvider
+     */
+    public function testWrite(
+        $argsClassName,
+        $argsValues,
+        $expected
+    ) {
+        $args = new $argsClassName($argsValues);
+        $args->write($this->protocol);
+
+        $actual = $this->transport->read(self::BUFFER_SIZE);
+
+        $this->assertEquals($expected, $actual);
+    }
+
+    public function writeDataProvider()
+    {
+        if (!is_dir(__DIR__ . '/../../../Resources/packages/php')) {
+            throw new \RuntimeException(
+                'Before running Integration test suite, you must run the Thrift compiler against the ThriftTest.thrift file in the ./Resources directory.'
+            );
+        }
+
+        yield 'void' => [
+            'argsClassName' => \Basic\ThriftTest\ThriftTest_testVoid_args::class,
+            'argsValues' => [],
+            'expected' => '{}',
+        ];
+        yield 'bool true' => [
+            'argsClassName' => \Basic\ThriftTest\ThriftTest_testBool_args::class,
+            'argsValues' => [
+                'thing' => true,
+            ],
+            'expected' => '{"thing":1}',
+        ];
+        yield 'bool false' => [
+            'argsClassName' => \Basic\ThriftTest\ThriftTest_testBool_args::class,
+            'argsValues' => [
+                'thing' => false,
+            ],
+            'expected' => '{"thing":0}',
+        ];
+        yield 'string1' => [
+            'argsClassName' => \Basic\ThriftTest\ThriftTest_testString_args::class,
+            'argsValues' => [
+                'thing' => "Afrikaans, Alemannisch, Aragonés, العربية, مصرى, Asturianu, Aymar aru, Azərbaycan, Башҡорт, Boarisch, Žemaitėška, Беларуская, Беларуская (тарашкевіца), Български, Bamanankan, বাংলা, Brezhoneg, Bosanski, Català, Mìng-dĕ̤ng-ngṳ̄, Нохчийн, Cebuano, ᏣᎳᎩ, Česky, Словѣ́ньскъ / ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ, Чӑвашла, Cymraeg, Dansk, Zazaki, ދިވެހިބަސް, Ελληνικά, Emiliàn e rumagnòl, English, Esperanto, Español, Eesti, Euskara, فارسی, Suomi, Võro, Føroyskt, Français, Arpetan, Furlan, Frysk, Gaeilge, 贛語, Gàidhlig, Galego, Avañe'ẽ, ગુજરાતી, Gaelg, עברית, हिन्दी, Fiji Hindi, Hrvatski, Kreyòl ayisyen, Magyar, Հայերեն, Interlingua, Bahasa Indonesia, Ilokano, Ido, Íslenska, Italiano, 日本語, Lojban, Basa Jawa, ქართული, Kongo, Kalaallisut, ಕನ್ನಡ, 한국어, Къарачай-Малкъар, Ripoarisch, Kurdî, Коми, Kernewek, Кыргызча, Latina, Ladino, Lëtzebuergesch, Limburgs, Lingála, ລາວ, Lietuvių, Latviešu, Basa Banyumasan, Malagasy, Македонски, മലയാളം, मराठी, Bahasa Melayu, مازِرونی, Nnapulitano, Nedersaksisch, नेपाल भाषा, Nederlands, ‪Norsk (nynorsk)‬, ‪Norsk (bokmål)‬, Nouormand, Diné bizaad, Occitan, Иронау, Papiamentu, Deitsch, Norfuk / Pitkern, Polski, پنجابی, پښتو, Português, Runa Simi, Rumantsch, Romani, Română, Русский, Саха тыла, Sardu, Sicilianu, Scots, Sámegiella, Simple English, Slovenčina, Slovenščina, Српски / Srpski, Seeltersk, Svenska, Kiswahili, தமிழ், తెలుగు, Тоҷикӣ, ไทย, Türkmençe, Tagalog, Türkçe, Татарча/Tatarça, Українська, اردو, Tiếng Việt, Volapük, Walon, Winaray, 吴语, isiXhosa, ייִדיש, Yorùbá, Zeêuws, 中文, Bân-lâm-gú, 粵語",
+            ],
+            'expected' => '{"thing":"Afrikaans, Alemannisch, Aragon\u00e9s, \u0627\u0644\u0639\u0631\u0628\u064a\u0629, \u0645\u0635\u0631\u0649, Asturianu, Aymar aru, Az\u0259rbaycan, \u0411\u0430\u0448\u04a1\u043e\u0440\u0442, Boarisch, \u017demait\u0117\u0161ka, \u0411\u0435\u043b\u0430\u0440\u0443\u0441\u043a\u0430\u044f, \u0411\u0435\u043b\u0430\u0440\u0443\u0441\u043a\u0430\u044f (\u0442\u0430\u0440\u0430\u0448\u043a\u0435\u0432\u0456\u0446\u0430), \u0411\u044a\u043b\u0433\u0430\u0440\u0441\u043a\u0438, Bamanankan, \u09ac\u09be\u0982\u09b2\u09be, Brezhoneg, Bosanski, Catal\u00e0, M\u00ecng-d\u0115\u0324ng-ng\u1e73\u0304, \u041d\u043e\u0445\u0447\u0438\u0439\u043d, Cebuano, \u13e3\u13b3\u13a9, \u010cesky, \u0421\u043b\u043e\u0432\u0463\u0301\u043d\u044c\u0441\u043a\u044a \/ \u2c14\u2c0e\u2c11\u2c02\u2c21\u2c10\u2c20\u2c14\u2c0d\u2c1f, \u0427\u04d1\u0432\u0430\u0448\u043b\u0430, Cymraeg, Dansk, Zazaki, \u078b\u07a8\u0788\u07ac\u0780\u07a8\u0784\u07a6\u0790\u07b0, \u0395\u03bb\u03bb\u03b7\u03bd\u03b9\u03ba\u03ac, Emili\u00e0n e rumagn\u00f2l, English, Esperanto, Espa\u00f1ol, Eesti, Euskara, \u0641\u0627\u0631\u0633\u06cc, Suomi, V\u00f5ro, F\u00f8royskt, Fran\u00e7ais, Arpetan, Furlan, Frysk, Gaeilge, \u8d1b\u8a9e, G\u00e0idhlig, Galego, Ava\u00f1e\'\u1ebd, \u0a97\u0ac1\u0a9c\u0ab0\u0abe\u0aa4\u0ac0, Gaelg, \u05e2\u05d1\u05e8\u05d9\u05ea, \u0939\u093f\u0928\u094d\u0926\u0940, Fiji Hindi, Hrvatski, Krey\u00f2l ayisyen, Magyar, \u0540\u0561\u0575\u0565\u0580\u0565\u0576, Interlingua, Bahasa Indonesia, Ilokano, Ido, \u00cdslenska, Italiano, \u65e5\u672c\u8a9e, Lojban, Basa Jawa, \u10e5\u10d0\u10e0\u10d7\u10e3\u10da\u10d8, Kongo, Kalaallisut, \u0c95\u0ca8\u0ccd\u0ca8\u0ca1, \ud55c\uad6d\uc5b4, \u041a\u044a\u0430\u0440\u0430\u0447\u0430\u0439-\u041c\u0430\u043b\u043a\u044a\u0430\u0440, Ripoarisch, Kurd\u00ee, \u041a\u043e\u043c\u0438, Kernewek, \u041a\u044b\u0440\u0433\u044b\u0437\u0447\u0430, Latina, Ladino, L\u00ebtzebuergesch, Limburgs, Ling\u00e1la, \u0ea5\u0eb2\u0ea7, Lietuvi\u0173, Latvie\u0161u, Basa Banyumasan, Malagasy, \u041c\u0430\u043a\u0435\u0434\u043e\u043d\u0441\u043a\u0438, \u0d2e\u0d32\u0d2f\u0d3e\u0d33\u0d02, \u092e\u0930\u093e\u0920\u0940, Bahasa Melayu, \u0645\u0627\u0632\u0650\u0631\u0648\u0646\u06cc, Nnapulitano, Nedersaksisch, \u0928\u0947\u092a\u093e\u0932 \u092d\u093e\u0937\u093e, Nederlands, \u202aNorsk (nynorsk)\u202c, \u202aNorsk (bokm\u00e5l)\u202c, Nouormand, Din\u00e9 bizaad, Occitan, \u0418\u0440\u043e\u043d\u0430\u0443, Papiamentu, Deitsch, Norfuk \/ Pitkern, Polski, \u067e\u0646\u062c\u0627\u0628\u06cc, \u067e\u069a\u062a\u0648, Portugu\u00eas, Runa Simi, Rumantsch, Romani, Rom\u00e2n\u0103, \u0420\u0443\u0441\u0441\u043a\u0438\u0439, \u0421\u0430\u0445\u0430 \u0442\u044b\u043b\u0430, Sardu, Sicilianu, Scots, S\u00e1megiella, Simple English, Sloven\u010dina, Sloven\u0161\u010dina, \u0421\u0440\u043f\u0441\u043a\u0438 \/ Srpski, Seeltersk, Svenska, Kiswahili, \u0ba4\u0bae\u0bbf\u0bb4\u0bcd, \u0c24\u0c46\u0c32\u0c41\u0c17\u0c41, \u0422\u043e\u04b7\u0438\u043a\u04e3, \u0e44\u0e17\u0e22, T\u00fcrkmen\u00e7e, Tagalog, T\u00fcrk\u00e7e, \u0422\u0430\u0442\u0430\u0440\u0447\u0430\/Tatar\u00e7a, \u0423\u043a\u0440\u0430\u0457\u043d\u0441\u044c\u043a\u0430, \u0627\u0631\u062f\u0648, Ti\u1ebfng Vi\u1ec7t, Volap\u00fck, Walon, Winaray, \u5434\u8bed, isiXhosa, \u05d9\u05d9\u05b4\u05d3\u05d9\u05e9, Yor\u00f9b\u00e1, Ze\u00eauws, \u4e2d\u6587, B\u00e2n-l\u00e2m-g\u00fa, \u7cb5\u8a9e"}',
+        ];
+        yield 'string2' => [
+            'argsClassName' => \Basic\ThriftTest\ThriftTest_testString_args::class,
+            'argsValues' => [
+                'thing' => "quote: \\\" backslash:" .
+                    " forwardslash-escaped: \\/ " .
+                    " backspace: \b formfeed: \f newline: \n return: \r tab: " .
+                    " now-all-of-them-together: \"\\\/\b\n\r\t" .
+                    " now-a-bunch-of-junk: !@#\$%&()(&%$#{}{}<><><",
+            ],
+            'expected' => '{"thing":"quote: \\\\\" backslash: forwardslash-escaped: \\\\\/  backspace: \\\\b formfeed: \f newline: \n return: \r tab:  now-all-of-them-together: \"\\\\\\\\\/\\\\b\n\r\t now-a-bunch-of-junk: !@#$%&()(&%$#{}{}<><><"}',
+        ];
+
+        yield 'string3' => [
+            'argsClassName' => \Basic\ThriftTest\ThriftTest_testString_args::class,
+            'argsValues' => [
+                'thing' => "string that ends in double-backslash \\\\",
+            ],
+            'expected' => '{"thing":"string that ends in double-backslash \\\\\\\\"}',
+        ];
+        yield 'string4 testUnicodeStringWithNonBMP' => [
+            'argsClassName' => \Basic\ThriftTest\ThriftTest_testString_args::class,
+            'argsValues' => [
+                'thing' => "สวัสดี/𝒯",
+            ],
+            'expected' => '{"thing":"\u0e2a\u0e27\u0e31\u0e2a\u0e14\u0e35\/\ud835\udcaf"}',
+        ];
+        yield 'double' => [
+            'argsClassName' => \Basic\ThriftTest\ThriftTest_testDouble_args::class,
+            'argsValues' => [
+                'thing' => 3.1415926535898,
+            ],
+            'expected' => '{"thing":3.1415926535898}',
+        ];
+        #TODO Should be fixed in future
+        yield 'double Nan' => [
+            'argsClassName' => \Basic\ThriftTest\ThriftTest_testDouble_args::class,
+            'argsValues' => [
+                'thing' => NAN,
+            ],
+            'expected' => '{"thing":}',
+        ];
+        #TODO Should be fixed in future
+        yield 'double Infinity' => [
+            'argsClassName' => \Basic\ThriftTest\ThriftTest_testDouble_args::class,
+            'argsValues' => [
+                'thing' => INF,
+            ],
+            'expected' => '{"thing":}',
+        ];
+        yield 'byte' => [
+            'argsClassName' => \Basic\ThriftTest\ThriftTest_testByte_args::class,
+            'argsValues' => [
+                'thing' => 0x01,
+            ],
+            'expected' => '{"thing":1}',
+        ];
+        yield 'i32' => [
+            'argsClassName' => \Basic\ThriftTest\ThriftTest_testI32_args::class,
+            'argsValues' => [
+                'thing' => pow(2, 30),
+            ],
+            'expected' => '{"thing":1073741824}',
+        ];
+        if (PHP_INT_SIZE == 8) {
+            yield 'i64_64Architecture' => [
+                'argsClassName' => \Basic\ThriftTest\ThriftTest_testI64_args::class,
+                'argsValues' => [
+                    'thing' => pow(2, 60),
+                ],
+                'expected' => '{"thing":' . pow(2, 60) . '}',
+            ];
+            yield 'struct_64Architecture' => [
+                'argsClassName' => \Basic\ThriftTest\ThriftTest_testStruct_args::class,
+                'argsValues' => [
+                    'thing' => new Xtruct(
+                        [
+                            'string_thing' => 'worked',
+                            'byte_thing' => 0x01,
+                            'i32_thing' => pow(2, 30),
+                            'i64_thing' => pow(2, 60),
+                        ]
+                    ),
+                ],
+                'expected' => '{"thing":{"string_thing":"worked","byte_thing":1,"i32_thing":1073741824,"i64_thing":' . pow(2, 60) . '}}',
+            ];
+            yield 'nest_64Architecture' => [
+                'argsClassName' => \Basic\ThriftTest\ThriftTest_testNest_args::class,
+                'argsValues' => [
+                    'thing' => new Xtruct2(
+                        [
+                            'byte_thing' => 0x01,
+                            'struct_thing' => new Xtruct(
+                                [
+                                    'string_thing' => 'worked',
+                                    'byte_thing' => 0x01,
+                                    'i32_thing' => pow(2, 30),
+                                    'i64_thing' => pow(2, 60),
+                                ]
+                            ),
+                            'i32_thing' => pow(2, 15),
+                        ]
+                    ),
+                ],
+                'expected' => '{"thing":{"byte_thing":1,"struct_thing":{"string_thing":"worked","byte_thing":1,"i32_thing":1073741824,"i64_thing":' . pow(2, 60) . '},"i32_thing":32768}}',
+            ];
+        } else {
+            yield 'i64_32Architecture' => [
+                'argsClassName' => \Basic\ThriftTest\ThriftTest_testI64_args::class,
+                'argsValues' => [
+                    'thing' => "1152921504606847000",
+                ],
+                'expected' => '{"thing":1152921504606847000}',
+            ];
+            yield 'struct_32Architecture' => [
+                'argsClassName' => \Basic\ThriftTest\ThriftTest_testStruct_args::class,
+                'argsValues' => [
+                    'thing' => new Xtruct(
+                        [
+                            'string_thing' => 'worked',
+                            'byte_thing' => 0x01,
+                            'i32_thing' => pow(2, 30),
+                            'i64_thing' => pow(2, 60),
+                        ]
+                    ),
+                ],
+                'expected' => '{"thing":{"string_thing":"worked","byte_thing":1,"i32_thing":1073741824,"i64_thing":1152921504606847000}}',
+            ];
+            yield 'nest_32Architecture' => [
+                'argsClassName' => \Basic\ThriftTest\ThriftTest_testNest_args::class,
+                'argsValues' => [
+                    'thing' => new Xtruct2(
+                        [
+                            'byte_thing' => 0x01,
+                            'struct_thing' => new Xtruct(
+                                [
+                                    'string_thing' => 'worked',
+                                    'byte_thing' => 0x01,
+                                    'i32_thing' => pow(2, 30),
+                                    'i64_thing' => '1152921504606847000',
+                                ]
+                            ),
+                            'i32_thing' => pow(2, 15),
+                        ]
+                    ),
+                ],
+                'expected' => '{"thing":{"byte_thing":1,"struct_thing":{"string_thing":"worked","byte_thing":1,"i32_thing":1073741824,"i64_thing":1152921504606847000},"i32_thing":32768}}',
+            ];
+        }
+        yield 'map' => [
+            'argsClassName' => \Basic\ThriftTest\ThriftTest_testMap_args::class,
+            'argsValues' => [
+                'thing' => [
+                    7 => 77,
+                    8 => 88,
+                    9 => 99,
+                ],
+            ],
+            'expected' => '{"thing":{"7":77,"8":88,"9":99}}',
+        ];
+        yield 'stringMap' => [
+            'argsClassName' => \Basic\ThriftTest\ThriftTest_testStringMap_args::class,
+            'argsValues' => [
+                'thing' => [
+                    "a" => "123",
+                    "a b" => "with spaces ",
+                    "same" => "same",
+                    "0" => "numeric key",
+                    "longValue" => "Afrikaans, Alemannisch, Aragonés, العربية, مصرى, Asturianu, Aymar aru, Azərbaycan, Башҡорт, Boarisch, Žemaitėška, Беларуская, Беларуская (тарашкевіца), Български, Bamanankan, বাংলা, Brezhoneg, Bosanski, Català, Mìng-dĕ̤ng-ngṳ̄, Нохчийн, Cebuano, ᏣᎳᎩ, Česky, Словѣ́ньскъ / ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ, Чӑвашла, Cymraeg, Dansk, Zazaki, ދިވެހިބަސް, Ελληνικά, Emiliàn e rumagnòl, English, Esperanto, Español, Eesti, Euskara, فارسی, Suomi, Võro, Føroyskt, Français, Arpetan, Furlan, Frysk, Gaeilge, 贛語, Gàidhlig, Galego, Avañe'ẽ, ગુજરાતી, Gaelg, עברית, हिन्दी, Fiji Hindi, Hrvatski, Kreyòl ayisyen, Magyar, Հայերեն, Interlingua, Bahasa Indonesia, Ilokano, Ido, Íslenska, Italiano, 日本語, Lojban, Basa Jawa, ქართული, Kongo, Kalaallisut, ಕನ್ನಡ, 한국어, Къарачай-Малкъар, Ripoarisch, Kurdî, Коми, Kernewek, Кыргызча, Latina, Ladino, Lëtzebuergesch, Limburgs, Lingála, ລາວ, Lietuvių, Latviešu, Basa Banyumasan, Malagasy, Македонски, മലയാളം, मराठी, Bahasa Melayu, مازِرونی, Nnapulitano, Nedersaksisch, नेपाल भाषा, Nederlands, ‪Norsk (nynorsk)‬, ‪Norsk (bokmål)‬, Nouormand, Diné bizaad, Occitan, Иронау, Papiamentu, Deitsch, Norfuk / Pitkern, Polski, پنجابی, پښتو, Português, Runa Simi, Rumantsch, Romani, Română, Русский, Саха тыла, Sardu, Sicilianu, Scots, Sámegiella, Simple English, Slovenčina, Slovenščina, Српски / Srpski, Seeltersk, Svenska, Kiswahili, தமிழ், తెలుగు, Тоҷикӣ, ไทย, Türkmençe, Tagalog, Türkçe, Татарча/Tatarça, Українська, اردو, Tiếng Việt, Volapük, Walon, Winaray, 吴语, isiXhosa, ייִדיש, Yorùbá, Zeêuws, 中文, Bân-lâm-gú, 粵語",
+                    "Afrikaans, Alemannisch, Aragonés, العربية, مصرى, Asturianu, Aymar aru, Azərbaycan, Башҡорт, Boarisch, Žemaitėška, Беларуская, Беларуская (тарашкевіца), Български, Bamanankan, বাংলা, Brezhoneg, Bosanski, Català, Mìng-dĕ̤ng-ngṳ̄, Нохчийн, Cebuano, ᏣᎳᎩ, Česky, Словѣ́ньскъ / ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ, Чӑвашла, Cymraeg, Dansk, Zazaki, ދިވެހިބަސް, Ελληνικά, Emiliàn e rumagnòl, English, Esperanto, Español, Eesti, Euskara, فارسی, Suomi, Võro, Føroyskt, Français, Arpetan, Furlan, Frysk, Gaeilge, 贛語, Gàidhlig, Galego, Avañe'ẽ, ગુજરાતી, Gaelg, עברית, हिन्दी, Fiji Hindi, Hrvatski, Kreyòl ayisyen, Magyar, Հայերեն, Interlingua, Bahasa Indonesia, Ilokano, Ido, Íslenska, Italiano, 日本語, Lojban, Basa Jawa, ქართული, Kongo, Kalaallisut, ಕನ್ನಡ, 한국어, Къарачай-Малкъар, Ripoarisch, Kurdî, Коми, Kernewek, Кыргызча, Latina, Ladino, Lëtzebuergesch, Limburgs, Lingála, ລາວ, Lietuvių, Latviešu, Basa Banyumasan, Malagasy, Македонски, മലയാളം, मराठी, Bahasa Melayu, مازِرونی, Nnapulitano, Nedersaksisch, नेपाल भाषा, Nederlands, ‪Norsk (nynorsk)‬, ‪Norsk (bokmål)‬, Nouormand, Diné bizaad, Occitan, Иронау, Papiamentu, Deitsch, Norfuk / Pitkern, Polski, پنجابی, پښتو, Português, Runa Simi, Rumantsch, Romani, Română, Русский, Саха тыла, Sardu, Sicilianu, Scots, Sámegiella, Simple English, Slovenčina, Slovenščina, Српски / Srpski, Seeltersk, Svenska, Kiswahili, தமிழ், తెలుగు, Тоҷикӣ, ไทย, Türkmençe, Tagalog, Türkçe, Татарча/Tatarça, Українська, اردو, Tiếng Việt, Volapük, Walon, Winaray, 吴语, isiXhosa, ייִדיש, Yorùbá, Zeêuws, 中文, Bân-lâm-gú, 粵語" => "long key"
+                ],
+            ],
+            'expected' => '{"thing":{"a":"123","a b":"with spaces ","same":"same","0":"numeric key","longValue":"Afrikaans, Alemannisch, Aragon\u00e9s, \u0627\u0644\u0639\u0631\u0628\u064a\u0629, \u0645\u0635\u0631\u0649, Asturianu, Aymar aru, Az\u0259rbaycan, \u0411\u0430\u0448\u04a1\u043e\u0440\u0442, Boarisch, \u017demait\u0117\u0161ka, \u0411\u0435\u043b\u0430\u0440\u0443\u0441\u043a\u0430\u044f, \u0411\u0435\u043b\u0430\u0440\u0443\u0441\u043a\u0430\u044f (\u0442\u0430\u0440\u0430\u0448\u043a\u0435\u0432\u0456\u0446\u0430), \u0411\u044a\u043b\u0433\u0430\u0440\u0441\u043a\u0438, Bamanankan, \u09ac\u09be\u0982\u09b2\u09be, Brezhoneg, Bosanski, Catal\u00e0, M\u00ecng-d\u0115\u0324ng-ng\u1e73\u0304, \u041d\u043e\u0445\u0447\u0438\u0439\u043d, Cebuano, \u13e3\u13b3\u13a9, \u010cesky, \u0421\u043b\u043e\u0432\u0463\u0301\u043d\u044c\u0441\u043a\u044a \/ \u2c14\u2c0e\u2c11\u2c02\u2c21\u2c10\u2c20\u2c14\u2c0d\u2c1f, \u0427\u04d1\u0432\u0430\u0448\u043b\u0430, Cymraeg, Dansk, Zazaki, \u078b\u07a8\u0788\u07ac\u0780\u07a8\u0784\u07a6\u0790\u07b0, \u0395\u03bb\u03bb\u03b7\u03bd\u03b9\u03ba\u03ac, Emili\u00e0n e rumagn\u00f2l, English, Esperanto, Espa\u00f1ol, Eesti, Euskara, \u0641\u0627\u0631\u0633\u06cc, Suomi, V\u00f5ro, F\u00f8royskt, Fran\u00e7ais, Arpetan, Furlan, Frysk, Gaeilge, \u8d1b\u8a9e, G\u00e0idhlig, Galego, Ava\u00f1e\'\u1ebd, \u0a97\u0ac1\u0a9c\u0ab0\u0abe\u0aa4\u0ac0, Gaelg, \u05e2\u05d1\u05e8\u05d9\u05ea, \u0939\u093f\u0928\u094d\u0926\u0940, Fiji Hindi, Hrvatski, Krey\u00f2l ayisyen, Magyar, \u0540\u0561\u0575\u0565\u0580\u0565\u0576, Interlingua, Bahasa Indonesia, Ilokano, Ido, \u00cdslenska, Italiano, \u65e5\u672c\u8a9e, Lojban, Basa Jawa, \u10e5\u10d0\u10e0\u10d7\u10e3\u10da\u10d8, Kongo, Kalaallisut, \u0c95\u0ca8\u0ccd\u0ca8\u0ca1, \ud55c\uad6d\uc5b4, \u041a\u044a\u0430\u0440\u0430\u0447\u0430\u0439-\u041c\u0430\u043b\u043a\u044a\u0430\u0440, Ripoarisch, Kurd\u00ee, \u041a\u043e\u043c\u0438, Kernewek, \u041a\u044b\u0440\u0433\u044b\u0437\u0447\u0430, Latina, Ladino, L\u00ebtzebuergesch, Limburgs, Ling\u00e1la, \u0ea5\u0eb2\u0ea7, Lietuvi\u0173, Latvie\u0161u, Basa Banyumasan, Malagasy, \u041c\u0430\u043a\u0435\u0434\u043e\u043d\u0441\u043a\u0438, \u0d2e\u0d32\u0d2f\u0d3e\u0d33\u0d02, \u092e\u0930\u093e\u0920\u0940, Bahasa Melayu, \u0645\u0627\u0632\u0650\u0631\u0648\u0646\u06cc, Nnapulitano, Nedersaksisch, \u0928\u0947\u092a\u093e\u0932 \u092d\u093e\u0937\u093e, Nederlands, \u202aNorsk (nynorsk)\u202c, \u202aNorsk (bokm\u00e5l)\u202c, Nouormand, Din\u00e9 bizaad, Occitan, \u0418\u0440\u043e\u043d\u0430\u0443, Papiamentu, Deitsch, Norfuk \/ Pitkern, Polski, \u067e\u0646\u062c\u0627\u0628\u06cc, \u067e\u069a\u062a\u0648, Portugu\u00eas, Runa Simi, Rumantsch, Romani, Rom\u00e2n\u0103, \u0420\u0443\u0441\u0441\u043a\u0438\u0439, \u0421\u0430\u0445\u0430 \u0442\u044b\u043b\u0430, Sardu, Sicilianu, Scots, S\u00e1megiella, Simple English, Sloven\u010dina, Sloven\u0161\u010dina, \u0421\u0440\u043f\u0441\u043a\u0438 \/ Srpski, Seeltersk, Svenska, Kiswahili, \u0ba4\u0bae\u0bbf\u0bb4\u0bcd, \u0c24\u0c46\u0c32\u0c41\u0c17\u0c41, \u0422\u043e\u04b7\u0438\u043a\u04e3, \u0e44\u0e17\u0e22, T\u00fcrkmen\u00e7e, Tagalog, T\u00fcrk\u00e7e, \u0422\u0430\u0442\u0430\u0440\u0447\u0430\/Tatar\u00e7a, \u0423\u043a\u0440\u0430\u0457\u043d\u0441\u044c\u043a\u0430, \u0627\u0631\u062f\u0648, Ti\u1ebfng Vi\u1ec7t, Volap\u00fck, Walon, Winaray, \u5434\u8bed, isiXhosa, \u05d9\u05d9\u05b4\u05d3\u05d9\u05e9, Yor\u00f9b\u00e1, Ze\u00eauws, \u4e2d\u6587, B\u00e2n-l\u00e2m-g\u00fa, \u7cb5\u8a9e","Afrikaans, Alemannisch, Aragon\u00e9s, \u0627\u0644\u0639\u0631\u0628\u064a\u0629, \u0645\u0635\u0631\u0649, Asturianu, Aymar aru, Az\u0259rbaycan, \u0411\u0430\u0448\u04a1\u043e\u0440\u0442, Boarisch, \u017demait\u0117\u0161ka, \u0411\u0435\u043b\u0430\u0440\u0443\u0441\u043a\u0430\u044f, \u0411\u0435\u043b\u0430\u0440\u0443\u0441\u043a\u0430\u044f (\u0442\u0430\u0440\u0430\u0448\u043a\u0435\u0432\u0456\u0446\u0430), \u0411\u044a\u043b\u0433\u0430\u0440\u0441\u043a\u0438, Bamanankan, \u09ac\u09be\u0982\u09b2\u09be, Brezhoneg, Bosanski, Catal\u00e0, M\u00ecng-d\u0115\u0324ng-ng\u1e73\u0304, \u041d\u043e\u0445\u0447\u0438\u0439\u043d, Cebuano, \u13e3\u13b3\u13a9, \u010cesky, \u0421\u043b\u043e\u0432\u0463\u0301\u043d\u044c\u0441\u043a\u044a \/ \u2c14\u2c0e\u2c11\u2c02\u2c21\u2c10\u2c20\u2c14\u2c0d\u2c1f, \u0427\u04d1\u0432\u0430\u0448\u043b\u0430, Cymraeg, Dansk, Zazaki, \u078b\u07a8\u0788\u07ac\u0780\u07a8\u0784\u07a6\u0790\u07b0, \u0395\u03bb\u03bb\u03b7\u03bd\u03b9\u03ba\u03ac, Emili\u00e0n e rumagn\u00f2l, English, Esperanto, Espa\u00f1ol, Eesti, Euskara, \u0641\u0627\u0631\u0633\u06cc, Suomi, V\u00f5ro, F\u00f8royskt, Fran\u00e7ais, Arpetan, Furlan, Frysk, Gaeilge, \u8d1b\u8a9e, G\u00e0idhlig, Galego, Ava\u00f1e\'\u1ebd, \u0a97\u0ac1\u0a9c\u0ab0\u0abe\u0aa4\u0ac0, Gaelg, \u05e2\u05d1\u05e8\u05d9\u05ea, \u0939\u093f\u0928\u094d\u0926\u0940, Fiji Hindi, Hrvatski, Krey\u00f2l ayisyen, Magyar, \u0540\u0561\u0575\u0565\u0580\u0565\u0576, Interlingua, Bahasa Indonesia, Ilokano, Ido, \u00cdslenska, Italiano, \u65e5\u672c\u8a9e, Lojban, Basa Jawa, \u10e5\u10d0\u10e0\u10d7\u10e3\u10da\u10d8, Kongo, Kalaallisut, \u0c95\u0ca8\u0ccd\u0ca8\u0ca1, \ud55c\uad6d\uc5b4, \u041a\u044a\u0430\u0440\u0430\u0447\u0430\u0439-\u041c\u0430\u043b\u043a\u044a\u0430\u0440, Ripoarisch, Kurd\u00ee, \u041a\u043e\u043c\u0438, Kernewek, \u041a\u044b\u0440\u0433\u044b\u0437\u0447\u0430, Latina, Ladino, L\u00ebtzebuergesch, Limburgs, Ling\u00e1la, \u0ea5\u0eb2\u0ea7, Lietuvi\u0173, Latvie\u0161u, Basa Banyumasan, Malagasy, \u041c\u0430\u043a\u0435\u0434\u043e\u043d\u0441\u043a\u0438, \u0d2e\u0d32\u0d2f\u0d3e\u0d33\u0d02, \u092e\u0930\u093e\u0920\u0940, Bahasa Melayu, \u0645\u0627\u0632\u0650\u0631\u0648\u0646\u06cc, Nnapulitano, Nedersaksisch, \u0928\u0947\u092a\u093e\u0932 \u092d\u093e\u0937\u093e, Nederlands, \u202aNorsk (nynorsk)\u202c, \u202aNorsk (bokm\u00e5l)\u202c, Nouormand, Din\u00e9 bizaad, Occitan, \u0418\u0440\u043e\u043d\u0430\u0443, Papiamentu, Deitsch, Norfuk \/ Pitkern, Polski, \u067e\u0646\u062c\u0627\u0628\u06cc, \u067e\u069a\u062a\u0648, Portugu\u00eas, Runa Simi, Rumantsch, Romani, Rom\u00e2n\u0103, \u0420\u0443\u0441\u0441\u043a\u0438\u0439, \u0421\u0430\u0445\u0430 \u0442\u044b\u043b\u0430, Sardu, Sicilianu, Scots, S\u00e1megiella, Simple English, Sloven\u010dina, Sloven\u0161\u010dina, \u0421\u0440\u043f\u0441\u043a\u0438 \/ Srpski, Seeltersk, Svenska, Kiswahili, \u0ba4\u0bae\u0bbf\u0bb4\u0bcd, \u0c24\u0c46\u0c32\u0c41\u0c17\u0c41, \u0422\u043e\u04b7\u0438\u043a\u04e3, \u0e44\u0e17\u0e22, T\u00fcrkmen\u00e7e, Tagalog, T\u00fcrk\u00e7e, \u0422\u0430\u0442\u0430\u0440\u0447\u0430\/Tatar\u00e7a, \u0423\u043a\u0440\u0430\u0457\u043d\u0441\u044c\u043a\u0430, \u0627\u0631\u062f\u0648, Ti\u1ebfng Vi\u1ec7t, Volap\u00fck, Walon, Winaray, \u5434\u8bed, isiXhosa, \u05d9\u05d9\u05b4\u05d3\u05d9\u05e9, Yor\u00f9b\u00e1, Ze\u00eauws, \u4e2d\u6587, B\u00e2n-l\u00e2m-g\u00fa, \u7cb5\u8a9e":"long key"}}',
+        ];
+        yield 'set' => [
+            'argsClassName' => \Basic\ThriftTest\ThriftTest_testSet_args::class,
+            'argsValues' => [
+                'thing' => [1 => true, 5 => true, 6 => true],
+            ],
+            'expected' => '{"thing":[1,5,6]}',
+        ];
+        yield 'list' => [
+            'argsClassName' => \Basic\ThriftTest\ThriftTest_testList_args::class,
+            'argsValues' => [
+                'thing' => [1, 2, 3],
+            ],
+            'expected' => '{"thing":[1,2,3]}',
+        ];
+        yield 'enum' => [
+            'argsClassName' => \Basic\ThriftTest\ThriftTest_testEnum_args::class,
+            'argsValues' => [
+                'thing' => \Basic\ThriftTest\Numberz::SIX,
+            ],
+            'expected' => '{"thing":6}',
+        ];
+        yield 'typedef' => [
+            'argsClassName' => \Basic\ThriftTest\ThriftTest_testTypedef_args::class,
+            'argsValues' => [
+                'thing' => 69,
+            ],
+            'expected' => '{"thing":69}',
+        ];
+    }
+}
diff --git a/lib/php/test/Unit/BinarySerializerTest.php b/lib/php/test/Integration/Lib/Serializer/BinarySerializerTest.php
similarity index 66%
rename from lib/php/test/Unit/BinarySerializerTest.php
rename to lib/php/test/Integration/Lib/Serializer/BinarySerializerTest.php
index 744ca7a..44eef93 100644
--- a/lib/php/test/Unit/BinarySerializerTest.php
+++ b/lib/php/test/Integration/Lib/Serializer/BinarySerializerTest.php
@@ -19,35 +19,26 @@
  * under the License.
  */
 
-namespace Test\Thrift\Unit;
+namespace Test\Thrift\Integration\Lib\Serializer;
 
 use PHPUnit\Framework\TestCase;
-use Thrift\ClassLoader\ThriftClassLoader;
 use Thrift\Serializer\TBinarySerializer;
 
 /***
  * This test suite depends on running the compiler against the ./Resources/ThriftTest.thrift file:
- * lib/php/test$ ../../../compiler/cpp/thrift --gen php -r  --out ./Resources/packages/php ./Resources/ThriftTest.thrift
+ * lib/php/test$ ../../../compiler/cpp/thrift --gen php:nsglobal="Basic" -r  --out ./Resources/packages/php ./Resources/ThriftTest.thrift
  */
 class BinarySerializerTest extends TestCase
 {
-    public function setUp(): void
-    {
-        $loader = new ThriftClassLoader();
-        $loader->registerNamespace('ThriftTest', __DIR__ . '/../Resources/packages/php');
-        $loader->registerDefinition('ThriftTest', __DIR__ . '/../Resources/packages/php');
-        $loader->register();
-    }
-
     /**
      * We try to serialize and deserialize a random object to make sure no exceptions are thrown.
      * @see THRIFT-1579
      */
     public function testBinarySerializer()
     {
-        $struct = new \ThriftTest\Xtruct(array('string_thing' => 'abc'));
-        $serialized = TBinarySerializer::serialize($struct, 'ThriftTest\\Xtruct');
-        $deserialized = TBinarySerializer::deserialize($serialized, 'ThriftTest\\Xtruct');
+        $struct = new \Basic\ThriftTest\Xtruct(array('string_thing' => 'abc'));
+        $serialized = TBinarySerializer::serialize($struct, '\\Basic\\ThriftTest\\Xtruct');
+        $deserialized = TBinarySerializer::deserialize($serialized, '\\Basic\\ThriftTest\\Xtruct');
         $this->assertEquals($struct, $deserialized);
     }
 }
diff --git a/lib/php/test/Unit/JsonSerializeTest.php b/lib/php/test/Integration/Lib/Serializer/JsonSerializeTest.php
similarity index 71%
rename from lib/php/test/Unit/JsonSerializeTest.php
rename to lib/php/test/Integration/Lib/Serializer/JsonSerializeTest.php
index 66e4d5e..d3fe3f7 100644
--- a/lib/php/test/Unit/JsonSerializeTest.php
+++ b/lib/php/test/Integration/Lib/Serializer/JsonSerializeTest.php
@@ -19,7 +19,7 @@
  * under the License.
  */
 
-namespace Test\Thrift\Unit;
+namespace Test\Thrift\Integration\Lib\Serializer;
 
 use PHPUnit\Framework\TestCase;
 use stdClass;
@@ -27,21 +27,13 @@
 
 /***
  * This test suite depends on running the compiler against the ./Resources/ThriftTest.thrift file:
- * lib/php/test$ ../../../compiler/cpp/thrift --gen php:json -r  --out ./Resources/packages/phpjs ./Resources/ThriftTest.thrift
+ * lib/php/test$ ../../../compiler/cpp/thrift --gen php:json,nsglobal="Json" -r  --out ./Resources/packages/phpjs ./Resources/ThriftTest.thrift
  */
 class JsonSerializeTest extends TestCase
 {
-    protected function setUp(): void
-    {
-        $loader = new ThriftClassLoader();
-        $loader->registerNamespace('ThriftTest', __DIR__ . '/../Resources/packages/phpjs');
-        $loader->registerDefinition('ThriftTest', __DIR__ . '/../Resources/packages/phpjs');
-        $loader->register();
-    }
-
     public function testEmptyStruct()
     {
-        $empty = new \ThriftTest\EmptyStruct(array('non_existing_key' => 'bar'));
+        $empty = new \Json\ThriftTest\EmptyStruct(array('non_existing_key' => 'bar'));
         $this->assertEquals(new stdClass(), json_decode(json_encode($empty)));
     }
 
@@ -51,7 +43,7 @@
             'string_thing' => 'foo',
             'i64_thing' => 1234567890,
         );
-        $xtruct = new \ThriftTest\Xtruct($input);
+        $xtruct = new \Json\ThriftTest\Xtruct($input);
 
         // Xtruct's 'i32_thing' and 'byte_thing' fields should not be present here!
         $expected = new stdClass();
@@ -62,9 +54,9 @@
 
     public function testNestedStructs()
     {
-        $xtruct2 = new \ThriftTest\Xtruct2(array(
+        $xtruct2 = new \Json\ThriftTest\Xtruct2(array(
             'byte_thing' => 42,
-            'struct_thing' => new \ThriftTest\Xtruct(array(
+            'struct_thing' => new \Json\ThriftTest\Xtruct(array(
                 'i32_thing' => 123456,
             )),
         ));
@@ -79,8 +71,8 @@
     public function testInsanity()
     {
         $xinput = array('string_thing' => 'foo');
-        $xtruct = new \ThriftTest\Xtruct($xinput);
-        $insanity = new \ThriftTest\Insanity(array(
+        $xtruct = new \Json\ThriftTest\Xtruct($xinput);
+        $insanity = new \Json\ThriftTest\Insanity(array(
             'xtructs' => array($xtruct, $xtruct, $xtruct)
         ));
         $expected = new stdClass();
@@ -90,8 +82,8 @@
 
     public function testNestedLists()
     {
-        $bonk = new \ThriftTest\Bonk(array('message' => 'foo'));
-        $nested = new \ThriftTest\NestedListsBonk(array('bonk' => array(array(array($bonk)))));
+        $bonk = new \Json\ThriftTest\Bonk(array('message' => 'foo'));
+        $nested = new \Json\ThriftTest\NestedListsBonk(array('bonk' => array(array(array($bonk)))));
         $expected = new stdClass();
         $expected->bonk = array(array(array((object)array('message' => 'foo'))));
         $this->assertEquals($expected, json_decode(json_encode($nested)));
@@ -99,17 +91,17 @@
 
     public function testMaps()
     {
-        $intmap = new \ThriftTest\ThriftTest_testMap_args(['thing' => [0 => 'zero']]);
-        $emptymap = new \ThriftTest\ThriftTest_testMap_args([]);
+        $intmap = new \Json\ThriftTest\ThriftTest_testMap_args(['thing' => [0 => 'zero']]);
+        $emptymap = new \Json\ThriftTest\ThriftTest_testMap_args([]);
         $this->assertEquals('{"thing":{"0":"zero"}}', json_encode($intmap));
         $this->assertEquals('{}', json_encode($emptymap));
     }
 
     public function testScalarTypes()
     {
-        $b = new \ThriftTest\Bools(['im_true' => '1', 'im_false' => '0']);
+        $b = new \Json\ThriftTest\Bools(['im_true' => '1', 'im_false' => '0']);
         $this->assertEquals('{"im_true":true,"im_false":false}', json_encode($b));
-        $s = new \ThriftTest\StructA(['s' => 42]);
+        $s = new \Json\ThriftTest\StructA(['s' => 42]);
         $this->assertEquals('{"s":"42"}', json_encode($s));
     }
 }
diff --git a/lib/php/test/Integration/ValidatorOopTest.php b/lib/php/test/Integration/ValidatorOopTest.php
new file mode 100644
index 0000000..c3dce03
--- /dev/null
+++ b/lib/php/test/Integration/ValidatorOopTest.php
@@ -0,0 +1,34 @@
+<?php
+
+/*
+ * 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 Test\Thrift\Integration;
+
+/***
+ * This test suite depends on running the compiler against the ./Resources/ThriftTest.thrift file:
+ * lib/php/test$ ../../../compiler/cpp/thrift --gen php:validate,oop,nsglobal="ValidateOop" -r --out ./Resources/packages/phpvo ./Resources/ThriftTest.thrift
+ */
+class ValidatorOopTest extends BaseValidatorTest
+{
+    public function getNsGlobal()
+    {
+        return 'ValidateOop';
+    }
+}
diff --git a/lib/php/test/Unit/ValidatorTest.php b/lib/php/test/Integration/ValidatorTest.php
similarity index 62%
rename from lib/php/test/Unit/ValidatorTest.php
rename to lib/php/test/Integration/ValidatorTest.php
index b125424..0d6a697 100644
--- a/lib/php/test/Unit/ValidatorTest.php
+++ b/lib/php/test/Integration/ValidatorTest.php
@@ -19,23 +19,16 @@
  * under the License.
  */
 
-namespace Test\Thrift\Unit;
-
-use Thrift\ClassLoader\ThriftClassLoader;
+namespace Test\Thrift\Integration;
 
 /***
  * This test suite depends on running the compiler against the ./Resources/ThriftTest.thrift file:
- * lib/php/test$ ../../../compiler/cpp/thrift --gen php:validate -r  --out ./Resources/packages/phpv ./Resources/ThriftTest.thrift
+ * lib/php/test$ ../../../compiler/cpp/thrift --gen php:validate,nsglobal="Validate" -r  --out ./Resources/packages/phpv ./Resources/ThriftTest.thrift
  */
 class ValidatorTest extends BaseValidatorTest
 {
-    public function setUp(): void
+    public function getNsGlobal()
     {
-        $loader = new ThriftClassLoader();
-        $loader->registerNamespace('ThriftTest', __DIR__ . '/../Resources/packages/phpv');
-        $loader->registerDefinition('ThriftTest', __DIR__ . '/../Resources/packages/phpv');
-        $loader->registerNamespace('TestValidators', __DIR__ . '/../Resources/packages/phpv');
-        $loader->registerDefinition('TestValidators', __DIR__ . '/../Resources/packages/phpv');
-        $loader->register();
+        return 'Validate';
     }
 }
diff --git a/lib/php/test/Makefile.am b/lib/php/test/Makefile.am
index 00d51f6..b6a5325 100644
--- a/lib/php/test/Makefile.am
+++ b/lib/php/test/Makefile.am
@@ -25,11 +25,11 @@
 	mkdir -p ./Resources/packages/phpvo
 	mkdir -p ./Resources/packages/phpjs
 	mkdir -p ./Resources/packages/phpcm
-	$(THRIFT) --gen php -r --out ./Resources/packages/php Resources/ThriftTest.thrift
-	$(THRIFT) --gen php:validate -r --out ./Resources/packages/phpv Resources/ThriftTest.thrift
-	$(THRIFT) --gen php:validate,oop -r --out ./Resources/packages/phpvo Resources/ThriftTest.thrift
-	$(THRIFT) --gen php:json -r --out ./Resources/packages/phpjs Resources/ThriftTest.thrift
-	$(THRIFT) --gen php:classmap,server,rest -r --out ./Resources/packages/phpcm Resources/ThriftTest.thrift
+	$(THRIFT) --gen php:nsglobal="Basic" -r --out ./Resources/packages/php Resources/ThriftTest.thrift
+	$(THRIFT) --gen php:validate,nsglobal="Validate" -r --out ./Resources/packages/phpv Resources/ThriftTest.thrift
+	$(THRIFT) --gen php:validate,oop,nsglobal="ValidateOop" -r --out ./Resources/packages/phpvo Resources/ThriftTest.thrift
+	$(THRIFT) --gen php:json,nsglobal="Json" -r --out ./Resources/packages/phpjs Resources/ThriftTest.thrift
+	$(THRIFT) --gen php:classmap,server,rest,nsglobal="Classmap" -r --out ./Resources/packages/phpcm Resources/ThriftTest.thrift
 
 deps: $(top_srcdir)/composer.json
 	composer install --working-dir=$(top_srcdir)
@@ -41,6 +41,9 @@
 
 distclean-local:
 
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
 clean-local:
 	$(RM) -r ./Resources/packages
 	$(RM) test-log-junit.xml
diff --git a/lib/php/test/Unit/Lib/ClassLoader/Fixtures/A/TestClass.php b/lib/php/test/Unit/Lib/ClassLoader/Fixtures/A/TestClass.php
index e39f501..3652b25 100644
--- a/lib/php/test/Unit/Lib/ClassLoader/Fixtures/A/TestClass.php
+++ b/lib/php/test/Unit/Lib/ClassLoader/Fixtures/A/TestClass.php
@@ -17,11 +17,6 @@
  * KIND, either express or implied. See the License for the
  * specific language governing permissions and limitations
  * under the License.
- *
- * ClassLoader to load Thrift library and definitions
- * Inspired from UniversalClassLoader from Symfony 2
- *
- * @package thrift.classloader
  */
 
 namespace A;
diff --git a/lib/php/test/Unit/Lib/ClassLoader/Fixtures/B/TestClass.php b/lib/php/test/Unit/Lib/ClassLoader/Fixtures/B/TestClass.php
index d2e87e2..1d5a543 100644
--- a/lib/php/test/Unit/Lib/ClassLoader/Fixtures/B/TestClass.php
+++ b/lib/php/test/Unit/Lib/ClassLoader/Fixtures/B/TestClass.php
@@ -17,11 +17,6 @@
  * KIND, either express or implied. See the License for the
  * specific language governing permissions and limitations
  * under the License.
- *
- * ClassLoader to load Thrift library and definitions
- * Inspired from UniversalClassLoader from Symfony 2
- *
- * @package thrift.classloader
  */
 
 namespace B;
diff --git a/lib/php/test/Unit/Lib/ClassLoader/Fixtures/C/TestClass.php b/lib/php/test/Unit/Lib/ClassLoader/Fixtures/C/TestClass.php
index 9e4000c..58bae58 100644
--- a/lib/php/test/Unit/Lib/ClassLoader/Fixtures/C/TestClass.php
+++ b/lib/php/test/Unit/Lib/ClassLoader/Fixtures/C/TestClass.php
@@ -17,11 +17,6 @@
  * KIND, either express or implied. See the License for the
  * specific language governing permissions and limitations
  * under the License.
- *
- * ClassLoader to load Thrift library and definitions
- * Inspired from UniversalClassLoader from Symfony 2
- *
- * @package thrift.classloader
  */
 
 namespace C;
diff --git a/lib/php/test/Unit/Lib/ClassLoader/Fixtures/D/TestClass.php b/lib/php/test/Unit/Lib/ClassLoader/Fixtures/D/TestClass.php
index c0cda0c..592fe56 100644
--- a/lib/php/test/Unit/Lib/ClassLoader/Fixtures/D/TestClass.php
+++ b/lib/php/test/Unit/Lib/ClassLoader/Fixtures/D/TestClass.php
@@ -17,11 +17,6 @@
  * KIND, either express or implied. See the License for the
  * specific language governing permissions and limitations
  * under the License.
- *
- * ClassLoader to load Thrift library and definitions
- * Inspired from UniversalClassLoader from Symfony 2
- *
- * @package thrift.classloader
  */
 
 namespace D;
diff --git a/lib/php/test/Unit/Lib/ClassLoader/Fixtures/E/TestClass.php b/lib/php/test/Unit/Lib/ClassLoader/Fixtures/E/TestClass.php
index b1981b4..56b5679 100644
--- a/lib/php/test/Unit/Lib/ClassLoader/Fixtures/E/TestClass.php
+++ b/lib/php/test/Unit/Lib/ClassLoader/Fixtures/E/TestClass.php
@@ -17,11 +17,6 @@
  * KIND, either express or implied. See the License for the
  * specific language governing permissions and limitations
  * under the License.
- *
- * ClassLoader to load Thrift library and definitions
- * Inspired from UniversalClassLoader from Symfony 2
- *
- * @package thrift.classloader
  */
 
 namespace E;
diff --git a/lib/php/test/Unit/Lib/ClassLoader/ThriftClassLoaderTest.php b/lib/php/test/Unit/Lib/ClassLoader/ThriftClassLoaderTest.php
index 1180211..d99edfa 100644
--- a/lib/php/test/Unit/Lib/ClassLoader/ThriftClassLoaderTest.php
+++ b/lib/php/test/Unit/Lib/ClassLoader/ThriftClassLoaderTest.php
@@ -21,16 +21,13 @@
 
 namespace Test\Thrift\Unit\Lib\ClassLoader;
 
+use phpmock\phpunit\PHPMock;
 use PHPUnit\Framework\TestCase;
 use Thrift\ClassLoader\ThriftClassLoader;
 
-/***
- * This test depends on running the compiler against the ./Resources/ThriftTest.thrift file:
- * lib/php/test$ ../../../compiler/cpp/thrift --gen php:classmap,server,rest -r  --out ./Resources/packages/phpcm ./Resources/ThriftTest.thrift
- */
 class ThriftClassLoaderTest extends TestCase
 {
-    const APCU_PREFIX = 'test';
+    use PHPMock;
 
     /**
      * @dataProvider registerNamespaceDataProvider
@@ -42,6 +39,16 @@
         $useApcu = false,
         $apcuPrefix = null
     ) {
+        $this->getFunctionMock('Thrift\ClassLoader', 'apcu_fetch')
+             ->expects($useApcu ? $this->once() : $this->never())
+             ->with($apcuPrefix . $class)
+             ->willReturn(false);
+
+        $this->getFunctionMock('Thrift\ClassLoader', 'apcu_store')
+             ->expects($useApcu ? $this->once() : $this->never())
+             ->with($apcuPrefix . $class, $this->anything())
+             ->willReturn(true);
+
         $loader = new ThriftClassLoader($useApcu, $apcuPrefix);
         foreach ($namespaces as $namespace => $paths) {
             $loader->registerNamespace($namespace, $paths);
@@ -97,127 +104,7 @@
             'class' => '\E\TestClass',
             'isClassExist' => true,
             'useApcu' => true,
-            'apcuPrefix' => self::APCU_PREFIX,
+            'apcuPrefix' => 'APCU_PREFIX',
         ];
     }
-
-    /**
-     * @dataProvider registerDefinitionDataProvider
-     */
-    public function testRegisterDefinition(
-        $definitions,
-        $class,
-        $checkInterfaceExist = false,
-        $useApcu = false,
-        $apcuPrefix = null
-    ) {
-        $loader = new ThriftClassLoader($useApcu, $apcuPrefix);
-        foreach ($definitions as $namespace => $paths) {
-            $loader->registerDefinition($namespace, $paths);
-        }
-        $loader->register();
-
-        $loader->loadClass($class);
-        if ($checkInterfaceExist) {
-            $this->assertTrue(interface_exists($class, false), "->loadClass() loads '$class'");
-        } else {
-            $this->assertTrue(class_exists($class, false), "->loadClass() loads '$class'");
-        }
-    }
-
-    public function registerDefinitionDataProvider()
-    {
-        yield 'loadType' => [
-            'definitions' => [
-                'ThriftTest' => __DIR__ . '/../../../Resources/packages/phpcm',
-            ],
-            'class' => 'ThriftTest\Xtruct',
-        ];
-        yield 'loadInterface' => [
-            'definitions' => [
-                'ThriftTest' => __DIR__ . '/../../../Resources/packages/phpcm',
-            ],
-            'class' => '\ThriftTest\ThriftTestIf',
-            'checkInterfaceExist' => true,
-        ];
-        yield 'loadClient' => [
-            'definitions' => [
-                'ThriftTest' => __DIR__ . '/../../../Resources/packages/phpcm',
-            ],
-            'class' => '\ThriftTest\ThriftTestClient',
-        ];
-        yield 'loadProcessor' => [
-            'definitions' => [
-                'ThriftTest' => __DIR__ . '/../../../Resources/packages/phpcm',
-            ],
-            'class' => '\ThriftTest\ThriftTestProcessor',
-        ];
-        yield 'loadRest' => [
-            'definitions' => [
-                'ThriftTest' => __DIR__ . '/../../../Resources/packages/phpcm',
-            ],
-            'class' => '\ThriftTest\ThriftTestRest',
-        ];
-        yield 'load_args' => [
-            'definitions' => [
-                'ThriftTest' => __DIR__ . '/../../../Resources/packages/phpcm',
-            ],
-            'class' => '\ThriftTest\ThriftTest_testVoid_args',
-        ];
-        yield 'load_result' => [
-            'definitions' => [
-                'ThriftTest' => __DIR__ . '/../../../Resources/packages/phpcm',
-            ],
-            'class' => '\ThriftTest\ThriftTest_testVoid_result',
-        ];
-        yield 'pathAsArray' => [
-            'definitions' => [
-                'ThriftTest' => [__DIR__ . '/../../../Resources/packages/phpcm'],
-            ],
-            'class' => 'ThriftTest\Xtruct',
-        ];
-        yield 'severalDefinitions' => [
-            'definitions' => [
-                'ThriftTest' => [__DIR__ . '/../../../Resources/packages/phpcm'],
-                'TestValidators' => [__DIR__ . '/../../../Resources/packages/phpcm'],
-            ],
-            'class' => '\TestValidators\TestServiceClient',
-        ];
-        yield 'useApcu' => [
-            'definitions' => [
-                'ThriftTest' => [__DIR__ . '/../../../Resources/packages/phpcm'],
-                'TestValidators' => [__DIR__ . '/../../../Resources/packages/phpcm'],
-            ],
-            'class' => '\TestValidators\TestServiceClient',
-            'checkInterfaceExist' => false,
-            'useApcu' => true,
-            'apcuPrefix' => self::APCU_PREFIX,
-        ];
-    }
-}
-
-namespace Thrift\ClassLoader;
-
-use Test\Thrift\Unit\Lib\ClassLoader\ThriftClassLoaderTest;
-
-if (!function_exists('apcu_fetch')) {
-    {
-        function apcu_fetch($key, &$success = null)
-        {
-            if (strpos($key, ThriftClassLoaderTest::APCU_PREFIX) === false) {
-                throw new \Exception('apcu_fetch error, invalid key');
-            }
-
-            return false;
-        }
-
-        function apcu_store($key, $var, $ttl = 0)
-        {
-            if (strpos($key, ThriftClassLoaderTest::APCU_PREFIX) === false) {
-                throw new \Exception('apcu_store error, invalid key');
-            }
-
-            return false;
-        }
-    }
 }
diff --git a/lib/php/test/Unit/Lib/Factory/TBinaryProtocolFactoryTest.php b/lib/php/test/Unit/Lib/Factory/TBinaryProtocolFactoryTest.php
index 5f7c2a2..76ff187 100644
--- a/lib/php/test/Unit/Lib/Factory/TBinaryProtocolFactoryTest.php
+++ b/lib/php/test/Unit/Lib/Factory/TBinaryProtocolFactoryTest.php
@@ -17,8 +17,6 @@
  * KIND, either express or implied. See the License for the
  * specific language governing permissions and limitations
  * under the License.
- *
- * @package thrift.protocol
  */
 
 namespace Test\Thrift\Unit\Lib\Factory;
diff --git a/lib/php/test/Unit/Lib/Factory/TCompactProtocolFactoryTest.php b/lib/php/test/Unit/Lib/Factory/TCompactProtocolFactoryTest.php
index f81e789..1483c6a 100644
--- a/lib/php/test/Unit/Lib/Factory/TCompactProtocolFactoryTest.php
+++ b/lib/php/test/Unit/Lib/Factory/TCompactProtocolFactoryTest.php
@@ -17,8 +17,6 @@
  * KIND, either express or implied. See the License for the
  * specific language governing permissions and limitations
  * under the License.
- *
- * @package thrift.protocol
  */
 
 namespace Test\Thrift\Unit\Lib\Factory;
diff --git a/lib/php/test/Unit/Lib/Factory/TFramedTransportFactoryTest.php b/lib/php/test/Unit/Lib/Factory/TFramedTransportFactoryTest.php
index 2cb32d8..f8a860c 100644
--- a/lib/php/test/Unit/Lib/Factory/TFramedTransportFactoryTest.php
+++ b/lib/php/test/Unit/Lib/Factory/TFramedTransportFactoryTest.php
@@ -17,8 +17,6 @@
  * KIND, either express or implied. See the License for the
  * specific language governing permissions and limitations
  * under the License.
- *
- * @package thrift.protocol
  */
 
 namespace Test\Thrift\Unit\Lib\Factory;
@@ -37,7 +35,7 @@
     {
         $transport = $this->createMock(TTransport::class);
         $factory = new TFramedTransportFactory();
-        $framedTransport = $factory::getTransport($transport);
+        $framedTransport = $factory->getTransport($transport);
 
         $this->assertInstanceOf(TFramedTransport::class, $framedTransport);
 
diff --git a/lib/php/test/Unit/Lib/Factory/TJSONProtocolFactoryTest.php b/lib/php/test/Unit/Lib/Factory/TJSONProtocolFactoryTest.php
index 0685af7..9c7055d 100644
--- a/lib/php/test/Unit/Lib/Factory/TJSONProtocolFactoryTest.php
+++ b/lib/php/test/Unit/Lib/Factory/TJSONProtocolFactoryTest.php
@@ -17,8 +17,6 @@
  * KIND, either express or implied. See the License for the
  * specific language governing permissions and limitations
  * under the License.
- *
- * @package thrift.protocol
  */
 
 namespace Test\Thrift\Unit\Lib\Factory;
diff --git a/lib/php/test/Unit/Lib/Factory/TStringFuncFactoryTest.php b/lib/php/test/Unit/Lib/Factory/TStringFuncFactoryTest.php
index eb4df44..c6feb2c 100644
--- a/lib/php/test/Unit/Lib/Factory/TStringFuncFactoryTest.php
+++ b/lib/php/test/Unit/Lib/Factory/TStringFuncFactoryTest.php
@@ -17,12 +17,11 @@
  * KIND, either express or implied. See the License for the
  * specific language governing permissions and limitations
  * under the License.
- *
- * @package thrift.protocol
  */
 
 namespace Test\Thrift\Unit\Lib\Factory;
 
+use phpmock\phpunit\PHPMock;
 use PHPUnit\Framework\TestCase;
 use Thrift\Factory\TStringFuncFactory;
 use Thrift\StringFunc\Core;
@@ -31,16 +30,21 @@
 
 class TStringFuncFactoryTest extends TestCase
 {
-    /**
-     * @return void
-     */
-    public function testCreate()
-    {
-        $factory = new TStringFuncFactory();
-        $stringFunc = $factory::create();
-        $this->assertInstanceOf(TStringFunc::class, $stringFunc);
-        $this->assertInstanceOf(Mbstring::class, $stringFunc);
+    use PHPMock;
 
+    /**
+     * @dataProvider createDataProvider
+     */
+    public function testCreate(
+        $mbstringFuncOverload,
+        $expectedClass
+    ) {
+        $this->getFunctionMock('Thrift\Factory', 'ini_get')
+             ->expects($this->once())
+             ->with('mbstring.func_overload')
+             ->willReturn($mbstringFuncOverload);
+
+        $factory = new TStringFuncFactory();
         /**
          * it is a hack to nullable the instance of TStringFuncFactory, and get a new instance based on the new ini_get value
          */
@@ -50,25 +54,21 @@
         $refInstance->setValue($factory, null);
 
         $stringFunc = $factory::create();
+
         $this->assertInstanceOf(TStringFunc::class, $stringFunc);
-        $this->assertInstanceOf(Core::class, $stringFunc);
+        $this->assertInstanceOf($expectedClass, $stringFunc);
     }
-}
 
+    public function createDataProvider()
+    {
+        yield 'mbstring' => [
+            'mbstring.func_overload' => 2,
+            'expected' => Mbstring::class
+        ];
 
-namespace Thrift\Factory;
-
-function ini_get($key)
-{
-    static $count = 0;
-    if ($key === 'mbstring.func_overload') {
-        if ($count === 0) {
-            $count++;
-            return 2;
-        } else {
-            return 0;
-        }
-    } else {
-        return \ini_get($key);
+        yield 'string' => [
+            'mbstring.func_overload' => 0,
+            'expected' => Core::class
+        ];
     }
 }
diff --git a/lib/php/test/Unit/Lib/Factory/TTransportFactoryTest.php b/lib/php/test/Unit/Lib/Factory/TTransportFactoryTest.php
index da91b64..9d3e640 100644
--- a/lib/php/test/Unit/Lib/Factory/TTransportFactoryTest.php
+++ b/lib/php/test/Unit/Lib/Factory/TTransportFactoryTest.php
@@ -17,8 +17,6 @@
  * KIND, either express or implied. See the License for the
  * specific language governing permissions and limitations
  * under the License.
- *
- * @package thrift.protocol
  */
 
 namespace Test\Thrift\Unit\Lib\Factory;
@@ -36,7 +34,7 @@
     {
         $transport = $this->createMock(TTransport::class);
         $factory = new TTransportFactory();
-        $result = $factory::getTransport($transport);
+        $result = $factory->getTransport($transport);
 
         $this->assertSame($transport, $result);
     }
diff --git a/lib/php/test/Unit/Lib/Protocol/TBinaryProtocolAcceleratedTest.php b/lib/php/test/Unit/Lib/Protocol/TBinaryProtocolAcceleratedTest.php
new file mode 100644
index 0000000..4a82a5a
--- /dev/null
+++ b/lib/php/test/Unit/Lib/Protocol/TBinaryProtocolAcceleratedTest.php
@@ -0,0 +1,73 @@
+<?php
+
+/*
+ * 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 Test\Thrift\Unit\Lib\Protocol;
+
+use PHPUnit\Framework\TestCase;
+use Thrift\Protocol\TBinaryProtocolAccelerated;
+use Thrift\Transport\TBufferedTransport;
+use Thrift\Transport\TMemoryBuffer;
+use Thrift\Transport\TSocket;
+
+class TBinaryProtocolAcceleratedTest extends TestCase
+{
+    /**
+     * @dataProvider constructDataProvider
+     */
+    public function testConstruct(
+        $transport,
+        $expectedTransport
+    ) {
+        $protocol = new TBinaryProtocolAccelerated($transport);
+        $this->assertInstanceOf($expectedTransport, $protocol->getTransport());
+    }
+
+    public function constructDataProvider()
+    {
+        yield 'not buffered transport' => [
+            'transport' => new TMemoryBuffer(),
+            'expectedTransport' => TMemoryBuffer::class,
+        ];
+        yield 'buffered transport' => [
+            'transport' => new TSocket(),
+            'expectedTransport' => TBufferedTransport::class,
+        ];
+    }
+
+    /**
+     * @dataProvider strictParamsDataProvider
+     */
+    public function testStrictParams($strictRead, $strictWrite)
+    {
+        $protocol = new TBinaryProtocolAccelerated(new TMemoryBuffer(), $strictRead, $strictWrite);
+        $this->assertEquals($strictRead, $protocol->isStrictRead());
+        $this->assertEquals($strictWrite, $protocol->isStrictWrite());
+    }
+
+    public function strictParamsDataProvider()
+    {
+        yield 'strict read and write' => [true, true];
+        yield 'not strict read and write' => [false, false];
+        yield 'strict read and not strict write' => [true, false];
+        yield 'not strict read and strict write' => [false, true];
+    }
+}
diff --git a/lib/php/test/Unit/Lib/Protocol/TBinaryProtocolTest.php b/lib/php/test/Unit/Lib/Protocol/TBinaryProtocolTest.php
new file mode 100644
index 0000000..2648b55
--- /dev/null
+++ b/lib/php/test/Unit/Lib/Protocol/TBinaryProtocolTest.php
@@ -0,0 +1,1009 @@
+<?php
+
+/*
+ * 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 Test\Thrift\Unit\Lib\Protocol;
+
+use PHPUnit\Framework\TestCase;
+use Thrift\Exception\TProtocolException;
+use Thrift\Protocol\TBinaryProtocol;
+use Thrift\Transport\TTransport;
+use Thrift\Type\TType;
+
+class TBinaryProtocolTest extends TestCase
+{
+    private const VERSION_MASK = 0xffff0000;
+    private const VERSION_1 = 0x80010000;
+
+    /**
+     * @dataProvider writeMessageBeginDataProvider
+     */
+    public function testWriteMessageBegin(
+        $strictWrite,
+        $name,
+        $type,
+        $seqid,
+        $writeCallsParams,
+        $writeCallsResults,
+        $expectedResult
+    ) {
+        $transport = $this->createMock(TTransport::class);
+        $protocol = new TBinaryProtocol($transport, false, $strictWrite);
+
+        $transport->expects($this->exactly(count($writeCallsParams)))
+                  ->method('write')
+                  ->withConsecutive(...$writeCallsParams)
+                  ->willReturnOnConsecutiveCalls(...$writeCallsResults);
+
+        $result = $protocol->writeMessageBegin($name, $type, $seqid);
+        $this->assertEquals($expectedResult, $result);
+    }
+
+    public function writeMessageBeginDataProvider()
+    {
+        $type = TType::STRING;
+        $seqid = 555;
+
+        yield 'strictWrite=true' => [
+            'strictWrite' => true,
+            'name' => 'testName',
+            'type' => $type,
+            'seqid' => $seqid,
+            'writeCallsParams' => [
+                [pack('N', self::VERSION_1 | $type), 4], #writeI32
+                [pack('N', strlen('testName')), 4], #writeStringLen
+                ['testName', 8], #writeString
+                [pack('N', $seqid), 4], #writeI32
+            ],
+            'writeCallsResults' => [
+                4,
+                4,
+                8,
+                4,
+            ],
+            'expectedResult' => 20,
+        ];
+
+        yield 'strictWrite=false' => [
+            'strictWrite' => false,
+            'name' => 'testName',
+            'type' => $type,
+            'seqid' => $seqid,
+            'writeCallsParams' => [
+                [pack('N', strlen('testName')), 4], #writeStringLen
+                ['testName', 8], #writeString
+                [pack('c', $type), 1], #writeByte
+                [pack('N', $seqid), 4], #writeI32
+            ],
+            'writeCallsResults' => [
+                4,
+                8,
+                1,
+                4,
+            ],
+            'expectedResult' => 17,
+        ];
+    }
+
+    public function testWriteMessageEnd()
+    {
+        $transport = $this->createMock(TTransport::class);
+        $protocol = new TBinaryProtocol($transport, false, false);
+
+        $this->assertEquals(0, $protocol->writeMessageEnd());
+    }
+
+    public function testWriteStructBegin()
+    {
+        $transport = $this->createMock(TTransport::class);
+        $protocol = new TBinaryProtocol($transport, false, false);
+
+        $this->assertEquals(0, $protocol->writeStructBegin('testName'));
+    }
+
+    public function testWriteStructEnd()
+    {
+        $transport = $this->createMock(TTransport::class);
+        $protocol = new TBinaryProtocol($transport, false, false);
+
+        $this->assertEquals(0, $protocol->writeStructEnd());
+    }
+
+    public function testWriteFieldBegin()
+    {
+        $fieldName = 'testName';
+        $fieldType = TType::STRING;
+        $fieldId = 555;
+
+        $transport = $this->createMock(TTransport::class);
+        $protocol = new TBinaryProtocol($transport, false, false);
+
+        $transport
+            ->expects($this->exactly(2))
+            ->method('write')
+            ->withConsecutive(
+                ...[
+                       [pack('c', $fieldType), 1], #writeByte
+                       [pack('n', $fieldId), 2], #writeI16
+                   ]
+            )->willReturnOnConsecutiveCalls([1, 2]);
+
+        $this->assertEquals(3, $protocol->writeFieldBegin($fieldName, $fieldType, $fieldId));
+    }
+
+    public function testWriteFieldEnd()
+    {
+        $transport = $this->createMock(TTransport::class);
+        $protocol = new TBinaryProtocol($transport, false, false);
+
+        $this->assertEquals(0, $protocol->writeFieldEnd());
+    }
+
+    public function testWriteFieldStop()
+    {
+        $transport = $this->createMock(TTransport::class);
+        $protocol = new TBinaryProtocol($transport, false, false);
+
+        $transport
+            ->expects($this->once())
+            ->method('write')
+            ->with(pack('c', TType::STOP), 1) #writeByte
+            ->willReturn(1);
+
+        $this->assertEquals(1, $protocol->writeFieldStop());
+    }
+
+    public function testWriteMapBegin()
+    {
+        $keyType = TType::I32;
+        $valType = TType::STRING;
+        $size = 99;
+
+        $transport = $this->createMock(TTransport::class);
+        $protocol = new TBinaryProtocol($transport, false, false);
+
+        $transport
+            ->expects($this->exactly(3))
+            ->method('write')
+            ->withConsecutive(
+                ...[
+                       [pack('c', $keyType), 1], #writeByte
+                       [pack('c', $valType), 1], #writeByte
+                       [pack('N', $size), 4], #writeI32
+                   ]
+            )->willReturnOnConsecutiveCalls([1, 1, 4]);
+
+        $this->assertEquals(6, $protocol->writeMapBegin($keyType, $valType, $size));
+    }
+
+    public function testWriteMapEnd()
+    {
+        $transport = $this->createMock(TTransport::class);
+        $protocol = new TBinaryProtocol($transport, false, false);
+
+        $this->assertEquals(0, $protocol->writeMapEnd());
+    }
+
+    public function testWriteListBegin()
+    {
+        $elemType = TType::I32;
+        $size = 99;
+
+        $transport = $this->createMock(TTransport::class);
+        $protocol = new TBinaryProtocol($transport, false, false);
+
+        $transport
+            ->expects($this->exactly(2))
+            ->method('write')
+            ->withConsecutive(
+                ...[
+                       [pack('c', $elemType), 1], #writeByte
+                       [pack('N', $size), 4], #writeI32
+                   ]
+            )->willReturnOnConsecutiveCalls([1, 4]);
+
+        $this->assertEquals(5, $protocol->writeListBegin($elemType, $size));
+    }
+
+    public function testWriteListEnd()
+    {
+        $transport = $this->createMock(TTransport::class);
+        $protocol = new TBinaryProtocol($transport, false, false);
+
+        $this->assertEquals(0, $protocol->writeListEnd());
+    }
+
+    public function testWriteSetBegin()
+    {
+        $elemType = TType::I32;
+        $size = 99;
+
+        $transport = $this->createMock(TTransport::class);
+        $protocol = new TBinaryProtocol($transport, false, false);
+
+        $transport
+            ->expects($this->exactly(2))
+            ->method('write')
+            ->withConsecutive(
+                ...[
+                       [pack('c', $elemType), 1], #writeByte
+                       [pack('N', $size), 4], #writeI32
+                   ]
+            )->willReturnOnConsecutiveCalls([1, 4]);
+
+        $this->assertEquals(5, $protocol->writeSetBegin($elemType, $size));
+    }
+
+    public function testWriteSetEnd()
+    {
+        $transport = $this->createMock(TTransport::class);
+        $protocol = new TBinaryProtocol($transport, false, false);
+
+        $this->assertEquals(0, $protocol->writeSetEnd());
+    }
+
+    public function testWriteBool()
+    {
+        $value = true;
+        $transport = $this->createMock(TTransport::class);
+        $protocol = new TBinaryProtocol($transport, false, false);
+
+        $transport
+            ->expects($this->once())
+            ->method('write')
+            ->with(pack('c', (int)$value), 1) #writeByte
+            ->willReturn(1);
+
+        $this->assertEquals(1, $protocol->writeBool($value));
+    }
+
+    public function testWriteByte()
+    {
+        $value = 1;
+        $transport = $this->createMock(TTransport::class);
+        $protocol = new TBinaryProtocol($transport, false, false);
+
+        $transport
+            ->expects($this->once())
+            ->method('write')
+            ->with(pack('c', $value), 1) #writeByte
+            ->willReturn(1);
+
+        $this->assertEquals(1, $protocol->writeByte($value));
+    }
+
+    public function testWriteI16()
+    {
+        $value = 1;
+        $transport = $this->createMock(TTransport::class);
+        $protocol = new TBinaryProtocol($transport, false, false);
+
+        $transport
+            ->expects($this->once())
+            ->method('write')
+            ->with(pack('n', $value), 2) #writeI16
+            ->willReturn(2);
+
+        $this->assertEquals(2, $protocol->writeI16($value));
+    }
+
+    public function testWriteI32()
+    {
+        $value = 1;
+        $transport = $this->createMock(TTransport::class);
+        $protocol = new TBinaryProtocol($transport, false, false);
+
+        $transport
+            ->expects($this->once())
+            ->method('write')
+            ->with(pack('N', $value), 4) #writeI32
+            ->willReturn(4);
+
+        $this->assertEquals(4, $protocol->writeI32($value));
+    }
+
+    public function testWriteI64For32BitArchitecture()
+    {
+        if (PHP_INT_SIZE !== 4) {
+            $this->markTestSkipped('Test is only for 32 bit architecture');
+        }
+        $value = 1;
+        $transport = $this->createMock(TTransport::class);
+        $protocol = new TBinaryProtocol($transport, false, false);
+
+        $neg = $value < 0;
+
+        if ($neg) {
+            $value *= -1;
+        }
+
+        $hi = (int)($value / 4294967296);
+        $lo = (int)$value;
+
+        if ($neg) {
+            $hi = ~$hi;
+            $lo = ~$lo;
+            if (($lo & (int)0xffffffff) == (int)0xffffffff) {
+                $lo = 0;
+                $hi++;
+            } else {
+                $lo++;
+            }
+        }
+
+        $transport
+            ->expects($this->once())
+            ->method('write')
+            ->with(pack('N2', $hi, $lo), 8) #writeI64
+            ->willReturn(4);
+
+        $this->assertEquals(8, $protocol->writeI64($value));
+    }
+
+    public function testWriteI64For64BitArchitecture()
+    {
+        if (PHP_INT_SIZE == 4) {
+            $this->markTestSkipped('Test is only for 64 bit architecture');
+        }
+        $value = 1;
+        $transport = $this->createMock(TTransport::class);
+        $protocol = new TBinaryProtocol($transport, false, false);
+
+        $hi = $value >> 32;
+        $lo = $value & 0xFFFFFFFF;
+
+        $transport
+            ->expects($this->once())
+            ->method('write')
+            ->with(pack('N2', $hi, $lo), 8) #writeI64
+            ->willReturn(8);
+
+        $this->assertEquals(8, $protocol->writeI64($value));
+    }
+
+    public function testWriteDouble()
+    {
+        $value = 1;
+        $transport = $this->createMock(TTransport::class);
+        $protocol = new TBinaryProtocol($transport, false, false);
+
+        $transport
+            ->expects($this->once())
+            ->method('write')
+            ->with(strrev(pack('d', $value)), 8) #writeDouble
+            ->willReturn(8);
+
+        $this->assertEquals(8, $protocol->writeDouble($value));
+    }
+
+    public function testWriteString()
+    {
+        $value = 'string';
+        $transport = $this->createMock(TTransport::class);
+        $protocol = new TBinaryProtocol($transport, false, false);
+
+        $transport
+            ->expects($this->exactly(2))
+            ->method('write')
+            ->withConsecutive(
+                ...[
+                       [pack('N', strlen($value))], #writeI32,
+                       [$value, strlen($value)], #write,
+                   ]
+            )->willReturnOnConsecutiveCalls([4, 6]);
+
+        $this->assertEquals(10, $protocol->writeString($value));
+    }
+
+    /**
+     * @dataProvider readMessageBeginDataProvider
+     */
+    public function testReadMessageBegin(
+        $strictRead,
+        $readCallsParams,
+        $readCallsResults,
+        $expectedReadLengthResult,
+        $expectedName,
+        $expectedType,
+        $expectedSeqid,
+        $expectedException = null,
+        $expectedExceptionMessage = null,
+        $expectedExceptionCode = null
+    ) {
+        if ($expectedException) {
+            $this->expectException($expectedException);
+            $this->expectExceptionMessage($expectedExceptionMessage);
+            $this->expectExceptionCode($expectedExceptionCode);
+        }
+
+        $transport = $this->createMock(TTransport::class);
+        $protocol = new TBinaryProtocol($transport, $strictRead, true);
+
+        $transport->expects($this->exactly(count($readCallsParams)))
+                  ->method('readAll')
+                  ->withConsecutive(...$readCallsParams)
+                  ->willReturnOnConsecutiveCalls(...$readCallsResults);
+
+        $result = $protocol->readMessageBegin($name, $type, $seqid);
+        $this->assertEquals($expectedReadLengthResult, $result);
+        $this->assertEquals($expectedName, $name);
+        $this->assertEquals($expectedType, $type);
+        $this->assertEquals($expectedSeqid, $seqid);
+    }
+
+    public function readMessageBeginDataProvider()
+    {
+        yield 'strictRead=true' => [
+            'strictRead' => true,
+            'readCallsParams' => [
+                [4], #readI32
+                [4], #readStringLen
+                [8], #readString
+                [4], #readI32
+            ],
+            'readCallsResults' => [
+                pack('N', 0x80010000 | TType::STRING), #version
+                pack('N', strlen('testName')),
+                'testName',
+                pack('N', 555),
+            ],
+            'expectedReadLengthResult' => 20,
+            'expectedName' => 'testName',
+            'expectedType' => TType::STRING,
+            'expectedSeqid' => 555,
+        ];
+
+        yield 'incorrect version' => [
+            'strictRead' => true,
+            'readCallsParams' => [
+                [4], #readI32
+            ],
+            'readCallsResults' => [
+                pack('N', 0x80000000 | TType::STRING), #version
+            ],
+            'expectedReadLengthResult' => 4,
+            'expectedName' => '',
+            'expectedType' => 0,
+            'expectedSeqid' => 0,
+            'expectedException' => TProtocolException::class,
+            'expectedExceptionMessage' => 'Bad version identifier: -2147483637',
+            'expectedExceptionCode' => TProtocolException::BAD_VERSION,
+        ];
+
+        yield 'strictRead=false' => [
+            'strictRead' => false,
+            'readCallsParams' => [
+                [4], #readStringLen
+                [8], #readString
+                [1], #readByte
+                [4], #readI32
+            ],
+            'readCallsResults' => [
+                pack('N', strlen('testName')),
+                'testName',
+                pack('c', TType::STRING),
+                pack('N', 555),
+            ],
+            'expectedReadLengthResult' => 17,
+            'expectedName' => 'testName',
+            'expectedType' => TType::STRING,
+            'expectedSeqid' => 555,
+        ];
+
+        yield 'strictRead=true without version' => [
+            'strictRead' => true,
+            'readCallsParams' => [
+                [4], #readStringLen
+            ],
+            'readCallsResults' => [
+                pack('N', strlen('testName')),
+            ],
+            'expectedReadLengthResult' => 17,
+            'expectedName' => 'testName',
+            'expectedType' => TType::STRING,
+            'expectedSeqid' => 555,
+            'expectedException' => TProtocolException::class,
+            'expectedExceptionMessage' => 'No version identifier, old protocol client?',
+            'expectedExceptionCode' => TProtocolException::BAD_VERSION,
+        ];
+    }
+
+    public function testReadMessageEnd()
+    {
+        $transport = $this->createMock(TTransport::class);
+        $protocol = new TBinaryProtocol($transport, false, false);
+
+        $this->assertEquals(0, $protocol->readMessageEnd());
+    }
+
+    public function testReadStructBegin()
+    {
+        $transport = $this->createMock(TTransport::class);
+        $protocol = new TBinaryProtocol($transport, false, false);
+
+        $this->assertEquals(0, $protocol->readStructBegin($name));
+        $this->assertEquals('', $name);
+    }
+
+    public function testReadStructEnd()
+    {
+        $transport = $this->createMock(TTransport::class);
+        $protocol = new TBinaryProtocol($transport, false, false);
+
+        $this->assertEquals(0, $protocol->readStructEnd());
+    }
+
+    /**
+     * @dataProvider readFieldBeginDataProvider
+     */
+    public function testReadFieldBegin(
+        $storedFieldType,
+        $readCallsParams,
+        $readCallsResults,
+        $expectedResult,
+        $expectedName,
+        $expectedFieldType,
+        $expectedFieldId
+    ) {
+        $transport = $this->createMock(TTransport::class);
+        $protocol = new TBinaryProtocol($transport, false, false);
+
+        $transport
+            ->expects($this->exactly(count($readCallsParams)))
+            ->method('readAll')
+            ->withConsecutive(...$readCallsParams)
+            ->willReturnOnConsecutiveCalls(...$readCallsResults);
+
+        $this->assertEquals($expectedResult, $protocol->readFieldBegin($name, $fieldType, $fieldId));
+        $this->assertEquals($expectedName, $name);
+        $this->assertEquals($expectedFieldType, $fieldType);
+        $this->assertEquals($expectedFieldId, $fieldId);
+    }
+
+    public function readFieldBeginDataProvider()
+    {
+        yield 'default' => [
+            'storedFieldType' => TType::STRING,
+            'readCallsParams' => [
+                [1], #readByte
+                [2], #readI16
+            ],
+            'readCallsResults' => [
+                pack('c', TType::STRING),
+                pack('n', 555),
+            ],
+            'expectedResult' => 3,
+            'exprectedName' => '',
+            'expectedFieldType' => TType::STRING,
+            'expectedFieldId' => 555,
+        ];
+
+        yield 'stop field' => [
+            'storedFieldType' => TType::STOP,
+            'readCallsParams' => [
+                [1], #readByte
+            ],
+            'readCallsResults' => [
+                pack('c', TType::STOP),
+            ],
+            'expectedResult' => 1,
+            'exprectedName' => '',
+            'expectedFieldType' => 0,
+            'expectedFieldId' => 0,
+        ];
+    }
+
+    public function testReadFieldEnd()
+    {
+        $transport = $this->createMock(TTransport::class);
+        $protocol = new TBinaryProtocol($transport, false, false);
+
+        $this->assertEquals(0, $protocol->readFieldEnd());
+    }
+
+    public function testReadMapBegin()
+    {
+        $transport = $this->createMock(TTransport::class);
+        $protocol = new TBinaryProtocol($transport, false, false);
+
+        $transport
+            ->expects($this->exactly(3))
+            ->method('readAll')
+            ->withConsecutive(
+                ...[
+                       [1], #readByte
+                       [1], #readByte
+                       [4], #readI32
+                   ]
+            )->willReturnOnConsecutiveCalls(
+                pack('c', TType::I32),
+                pack('c', TType::STRING),
+                pack('N', 555)
+            );
+
+        $this->assertEquals(6, $protocol->readMapBegin($keyType, $valType, $size));
+        $this->assertEquals(TType::I32, $keyType);
+        $this->assertEquals(TType::STRING, $valType);
+        $this->assertEquals(555, $size);
+    }
+
+    public function testReadMapEnd()
+    {
+        $transport = $this->createMock(TTransport::class);
+        $protocol = new TBinaryProtocol($transport, false, false);
+
+        $this->assertEquals(0, $protocol->readMapEnd());
+    }
+
+    public function testReadListBegin()
+    {
+        $transport = $this->createMock(TTransport::class);
+        $protocol = new TBinaryProtocol($transport, false, false);
+
+        $transport
+            ->expects($this->exactly(2))
+            ->method('readAll')
+            ->withConsecutive(
+                ...[
+                       [1], #readByte
+                       [4], #readI32
+                   ]
+            )->willReturnOnConsecutiveCalls(
+                pack('c', TType::I32),
+                pack('N', 555)
+            );
+
+        $this->assertEquals(5, $protocol->readListBegin($elemType, $size));
+        $this->assertEquals(TType::I32, $elemType);
+        $this->assertEquals(555, $size);
+    }
+
+    public function testReadListEnd()
+    {
+        $transport = $this->createMock(TTransport::class);
+        $protocol = new TBinaryProtocol($transport, false, false);
+
+        $this->assertEquals(0, $protocol->readListEnd());
+    }
+
+    public function testReadSetBegin()
+    {
+        $transport = $this->createMock(TTransport::class);
+        $protocol = new TBinaryProtocol($transport, false, false);
+
+        $transport
+            ->expects($this->exactly(2))
+            ->method('readAll')
+            ->withConsecutive(
+                ...[
+                       [1], #readByte
+                       [4], #readI32
+                   ]
+            )->willReturnOnConsecutiveCalls(
+                pack('c', TType::I32),
+                pack('N', 555)
+            );
+
+        $this->assertEquals(5, $protocol->readSetBegin($elemType, $size));
+        $this->assertEquals(TType::I32, $elemType);
+        $this->assertEquals(555, $size);
+    }
+
+    public function testReadSetEnd()
+    {
+        $transport = $this->createMock(TTransport::class);
+        $protocol = new TBinaryProtocol($transport, false, false);
+
+        $this->assertEquals(0, $protocol->readSetEnd());
+    }
+
+    public function testReadBool()
+    {
+        $transport = $this->createMock(TTransport::class);
+        $protocol = new TBinaryProtocol($transport, false, false);
+
+        $transport
+            ->expects($this->once())
+            ->method('readAll')
+            ->with(1) #readByte
+            ->willReturn(pack('c', 1));
+
+        $this->assertEquals(1, $protocol->readBool($value));
+        $this->assertTrue($value);
+    }
+
+    public function testReadByte()
+    {
+        $transport = $this->createMock(TTransport::class);
+        $protocol = new TBinaryProtocol($transport, false, false);
+
+        $transport
+            ->expects($this->once())
+            ->method('readAll')
+            ->with(1) #readByte
+            ->willReturn(pack('c', 1));
+
+        $this->assertEquals(1, $protocol->readByte($value));
+        $this->assertEquals(1, $value);
+    }
+
+    /**
+     * @dataProvider readI16DataProvider
+     */
+    public function testReadI16(
+        $storedValue,
+        $expectedValue
+    ) {
+        $transport = $this->createMock(TTransport::class);
+        $protocol = new TBinaryProtocol($transport, false, false);
+
+        $transport
+            ->expects($this->once())
+            ->method('readAll')
+            ->with(2) #readI16
+            ->willReturn(pack('n', $storedValue));
+
+        $this->assertEquals(2, $protocol->readI16($value));
+        $this->assertEquals($expectedValue, $value);
+    }
+
+    public function readI16DataProvider()
+    {
+        yield 'positive' => [1, 1];
+        yield 'negative' => [-1, -1];
+    }
+
+    /**
+     * @dataProvider readI16DataProvider
+     */
+    public function testReadI32(
+        $storedValue,
+        $expectedValue
+    ) {
+        $transport = $this->createMock(TTransport::class);
+        $protocol = new TBinaryProtocol($transport, false, false);
+
+        $transport
+            ->expects($this->once())
+            ->method('readAll')
+            ->with(4) #readI32
+            ->willReturn(pack('N', $storedValue));
+
+        $this->assertEquals(4, $protocol->readI32($value));
+        $this->assertEquals($expectedValue, $value);
+    }
+
+    public function readI32DataProvider()
+    {
+        yield 'positive' => [1, 1];
+        yield 'negative' => [-1, -1];
+    }
+
+    /**
+     * @dataProvider readI64For32BitArchitectureDataProvider
+     */
+    public function testReadI64For32BitArchitecture(
+        $storedValue,
+        $expectedValue
+    ) {
+        if (PHP_INT_SIZE !== 4) {
+            $this->markTestSkipped('Test is only for 32 bit architecture');
+        }
+
+        $transport = $this->createMock(TTransport::class);
+        $protocol = new TBinaryProtocol($transport, false, false);
+
+        $neg = $storedValue < 0;
+
+        if ($neg) {
+            $storedValue *= -1;
+        }
+
+        $hi = (int)($storedValue / 4294967296);
+        $lo = (int)$storedValue;
+
+        if ($neg) {
+            $hi = ~$hi;
+            $lo = ~$lo;
+            if (($lo & (int)0xffffffff) == (int)0xffffffff) {
+                $lo = 0;
+                $hi++;
+            } else {
+                $lo++;
+            }
+        }
+
+        $transport
+            ->expects($this->once())
+            ->method('write')
+            ->with(pack('N2', $hi, $lo), 8) #writeI64
+            ->willReturn(4);
+
+        $this->assertEquals(8, $protocol->readI64($value));
+        $this->assertEquals($expectedValue, $value);
+    }
+
+    public function readI64For32BitArchitectureDataProvider()
+    {
+        $storedValueRepresent = function ($value) {
+            $neg = $value < 0;
+
+            if ($neg) {
+                $value *= -1;
+            }
+
+            $hi = (int)($value / 4294967296);
+            $lo = (int)$value;
+
+            if ($neg) {
+                $hi = ~$hi;
+                $lo = ~$lo;
+                if (($lo & (int)0xffffffff) == (int)0xffffffff) {
+                    $lo = 0;
+                    $hi++;
+                } else {
+                    $lo++;
+                }
+            }
+
+            return pack('N2', $hi, $lo);
+        };
+
+        yield 'positive' => [
+            'storedValue' => $storedValueRepresent(1),
+            'expectedValue' => 1,
+        ];
+
+        yield 'max' => [
+            'storedValue' => $storedValueRepresent(PHP_INT_MAX),
+            'expectedValue' => PHP_INT_MAX,
+        ];
+
+        yield 'min' => [
+            'storedValue' => $storedValueRepresent(PHP_INT_MIN),
+            'expectedValue' => PHP_INT_MIN,
+        ];
+
+        yield 'negative' => [
+            'storedValue' => $storedValueRepresent(-1),
+            'expectedValue' => -1,
+        ];
+    }
+
+    /**
+     * @dataProvider readI64For64BitArchitectureDataProvider
+     */
+    public function testReadI64For64BitArchitecture(
+        $storedValue,
+        $expectedValue
+    ) {
+        if (PHP_INT_SIZE == 4) {
+            $this->markTestSkipped('Test is only for 64 bit architecture');
+        }
+        $transport = $this->createMock(TTransport::class);
+        $protocol = new TBinaryProtocol($transport, false, false);
+
+        $transport
+            ->expects($this->once())
+            ->method('readAll')
+            ->with(8) #readI64
+            ->willReturn($storedValue);
+
+        $this->assertEquals(8, $protocol->readI64($value));
+        $this->assertEquals($expectedValue, $value);
+    }
+
+    public function readI64For64BitArchitectureDataProvider()
+    {
+        $storedValueRepresent = function ($value) {
+            $hi = $value >> 32;
+            $lo = $value & 0xFFFFFFFF;
+
+            return pack('N2', $hi, $lo);
+        };
+
+        yield 'positive' => [
+            'storedValue' => $storedValueRepresent(1),
+            'expectedValue' => 1,
+        ];
+
+        yield 'max' => [
+            'storedValue' => $storedValueRepresent(PHP_INT_MAX),
+            'expectedValue' => PHP_INT_MAX,
+        ];
+
+        yield 'min' => [
+            'storedValue' => $storedValueRepresent(PHP_INT_MIN),
+            'expectedValue' => PHP_INT_MIN,
+        ];
+
+        yield 'negative' => [
+            'storedValue' => $storedValueRepresent(-1),
+            'expectedValue' => -1,
+        ];
+    }
+
+    public function testReadDouble()
+    {
+        $transport = $this->createMock(TTransport::class);
+        $protocol = new TBinaryProtocol($transport, false, false);
+
+        $transport
+            ->expects($this->once())
+            ->method('readAll')
+            ->with(8) #readDouble
+            ->willReturn(strrev(pack('d', 789)));
+
+        $this->assertEquals(8, $protocol->readDouble($value));
+        $this->assertEquals(789, $value);
+    }
+
+    /**
+     * @dataProvider readStringDataProvider
+     */
+    public function testReadString(
+        $readCallsParams,
+        $readCallsResults,
+        $expectedLength,
+        $expectedValue
+    ) {
+        $transport = $this->createMock(TTransport::class);
+        $protocol = new TBinaryProtocol($transport, false, false);
+
+        $transport
+            ->expects($this->exactly(count($readCallsParams)))
+            ->method('readAll')
+            ->withConsecutive(...$readCallsParams)
+            ->willReturnOnConsecutiveCalls(...$readCallsResults);
+
+        $this->assertEquals($expectedLength, $protocol->readString($value));
+        $this->assertEquals($expectedValue, $value);
+    }
+
+    public function readStringDataProvider()
+    {
+        $storedValue = '';
+        yield 'empty' => [
+            'readCallsParams' => [
+                [4]
+            ],
+            'readCallsResults' => [
+                pack('N', strlen($storedValue))
+            ],
+            'expectedLength' => 4,
+            'expectedValue' => '',
+        ];
+
+        $storedValue = 'string';
+        yield 'non-empty' => [
+            'readCallsParams' => [
+                [4],
+                [strlen($storedValue)]
+            ],
+            'readCallsResults' => [
+                pack('N', strlen($storedValue)),
+                $storedValue
+            ],
+            'expectedLength' => 10,
+            'expectedValue' => 'string',
+        ];
+    }
+}
diff --git a/lib/php/test/Unit/Lib/Protocol/TCompactProtocolTest.php b/lib/php/test/Unit/Lib/Protocol/TCompactProtocolTest.php
new file mode 100644
index 0000000..95f972c
--- /dev/null
+++ b/lib/php/test/Unit/Lib/Protocol/TCompactProtocolTest.php
@@ -0,0 +1,843 @@
+<?php
+
+/*
+ * 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 Test\Thrift\Unit\Lib\Protocol;
+
+use PHPUnit\Framework\TestCase;
+use Thrift\Exception\TProtocolException;
+use Thrift\Protocol\TCompactProtocol;
+use Thrift\Transport\TTransport;
+use Thrift\Type\TType;
+
+class TCompactProtocolTest extends TestCase
+{
+    private const COMPACT_STOP = 0x00;
+    private const COMPACT_TRUE = 0x01;
+    private const COMPACT_FALSE = 0x02;
+    private const COMPACT_BYTE = 0x03;
+    private const COMPACT_I16 = 0x04;
+    private const COMPACT_I32 = 0x05;
+    private const COMPACT_I64 = 0x06;
+    private const COMPACT_DOUBLE = 0x07;
+    private const COMPACT_BINARY = 0x08;
+    private const COMPACT_LIST = 0x09;
+    private const COMPACT_SET = 0x0A;
+    private const COMPACT_MAP = 0x0B;
+    private const COMPACT_STRUCT = 0x0C;
+
+    private const STATE_CLEAR = 0;
+    private const STATE_FIELD_WRITE = 1;
+    private const STATE_VALUE_WRITE = 2;
+    private const STATE_CONTAINER_WRITE = 3;
+    private const STATE_BOOL_WRITE = 4;
+    private const STATE_FIELD_READ = 5;
+    private const STATE_CONTAINER_READ = 6;
+    private const STATE_VALUE_READ = 7;
+    private const STATE_BOOL_READ = 8;
+
+    private const VERSION_MASK = 0x1f;
+    private const VERSION = 1;
+    private const PROTOCOL_ID = 0x82;
+    private const TYPE_MASK = 0xe0;
+    private const TYPE_BITS = 0x07;
+    private const TYPE_SHIFT_AMOUNT = 5;
+
+    /**
+     * @dataProvider toZigZagDataProvider
+     */
+    public function testToZigZag(
+        $n,
+        $bits,
+        $expected
+    ) {
+        $protocol = new TCompactProtocol($this->createMock(TTransport::class));
+        $this->assertSame($expected, $protocol->toZigZag($n, $bits));
+    }
+
+    public function toZigZagDataProvider()
+    {
+        yield ['n' => 0, 'bits' => 16, 'expected' => 0];
+        yield ['n' => -1, 'bits' => 16, 'expected' => 1];
+        yield ['n' => 1, 'bits' => 16, 'expected' => 2];
+        yield ['n' => -2, 'bits' => 16, 'expected' => 3];
+        yield ['n' => 2, 'bits' => 16, 'expected' => 4];
+        yield ['n' => -1, 'bits' => 32, 'expected' => 1];
+        yield ['n' => 1, 'bits' => 32, 'expected' => 2];
+        yield ['n' => -1, 'bits' => 64, 'expected' => 1];
+        yield ['n' => 1, 'bits' => 64, 'expected' => 2];
+        yield ['n' => -0x7fffffff, 'bits' => 64, 'expected' => 4294967293];
+        yield ['n' => 0x7fffffff, 'bits' => 64, 'expected' => 4294967294];
+    }
+
+    /**
+     * @dataProvider fromZigZagDataProvider
+     */
+    public function testFromZigZag(
+        $n,
+        $expected
+    ) {
+        $protocol = new TCompactProtocol($this->createMock(TTransport::class));
+        $this->assertSame($expected, $protocol->fromZigZag($n));
+    }
+
+    public function fromZigZagDataProvider()
+    {
+        yield ['n' => 0, 'expected' => 0];
+        yield ['n' => 1, 'expected' => -1];
+        yield ['n' => 2, 'expected' => 1];
+        yield ['n' => 3, 'expected' => -2];
+        yield ['n' => 4, 'expected' => 2];
+        yield ['n' => 4294967293, 'expected' => -0x7fffffff];
+        yield ['n' => 4294967294, 'expected' => 0x7fffffff];
+    }
+
+    /**
+     * @dataProvider getVarintDataProvider
+     */
+    public function testGetVarint(
+        $data,
+        $expected
+    ) {
+        $protocol = new TCompactProtocol($this->createMock(TTransport::class));
+        $this->assertSame($expected, $protocol->getVarint($data));
+    }
+
+    public function getVarintDataProvider()
+    {
+        yield ['data' => 0, 'expected' => "\x00"];
+        yield ['data' => 1, 'expected' => "\x01"];
+        yield ['data' => 97, 'expected' => "a"];
+        yield ['data' => 100, 'expected' => "d"];
+        yield ['data' => 1000, 'expected' => "\xe8\x07"];
+    }
+
+    public function testWriteVarint()
+    {
+        $transport = $this->createMock(TTransport::class);
+        $protocol = new TCompactProtocol($transport);
+
+        $transport->expects($this->once())
+                  ->method('write')
+                  ->with("\xe8\x07", 2);
+
+        $protocol->writeVarint(1000);
+    }
+
+    public function testReadVarint()
+    {
+        $transport = $this->createMock(TTransport::class);
+        $protocol = new TCompactProtocol($transport);
+
+        $transport->expects($this->exactly(2))
+                  ->method('readAll')
+                  ->with(1)
+                  ->willReturnOnConsecutiveCalls(
+                      ...[
+                             "\xe8",
+                             "\x07",
+                         ]
+                  );
+
+        $this->assertSame(2, $protocol->readVarint($result));
+        $this->assertSame(1000, $result);
+    }
+
+    public function testWriteMessageBegin()
+    {
+        $name = 'testName';
+        $type = TType::STRING;
+        $seqid = 1;
+
+        $transport = $this->createMock(TTransport::class);
+        $protocol = new TCompactProtocol($transport);
+
+        $transport
+            ->expects($this->exactly(5))
+            ->method('write')
+            ->withConsecutive(
+                ...[
+                       [pack('C', self::PROTOCOL_ID), 1], #protocal id
+                       [pack('C', self::VERSION | ($type << TCompactProtocol::TYPE_SHIFT_AMOUNT)), 1], #version
+                       ["\x01", 1], #seqid
+                       ["\x08", 1], #field name length
+                       ["testName", 8], #field name
+                   ]
+            )->willReturnOnConsecutiveCalls(
+                1,
+                1,
+                1,
+                1,
+                8
+            );
+
+        $result = $protocol->writeMessageBegin($name, $type, $seqid);
+        $this->assertSame(12, $result);
+
+        $ref = new \ReflectionClass($protocol);
+        $state = $ref->getProperty('state');
+        $state->setAccessible(true);
+        $this->assertSame(self::STATE_VALUE_WRITE, $state->getValue($protocol));
+    }
+
+    public function testWriteMessageEnd()
+    {
+        $transport = $this->createMock(TTransport::class);
+        $protocol = new TCompactProtocol($transport);
+
+        $this->assertSame(0, $protocol->writeMessageEnd());
+        $ref = new \ReflectionClass($protocol);
+        $state = $ref->getProperty('state');
+        $state->setAccessible(true);
+        $this->assertSame(self::STATE_CLEAR, $state->getValue($protocol));
+    }
+
+    public function testWriteStruct()
+    {
+        $name = 'testName';
+
+        $transport = $this->createMock(TTransport::class);
+        $protocol = new TCompactProtocol($transport);
+        $ref = new \ReflectionClass($protocol);
+        $state = $ref->getProperty('state');
+        $state->setAccessible(true);
+        $lastFid = $ref->getProperty('lastFid');
+        $lastFid->setAccessible(true);
+        $structs = $ref->getProperty('structs');
+        $structs->setAccessible(true);
+
+        $this->assertSame(0, $protocol->writeStructBegin($name));
+        $this->assertSame([[self::STATE_CLEAR, 0]], $structs->getValue($protocol));
+        $this->assertSame(self::STATE_FIELD_WRITE, $state->getValue($protocol));
+        $this->assertSame(0, $lastFid->getValue($protocol));
+
+        $this->assertSame(0, $protocol->writeStructBegin($name));
+        $this->assertSame(self::STATE_FIELD_WRITE, $state->getValue($protocol));
+        $this->assertSame(0, $lastFid->getValue($protocol));
+        $this->assertSame([[self::STATE_CLEAR, 0], [self::STATE_FIELD_WRITE, 0]], $structs->getValue($protocol));
+
+        $this->assertSame(0, $protocol->writeStructEnd());
+        $this->assertSame(self::STATE_FIELD_WRITE, $state->getValue($protocol));
+        $this->assertSame(0, $lastFid->getValue($protocol));
+        $this->assertSame([[self::STATE_CLEAR, 0]], $structs->getValue($protocol));
+
+        $this->assertSame(0, $protocol->writeStructEnd());
+        $this->assertSame(self::STATE_CLEAR, $state->getValue($protocol));
+        $this->assertSame(0, $lastFid->getValue($protocol));
+        $this->assertSame([], $structs->getValue($protocol));
+    }
+
+    public function testWriteFieldStop()
+    {
+        $transport = $this->createMock(TTransport::class);
+        $protocol = new TCompactProtocol($transport);
+
+        $transport->expects($this->once())
+                  ->method('write')
+                  ->with("\x00", 1);
+
+        $this->assertSame(1, $protocol->writeFieldStop());
+    }
+
+    /**
+     * @dataProvider writeFieldHeaderDataProvider
+     */
+    public function testWriteFieldHeader(
+        $type,
+        $fid,
+        $writeCallParams,
+        $writeCallResult,
+        $expectedResult
+    ) {
+        $transport = $this->createMock(TTransport::class);
+        $protocol = new TCompactProtocol($transport);
+
+        $transport
+            ->expects($this->exactly(count($writeCallParams)))
+            ->method('write')
+            ->withConsecutive(...$writeCallParams)
+            ->willReturnOnConsecutiveCalls(...$writeCallResult);
+
+        $this->assertSame($expectedResult, $protocol->writeFieldHeader($type, $fid));
+    }
+
+    public function writeFieldHeaderDataProvider()
+    {
+        yield 'bool' => [
+            'type' => TType::BOOL,
+            'fid' => 1,
+            'writeCallParams' => [
+                ["\x12", 1], #writeUByte(pack('C', ($delta << 4) | $type)),
+            ],
+            'writeCallResult' => [
+                1,
+            ],
+            'expectedResult' => 1,
+        ];
+        yield 'list' => [
+            'type' => TType::LST,
+            'fid' => 16,
+            'writeCallParams' => [
+                ["\x0f", 1], #writeUByte(pack('C', ($delta << 4) | $type)),
+                [" ", 1], #writeI16($fid),
+            ],
+            'writeCallResult' => [
+                1,
+            ],
+            'expectedResult' => 2,
+        ];
+    }
+
+    /**
+     * @dataProvider writeFieldBeginDataProvider
+     */
+    public function testWriteFieldBegin(
+        $fieldName,
+        $fieldType,
+        $fieldId,
+        $writeCallParams,
+        $writeCallResult,
+        $expectedState,
+        $expectedBoolFid,
+        $expectedLastFid,
+        $expectedResult
+    ) {
+        $transport = $this->createMock(TTransport::class);
+        $protocol = new TCompactProtocol($transport);
+
+        $transport
+            ->expects($this->exactly(count($writeCallParams)))
+            ->method('write')
+            ->withConsecutive(...$writeCallParams)
+            ->willReturnOnConsecutiveCalls(...$writeCallResult);
+
+        $this->assertSame($expectedResult, $protocol->writeFieldBegin($fieldName, $fieldType, $fieldId));
+
+        $ref = new \ReflectionClass($protocol);
+        $state = $ref->getProperty('state');
+        $state->setAccessible(true);
+        $boolFid = $ref->getProperty('boolFid');
+        $boolFid->setAccessible(true);
+        $lastFid = $ref->getProperty('lastFid');
+        $lastFid->setAccessible(true);
+        $this->assertSame($expectedState, $state->getValue($protocol));
+        $this->assertSame($expectedBoolFid, $boolFid->getValue($protocol));
+        $this->assertSame($expectedLastFid, $lastFid->getValue($protocol));
+    }
+
+    public function writeFieldBeginDataProvider()
+    {
+        yield 'bool' => [
+            'fieldName' => 'testName',
+            'fieldType' => TType::BOOL,
+            'fieldId' => 1,
+            'writeCallParams' => [],
+            'writeCallResult' => [],
+            'expectedState' => self::STATE_BOOL_WRITE,
+            'expectedBoolFid' => 1,
+            'expectedLastFid' => 0,
+            'expectedResult' => 0,
+        ];
+        yield 'list' => [
+            'fieldName' => 'testName',
+            'fieldType' => TType::LST,
+            'fieldId' => 1,
+            'writeCallParams' => [
+                ["\x19", 1], #writeUByte(pack('C', ($delta << 4) | $type)),
+            ],
+            'writeCallResult' => [
+                1,
+            ],
+            'expectedState' => self::STATE_VALUE_WRITE,
+            'expectedBoolFid' => null,
+            'expectedLastFid' => 1,
+            'expectedResult' => 1,
+        ];
+    }
+
+    public function testWriteFieldEnd()
+    {
+        $transport = $this->createMock(TTransport::class);
+        $protocol = new TCompactProtocol($transport);
+
+        $this->assertSame(0, $protocol->writeFieldEnd());
+
+        $ref = new \ReflectionClass($protocol);
+        $state = $ref->getProperty('state');
+        $state->setAccessible(true);
+        $this->assertSame(self::STATE_FIELD_WRITE, $state->getValue($protocol));
+    }
+
+    /**
+     * @dataProvider writeCollectionDataProvider
+     */
+    public function testWriteCollection(
+        $etype,
+        $size,
+        $writeCallParams,
+        $writeCallResult,
+        $expectedState,
+        $expectedContainers,
+        $expectedResult
+    ) {
+        $transport = $this->createMock(TTransport::class);
+        $protocol = new TCompactProtocol($transport);
+
+        $transport
+            ->expects($this->exactly(count($writeCallParams)))
+            ->method('write')
+            ->withConsecutive(...$writeCallParams)
+            ->willReturnOnConsecutiveCalls(...$writeCallResult);
+
+        $this->assertSame($expectedResult, $protocol->writeCollectionBegin($etype, $size));
+
+        $ref = new \ReflectionClass($protocol);
+        $state = $ref->getProperty('state');
+        $state->setAccessible(true);
+        $containers = $ref->getProperty('containers');
+        $containers->setAccessible(true);
+        $this->assertSame($expectedState, $state->getValue($protocol));
+        $this->assertSame($expectedContainers, $containers->getValue($protocol));
+
+        $this->assertSame(0, $protocol->writeCollectionEnd());
+        $this->assertSame(TCompactProtocol::STATE_CLEAR, $state->getValue($protocol));
+    }
+
+    public function writeCollectionDataProvider()
+    {
+        yield 'size < 14' => [
+            'etype' => TType::STRING,
+            'size' => 1,
+            'writeCallParams' => [
+                ["\x18", 1], #writeUByte(pack('C', ($size << 4 | self::$ctypes[$etype])),
+            ],
+            'writeCallResult' => [
+                1,
+            ],
+            'expectedState' => self::STATE_CONTAINER_WRITE,
+            'expectedContainers' => [
+                0 => 0,
+            ],
+            'expectedResult' => 1,
+        ];
+        yield 'size > 14' => [
+            'etype' => TType::STRING,
+            'size' => 16,
+            'writeCallParams' => [
+                ["\xf8", 1], #writeUByte(pack('C', 0xf0 | self::$ctypes[$etype])),
+                ["\x10", 1], #writeVarint(16),
+            ],
+            'writeCallResult' => [
+                1,
+                1,
+            ],
+            'expectedState' => self::STATE_CONTAINER_WRITE,
+            'expectedContainers' => [
+                0 => 0,
+            ],
+            'expectedResult' => 2,
+        ];
+    }
+
+    /**
+     * @dataProvider writeMapDataProvider
+     */
+    public function testWriteMap(
+        $keyType,
+        $valType,
+        $size,
+        $writeCallParams,
+        $writeCallResult,
+        $expectedContainers,
+        $expectedResult
+    ) {
+        $transport = $this->createMock(TTransport::class);
+        $protocol = new TCompactProtocol($transport);
+
+        $transport
+            ->expects($this->exactly(count($writeCallParams)))
+            ->method('write')
+            ->withConsecutive(...$writeCallParams)
+            ->willReturnOnConsecutiveCalls(...$writeCallResult);
+
+        $this->assertSame($expectedResult, $protocol->writeMapBegin($keyType, $valType, $size));
+
+        $ref = new \ReflectionClass($protocol);
+        $containers = $ref->getProperty('containers');
+        $containers->setAccessible(true);
+        $state = $ref->getProperty('state');
+        $state->setAccessible(true);
+        $this->assertSame($expectedContainers, $containers->getValue($protocol));
+        $this->assertSame(TCompactProtocol::STATE_CLEAR, $state->getValue($protocol));
+
+        $this->assertSame(0, $protocol->writeMapEnd());
+        $this->assertSame(TCompactProtocol::STATE_CLEAR, $state->getValue($protocol));
+        $this->assertSame([], $containers->getValue($protocol));
+    }
+
+    public function writeMapDataProvider()
+    {
+        yield 'size zero' => [
+            'keyType' => TType::STRING,
+            'valType' => TType::STRING,
+            'size' => 0,
+            'writeCallParams' => [
+                ["\x00", 1], #writeByte(0),
+            ],
+            'writeCallResult' => [
+                1,
+            ],
+            'expectedContainers' => [
+                0 => 0,
+            ],
+            'expectedResult' => 1,
+        ];
+        yield 'size non zero' => [
+            'keyType' => TType::STRING,
+            'valType' => TType::STRING,
+            'size' => 16,
+            'writeCallParams' => [
+                ["\x10", 1], #writeVarint(16),
+                ["\x88", 1], #writeUByte(pack('C', self::$ctypes[$key_type] << 4 | self::$ctypes[$val_type])),
+            ],
+            'writeCallResult' => [
+                1,
+                1,
+            ],
+            'expectedContainers' => [
+                0 => 0,
+            ],
+            'expectedResult' => 2,
+        ];
+    }
+
+    public function testWriteListBegin()
+    {
+        $protocol = $this->createPartialMock(TCompactProtocol::class, ['writeCollectionBegin']);
+
+        $protocol->expects($this->once())
+                 ->method('writeCollectionBegin')
+                 ->with(TType::STRING, 1)
+                 ->willReturn(1);
+
+        $this->assertSame(1, $protocol->writeListBegin(TType::STRING, 1));
+    }
+
+    public function testWriteListEnd()
+    {
+        $protocol = $this->createPartialMock(TCompactProtocol::class, ['writeCollectionEnd']);
+
+        $protocol->expects($this->once())
+                 ->method('writeCollectionEnd')
+                 ->willReturn(1);
+
+        $this->assertSame(1, $protocol->writeListEnd());
+    }
+
+    public function testWriteSettBegin()
+    {
+        $protocol = $this->createPartialMock(TCompactProtocol::class, ['writeCollectionBegin']);
+
+        $protocol->expects($this->once())
+                 ->method('writeCollectionBegin')
+                 ->with(TType::STRING, 1)
+                 ->willReturn(1);
+
+        $this->assertSame(1, $protocol->writeSetBegin(TType::STRING, 1));
+    }
+
+    public function testWriteSetEnd()
+    {
+        $protocol = $this->createPartialMock(TCompactProtocol::class, ['writeCollectionEnd']);
+
+        $protocol->expects($this->once())
+                 ->method('writeCollectionEnd')
+                 ->willReturn(1);
+
+        $this->assertSame(1, $protocol->writeSetEnd());
+    }
+
+    /**
+     * @dataProvider writeBinaryDataProvider
+     */
+    public function testWriteBool(
+        $value,
+        $startState,
+        $writeCallParams,
+        $writeCallResult,
+        $expectedResult,
+        $expectedException,
+        $expectedExceptionMessage
+    ) {
+        if ($expectedException) {
+            $this->expectException($expectedException);
+            $this->expectExceptionMessage($expectedExceptionMessage);
+        }
+
+        $transport = $this->createMock(TTransport::class);
+        $protocol = new TCompactProtocol($transport);
+        if (!is_null($startState)) {
+            $ref = new \ReflectionClass($protocol);
+            $state = $ref->getProperty('state');
+            $state->setAccessible(true);
+            $state->setValue($protocol, $startState);
+        }
+
+        $transport
+            ->expects($this->exactly(count($writeCallParams)))
+            ->method('write')
+            ->withConsecutive(...$writeCallParams)
+            ->willReturnOnConsecutiveCalls(...$writeCallResult);
+
+        $this->assertSame($expectedResult, $protocol->writeBool($value));
+    }
+
+    public function writeBinaryDataProvider()
+    {
+        yield 'invalid state' => [
+            'value' => true,
+            'startState' => null,
+            'writeCallParams' => [],
+            'writeCallResult' => [],
+            'expectedResult' => 0,
+            'expectedException' => TProtocolException::class,
+            'expectedExceptionMessage' => 'Invalid state in compact protocol',
+        ];
+
+        yield 'true' => [
+            'value' => true,
+            'startState' => TCompactProtocol::STATE_BOOL_WRITE,
+            'writeCallParams' => [
+                ["\x01", 1], #writeByte
+                ["\x00", 1], #writeI16
+            ],
+            'writeCallResult' => [
+                1,
+                1,
+            ],
+            'expectedResult' => 2,
+            'expectedException' => null,
+            'expectedExceptionMessage' => null,
+        ];
+
+        yield 'false' => [
+            'value' => false,
+            'startState' => TCompactProtocol::STATE_BOOL_WRITE,
+            'writeCallParams' => [
+                ["\x02", 1], #writeByte
+                ["\x00", 1], #writeI16
+            ],
+            'writeCallResult' => [
+                1,
+                1,
+            ],
+            'expectedResult' => 2,
+            'expectedException' => null,
+            'expectedExceptionMessage' => null,
+        ];
+
+        yield 'container true' => [
+            'value' => true,
+            'startState' => TCompactProtocol::STATE_CONTAINER_WRITE,
+            'writeCallParams' => [
+                ["\x01", 1], #writeByte
+            ],
+            'writeCallResult' => [
+                1,
+            ],
+            'expectedResult' => 1,
+            'expectedException' => null,
+            'expectedExceptionMessage' => null,
+        ];
+    }
+
+    /**
+     * @dataProvider writeByteDataProvider
+     */
+    public function testWriteByte(
+        $value,
+        $expectedWriteCallParam
+    ) {
+        $transport = $this->createMock(TTransport::class);
+        $protocol = new TCompactProtocol($transport);
+
+        $transport->expects($this->once())
+                  ->method('write')
+                  ->with($expectedWriteCallParam, 1);
+
+        $this->assertSame(1, $protocol->writeByte($value));
+    }
+
+    public function writeByteDataProvider()
+    {
+        yield 'signed' => [
+            'value' => -1,
+            'expectedWriteCallParam' => "\xff",
+        ];
+        yield 'unsigned' => [
+            'value' => 1,
+            'expectedWriteCallParam' => "\x01",
+        ];
+        yield 'lowercase' => [
+            'value' => 'a',
+            'expectedWriteCallParam' => "\x00",
+        ];
+        yield 'upercase' => [
+            'value' => 'A',
+            'expectedWriteCallParam' => "\x00",
+        ];
+    }
+
+    /**
+     * @dataProvider writeUByteDataProvider
+     */
+    public function testWriteUByte(
+        $value,
+        $expectedWriteCallParam
+    ) {
+        $transport = $this->createMock(TTransport::class);
+        $protocol = new TCompactProtocol($transport);
+
+        $transport->expects($this->once())
+                  ->method('write')
+                  ->with($expectedWriteCallParam, 1);
+
+        $this->assertSame(1, $protocol->writeUByte($value));
+    }
+
+    public function writeUByteDataProvider()
+    {
+        yield 'signed' => [
+            'value' => -1,
+            'expectedWriteCallParam' => "\xff",
+        ];
+        yield 'unsigned' => [
+            'value' => 1,
+            'expectedWriteCallParam' => "\x01",
+        ];
+        yield 'lowercase' => [
+            'value' => 'a',
+            'expectedWriteCallParam' => "\x00",
+        ];
+        yield 'upercase' => [
+            'value' => 'A',
+            'expectedWriteCallParam' => "\x00",
+        ];
+    }
+
+    public function testWriteI16()
+    {
+        $transport = $this->createMock(TTransport::class);
+        $protocol = new TCompactProtocol($transport);
+
+        $transport->expects($this->once())
+                  ->method('write')
+                  ->with("\x00", 1);
+
+        $this->assertSame(1, $protocol->writeI16(0));
+    }
+
+    public function testWriteI32()
+    {
+        $transport = $this->createMock(TTransport::class);
+        $protocol = new TCompactProtocol($transport);
+
+        $transport->expects($this->once())
+                  ->method('write')
+                  ->with("\x00", 1);
+
+        $this->assertSame(1, $protocol->writeI32(0));
+    }
+
+    public function testWriteDouble()
+    {
+        $transport = $this->createMock(TTransport::class);
+        $protocol = new TCompactProtocol($transport);
+
+        $transport->expects($this->once())
+                  ->method('write')
+                  ->with(pack('d', 0), 8);
+
+        $this->assertSame(8, $protocol->writeDouble(0));
+    }
+
+    public function testWriteString()
+    {
+        $transport = $this->createMock(TTransport::class);
+        $protocol = new TCompactProtocol($transport);
+
+        $transport->expects($this->exactly(2))
+                  ->method('write')
+                  ->withConsecutive(
+                      ["\x04", 1],
+                      ["test", 4]
+                  );
+
+        $this->assertSame(5, $protocol->writeString('test'));
+    }
+
+    /**
+     * @dataProvider writeI64DataProvider
+     */
+    public function testWriteI64(
+        $value,
+        $expectedWriteCallParam,
+        $expectedResult
+    ) {
+        $transport = $this->createMock(TTransport::class);
+        $protocol = new TCompactProtocol($transport);
+
+        $transport->expects($this->once())
+                  ->method('write')
+                  ->with(...$expectedWriteCallParam);
+
+        $this->assertSame($expectedResult, $protocol->writeI64($value));
+    }
+
+    public function writeI64DataProvider()
+    {
+        yield 'simple' => [
+            'value' => 0,
+            'expectedWriteCallParam' => ["\x00", 1],
+            'expectedResult' => 1,
+        ];
+        yield 'negative' => [
+            'value' => -1,
+            'expectedWriteCallParam' => ["\x01", 1],
+            'expectedResult' => 1,
+        ];
+        yield 'big' => [
+            'value' => 5000000000,
+            'expectedWriteCallParam' => [hex2bin("80c8afa025"), 5],
+            'expectedResult' => 5,
+        ];
+        yield 'small' => [
+            'value' => -5000000000,
+            'expectedWriteCallParam' => [hex2bin("ffc7afa025"), 5],
+            'expectedResult' => 5,
+        ];
+        yield 'max simple' => [
+            'value' => 0xffffffff,
+            'expectedWriteCallParam' => [hex2bin("feffffff1f"), 5],
+            'expectedResult' => 5,
+        ];
+    }
+}
diff --git a/lib/php/test/Unit/Lib/Protocol/TMultiplexedProtocolTest.php b/lib/php/test/Unit/Lib/Protocol/TMultiplexedProtocolTest.php
new file mode 100644
index 0000000..970e3a9
--- /dev/null
+++ b/lib/php/test/Unit/Lib/Protocol/TMultiplexedProtocolTest.php
@@ -0,0 +1,85 @@
+<?php
+
+/*
+ * 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 Test\Thrift\Unit\Lib\Protocol;
+
+use PHPUnit\Framework\TestCase;
+use Thrift\Protocol\TMultiplexedProtocol;
+use Thrift\Protocol\TProtocol;
+use Thrift\Type\TMessageType;
+
+class TMultiplexedProtocolTest extends TestCase
+{
+
+    /**
+     * @dataProvider writeMessageBeginDataProvider
+     */
+    public function testWriteMessageBegin(
+        $serviceName,
+        $name,
+        $type,
+        $seqid,
+        $expectedName
+    ) {
+        $protocol = $this->createMock(TProtocol::class);
+        $multiplexedProtocol = new TMultiplexedProtocol($protocol, $serviceName);
+
+        $protocol->expects($this->once())
+            ->method('writeMessageBegin')
+            ->with($expectedName, $type, $seqid);
+
+        $multiplexedProtocol->writeMessageBegin($name, $type, $seqid);
+    }
+
+    public function writeMessageBeginDataProvider()
+    {
+        yield 'messageTypeCall' => [
+            'serviceName' => 'serviceName',
+            'name' => 'testName',
+            'type' => TMessageType::CALL,
+            'seqid' => 1,
+            'expectedName' => 'serviceName:testName'
+        ];
+        yield 'messageTypeOneWay' => [
+            'serviceName' => 'serviceName',
+            'name' => 'testName',
+            'type' => TMessageType::ONEWAY,
+            'seqid' => 1,
+            'expectedName' => 'serviceName:testName'
+        ];
+        yield 'messageTypeReply' => [
+            'serviceName' => 'serviceName',
+            'name' => 'testName',
+            'type' => TMessageType::REPLY,
+            'seqid' => 1,
+            'expectedName' => 'testName'
+        ];
+        yield 'messageTypeException' => [
+            'serviceName' => 'serviceName',
+            'name' => 'testName',
+            'type' => TMessageType::EXCEPTION,
+            'seqid' => 1,
+            'expectedName' => 'testName'
+        ];
+
+    }
+}
diff --git a/lib/php/test/Unit/Lib/Protocol/TProtocolDecoratorTest.php b/lib/php/test/Unit/Lib/Protocol/TProtocolDecoratorTest.php
new file mode 100644
index 0000000..e5dbdb3
--- /dev/null
+++ b/lib/php/test/Unit/Lib/Protocol/TProtocolDecoratorTest.php
@@ -0,0 +1,96 @@
+<?php
+
+/*
+ * 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 Test\Thrift\Unit\Lib\Protocol;
+
+use PHPUnit\Framework\TestCase;
+use Thrift\Protocol\TProtocol;
+use Thrift\Protocol\TProtocolDecorator;
+
+class TProtocolDecoratorTest extends TestCase
+{
+
+    /**
+     * @dataProvider methodDecorationDataProvider
+     */
+    public function testMethodDecoration(
+        $methodName,
+        $methodArguments
+    ) {
+        $concreteProtocol = $this->createMock(TProtocol::class);
+        $decorator = new class ($concreteProtocol) extends TProtocolDecorator {
+            public function __construct(TProtocol $protocol)
+            {
+                parent::__construct($protocol);
+            }
+        };
+
+        $concreteProtocol->expects($this->once())
+                         ->method($methodName)
+                         ->with(...$methodArguments);
+
+        $decorator->$methodName(...$methodArguments);
+    }
+
+    public function methodDecorationDataProvider()
+    {
+        yield 'writeMessageBegin' => ['writeMessageBegin', ['name', 'type', 'seqid']];
+        yield 'writeMessageEnd' => ['writeMessageEnd', []];
+        yield 'writeStructBegin' => ['writeStructBegin', ['name']];
+        yield 'writeStructEnd' => ['writeStructEnd', []];
+        yield 'writeFieldBegin' => ['writeFieldBegin', ['name', 'type', 'id']];
+        yield 'writeFieldEnd' => ['writeFieldEnd', []];
+        yield 'writeFieldStop' => ['writeFieldStop', []];
+        yield 'writeMapBegin' => ['writeMapBegin', ['keyType', 'valType', 'size']];
+        yield 'writeMapEnd' => ['writeMapEnd', []];
+        yield 'writeListBegin' => ['writeListBegin', ['elemType', 'size']];
+        yield 'writeListEnd' => ['writeListEnd', []];
+        yield 'writeSetBegin' => ['writeSetBegin', ['elemType', 'size']];
+        yield 'writeSetEnd' => ['writeSetEnd', []];
+        yield 'writeBool' => ['writeBool', ['value']];
+        yield 'writeByte' => ['writeByte', ['value']];
+        yield 'writeI16' => ['writeI16', ['value']];
+        yield 'writeI32' => ['writeI32', ['value']];
+        yield 'writeI64' => ['writeI64', ['value']];
+        yield 'writeDouble' => ['writeDouble', ['value']];
+        yield 'writeString' => ['writeString', ['value']];
+        yield 'readMessageBegin' => ['readMessageBegin', ['name', 'type', 'seqid']];
+        yield 'readMessageEnd' => ['readMessageEnd', []];
+        yield 'readStructBegin' => ['readStructBegin', ['name']];
+        yield 'readStructEnd' => ['readStructEnd', []];
+        yield 'readFieldBegin' => ['readFieldBegin', ['name', 'type', 'id']];
+        yield 'readFieldEnd' => ['readFieldEnd', []];
+        yield 'readMapBegin' => ['readMapBegin', ['keyType', 'valType', 'size']];
+        yield 'readMapEnd' => ['readMapEnd', []];
+        yield 'readListBegin' => ['readListBegin', ['elemType', 'size']];
+        yield 'readListEnd' => ['readListEnd', []];
+        yield 'readSetBegin' => ['readSetBegin', ['elemType', 'size']];
+        yield 'readSetEnd' => ['readSetEnd', []];
+        yield 'readBool' => ['readBool', ['value']];
+        yield 'readByte' => ['readByte', ['value']];
+        yield 'readI16' => ['readI16', ['value']];
+        yield 'readI32' => ['readI32', ['value']];
+        yield 'readI64' => ['readI64', ['value']];
+        yield 'readDouble' => ['readDouble', ['value']];
+        yield 'readString' => ['readString', ['value']];
+    }
+}
diff --git a/lib/php/test/Unit/Lib/Protocol/TSimpleJSONProtocolTest.php b/lib/php/test/Unit/Lib/Protocol/TSimpleJSONProtocolTest.php
new file mode 100644
index 0000000..e4d005a
--- /dev/null
+++ b/lib/php/test/Unit/Lib/Protocol/TSimpleJSONProtocolTest.php
@@ -0,0 +1,133 @@
+<?php
+
+/*
+ * 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 Test\Thrift\Unit\Lib\Protocol;
+
+use PHPUnit\Framework\TestCase;
+use Thrift\Exception\TException;
+use Thrift\Protocol\TSimpleJSONProtocol;
+use Thrift\Transport\TTransport;
+use Thrift\Type\TType;
+
+class TSimpleJSONProtocolTest extends TestCase
+{
+    /**
+     * Reading methods.
+     *
+     * simplejson is not meant to be read back into thrift
+     * - see http://wiki.apache.org/thrift/ThriftUsageJava
+     * - use JSON instead
+     *
+     * @dataProvider readDataProvider
+     */
+    public function testRead(
+        $methodName,
+        $methodArguments
+    ) {
+        $this->expectException(TException::class);
+        $this->expectExceptionMessage("Not implemented");
+
+        $transport = $this->createMock(TTransport::class);
+        $protocol = new TSimpleJSONProtocol($transport);
+        $protocol->$methodName(...$methodArguments);
+    }
+
+    public function readDataProvider()
+    {
+        yield 'readMessageBegin' => [
+            'methodName' => 'readMessageBegin',
+            'methodArguments' => ['name', 'type', 'seqId'],
+        ];
+        yield 'readMessageEnd' => [
+            'methodName' => 'readMessageEnd',
+            'methodArguments' => [],
+        ];
+        yield 'readStructBegin' => [
+            'methodName' => 'readStructBegin',
+            'methodArguments' => ['name'],
+        ];
+        yield 'readStructEnd' => [
+            'methodName' => 'readStructEnd',
+            'methodArguments' => [],
+        ];
+        yield 'readFieldBegin' => [
+            'methodName' => 'readFieldBegin',
+            'methodArguments' => ['name', TType::STRING, 1],
+        ];
+        yield 'readFieldEnd' => [
+            'methodName' => 'readFieldEnd',
+            'methodArguments' => [],
+        ];
+        yield 'readMapBegin' => [
+            'methodName' => 'readMapBegin',
+            'methodArguments' => [TType::STRING, TType::STRING, 1],
+        ];
+        yield 'readMapEnd' => [
+            'methodName' => 'readMapEnd',
+            'methodArguments' => [],
+        ];
+        yield 'readListBegin' => [
+            'methodName' => 'readListBegin',
+            'methodArguments' => [TType::STRING, 1],
+        ];
+        yield 'readListEnd' => [
+            'methodName' => 'readListEnd',
+            'methodArguments' => [],
+        ];
+        yield 'readSetBegin' => [
+            'methodName' => 'readSetBegin',
+            'methodArguments' => [TType::STRING, 1],
+        ];
+        yield 'readSetEnd' => [
+            'methodName' => 'readSetEnd',
+            'methodArguments' => [],
+        ];
+        yield 'readBool' => [
+            'methodName' => 'readBool',
+            'methodArguments' => [true],
+        ];
+        yield 'readByte' => [
+            'methodName' => 'readByte',
+            'methodArguments' => [0x01],
+        ];
+        yield 'readI16' => [
+            'methodName' => 'readI16',
+            'methodArguments' => [1],
+        ];
+        yield 'readI32' => [
+            'methodName' => 'readI32',
+            'methodArguments' => [1],
+        ];
+        yield 'readI64' => [
+            'methodName' => 'readI64',
+            'methodArguments' => [1],
+        ];
+        yield 'readDouble' => [
+            'methodName' => 'readDouble',
+            'methodArguments' => [0.1],
+        ];
+        yield 'readString' => [
+            'methodName' => 'readString',
+            'methodArguments' => ['string'],
+        ];
+    }
+}
diff --git a/lib/php/test/Unit/Lib/Serializer/TBinarySerializerTest.php b/lib/php/test/Unit/Lib/Serializer/TBinarySerializerTest.php
new file mode 100644
index 0000000..292f261
--- /dev/null
+++ b/lib/php/test/Unit/Lib/Serializer/TBinarySerializerTest.php
@@ -0,0 +1,38 @@
+<?php
+
+/*
+ * 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 Test\Thrift\Unit\Lib\Serializer;
+
+use PHPUnit\Framework\TestCase;
+
+class TBinarySerializerTest extends TestCase
+{
+    public function testSerialize()
+    {
+        $this->markTestIncomplete('Could not test static function which create instances during execution');
+    }
+
+    public function testDeserialize()
+    {
+        $this->markTestIncomplete('Could not test static function which create instances during execution');
+    }
+}
diff --git a/lib/php/test/Unit/Lib/Server/Fixture/TestProcessor.php b/lib/php/test/Unit/Lib/Server/Fixture/TestProcessor.php
new file mode 100644
index 0000000..8fc6891
--- /dev/null
+++ b/lib/php/test/Unit/Lib/Server/Fixture/TestProcessor.php
@@ -0,0 +1,30 @@
+<?php
+
+/*
+ * 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 Test\Thrift\Unit\Lib\Server\Fixture;
+
+class TestProcessor
+{
+    public function process($input, $output)
+    {
+        return true;
+    }
+}
diff --git a/lib/php/test/Unit/Lib/Server/TForkingServerTest.php b/lib/php/test/Unit/Lib/Server/TForkingServerTest.php
new file mode 100644
index 0000000..0a44032
--- /dev/null
+++ b/lib/php/test/Unit/Lib/Server/TForkingServerTest.php
@@ -0,0 +1,32 @@
+<?php
+
+/*
+ * 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 Test\Thrift\Unit\Lib\Server;
+
+use PHPUnit\Framework\TestCase;
+
+class TForkingServerTest extends TestCase
+{
+    public function testServe(): void
+    {
+        $this->markTestSkipped('Unit test could not be written for class which use pcntl_fork and exit functions');
+    }
+}
diff --git a/lib/php/test/Unit/Lib/Server/TSSLServerSocketTest.php b/lib/php/test/Unit/Lib/Server/TSSLServerSocketTest.php
new file mode 100644
index 0000000..02ae584
--- /dev/null
+++ b/lib/php/test/Unit/Lib/Server/TSSLServerSocketTest.php
@@ -0,0 +1,150 @@
+<?php
+
+/*
+ * 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 Test\Thrift\Unit\Lib\Server;
+
+use phpmock\phpunit\PHPMock;
+use PHPUnit\Framework\TestCase;
+use Thrift\Exception\TTransportException;
+use Thrift\Server\TSSLServerSocket;
+use Thrift\Transport\TSocket;
+
+class TSSLServerSocketTest extends TestCase
+{
+    use PHPMock;
+
+    public function testGetSSLHost()
+    {
+        $socket = new TSSLServerSocket();
+
+        $this->assertEquals('ssl://localhost', $socket->getSSLHost('localhost'));
+        $this->assertEquals('ssl://localhost', $socket->getSSLHost('ssl://localhost'));
+        $this->assertEquals('tcp://localhost', $socket->getSSLHost('tcp://localhost'));
+    }
+
+    public function testListenAndClose(): void
+    {
+        $options = [
+            'ssl' => [
+                'verify_peer' => true,
+                'verify_peer_name' => true,
+                'allow_self_signed' => true,
+            ],
+        ];
+        $context = stream_context_create($options);
+        $socket = new TSSLServerSocket('somehost', 999, $context);
+
+        $listener = tmpfile();
+        $this->getFunctionMock('Thrift\Server', 'stream_socket_server')
+             ->expects($this->once())
+             ->with(
+                 'ssl://somehost:999', #$address
+                 $this->anything(), #&$error_code
+                 $this->anything(), #&$error_string
+                 STREAM_SERVER_BIND | STREAM_SERVER_LISTEN, #int $flags
+                 $this->callback(function ($context) use ($options) {
+                     $contextOptions = stream_context_get_options($context);
+
+                     return is_resource($context) && $options === $contextOptions;
+                 })#resource $context
+             )->willReturn($listener);
+
+        $socket->listen();
+
+        $reflection = new \ReflectionClass($socket);
+        $property = $reflection->getProperty('listener_');
+        $property->setAccessible(true);
+
+        $this->assertIsResource($property->getValue($socket));
+
+        $this->getFunctionMock('Thrift\Server', 'fclose')
+             ->expects($this->once())
+             ->with($this->equalTo($listener))
+             ->willReturn(true);
+
+        $socket->close();
+        $this->assertNull($property->getValue($socket));
+    }
+
+    public function testAccept()
+    {
+        $socket = new TSSLServerSocket('somehost', 999);
+        $socket->setAcceptTimeout(1000);
+
+        $listener = tmpfile();
+        $this->getFunctionMock('Thrift\Server', 'stream_socket_server')
+             ->expects($this->once())
+             ->with(
+                 'ssl://somehost:999', #$address
+                 $this->anything(), #&$error_code
+                 $this->anything(), #&$error_string
+                 STREAM_SERVER_BIND | STREAM_SERVER_LISTEN, #int $flags
+                 $this->callback(function ($context) {
+                     $contextOptions = stream_context_get_options($context);
+
+                     return is_resource($context) && $contextOptions === [];
+                 }) #resource $context
+             )->willReturn($listener);
+
+        $transportHandle = tmpfile();
+        $this->getFunctionMock('Thrift\Server', 'stream_socket_accept')
+             ->expects($this->once())
+             ->with(
+                 $this->equalTo($listener),
+                 1
+             )->willReturn($transportHandle);
+
+        $socket->listen();
+        $result = $socket->accept();
+        $this->assertInstanceOf(TSocket::class, $result);
+
+        $reflection = new \ReflectionClass($result);
+        $property = $reflection->getProperty('handle_');
+        $property->setAccessible(true);
+        $this->assertEquals($transportHandle, $property->getValue($result));
+    }
+
+    public function testAcceptFailed()
+    {
+        $socket = new TSSLServerSocket('somehost', 999);
+        $socket->setAcceptTimeout(1000);
+
+        $listener = tmpfile();
+
+        $this->getFunctionMock('Thrift\Server', 'stream_socket_server')
+             ->expects($this->once())
+             ->with('ssl://somehost:999')
+             ->willReturn($listener);
+
+        $this->getFunctionMock('Thrift\Server', 'stream_socket_accept')
+             ->expects($this->once())
+             ->with(
+                 $this->equalTo($listener),
+                 1
+             )->willReturn(null);
+
+        $this->expectException(TTransportException::class);
+        $this->expectExceptionMessage('accept() may not return NULL');
+
+        $socket->listen();
+        $socket->accept();
+    }
+}
diff --git a/lib/php/test/Unit/Lib/Server/TServerSocketTest.php b/lib/php/test/Unit/Lib/Server/TServerSocketTest.php
new file mode 100644
index 0000000..e9d3b96
--- /dev/null
+++ b/lib/php/test/Unit/Lib/Server/TServerSocketTest.php
@@ -0,0 +1,128 @@
+<?php
+
+/*
+ * 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 Test\Thrift\Unit\Lib\Server;
+
+use phpmock\phpunit\PHPMock;
+use PHPUnit\Framework\TestCase;
+use Thrift\Exception\TTransportException;
+use Thrift\Server\TServerSocket;
+use Thrift\Transport\TSocket;
+
+class TServerSocketTest extends TestCase
+{
+    use PHPMock;
+
+    public function testSetAcceptTimeout(): void
+    {
+        $socket = new TServerSocket();
+        $socket->setAcceptTimeout(1000);
+
+        $reflection = new \ReflectionClass($socket);
+        $property = $reflection->getProperty('acceptTimeout_');
+        $property->setAccessible(true);
+
+        $this->assertEquals(1000, $property->getValue($socket));
+    }
+
+    public function testListenAndClose(): void
+    {
+        $socket = new TServerSocket('somehost', 999);
+
+        $listener = tmpfile();
+        $this->getFunctionMock('Thrift\Server', 'stream_socket_server')
+             ->expects($this->once())
+             ->with('tcp://somehost:999')
+             ->willReturn($listener);
+
+        $socket->listen();
+
+        $reflection = new \ReflectionClass($socket);
+        $property = $reflection->getProperty('listener_');
+        $property->setAccessible(true);
+
+        $this->assertIsResource($property->getValue($socket));
+
+        $this->getFunctionMock('Thrift\Server', 'fclose')
+             ->expects($this->once())
+             ->with($this->equalTo($listener))
+             ->willReturn(true);
+
+        $socket->close();
+        $this->assertNull($property->getValue($socket));
+    }
+
+    public function testAccept()
+    {
+        $socket = new TServerSocket('somehost', 999);
+        $socket->setAcceptTimeout(1000);
+
+        $listener = tmpfile();
+
+        $this->getFunctionMock('Thrift\Server', 'stream_socket_server')
+             ->expects($this->once())
+             ->with('tcp://somehost:999')
+             ->willReturn($listener);
+
+        $transportHandle = tmpfile();
+        $this->getFunctionMock('Thrift\Server', 'stream_socket_accept')
+             ->expects($this->once())
+             ->with(
+                 $this->equalTo($listener),
+                 1
+             )->willReturn($transportHandle);
+
+        $socket->listen();
+        $result = $socket->accept();
+        $this->assertInstanceOf(TSocket::class, $result);
+
+        $reflection = new \ReflectionClass($result);
+        $property = $reflection->getProperty('handle_');
+        $property->setAccessible(true);
+        $this->assertEquals($transportHandle, $property->getValue($result));
+    }
+
+    public function testAcceptFailed()
+    {
+        $socket = new TServerSocket('somehost', 999);
+        $socket->setAcceptTimeout(1000);
+
+        $listener = tmpfile();
+
+        $this->getFunctionMock('Thrift\Server', 'stream_socket_server')
+             ->expects($this->once())
+             ->with('tcp://somehost:999')
+             ->willReturn($listener);
+
+        $this->getFunctionMock('Thrift\Server', 'stream_socket_accept')
+             ->expects($this->once())
+             ->with(
+                 $this->equalTo($listener),
+                 1
+             )->willReturn(null);
+
+        $this->expectException(TTransportException::class);
+        $this->expectExceptionMessage('accept() may not return NULL');
+
+        $socket->listen();
+        $socket->accept();
+    }
+}
diff --git a/lib/php/test/Unit/Lib/Server/TSimpleServerTest.php b/lib/php/test/Unit/Lib/Server/TSimpleServerTest.php
new file mode 100644
index 0000000..269b838
--- /dev/null
+++ b/lib/php/test/Unit/Lib/Server/TSimpleServerTest.php
@@ -0,0 +1,166 @@
+<?php
+
+/*
+ * 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 Test\Thrift\Unit\Lib\Server;
+
+use PHPUnit\Framework\MockObject\MockObject;
+use PHPUnit\Framework\TestCase;
+use Test\Thrift\Unit\Lib\Server\Fixture\TestProcessor;
+use Thrift\Factory\TProtocolFactory;
+use Thrift\Factory\TTransportFactoryInterface;
+use Thrift\Server\TServerTransport;
+use Thrift\Server\TSimpleServer;
+use Thrift\Transport\TTransport;
+
+class TSimpleServerTest extends TestCase
+{
+    /**
+     * @var object
+     */
+    private $processor;
+    /**
+     * @var MockObject|TServerTransport
+     */
+    private $transport;
+    /**
+     * @var MockObject|TTransportFactoryInterface
+     */
+    private $inputTransportFactory;
+    /**
+     * @var MockObject|TTransportFactoryInterface
+     */
+    private $outputTransportFactory;
+    /**
+     * @var MockObject|TProtocolFactory
+     */
+    private $inputProtocolFactory;
+    /**
+     * @var MockObject|TProtocolFactory
+     */
+    private $outputProtocolFactory;
+    /**
+     * @var TSimpleServer
+     */
+    private $server;
+
+    protected function setUp(): void
+    {
+        $this->processor = $this->createMock(TestProcessor::class);
+        $this->transport = $this->createMock(TServerTransport::class);
+        $this->inputTransportFactory = $this->createMock(TTransportFactoryInterface::class);
+        $this->outputTransportFactory = $this->createMock(TTransportFactoryInterface::class);
+        $this->inputProtocolFactory = $this->createMock(TProtocolFactory::class);
+        $this->outputProtocolFactory = $this->createMock(TProtocolFactory::class);
+
+        $this->server = new TSimpleServer(
+            $this->processor,
+            $this->transport,
+            $this->inputTransportFactory,
+            $this->outputTransportFactory,
+            $this->inputProtocolFactory,
+            $this->outputProtocolFactory
+        );
+    }
+
+    protected function tearDown(): void
+    {
+        unset(
+            $this->processor,
+            $this->transport,
+            $this->inputTransportFactory,
+            $this->outputTransportFactory,
+            $this->inputProtocolFactory,
+            $this->outputProtocolFactory,
+            $this->server
+        );
+    }
+
+    /**
+     * @dataProvider serveDataProvider
+     */
+    public function testServe(
+        $serveLoopCount,
+        array $processLoopResult
+    ): void {
+        $transport = $this->createMock(TTransport::class);
+
+        $this->transport->expects($this->once())
+            ->method('listen');
+        $this->transport->expects($this->exactly($serveLoopCount))
+            ->method('accept')
+            ->willReturn($transport);
+
+        $this->inputTransportFactory->expects($this->exactly($serveLoopCount))
+            ->method('getTransport')
+            ->willReturn($this->createMock(TServerTransport::class));
+        $this->outputTransportFactory->expects($this->exactly($serveLoopCount))
+            ->method('getTransport')
+            ->willReturn($this->createMock(TServerTransport::class));
+
+        $inputProtocol = $this->createMock(TServerTransport::class);
+        $this->inputProtocolFactory->expects($this->exactly($serveLoopCount))
+            ->method('getProtocol')
+            ->willReturn($inputProtocol);
+
+        $outputProtocol = $this->createMock(TServerTransport::class);
+        $this->outputProtocolFactory->expects($this->exactly($serveLoopCount))
+            ->method('getProtocol')
+            ->willReturn($outputProtocol);
+
+        /**
+         * ATTENTION!
+         * it is a hack to stop the server loop in unit test
+         * last call of process can return any value, but should stop server for removing infinite loop
+         **/
+        $processLoopResult[] = $this->returnCallback(function () {
+            $this->server->stop();
+
+            return false;
+        });
+
+        $this->processor->expects($this->exactly(count($processLoopResult)))
+            ->method('process')
+            ->with(
+                $this->equalTo($inputProtocol),
+                $this->equalTo($outputProtocol)
+            )
+            ->willReturnOnConsecutiveCalls(...$processLoopResult);
+
+        $this->server->serve();
+    }
+
+    public function serveDataProvider()
+    {
+        yield 'one serve loop' => [
+            'serveLoopCount' => 1,
+            'processLoopResult' => [
+                true,
+            ]
+        ];
+        yield 'two serve loop' => [
+            'serveLoopCount' => 2,
+            'processLoopResult' => [
+                true,
+                false,
+            ]
+        ];
+    }
+}
diff --git a/lib/php/test/Unit/Lib/Transport/TBufferedTransportTest.php b/lib/php/test/Unit/Lib/Transport/TBufferedTransportTest.php
new file mode 100644
index 0000000..dd6003a
--- /dev/null
+++ b/lib/php/test/Unit/Lib/Transport/TBufferedTransportTest.php
@@ -0,0 +1,286 @@
+<?php
+
+/*
+ * 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 Test\Thrift\Unit\Lib\Transport;
+
+use PHPUnit\Framework\TestCase;
+use Thrift\Transport\TBufferedTransport;
+use Thrift\Transport\TTransport;
+
+class TBufferedTransportTest extends TestCase
+{
+    public function testIsOpen()
+    {
+        $transport = $this->createMock(TTransport::class);
+        $bufferedTransport = new TBufferedTransport($transport);
+
+        $transport
+            ->expects($this->once())
+            ->method('isOpen')
+            ->willReturn(true);
+
+        $this->assertTrue($bufferedTransport->isOpen());
+    }
+
+    public function testOpen()
+    {
+        $transport = $this->createMock(TTransport::class);
+        $bufferedTransport = new TBufferedTransport($transport);
+
+        $transport
+            ->expects($this->once())
+            ->method('open')
+            ->willReturn(null);
+
+        $this->assertNull($bufferedTransport->open());
+    }
+
+    public function testClose()
+    {
+        $transport = $this->createMock(TTransport::class);
+        $bufferedTransport = new TBufferedTransport($transport);
+
+        $transport
+            ->expects($this->once())
+            ->method('close')
+            ->willReturn(null);
+
+        $this->assertNull($bufferedTransport->close());
+    }
+
+    public function testPutBack()
+    {
+        $transport = $this->createMock(TTransport::class);
+        $bufferedTransport = new TBufferedTransport($transport);
+        $bufferedTransport->putBack('test');
+
+        $ref = new \ReflectionClass($bufferedTransport);
+        $property = $ref->getProperty('rBuf_');
+        $property->setAccessible(true);
+        $this->assertEquals('test', $property->getValue($bufferedTransport));
+
+        $bufferedTransport->putBack('abcde');
+        $this->assertEquals('abcdetest', $property->getValue($bufferedTransport));
+    }
+
+    /**
+     * @dataProvider readAllDataProvider
+     */
+    public function testReadAll(
+        $startBuffer,
+        $readLength,
+        $bufferReadLength,
+        $bufferReadResult,
+        $expectedBufferValue,
+        $expectedRead
+    ) {
+        $transport = $this->createMock(TTransport::class);
+        $bufferedTransport = new TBufferedTransport($transport);
+        $bufferedTransport->putBack($startBuffer);
+
+        $transport
+            ->expects($bufferReadLength > 0 ? $this->once() : $this->never())
+            ->method('readAll')
+            ->with($bufferReadLength)
+            ->willReturn($bufferReadResult);
+
+        $this->assertEquals($expectedRead, $bufferedTransport->readAll($readLength));
+
+        $ref = new \ReflectionClass($bufferedTransport);
+        $property = $ref->getProperty('rBuf_');
+        $property->setAccessible(true);
+        $this->assertEquals($expectedBufferValue, $property->getValue($bufferedTransport));
+    }
+
+    public function readAllDataProvider()
+    {
+        yield 'buffer empty' => [
+            'startBuffer' => '',
+            'readLength' => 5,
+            'bufferReadLength' => 5,
+            'bufferReadResult' => '12345',
+            'expectedBufferValue' => '',
+            'expectedRead' => '12345',
+        ];
+        yield 'buffer have partly loaded data' => [
+            'startBuffer' => '12345',
+            'readLength' => 10,
+            'bufferReadLength' => 5,
+            'bufferReadResult' => '67890',
+            'expectedBufferValue' => '',
+            'expectedRead' => '1234567890',
+        ];
+        yield 'buffer fully read' => [
+            'startBuffer' => '12345',
+            'readLength' => 5,
+            'bufferReadLength' => 0,
+            'bufferReadResult' => '',
+            'expectedBufferValue' => '',
+            'expectedRead' => '12345',
+        ];
+        yield 'request less data that we have in buffer' => [
+            'startBuffer' => '12345',
+            'readLength' => 3,
+            'bufferReadLength' => 0,
+            'bufferReadResult' => '',
+            'expectedBufferValue' => '45',
+            'expectedRead' => '123',
+        ];
+    }
+
+    /**
+     * @dataProvider readDataProvider
+     */
+    public function testRead(
+        $readBufferSize,
+        $startBuffer,
+        $readLength,
+        $bufferReadResult,
+        $expectedBufferValue,
+        $expectedRead
+    ) {
+        $transport = $this->createMock(TTransport::class);
+        $bufferedTransport = new TBufferedTransport($transport, $readBufferSize);
+        $bufferedTransport->putBack($startBuffer);
+
+        $transport
+            ->expects(empty($startBuffer) > 0 ? $this->once() : $this->never())
+            ->method('read')
+            ->with($readBufferSize)
+            ->willReturn($bufferReadResult);
+
+        $this->assertEquals($expectedRead, $bufferedTransport->read($readLength));
+
+        $ref = new \ReflectionClass($bufferedTransport);
+        $property = $ref->getProperty('rBuf_');
+        $property->setAccessible(true);
+        $this->assertEquals($expectedBufferValue, $property->getValue($bufferedTransport));
+    }
+
+    public function readDataProvider()
+    {
+        yield 'buffer empty' => [
+            'readBufferSize' => 10,
+            'startBuffer' => '',
+            'readLength' => 5,
+            'bufferReadResult' => '12345',
+            'expectedBufferValue' => '',
+            'expectedRead' => '12345',
+        ];
+        yield 'buffer read partly' => [
+            'readBufferSize' => 10,
+            'startBuffer' => '',
+            'readLength' => 5,
+            'bufferReadResult' => '1234567890',
+            'expectedBufferValue' => '67890',
+            'expectedRead' => '12345',
+        ];
+        yield 'buffer fully read' => [
+            'readBufferSize' => 10,
+            'startBuffer' => '12345',
+            'readLength' => 5,
+            'bufferReadResult' => '',
+            'expectedBufferValue' => '',
+            'expectedRead' => '12345',
+        ];
+    }
+
+    /**
+     * @dataProvider writeDataProvider
+     */
+    public function testWrite(
+        $writeBufferSize,
+        $writeData,
+        $bufferedTransportCall,
+        $expectedWriteBufferValue
+    ) {
+        $transport = $this->createMock(TTransport::class);
+        $bufferedTransport = new TBufferedTransport($transport, 512, $writeBufferSize);
+
+        $transport
+            ->expects($this->exactly($bufferedTransportCall))
+            ->method('write')
+            ->with($writeData)
+            ->willReturn(null);
+
+        $this->assertNull($bufferedTransport->write($writeData));
+
+        $ref = new \ReflectionClass($bufferedTransport);
+        $property = $ref->getProperty('wBuf_');
+        $property->setAccessible(true);
+        $this->assertEquals($expectedWriteBufferValue, $property->getValue($bufferedTransport));
+    }
+
+    public function writeDataProvider()
+    {
+        yield 'store data in buffer' => [
+            'writeBufferSize' => 10,
+            'writeData' => '12345',
+            'bufferedTransportCall' => 0,
+            'expectedWriteBufferValue' => '12345',
+        ];
+        yield 'send data to buffered transport' => [
+            'writeBufferSize' => 10,
+            'writeData' => '12345678901',
+            'bufferedTransportCall' => 1,
+            'expectedWriteBufferValue' => '',
+        ];
+    }
+
+    /**
+     * @dataProvider flushDataProvider
+     */
+    public function testFlush(
+        $writeBuffer
+    ) {
+        $transport = $this->createMock(TTransport::class);
+        $bufferedTransport = new TBufferedTransport($transport, 512, 512);
+        $ref = new \ReflectionClass($bufferedTransport);
+        $property = $ref->getProperty('wBuf_');
+        $property->setAccessible(true);
+        $property->setValue($bufferedTransport, $writeBuffer);
+
+        $transport
+            ->expects(!empty($writeBuffer) ? $this->once() : $this->never())
+            ->method('write')
+            ->with($writeBuffer)
+            ->willReturn(null);
+
+        $transport
+            ->expects($this->once())
+            ->method('flush')
+            ->willReturn(null);
+
+        $this->assertNull($bufferedTransport->flush());
+
+        $this->assertEquals('', $property->getValue($bufferedTransport));
+    }
+
+    public function flushDataProvider()
+    {
+        yield 'empty buffer' => [
+            'writeBuffer' => '',
+        ];
+        yield 'not empty buffer' => [
+            'writeBuffer' => '12345',
+        ];
+    }
+}
diff --git a/lib/php/test/Unit/Lib/Transport/TCurlClientTest.php b/lib/php/test/Unit/Lib/Transport/TCurlClientTest.php
new file mode 100644
index 0000000..7cd7446
--- /dev/null
+++ b/lib/php/test/Unit/Lib/Transport/TCurlClientTest.php
@@ -0,0 +1,423 @@
+<?php
+
+/*
+ * 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 Test\Thrift\Unit\Lib\Transport;
+
+use phpmock\phpunit\PHPMock;
+use PHPUnit\Framework\TestCase;
+use Thrift\Exception\TTransportException;
+use Thrift\Transport\TCurlClient;
+
+class TCurlClientTest extends TestCase
+{
+    use PHPMock;
+
+    public function testSetTimeoutSecs()
+    {
+        $host = 'localhost';
+        $transport = new TCurlClient($host);
+        $transport->setTimeoutSecs(1000);
+
+        $ref = new \ReflectionClass($transport);
+        $prop = $ref->getProperty('timeout_');
+        $prop->setAccessible(true);
+        $this->assertEquals(1000, $prop->getValue($transport));
+    }
+
+    public function testSetConnectionTimeoutSecs()
+    {
+        $host = 'localhost';
+        $transport = new TCurlClient($host);
+        $transport->setConnectionTimeoutSecs(1000);
+
+        $ref = new \ReflectionClass($transport);
+        $prop = $ref->getProperty('connectionTimeout_');
+        $prop->setAccessible(true);
+        $this->assertEquals(1000, $prop->getValue($transport));
+    }
+
+    public function testIsOpen()
+    {
+        $host = 'localhost';
+        $transport = new TCurlClient($host);
+        $this->assertTrue($transport->isOpen());
+    }
+
+    public function testOpen()
+    {
+        $host = 'localhost';
+        $transport = new TCurlClient($host);
+        $this->assertNull($transport->open());
+    }
+
+    public function testClose()
+    {
+        $host = 'localhost';
+        $transport = new TCurlClient($host);
+
+        $ref = new \ReflectionClass($transport);
+        $propRequest = $ref->getProperty('request_');
+        $propRequest->setAccessible(true);
+        $propRequest->setValue($transport, 'testRequest');
+        $propResponse = $ref->getProperty('response_');
+        $propResponse->setAccessible(true);
+        $propResponse->setValue($transport, 'testResponse');
+
+        $this->assertNull($transport->close());
+        $this->assertEmpty($propRequest->getValue($transport));
+        $this->assertEmpty($propResponse->getValue($transport));
+    }
+
+    public function testRead()
+    {
+        $host = 'localhost';
+        $transport = new TCurlClient($host);
+
+        $ref = new \ReflectionClass($transport);
+        $propResponse = $ref->getProperty('response_');
+        $propResponse->setAccessible(true);
+        $propResponse->setValue($transport, '1234567890');
+
+        $response = $transport->read(5);
+        $this->assertEquals('12345', $response);
+        $this->assertEquals('67890', $propResponse->getValue($transport));
+
+        $response = $transport->read(5);
+        $this->assertEquals('67890', $response);
+        # The response does not cleaned after reading full answer, maybe it should be fixed
+        $this->assertEquals('67890', $propResponse->getValue($transport));
+    }
+
+    public function testReadAll()
+    {
+        $host = 'localhost';
+        $transport = new TCurlClient($host);
+
+        $ref = new \ReflectionClass($transport);
+        $propResponse = $ref->getProperty('response_');
+        $propResponse->setAccessible(true);
+        $propResponse->setValue($transport, '1234567890');
+
+        $response = $transport->readAll(5);
+        $this->assertEquals('12345', $response);
+        $this->assertEquals('67890', $propResponse->getValue($transport));
+    }
+
+    public function testReadAll_THRIFT_4656()
+    {
+        $host = 'localhost';
+        $transport = new TCurlClient($host);
+
+        $ref = new \ReflectionClass($transport);
+        $propResponse = $ref->getProperty('response_');
+        $propResponse->setAccessible(true);
+        $propResponse->setValue($transport, '');
+
+        $this->expectException(TTransportException::class);
+        $this->expectExceptionMessage('TCurlClient could not read 5 bytes');
+        $this->expectExceptionCode(TTransportException::UNKNOWN);
+
+        $transport->readAll(5);
+    }
+
+    public function testWrite()
+    {
+        $host = 'localhost';
+        $transport = new TCurlClient($host);
+
+        $ref = new \ReflectionClass($transport);
+        $propRequest = $ref->getProperty('request_');
+        $propRequest->setAccessible(true);
+        $propRequest->setValue($transport, '1234567890');
+
+        $transport->write('12345');
+        $this->assertEquals('123456789012345', $propRequest->getValue($transport));
+    }
+
+    public function testAddHeaders()
+    {
+        $host = 'localhost';
+        $transport = new TCurlClient($host);
+
+        $ref = new \ReflectionClass($transport);
+        $propRequest = $ref->getProperty('headers_');
+        $propRequest->setAccessible(true);
+        $propRequest->setValue($transport, ['test' => '1234567890']);
+
+        $transport->addHeaders(['test2' => '12345']);
+        $this->assertEquals(['test' => '1234567890', 'test2' => '12345'], $propRequest->getValue($transport));
+    }
+
+    /**
+     * @dataProvider flushDataProvider
+     */
+    public function testFlush(
+        $host,
+        $port,
+        $uri,
+        $scheme,
+        $headers,
+        $request,
+        $timeout,
+        $connectionTimeout,
+        $curlSetOptCalls,
+        $response,
+        $responseError,
+        $responseCode,
+        $expectedException = null,
+        $expectedMessage = null,
+        $expectedCode = null
+    ) {
+        $this->getFunctionMock('Thrift\\Transport', 'register_shutdown_function')
+             ->expects($this->once())
+             ->with(
+                 $this->callback(
+                     function ($arg) {
+                         return is_array(
+                                 $arg
+                             ) && $arg[0] === 'Thrift\\Transport\\TCurlClient' && $arg[1] === 'closeCurlHandle';
+                     }
+                 )
+             );
+        $this->getFunctionMock('Thrift\\Transport', 'curl_init')
+             ->expects($this->once());
+
+        $this->getFunctionMock('Thrift\\Transport', 'curl_setopt')
+             ->expects($this->any())
+             ->withConsecutive(...$curlSetOptCalls)
+             ->willReturn(true);
+
+        $this->getFunctionMock('Thrift\\Transport', 'curl_exec')
+             ->expects($this->once())
+             ->with($this->anything())
+             ->willReturn($response);
+
+        $this->getFunctionMock('Thrift\\Transport', 'curl_error')
+             ->expects($this->once())
+             ->with($this->anything())
+             ->willReturn($responseError);
+
+        $this->getFunctionMock('Thrift\\Transport', 'curl_getinfo')
+             ->expects($this->once())
+             ->with($this->anything(), CURLINFO_HTTP_CODE)
+             ->willReturn($responseCode);
+
+        if (!is_null($expectedException)) {
+            $this->expectException($expectedException);
+            $this->expectExceptionMessage($expectedMessage);
+            $this->expectExceptionCode($expectedCode);
+
+            $this->getFunctionMock('Thrift\\Transport', 'curl_close')
+                 ->expects($this->once())
+                 ->with($this->anything());
+        }
+
+        $transport = new TCurlClient($host, $port, $uri, $scheme);
+        if (!empty($headers)) {
+            $transport->addHeaders($headers);
+        }
+        $transport->write($request);
+        if (!empty($timeout)) {
+            $transport->setTimeoutSecs($timeout);
+        }
+        if (!empty($connectionTimeout)) {
+            $transport->setConnectionTimeoutSecs($connectionTimeout);
+        }
+
+        $transport->flush();
+    }
+
+    public function flushDataProvider()
+    {
+        $request = 'request';
+
+        $default = [
+            'host' => 'localhost',
+            'port' => 80,
+            'uri' => '',
+            'scheme' => 'http',
+            'headers' => [],
+            'request' => $request,
+            'timeout' => null,
+            'connectionTimeout' => null,
+            'curlSetOptCalls' => [
+                [$this->anything(), CURLOPT_RETURNTRANSFER, true],
+                [$this->anything(), CURLOPT_USERAGENT, 'PHP/TCurlClient'],
+                [$this->anything(), CURLOPT_CUSTOMREQUEST, 'POST'],
+                [$this->anything(), CURLOPT_FOLLOWLOCATION, true],
+                [$this->anything(), CURLOPT_MAXREDIRS, 1],
+                [
+                    $this->anything(),
+                    CURLOPT_HTTPHEADER,
+                    [
+                        'Accept: application/x-thrift',
+                        'Content-Type: application/x-thrift',
+                        'Content-Length: ' . strlen($request),
+                    ],
+                ],
+                [$this->anything(), CURLOPT_POSTFIELDS, $request],
+                [$this->anything(), CURLOPT_URL, 'http://localhost'],
+            ],
+            'response' => 'response',
+            'responseError' => '',
+            'responseCode' => 200,
+        ];
+
+        yield 'default' => $default;
+        yield 'additionalHeaders' => array_merge(
+            $default,
+            [
+                'headers' => ['test' => '1234567890'],
+                'curlSetOptCalls' => [
+                    [$this->anything(), CURLOPT_RETURNTRANSFER, true],
+                    [$this->anything(), CURLOPT_USERAGENT, 'PHP/TCurlClient'],
+                    [$this->anything(), CURLOPT_CUSTOMREQUEST, 'POST'],
+                    [$this->anything(), CURLOPT_FOLLOWLOCATION, true],
+                    [$this->anything(), CURLOPT_MAXREDIRS, 1],
+                    [
+                        $this->anything(),
+                        CURLOPT_HTTPHEADER,
+                        [
+                            'Accept: application/x-thrift',
+                            'Content-Type: application/x-thrift',
+                            'Content-Length: ' . strlen($request),
+                            'test: 1234567890',
+                        ],
+                    ],
+                    [$this->anything(), CURLOPT_POSTFIELDS, $request],
+                    [$this->anything(), CURLOPT_URL, 'http://localhost'],
+                ],
+            ]
+        );
+        yield 'uri' => array_merge(
+            $default,
+            [
+                'uri' => 'test1234567890',
+                'curlSetOptCalls' => [
+                    [$this->anything(), CURLOPT_RETURNTRANSFER, true],
+                    [$this->anything(), CURLOPT_USERAGENT, 'PHP/TCurlClient'],
+                    [$this->anything(), CURLOPT_CUSTOMREQUEST, 'POST'],
+                    [$this->anything(), CURLOPT_FOLLOWLOCATION, true],
+                    [$this->anything(), CURLOPT_MAXREDIRS, 1],
+                    [
+                        $this->anything(),
+                        CURLOPT_HTTPHEADER,
+                        [
+                            'Accept: application/x-thrift',
+                            'Content-Type: application/x-thrift',
+                            'Content-Length: ' . strlen($request),
+                        ],
+                    ],
+                    [$this->anything(), CURLOPT_POSTFIELDS, $request],
+                    [$this->anything(), CURLOPT_URL, 'http://localhost/test1234567890'],
+                ],
+            ]
+        );
+        yield 'timeout' => array_merge(
+            $default,
+            [
+                'timeout' => 10,
+                'connectionTimeout' => 10,
+                'curlSetOptCalls' => [
+                    [$this->anything(), CURLOPT_RETURNTRANSFER, true],
+                    [$this->anything(), CURLOPT_USERAGENT, 'PHP/TCurlClient'],
+                    [$this->anything(), CURLOPT_CUSTOMREQUEST, 'POST'],
+                    [$this->anything(), CURLOPT_FOLLOWLOCATION, true],
+                    [$this->anything(), CURLOPT_MAXREDIRS, 1],
+                    [
+                        $this->anything(),
+                        CURLOPT_HTTPHEADER,
+                        [
+                            'Accept: application/x-thrift',
+                            'Content-Type: application/x-thrift',
+                            'Content-Length: ' . strlen($request),
+                        ],
+                    ],
+                    [$this->anything(), CURLOPT_TIMEOUT, 10],
+                    [$this->anything(), CURLOPT_CONNECTTIMEOUT, 10],
+                    [$this->anything(), CURLOPT_POSTFIELDS, $request],
+                    [$this->anything(), CURLOPT_URL, 'http://localhost'],
+                ],
+            ]
+        );
+        yield 'timeout msec' => array_merge(
+            $default,
+            [
+                'timeout' => 0.1,
+                'connectionTimeout' => 0.1,
+                'curlSetOptCalls' => [
+                    [$this->anything(), CURLOPT_RETURNTRANSFER, true],
+                    [$this->anything(), CURLOPT_USERAGENT, 'PHP/TCurlClient'],
+                    [$this->anything(), CURLOPT_CUSTOMREQUEST, 'POST'],
+                    [$this->anything(), CURLOPT_FOLLOWLOCATION, true],
+                    [$this->anything(), CURLOPT_MAXREDIRS, 1],
+                    [
+                        $this->anything(),
+                        CURLOPT_HTTPHEADER,
+                        [
+                            'Accept: application/x-thrift',
+                            'Content-Type: application/x-thrift',
+                            'Content-Length: ' . strlen($request),
+                        ],
+                    ],
+                    [$this->anything(), CURLOPT_TIMEOUT_MS, 100],
+                    [$this->anything(), CURLOPT_CONNECTTIMEOUT_MS, 100],
+                    [$this->anything(), CURLOPT_POSTFIELDS, $request],
+                    [$this->anything(), CURLOPT_URL, 'http://localhost'],
+                ],
+            ]
+        );
+        yield 'curl_exec return false' => array_merge(
+            $default,
+            [
+                'response' => false,
+                'expectedException' => TTransportException::class,
+                'expectedMessage' => 'TCurlClient: Could not connect to http://localhost',
+                'expectedCode' => TTransportException::UNKNOWN,
+            ]
+        );
+        yield 'curl_exec return response code 403' => array_merge(
+            $default,
+            [
+                'responseError' => 'Access denied',
+                'responseCode' => 403,
+                'expectedException' => TTransportException::class,
+                'expectedMessage' => 'TCurlClient: Could not connect to http://localhost, Access denied, HTTP status code: 403',
+                'expectedCode' => TTransportException::UNKNOWN,
+            ]
+        );
+    }
+
+    public function testCloseCurlHandle()
+    {
+        $this->getFunctionMock('Thrift\\Transport', 'curl_close')
+             ->expects($this->once())
+             ->with('testHandle');
+
+        $transport = new TCurlClient('localhost');
+        $ref = new \ReflectionClass($transport);
+        $prop = $ref->getProperty('curlHandle');
+        $prop->setAccessible(true);
+        $prop->setValue($transport, 'testHandle');
+
+        $transport::closeCurlHandle();
+    }
+}
diff --git a/lib/php/test/Unit/Lib/Transport/TFramedTransportTest.php b/lib/php/test/Unit/Lib/Transport/TFramedTransportTest.php
new file mode 100644
index 0000000..2607ddb
--- /dev/null
+++ b/lib/php/test/Unit/Lib/Transport/TFramedTransportTest.php
@@ -0,0 +1,240 @@
+<?php
+
+/*
+ * 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 Test\Thrift\Unit\Lib\Transport;
+
+use PHPUnit\Framework\TestCase;
+use Thrift\Transport\TFramedTransport;
+use Thrift\Transport\TTransport;
+
+class TFramedTransportTest extends TestCase
+{
+    public function testIsOpen()
+    {
+        $transport = $this->createMock(TTransport::class);
+        $framedTransport = new TFramedTransport($transport);
+
+        $transport
+            ->expects($this->once())
+            ->method('isOpen')
+            ->willReturn(true);
+
+        $this->assertTrue($framedTransport->isOpen());
+    }
+
+    public function testOpen()
+    {
+        $transport = $this->createMock(TTransport::class);
+        $framedTransport = new TFramedTransport($transport);
+
+        $transport
+            ->expects($this->once())
+            ->method('open')
+            ->willReturn(null);
+
+        $this->assertNull($framedTransport->open());
+    }
+
+    public function testClose()
+    {
+        $transport = $this->createMock(TTransport::class);
+        $framedTransport = new TFramedTransport($transport);
+
+        $transport
+            ->expects($this->once())
+            ->method('close')
+            ->willReturn(null);
+
+        $this->assertNull($framedTransport->close());
+    }
+
+    public function testPutBack()
+    {
+        $transport = $this->createMock(TTransport::class);
+        $framedTransport = new TFramedTransport($transport);
+        $framedTransport->putBack('test');
+
+        $ref = new \ReflectionClass($framedTransport);
+        $property = $ref->getProperty('rBuf_');
+        $property->setAccessible(true);
+        $this->assertEquals('test', $property->getValue($framedTransport));
+
+        $framedTransport->putBack('abcde');
+        $this->assertEquals('abcdetest', $property->getValue($framedTransport));
+    }
+
+    /**
+     * @dataProvider readDataProvider
+     */
+    public function testRead(
+        $readAllowed,
+        $readBuffer,
+        $lowLevelTransportReadResult,
+        $lowLevelTransportReadAllParams,
+        $lowLevelTransportReadAllResult,
+        $readLength,
+        $expectedReadResult
+    ) {
+        $transport = $this->createMock(TTransport::class);
+        $framedTransport = new TFramedTransport($transport, $readAllowed);
+        $framedTransport->putBack($readBuffer);
+
+        $transport
+            ->expects($readAllowed ? $this->never() : $this->once())
+            ->method('read')
+            ->with($readLength)
+            ->willReturn($lowLevelTransportReadResult);
+
+        $transport
+            ->expects($this->exactly(count($lowLevelTransportReadAllParams)))
+            ->method('readAll')
+            ->withConsecutive(...$lowLevelTransportReadAllParams)
+            ->willReturnOnConsecutiveCalls(...$lowLevelTransportReadAllResult);
+
+        $this->assertEquals($expectedReadResult, $framedTransport->read($readLength));
+    }
+
+    public function readDataProvider()
+    {
+        yield 'read not allowed' => [
+            'readAllowed' => false,
+            'readBuffer' => '',
+            'lowLevelTransportReadResult' => '12345',
+            'lowLevelTransportReadAllParams' => [],
+            'lowLevelTransportReadAllResult' => [],
+            'readLength' => 5,
+            'expectedReadResult' => '12345',
+        ];
+        yield 'read fully buffered item' => [
+            'readAllowed' => true,
+            'readBuffer' => '',
+            'lowLevelTransportReadResult' => '',
+            'lowLevelTransportReadAllParams' => [[4], [5]],
+            'lowLevelTransportReadAllResult' => [pack('N', '5'), '12345'],
+            'readLength' => 5,
+            'expectedReadResult' => '12345',
+        ];
+        yield 'read partly buffered item' => [
+            'readAllowed' => true,
+            'readBuffer' => '',
+            'lowLevelTransportReadResult' => '',
+            'lowLevelTransportReadAllParams' => [[4], [10]],
+            'lowLevelTransportReadAllResult' => [pack('N', '10'), '1234567890'],
+            'readLength' => 5,
+            'expectedReadResult' => '12345',
+        ];
+    }
+
+    /**
+     * @dataProvider writeDataProvider
+     */
+    public function testWrite(
+        $writeAllowed,
+        $writeData,
+        $writeLength,
+        $expectedWriteBufferValue
+    ) {
+        $transport = $this->createMock(TTransport::class);
+        $framedTransport = new TFramedTransport($transport, true, $writeAllowed);
+
+        $transport
+            ->expects($writeAllowed ? $this->never() : $this->once())
+            ->method('write')
+            ->with('12345', 5)
+            ->willReturn(5);
+
+        $framedTransport->write($writeData, $writeLength);
+
+        $ref = new \ReflectionClass($framedTransport);
+        $property = $ref->getProperty('wBuf_');
+        $property->setAccessible(true);
+        $this->assertEquals($expectedWriteBufferValue, $property->getValue($framedTransport));
+    }
+
+    public function writeDataProvider()
+    {
+        yield 'write not allowed' => [
+            'writeAllowed' => false,
+            'writeData' => '12345',
+            'writeLength' => 5,
+            'expectedWriteBufferValue' => '',
+        ];
+        yield 'write full' => [
+            'writeAllowed' => true,
+            'writeData' => '12345',
+            'writeLength' => 5,
+            'expectedWriteBufferValue' => '12345',
+        ];
+        yield 'write partly' => [
+            'writeAllowed' => true,
+            'writeData' => '1234567890',
+            'writeLength' => 5,
+            'expectedWriteBufferValue' => '12345',
+        ];
+    }
+
+    /**
+     * @dataProvider flushDataProvider
+     */
+    public function testFlush(
+        $writeAllowed,
+        $writeBuffer,
+        $lowLevelTransportWrite
+    ) {
+        $transport = $this->createMock(TTransport::class);
+        $framedTransport = new TFramedTransport($transport, true, $writeAllowed);
+        $ref = new \ReflectionClass($framedTransport);
+        $property = $ref->getProperty('wBuf_');
+        $property->setAccessible(true);
+        $property->setValue($framedTransport, $writeBuffer);
+
+        $transport
+            ->expects($this->once())
+            ->method('flush');
+
+        $transport
+            ->expects($writeAllowed && !empty($writeBuffer) ? $this->once() : $this->never())
+            ->method('write')
+            ->with($lowLevelTransportWrite)
+            ->willReturn(null);
+
+        $this->assertNull($framedTransport->flush());
+    }
+
+    public function flushDataProvider()
+    {
+        yield 'write not allowed' => [
+            'writeAllowed' => false,
+            'writeBuffer' => '12345',
+            'lowLevelTransportWrite' => '',
+        ];
+        yield 'empty buffer' => [
+            'writeAllowed' => true,
+            'writeBuffer' => '',
+            'lowLevelTransportWrite' => '',
+        ];
+        yield 'write full' => [
+            'writeAllowed' => true,
+            'writeBuffer' => '12345',
+            'lowLevelTransportWrite' => pack('N', strlen('12345')) . '12345',
+        ];
+    }
+}
diff --git a/lib/php/test/Unit/Lib/Transport/THttpClientTest.php b/lib/php/test/Unit/Lib/Transport/THttpClientTest.php
new file mode 100644
index 0000000..ce6813c
--- /dev/null
+++ b/lib/php/test/Unit/Lib/Transport/THttpClientTest.php
@@ -0,0 +1,332 @@
+<?php
+
+/*
+ * 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 Test\Thrift\Unit\Lib\Transport;
+
+use phpmock\phpunit\PHPMock;
+use PHPUnit\Framework\TestCase;
+use Thrift\Exception\TTransportException;
+use Thrift\Transport\THttpClient;
+
+class THttpClientTest extends TestCase
+{
+    use PHPMock;
+
+    public function testSetTimeoutSecs()
+    {
+        $host = 'localhost';
+        $transport = new THttpClient($host);
+        $transport->setTimeoutSecs(1000);
+
+        $ref = new \ReflectionClass($transport);
+        $prop = $ref->getProperty('timeout_');
+        $prop->setAccessible(true);
+        $this->assertEquals(1000, $prop->getValue($transport));
+    }
+
+    public function testIsOpen()
+    {
+        $host = 'localhost';
+        $transport = new THttpClient($host);
+        $this->assertTrue($transport->isOpen());
+    }
+
+    public function testOpen()
+    {
+        $host = 'localhost';
+        $transport = new THttpClient($host);
+        $this->assertNull($transport->open());
+    }
+
+    public function testClose()
+    {
+        $handle = fopen('php://temp', 'r+');
+        $this->getFunctionMock('Thrift\\Transport', 'fclose')
+             ->expects($this->once())
+             ->with($handle)
+             ->willReturn(true);
+
+        $host = 'localhost';
+        $transport = new THttpClient($host);
+
+        $ref = new \ReflectionClass($transport);
+        $propRequest = $ref->getProperty('handle_');
+        $propRequest->setAccessible(true);
+        $propRequest->setValue($transport, $handle);
+
+        $this->assertNull($transport->close());
+        $this->assertNull($propRequest->getValue($transport));
+    }
+
+    /**
+     * @dataProvider readDataProvider
+     */
+    public function testRead(
+        $readLen,
+        $freadResult,
+        $streamGetMetaDataResult,
+        $expectedResult,
+        $expectedException,
+        $expectedExceptionMessage,
+        $expectedExceptionCode
+    ) {
+        $handle = fopen('php://temp', 'r+');
+        $this->getFunctionMock('Thrift\\Transport', 'fread')
+             ->expects($this->once())
+             ->with($handle, $readLen)
+             ->willReturn($freadResult);
+
+        $this->getFunctionMock('Thrift\\Transport', 'stream_get_meta_data')
+             ->expects(!empty($streamGetMetaDataResult) ? $this->once() : $this->never())
+             ->with($handle)
+             ->willReturn($streamGetMetaDataResult);
+
+        if ($expectedException) {
+            $this->expectException($expectedException);
+            $this->expectExceptionMessage($expectedExceptionMessage);
+            $this->expectExceptionCode($expectedExceptionCode);
+        }
+
+        $host = 'localhost';
+        $transport = new THttpClient($host);
+
+        $ref = new \ReflectionClass($transport);
+        $propRequest = $ref->getProperty('handle_');
+        $propRequest->setAccessible(true);
+        $propRequest->setValue($transport, $handle);
+
+        $this->assertEquals($expectedResult, $transport->read($readLen));
+    }
+
+    public function readDataProvider()
+    {
+        yield 'read success' => [
+            'readLen' => 10,
+            'freadResult' => '1234567890',
+            'streamGetMetaDataResult' => [],
+            'expectedResult' => '1234567890',
+            'expectedException' => null,
+            'expectedExceptionMessage' => null,
+            'expectedExceptionCode' => null,
+        ];
+        yield 'read failed' => [
+            'readLen' => 10,
+            'freadResult' => false,
+            'streamGetMetaDataResult' => [
+                'timed_out' => false,
+            ],
+            'expectedResult' => '',
+            'expectedException' => TTransportException::class,
+            'expectedExceptionMessage' => 'THttpClient: Could not read 10 bytes from localhost:80',
+            'expectedExceptionCode' => TTransportException::UNKNOWN,
+        ];
+        yield 'read timeout' => [
+            'readLen' => 10,
+            'freadResult' => '',
+            'streamGetMetaDataResult' => [
+                'timed_out' => true,
+            ],
+            'expectedResult' => '',
+            'expectedException' => TTransportException::class,
+            'expectedExceptionMessage' => 'THttpClient: timed out reading 10 bytes from localhost:80',
+            'expectedExceptionCode' => TTransportException::TIMED_OUT,
+        ];
+    }
+
+    public function testWrite()
+    {
+        $host = 'localhost';
+        $transport = new THttpClient($host);
+
+        $ref = new \ReflectionClass($transport);
+        $prop = $ref->getProperty('buf_');
+        $prop->setAccessible(true);
+
+        $transport->write('1234567890');
+
+        $this->assertEquals('1234567890', $prop->getValue($transport));
+    }
+
+    /**
+     * @dataProvider flushDataProvider
+     */
+    public function testFlush(
+        $host,
+        $port,
+        $uri,
+        $scheme,
+        $context,
+        $headers,
+        $timeout,
+        $streamContextOptions,
+        $streamContext,
+        $fopenResult,
+        $expectedHost,
+        $expectedUri,
+        $expectedException,
+        $expectedExceptionMessage,
+        $expectedExceptionCode
+    ) {
+        $this->getFunctionMock('Thrift\\Transport', 'stream_context_create')
+             ->expects($this->once())
+             ->with($streamContextOptions)
+             ->willReturn($streamContext);
+
+        $this->getFunctionMock('Thrift\\Transport', 'fopen')
+             ->expects($this->once())
+             ->with(
+                 $scheme . '://' . $expectedHost . $expectedUri,
+                 'r',
+                 false,
+                 $streamContext
+             )->willReturn($fopenResult);
+
+        if ($expectedException) {
+            $this->expectException($expectedException);
+            $this->expectExceptionMessage($expectedExceptionMessage);
+            $this->expectExceptionCode($expectedExceptionCode);
+        }
+
+        $transport = new THttpClient($host, $port, $uri, $scheme, $context);
+        if (!empty($headers)) {
+            $transport->addHeaders($headers);
+        }
+        if (!empty($timeout)) {
+            $transport->setTimeoutSecs($timeout);
+        }
+
+        $this->assertNull($transport->flush());
+    }
+
+    public function flushDataProvider()
+    {
+        $default = [
+            'host' => 'localhost',
+            'port' => '80',
+            'uri' => '',
+            'scheme' => 'http',
+            'context' => [],
+            'headers' => [],
+            'timeout' => null,
+            'streamContextOptions' => [
+                'http' => [
+                    'method' => 'POST',
+                    'header' => "Host: localhost\r\n" .
+                        "Accept: application/x-thrift\r\n" .
+                        "User-Agent: PHP/THttpClient\r\n" .
+                        "Content-Type: application/x-thrift\r\n" .
+                        "Content-Length: 0",
+                    'content' => '',
+                    'max_redirects' => 1,
+                ],
+            ],
+            'streamContext' => fopen('php://temp', 'r+'),
+            'fopenResult' => fopen('php://memory', 'r+'),
+            'expectedHost' => 'localhost',
+            'expectedUri' => '',
+            'expectedException' => '',
+            'expectedExceptionMessage' => '',
+            'expectedExceptionCode' => '',
+        ];
+
+        yield 'success' => $default;
+        yield 'additionalHeaders' => array_merge(
+            $default,
+            [
+                'headers' => [
+                    'X-Test-Header' => 'test',
+                ],
+                'streamContextOptions' => [
+                    'http' => [
+                        'method' => 'POST',
+                        'header' => "Host: localhost\r\n" .
+                            "Accept: application/x-thrift\r\n" .
+                            "User-Agent: PHP/THttpClient\r\n" .
+                            "Content-Type: application/x-thrift\r\n" .
+                            "Content-Length: 0\r\n" .
+                            "X-Test-Header: test",
+                        'content' => '',
+                        'max_redirects' => 1,
+                    ],
+                ],
+            ]
+        );
+        yield 'timeout' => array_merge(
+            $default,
+            [
+                'timeout' => 1000,
+                'streamContextOptions' => [
+                    'http' => [
+                        'method' => 'POST',
+                        'header' => "Host: localhost\r\n" .
+                            "Accept: application/x-thrift\r\n" .
+                            "User-Agent: PHP/THttpClient\r\n" .
+                            "Content-Type: application/x-thrift\r\n" .
+                            "Content-Length: 0",
+                        'content' => '',
+                        'max_redirects' => 1,
+                        'timeout' => 1000,
+                    ],
+                ],
+            ]
+        );
+        yield 'fopenFailed' => array_merge(
+            $default,
+            [
+                'host' => 'localhost',
+                'port' => 8080,
+                'uri' => 'test',
+                'expectedHost' => 'localhost:8080',
+                'expectedUri' => '/test',
+                'streamContextOptions' => [
+                    'http' => [
+                        'method' => 'POST',
+                        'header' => "Host: localhost:8080\r\n" .
+                            "Accept: application/x-thrift\r\n" .
+                            "User-Agent: PHP/THttpClient\r\n" .
+                            "Content-Type: application/x-thrift\r\n" .
+                            "Content-Length: 0",
+                        'content' => '',
+                        'max_redirects' => 1,
+                    ],
+                ],
+                'fopenResult' => false,
+                'expectedException' => TTransportException::class,
+                'expectedExceptionMessage' => 'THttpClient: Could not connect to localhost:8080/test',
+                'expectedExceptionCode' => TTransportException::NOT_OPEN,
+            ]
+        );
+    }
+
+    public function testAddHeaders()
+    {
+        $host = 'localhost';
+        $transport = new THttpClient($host);
+
+        $ref = new \ReflectionClass($transport);
+        $propRequest = $ref->getProperty('headers_');
+        $propRequest->setAccessible(true);
+        $propRequest->setValue($transport, ['test' => '1234567890']);
+
+        $transport->addHeaders(['test2' => '12345']);
+        $this->assertEquals(['test' => '1234567890', 'test2' => '12345'], $propRequest->getValue($transport));
+    }
+}
diff --git a/lib/php/test/Unit/Lib/Transport/TMemoryBufferTest.php b/lib/php/test/Unit/Lib/Transport/TMemoryBufferTest.php
new file mode 100644
index 0000000..06f0012
--- /dev/null
+++ b/lib/php/test/Unit/Lib/Transport/TMemoryBufferTest.php
@@ -0,0 +1,143 @@
+<?php
+
+/*
+ * 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 Test\Thrift\Unit\Lib\Transport;
+
+use PHPUnit\Framework\TestCase;
+use Thrift\Exception\TTransportException;
+use Thrift\Transport\TMemoryBuffer;
+
+class TMemoryBufferTest extends TestCase
+{
+    public function testIsOpen()
+    {
+        $transport = new TMemoryBuffer();
+        $this->assertTrue($transport->isOpen());
+    }
+
+    public function testOpen()
+    {
+        $transport = new TMemoryBuffer();
+        $this->assertNull($transport->open());
+    }
+
+    public function testClose()
+    {
+        $transport = new TMemoryBuffer();
+        $this->assertNull($transport->close());
+    }
+
+    public function testReadEmptyBuffer()
+    {
+        $transport = new TMemoryBuffer();
+        $this->expectException(\Thrift\Exception\TTransportException::class);
+        $this->expectExceptionMessage("TMemoryBuffer: Could not read 1 bytes from buffer.");
+        $this->expectExceptionCode(TTransportException::UNKNOWN);
+        $transport->read(1);
+    }
+
+    /**
+     * @dataProvider readDataProvider
+     */
+    public function testRead(
+        $startBuffer,
+        $readLength,
+        $expectedRead,
+        $expectedBuffer
+    ) {
+        $transport = new TMemoryBuffer($startBuffer);
+        $this->assertEquals($expectedRead, $transport->read($readLength));
+        $this->assertEquals($expectedBuffer, $transport->getBuffer());
+    }
+
+    public function readDataProvider()
+    {
+        yield 'Read part of buffer' => [
+            'startBuffer' => '1234567890',
+            'readLength' => 5,
+            'expectedRead' => '12345',
+            'expectedBuffer' => '67890',
+        ];
+        yield 'Read part of buffer UTF' => [
+            'startBuffer' => 'Slovenščina',
+            'readLength' => 6,
+            'expectedRead' => 'Sloven',
+            'expectedBuffer' => 'ščina',
+        ];
+        yield 'Read part of buffer UTF 2' => [
+            'startBuffer' => 'Українська',
+            'readLength' => 6,
+            'expectedRead' => 'Укр',
+            'expectedBuffer' => 'аїнська',
+        ];
+        yield 'Read full' => [
+            'startBuffer' => '123456789',
+            'readLength' => 10,
+            'expectedRead' => '123456789',
+            'expectedBuffer' => '',
+        ];
+    }
+
+    /**
+     * @dataProvider writeDataProvider
+     */
+    public function testWrite(
+        $startBuffer,
+        $writeData,
+        $expectedBuffer
+    ) {
+        $transport = new TMemoryBuffer($startBuffer);
+        $transport->write($writeData);
+        $this->assertEquals($expectedBuffer, $transport->getBuffer());
+    }
+
+    public function writeDataProvider()
+    {
+        yield 'empty start buffer' => [
+            'startBuffer' => '',
+            'writeData' => '12345',
+            'expectedBuffer' => '12345',
+        ];
+        yield 'not empty start buffer' => [
+            'startBuffer' => '67890',
+            'writeData' => '12345',
+            'expectedBuffer' => '6789012345',
+        ];
+        yield 'not empty start buffer UTF' => [
+            'startBuffer' => 'Slovenščina',
+            'writeData' => 'Українська',
+            'expectedBuffer' => 'SlovenščinaУкраїнська',
+        ];
+    }
+
+    public function testAvailable()
+    {
+        $transport = new TMemoryBuffer('12345');
+        $this->assertEquals('5', $transport->available());
+    }
+
+    public function testPutBack()
+    {
+        $transport = new TMemoryBuffer('12345');
+        $transport->putBack('67890');
+        $this->assertEquals('6789012345', $transport->getBuffer());
+    }
+}
diff --git a/lib/php/test/Unit/Lib/Transport/TNullTransportTest.php b/lib/php/test/Unit/Lib/Transport/TNullTransportTest.php
new file mode 100644
index 0000000..044c703
--- /dev/null
+++ b/lib/php/test/Unit/Lib/Transport/TNullTransportTest.php
@@ -0,0 +1,62 @@
+<?php
+
+/*
+ * 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 Test\Thrift\Unit\Lib\Transport;
+
+use PHPUnit\Framework\TestCase;
+use Thrift\Exception\TTransportException;
+use Thrift\Transport\TNullTransport;
+
+class TNullTransportTest extends TestCase
+{
+    public function testIsOpen()
+    {
+        $transport = new TNullTransport();
+        $this->assertTrue($transport->isOpen());
+    }
+
+    public function testOpen()
+    {
+        $transport = new TNullTransport();
+        $this->assertNull($transport->open());
+    }
+
+    public function testClose()
+    {
+        $transport = new TNullTransport();
+        $this->assertNull($transport->close());
+    }
+
+    public function testRead()
+    {
+        $transport = new TNullTransport();
+        $this->expectException(TTransportException::class);
+        $this->expectExceptionMessage("Can't read from TNullTransport.");
+        $this->expectExceptionCode(0);
+        $transport->read(1);
+    }
+
+    public function testWrite()
+    {
+        $transport = new TNullTransport();
+        $this->assertNull($transport->write('test'));
+    }
+}
diff --git a/lib/php/test/Unit/Lib/Transport/TPhpStreamTest.php b/lib/php/test/Unit/Lib/Transport/TPhpStreamTest.php
new file mode 100644
index 0000000..c2f950c
--- /dev/null
+++ b/lib/php/test/Unit/Lib/Transport/TPhpStreamTest.php
@@ -0,0 +1,296 @@
+<?php
+
+/*
+ * 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 Test\Thrift\Unit\Lib\Transport;
+
+use phpmock\phpunit\PHPMock;
+use PHPUnit\Framework\TestCase;
+use Thrift\Exception\TException;
+use Thrift\Transport\TPhpStream;
+
+class TPhpStreamTest extends TestCase
+{
+    use PHPMock;
+
+    /**
+     * @dataProvider fopenDataProvider
+     */
+    public function testOpen(
+        $mode,
+        $sapiName,
+        $fopenParams,
+        $fopenResult,
+        $expectedException,
+        $expectedExceptionMessage,
+        $expectedExceptionCode
+    ) {
+        #due to the running tests in separate process we could not open stream in data provider, so we need to do it here
+        foreach ($fopenResult as $num => $result) {
+            $fopenResult[$num] = $result ? fopen(...$result) : $result;
+        }
+
+        $this->getFunctionMock('Thrift\Transport', 'php_sapi_name')
+             ->expects(!empty($sapiName) ? $this->once() : $this->never())
+             ->willReturn($sapiName);
+
+        $this->getFunctionMock('Thrift\Transport', 'fopen')
+             ->expects($this->exactly(count($fopenResult)))
+             ->withConsecutive(...$fopenParams)
+             ->willReturnOnConsecutiveCalls(...$fopenResult);
+
+        if ($expectedException) {
+            $this->expectException($expectedException);
+            $this->expectExceptionMessage($expectedExceptionMessage);
+            $this->expectExceptionCode($expectedExceptionCode);
+        }
+
+        $transport = new TPhpStream($mode);
+        $transport->open();
+    }
+
+    public function fopenDataProvider()
+    {
+        yield 'readCli' => [
+            'mode' => TPhpStream::MODE_R,
+            'sapiName' => 'cli',
+            'fopenParams' => [['php://stdin', 'r']],
+            'fopenResult' => [['php://temp', 'r']],
+            'expectedException' => null,
+            'expectedExceptionMessage' => '',
+            'expectedExceptionCode' => 0,
+        ];
+        yield 'readNotCli' => [
+            'mode' => TPhpStream::MODE_R,
+            'sapiName' => 'apache',
+            'fopenParams' => [['php://input', 'r']],
+            'fopenResult' => [['php://temp', 'r']],
+            'expectedException' => null,
+            'expectedExceptionMessage' => '',
+            'expectedExceptionCode' => 0,
+        ];
+        yield 'write' => [
+            'mode' => TPhpStream::MODE_W,
+            'sapiName' => '',
+            'fopenParams' => [['php://output', 'w']],
+            'fopenResult' => [['php://temp', 'w']],
+            'expectedException' => null,
+            'expectedExceptionMessage' => '',
+            'expectedExceptionCode' => 0,
+        ];
+        yield 'read and write' => [
+            'mode' => TPhpStream::MODE_R | TPhpStream::MODE_W,
+            'sapiName' => 'cli',
+            'fopenParams' => [['php://stdin', 'r'], ['php://output', 'w']],
+            'fopenResult' => [['php://temp', 'r'], ['php://temp', 'w']],
+            'expectedException' => null,
+            'expectedExceptionMessage' => '',
+            'expectedExceptionCode' => 0,
+        ];
+        yield 'read exception' => [
+            'mode' => TPhpStream::MODE_R,
+            'sapiName' => 'cli',
+            'fopenParams' => [['php://stdin', 'r']],
+            'fopenResult' => [false],
+            'expectedException' => TException::class,
+            'expectedExceptionMessage' => 'TPhpStream: Could not open php://input',
+            #should depend on php_sapi_name result
+            'expectedExceptionCode' => 0,
+        ];
+        yield 'write exception' => [
+            'mode' => TPhpStream::MODE_W,
+            'sapiName' => '',
+            'fopenParams' => [['php://output', 'w']],
+            'fopenResult' => [false],
+            'expectedException' => TException::class,
+            'expectedExceptionMessage' => 'TPhpStream: Could not open php://output',
+            'expectedExceptionCode' => 0,
+        ];
+    }
+
+    /**
+     * @dataProvider closeDataProvider
+     */
+    public function testClose(
+        $mode,
+        $fopenParams,
+        $fopenResult
+    ) {
+        #due to the running tests in separate process we could not open stream in data provider, so we need to do it here
+        foreach ($fopenResult as $num => $result) {
+            $fopenResult[$num] = $result ? fopen(...$result) : $result;
+        }
+
+        $this->getFunctionMock('Thrift\Transport', 'fopen')
+             ->expects($this->exactly(count($fopenParams)))
+             ->withConsecutive(...$fopenParams)
+             ->willReturnOnConsecutiveCalls(...$fopenResult);
+
+        $this->getFunctionMock('Thrift\Transport', 'fclose')
+             ->expects($this->exactly(count($fopenParams)))
+             ->with(
+                 $this->callback(function ($stream) {
+                     return is_resource($stream);
+                 })
+             )
+             ->willReturn(true);
+
+        $transport = new TPhpStream($mode);
+        $transport->open();
+        $this->assertTrue($transport->isOpen());
+
+        $transport->close();
+        $this->assertFalse($transport->isOpen());
+    }
+
+    public function closeDataProvider()
+    {
+        $read = ['php://temp', 'r'];
+        $write = ['php://temp', 'w'];
+        yield 'read' => [
+            'mode' => TPhpStream::MODE_R,
+            'fopenParams' => [['php://stdin', 'r']],
+            'fopenResult' => [$read],
+        ];
+        yield 'write' => [
+            'mode' => TPhpStream::MODE_W,
+            'fopenParams' => [['php://output', 'w']],
+            'fopenResult' => [$write],
+        ];
+        yield 'read and write' => [
+            'mode' => TPhpStream::MODE_R | TPhpStream::MODE_W,
+            'fopenParams' => [['php://stdin', 'r'], ['php://output', 'w']],
+            'fopenResult' => [$read, $write],
+        ];
+    }
+
+    /**
+     * @dataProvider readDataProvider
+     */
+    public function testRead(
+        $freadResult,
+        $expectedResult,
+        $expectedException,
+        $expectedExceptionMessage,
+        $expectedExceptionCode
+    ) {
+        $this->getFunctionMock('Thrift\Transport', 'fread')
+             ->expects($this->once())
+             ->with($this->anything(), 5)
+             ->willReturn($freadResult);
+
+        if ($expectedException) {
+            $this->expectException($expectedException);
+            $this->expectExceptionMessage($expectedExceptionMessage);
+            $this->expectExceptionCode($expectedExceptionCode);
+        }
+
+        $transport = new TPhpStream(TPhpStream::MODE_R);
+        $this->assertEquals($expectedResult, $transport->read(5));
+    }
+
+    public function readDataProvider()
+    {
+        yield 'success' => [
+            'freadResult' => '12345',
+            'expectedResult' => '12345',
+            'expectedException' => null,
+            'expectedExceptionMessage' => '',
+            'expectedExceptionCode' => 0,
+        ];
+        yield 'empty' => [
+            'freadResult' => '',
+            'expectedResult' => '',
+            'expectedException' => TException::class,
+            'expectedExceptionMessage' => 'TPhpStream: Could not read 5 bytes',
+            'expectedExceptionCode' => 0,
+        ];
+        yield 'false' => [
+            'freadResult' => false,
+            'expectedResult' => false,
+            'expectedException' => TException::class,
+            'expectedExceptionMessage' => 'TPhpStream: Could not read 5 bytes',
+            'expectedExceptionCode' => 0,
+        ];
+    }
+
+    /**
+     * @dataProvider writeDataProvider
+     */
+    public function testWrite(
+        $buf,
+        $fwriteParams,
+        $fwriteResult,
+        $expectedException,
+        $expectedExceptionMessage,
+        $expectedExceptionCode
+    ) {
+        $this->getFunctionMock('Thrift\Transport', 'fwrite')
+             ->expects($this->exactly(count($fwriteParams)))
+             ->withConsecutive(...$fwriteParams)
+             ->willReturnOnConsecutiveCalls(...$fwriteResult);
+
+        if ($expectedException) {
+            $this->expectException($expectedException);
+            $this->expectExceptionMessage($expectedExceptionMessage);
+            $this->expectExceptionCode($expectedExceptionCode);
+        }
+
+        $transport = new TPhpStream(TPhpStream::MODE_W);
+        $transport->write($buf);
+    }
+
+    public function writeDataProvider()
+    {
+        yield 'success' => [
+            'buf' => '12345',
+            'fwriteParams' => [[$this->anything(), '12345']],
+            'fwriteResult' => [5],
+            'expectedException' => null,
+            'expectedExceptionMessage' => '',
+            'expectedExceptionCode' => 0,
+        ];
+        yield 'several iteration' => [
+            'buf' => '1234567890',
+            'fwriteParams' => [[$this->anything(), '1234567890'], [$this->anything(), '67890']],
+            'fwriteResult' => [5, 5],
+            'expectedException' => null,
+            'expectedExceptionMessage' => '',
+            'expectedExceptionCode' => 0,
+        ];
+        yield 'fail' => [
+            'buf' => '1234567890',
+            'fwriteParams' => [[$this->anything(), '1234567890']],
+            'fwriteResult' => [false],
+            'expectedException' => TException::class,
+            'expectedExceptionMessage' => 'TPhpStream: Could not write 10 bytes',
+            'expectedExceptionCode' => 0,
+        ];
+    }
+
+    public function testFlush()
+    {
+        $this->getFunctionMock('Thrift\Transport', 'fflush')
+             ->expects($this->once());
+
+        $transport = new TPhpStream(TPhpStream::MODE_R);
+        $transport->flush();
+    }
+}
diff --git a/lib/php/test/Unit/Lib/Transport/TSSLSocketTest.php b/lib/php/test/Unit/Lib/Transport/TSSLSocketTest.php
new file mode 100644
index 0000000..7177219
--- /dev/null
+++ b/lib/php/test/Unit/Lib/Transport/TSSLSocketTest.php
@@ -0,0 +1,247 @@
+<?php
+
+/*
+ * 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 Test\Thrift\Unit\Lib\Transport;
+
+use phpmock\phpunit\PHPMock;
+use PHPUnit\Framework\TestCase;
+use Thrift\Exception\TException;
+use Thrift\Exception\TTransportException;
+use Thrift\Transport\TSSLSocket;
+
+class TSSLSocketTest extends TestCase
+{
+    use PHPMock;
+
+    /**
+     * @dataProvider openExceptionDataProvider
+     */
+    public function testOpenException(
+        $host,
+        $port,
+        $context,
+        $debugHandler,
+        $streamSocketClientCallCount,
+        $expectedException,
+        $expectedMessage,
+        $expectedCode
+    ) {
+        $this->expectException($expectedException);
+        $this->expectExceptionMessage($expectedMessage);
+        $this->expectExceptionCode($expectedCode);
+
+        $this->getFunctionMock('Thrift\Transport', 'stream_socket_client')
+             ->expects($this->exactly($streamSocketClientCallCount))
+             ->with(
+                 'ssl://' . $host . ':' . $port,
+                 $this->anything(), #$errno,
+                 $this->anything(), #$errstr,
+                 $this->anything(), #$this->sendTimeoutSec_ + ($this->sendTimeoutUsec_ / 1000000),
+                 STREAM_CLIENT_CONNECT,
+                 $this->anything() #$context
+             )
+             ->willReturn(false);
+
+        $socket = new TSSLSocket(
+            $host,
+            $port,
+            $context,
+            $debugHandler
+        );
+        $socket->open();
+    }
+
+    public function openExceptionDataProvider()
+    {
+        yield 'host is empty' => [
+            'host' => '',
+            'port' => 9090,
+            'context' => null,
+            'debugHandler' => null,
+            'streamSocketClientCallCount' => 0,
+            'expectedException' => TTransportException::class,
+            'expectedMessage' => 'Cannot open null host',
+            'expectedCode' => TTransportException::NOT_OPEN,
+        ];
+        yield 'port is not positive' => [
+            'host' => 'localhost',
+            'port' => 0,
+            'context' => null,
+            'debugHandler' => null,
+            'streamSocketClientCallCount' => 0,
+            'expectedException' => TTransportException::class,
+            'expectedMessage' => 'Cannot open without port',
+            'expectedCode' => TTransportException::NOT_OPEN,
+        ];
+        yield 'connection failure' => [
+            'host' => 'nonexistent-host',
+            'port' => 9090,
+            'context' => null,
+            'debugHandler' => null,
+            'streamSocketClientCallCount' => 1,
+            'expectedException' => TException::class,
+            'expectedMessage' => 'TSocket: Could not connect to',
+            'expectedCode' => TTransportException::UNKNOWN,
+        ];
+    }
+
+    public function testDoubleConnect(): void
+    {
+        $host = 'localhost';
+        $port = 9090;
+        $context = null;
+        $debugHandler = null;
+
+        $this->getFunctionMock('Thrift\Transport', 'stream_socket_client')
+             ->expects($this->once())
+             ->with(
+                 'ssl://' . $host . ':' . $port,
+                 $this->anything(), #$errno,
+                 $this->anything(), #$errstr,
+                 $this->anything(), #$this->sendTimeoutSec_ + ($this->sendTimeoutUsec_ / 1000000),
+                 STREAM_CLIENT_CONNECT,
+                 $this->anything() #$context
+             )
+             ->willReturn(fopen('php://memory', 'r+'));
+
+        $transport = new TSSLSocket(
+            $host,
+            $port,
+            $context,
+            $debugHandler
+        );
+
+        $transport->open();
+        $this->expectException(TTransportException::class);
+        $this->expectExceptionMessage('Socket already connected');
+        $this->expectExceptionCode(TTransportException::ALREADY_OPEN);
+        $transport->open();
+    }
+
+    public function testDebugHandler()
+    {
+        $host = 'nonexistent-host';
+        $port = 9090;
+        $context = null;
+
+        $debugHandler = function ($error) {
+            $this->assertEquals(
+                'TSocket: Could not connect to ssl://nonexistent-host:9090 (Connection refused [999])',
+                $error
+            );
+        };
+
+        $this->getFunctionMock('Thrift\Transport', 'stream_socket_client')
+             ->expects($this->once())
+             ->with(
+                 'ssl://' . $host . ':' . $port,
+                 $this->anything(), #$errno,
+                 $this->anything(), #$errstr,
+                 $this->anything(), #$this->sendTimeoutSec_ + ($this->sendTimeoutUsec_ / 1000000),
+                 STREAM_CLIENT_CONNECT,
+                 $this->anything() #$context
+             )
+             ->willReturnCallback(
+                 function ($host, &$error_code, &$error_message, $timeout, $flags, $context) {
+                     $error_code = 999;
+                     $error_message = 'Connection refused';
+
+                     return false;
+                 }
+             );
+
+        $this->expectException(\Exception::class);
+        $this->expectExceptionMessage('TSocket: Could not connect to');
+        $this->expectExceptionCode(0);
+
+        $transport = new TSSLSocket(
+            $host,
+            $port,
+            $context,
+            $debugHandler
+        );
+        $transport->setDebug(true);
+        $transport->open();
+    }
+
+    public function testOpenWithContext()
+    {
+        $host = 'self-signed-localhost';
+        $port = 9090;
+        $context = stream_context_create(
+            [
+                'ssl' => [
+                    'verify_peer' => true,
+                    'verify_peer_name' => true,
+                    'allow_self_signed' => true,
+                ],
+            ]
+        );
+        $debugHandler = null;
+
+        $this->getFunctionMock('Thrift\Transport', 'stream_socket_client')
+             ->expects($this->once())
+             ->with(
+                 'ssl://' . $host . ':' . $port,
+                 $this->anything(), #$errno,
+                 $this->anything(), #$errstr,
+                 $this->anything(), #$this->sendTimeoutSec_ + ($this->sendTimeoutUsec_ / 1000000),
+                 STREAM_CLIENT_CONNECT,
+                 $context #$context
+             )
+             ->willReturn(fopen('php://memory', 'r+'));
+
+        $transport = new TSSLSocket(
+            $host,
+            $port,
+            $context,
+            $debugHandler
+        );
+
+
+        $transport->open();
+        $this->assertTrue($transport->isOpen());
+    }
+
+    /**
+     * @dataProvider hostDataProvider
+     */
+    public function testGetHost($host, $expected)
+    {
+        $port = 9090;
+        $context = null;
+        $debugHandler = null;
+        $transport = new TSSLSocket(
+            $host,
+            $port,
+            $context,
+            $debugHandler
+        );
+        $this->assertEquals($expected, $transport->getHost());
+    }
+
+    public function hostDataProvider()
+    {
+        yield 'localhost' => ['localhost', 'ssl://localhost'];
+        yield 'ssl_localhost' => ['ssl://localhost', 'ssl://localhost'];
+        yield 'http_localhost' => ['http://localhost', 'http://localhost'];
+    }
+}
diff --git a/lib/php/test/Unit/Lib/Transport/TSocketPoolTest.php b/lib/php/test/Unit/Lib/Transport/TSocketPoolTest.php
new file mode 100644
index 0000000..01e4532
--- /dev/null
+++ b/lib/php/test/Unit/Lib/Transport/TSocketPoolTest.php
@@ -0,0 +1,541 @@
+<?php
+
+/*
+ * 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 Test\Thrift\Unit\Lib\Transport;
+
+use phpmock\phpunit\PHPMock;
+use PHPUnit\Framework\TestCase;
+use Thrift\Exception\TException;
+use Thrift\Transport\TSocketPool;
+
+class TSocketPoolTest extends TestCase
+{
+    use PHPMock;
+
+    protected function setUp(): void
+    {
+        #need to be defined before the TSocketPool class definition
+        self::defineFunctionMock('Thrift\Transport', 'function_exists');
+    }
+
+    /**
+     * @dataProvider constructDataProvider
+     */
+    public function testConstruct(
+        $hosts,
+        $ports,
+        $persist,
+        $debugHandler,
+        $expectedServers
+    ) {
+        $socketPool = new TSocketPool($hosts, $ports, $persist, $debugHandler);
+
+        $ref = new \ReflectionObject($socketPool);
+        $serversProp = $ref->getProperty('servers_');
+        $serversProp->setAccessible(true);
+
+        $this->assertEquals($expectedServers, $serversProp->getValue($socketPool));
+    }
+
+
+    public function constructDataProvider()
+    {
+        yield 'one server' => [
+            ['localhost'],
+            [9090],
+            false,
+            null,
+            [
+                ['host' => 'localhost', 'port' => 9090],
+            ],
+        ];
+        yield 'two servers' => [
+            ['localhost1', 'localhost2'],
+            [9090, 9091],
+            false,
+            null,
+            [
+                ['host' => 'localhost1', 'port' => 9090],
+                ['host' => 'localhost2', 'port' => 9091],
+            ],
+        ];
+        yield 'one server with one port' => [
+            ['localhost'],
+            9090,
+            false,
+            null,
+            [
+                ['host' => 'localhost', 'port' => 9090],
+            ],
+        ];
+        yield 'two servers with one port' => [
+            ['localhost1', 'localhost2'],
+            9090,
+            false,
+            null,
+            [
+                ['host' => 'localhost1', 'port' => 9090],
+                ['host' => 'localhost2', 'port' => 9090],
+            ],
+        ];
+    }
+
+    public function testAddServer(): void
+    {
+        $socketPool = new TSocketPool([], []);
+        $socketPool->addServer('localhost', 9090);
+
+        $ref = new \ReflectionObject($socketPool);
+        $servers = $ref->getProperty('servers_');
+        $servers->setAccessible(true);
+
+        $this->assertEquals([['host' => 'localhost', 'port' => 9090]], $servers->getValue($socketPool));
+    }
+
+    public function testSetNumRetries(): void
+    {
+        $socketPool = new TSocketPool([], []);
+        $socketPool->setNumRetries(5);
+
+        $ref = new \ReflectionObject($socketPool);
+        $numRetries = $ref->getProperty('numRetries_');
+        $numRetries->setAccessible(true);
+
+        $this->assertEquals(5, $numRetries->getValue($socketPool));
+    }
+
+    public function testrSetRetryInterval(): void
+    {
+        $socketPool = new TSocketPool([], []);
+        $socketPool->setRetryInterval(5);
+
+        $ref = new \ReflectionObject($socketPool);
+        $retryInterval = $ref->getProperty('retryInterval_');
+        $retryInterval->setAccessible(true);
+
+        $this->assertEquals(5, $retryInterval->getValue($socketPool));
+    }
+
+    public function testrSetMaxConsecutiveFailures(): void
+    {
+        $socketPool = new TSocketPool([], []);
+        $socketPool->setMaxConsecutiveFailures(5);
+
+        $ref = new \ReflectionObject($socketPool);
+        $maxConsecutiveFailures = $ref->getProperty('maxConsecutiveFailures_');
+        $maxConsecutiveFailures->setAccessible(true);
+
+        $this->assertEquals(5, $maxConsecutiveFailures->getValue($socketPool));
+    }
+
+    public function testrSetRandomize(): void
+    {
+        $socketPool = new TSocketPool([], []);
+        $socketPool->setRandomize(false);
+
+        $ref = new \ReflectionObject($socketPool);
+        $randomize = $ref->getProperty('randomize_');
+        $randomize->setAccessible(true);
+
+        $this->assertEquals(false, $randomize->getValue($socketPool));
+    }
+
+    public function testrSetAlwaysTryLast(): void
+    {
+        $socketPool = new TSocketPool([], []);
+        $socketPool->setAlwaysTryLast(false);
+
+        $ref = new \ReflectionObject($socketPool);
+        $alwaysTryLast = $ref->getProperty('alwaysTryLast_');
+        $alwaysTryLast->setAccessible(true);
+
+        $this->assertEquals(false, $alwaysTryLast->getValue($socketPool));
+    }
+
+    /**
+     * @dataProvider openDataProvider
+     */
+    public function testOpen(
+        $hosts,
+        $ports,
+        $persist,
+        $debugHandler,
+        $randomize,
+        $retryInterval,
+        $numRetries,
+        $maxConsecutiveFailures,
+        $debug,
+        $servers,
+        $functionExistCallParams,
+        $functionExistResult,
+        $apcuFetchCallParams,
+        $apcuFetchResult,
+        $timeResult,
+        $debugHandlerCall,
+        $apcuStoreCallParams,
+        $fsockopenCallParams,
+        $fsockopenResult,
+        $expectedException,
+        $expectedExceptionMessage
+    ) {
+        $this->getFunctionMock('Thrift\Transport', 'function_exists')
+             ->expects($this->exactly(count($functionExistCallParams)))
+             ->withConsecutive(...$functionExistCallParams)
+             ->willReturnOnConsecutiveCalls(...$functionExistResult);
+
+        $this->getFunctionMock('Thrift\Transport', 'shuffle')
+             ->expects($randomize ? $this->once() : $this->never())
+             ->with($servers)
+             ->willReturnCallback(function (array &$servers) {
+                 $servers = array_reverse($servers);
+
+                 return true;
+             });
+
+        $this->getFunctionMock('Thrift\Transport', 'apcu_fetch')
+             ->expects($this->exactly(count($apcuFetchCallParams)))
+             ->withConsecutive(...$apcuFetchCallParams)
+             ->willReturnOnConsecutiveCalls(...$apcuFetchResult);
+
+        $this->getFunctionMock('Thrift\Transport', 'call_user_func')
+             ->expects($this->exactly(count($debugHandlerCall)))
+             ->withConsecutive(...$debugHandlerCall)
+             ->willReturn(true);
+
+        $this->getFunctionMock('Thrift\Transport', 'apcu_store')
+             ->expects($this->exactly(count($apcuStoreCallParams)))
+             ->withConsecutive(...$apcuStoreCallParams)
+             ->willReturn(true);
+
+        $this->getFunctionMock('Thrift\Transport', 'time')
+             ->expects($this->exactly(count($timeResult)))
+             ->willReturnOnConsecutiveCalls(...$timeResult);
+
+        #due to the running tests in separate process we could not open stream in data provider, so we need to do it here
+        foreach ($fsockopenResult as $num => $result) {
+            $fsockopenResult[$num] = $result ? fopen(...$result) : $result;
+        }
+
+        $this->getFunctionMock('Thrift\Transport', $persist ? 'pfsockopen' : 'fsockopen')
+             ->expects($this->exactly(count($fsockopenCallParams)))
+             ->withConsecutive(...$fsockopenCallParams)
+             ->willReturnOnConsecutiveCalls(...$fsockopenResult);
+
+        $this->getFunctionMock('Thrift\Transport', 'socket_import_stream')
+             ->expects(is_null($expectedException) ? $this->once() : $this->never())
+             ->with(
+                 $this->callback(function ($stream) {
+                     return is_resource($stream);
+                 })
+             )
+             ->willReturn(true);
+
+        $this->getFunctionMock('Thrift\Transport', 'socket_set_option')
+             ->expects(is_null($expectedException) ? $this->once() : $this->never())
+             ->with(
+                 $this->anything(), #$socket,
+                 SOL_TCP, #$level
+                 TCP_NODELAY, #$option
+                 1 #$value
+             )
+             ->willReturn(true);
+
+        if ($expectedException) {
+            $this->expectException($expectedException);
+            $this->expectExceptionMessage($expectedExceptionMessage);
+        }
+
+        $socketPool = new TSocketPool($hosts, $ports, $persist, $debugHandler);
+        $socketPool->setRandomize($randomize);
+        $socketPool->setRetryInterval($retryInterval);
+        $socketPool->setNumRetries($numRetries);
+        $socketPool->setMaxConsecutiveFailures($maxConsecutiveFailures);
+        $socketPool->setDebug($debug);
+
+        $this->assertNull($socketPool->open());
+    }
+
+    public function openDataProvider()
+    {
+        $default = [
+            'hosts' => ['localhost'],
+            'ports' => [9090],
+            'persist' => false,
+            'debugHandler' => null,
+            'randomize' => true,
+            'retryInterval' => 5,
+            'numRetries' => 1,
+            'maxConsecutiveFailures' => 1,
+            'debug' => false,
+            'servers' => [
+                ['host' => 'localhost', 'port' => 9090],
+            ],
+            'functionExistCallParams' => [
+                ['apcu_fetch'],
+                ['socket_import_stream'],
+                ['socket_set_option'],
+            ],
+            'functionExistResult' => [
+                true,
+                true,
+                true,
+            ],
+            'apcuFetchCallParams' => [
+                ['thrift_failtime:localhost:9090~', $this->anything()],
+            ],
+            'apcuFetchResult' => [
+                false,
+            ],
+            'timeResult' => [],
+            'debugHandlerCall' => [],
+            'apcuStoreCallParams' => [],
+            'fsockopenCallParams' => [
+                [
+                    'localhost',
+                    9090,
+                    $this->anything(), #$errno,
+                    $this->anything(), #$errstr,
+                    $this->anything(), #$this->sendTimeoutSec_ + ($this->sendTimeoutUsec_ / 1000000),
+                ],
+            ],
+            'fsockopenResult' => [
+                ['php://temp', 'r'],
+            ],
+            'expectedException' => null,
+            'expectedExceptionMessage' => null,
+        ];
+
+        yield 'one server ready' => $default;
+        yield 'one server failed' => array_merge(
+            $default,
+            [
+                'functionExistCallParams' => [
+                    ['apcu_fetch'],
+                ],
+                'fsockopenResult' => [
+                    false,
+                ],
+                'apcuFetchCallParams' => [
+                    ['thrift_failtime:localhost:9090~', $this->anything()],
+                    ['thrift_consecfails:localhost:9090~', $this->anything()],
+                ],
+                'apcuStoreCallParams' => [
+                    ['thrift_failtime:localhost:9090~', $this->anything()],
+                    ['thrift_consecfails:localhost:9090~', $this->anything(), 0],
+                ],
+                'timeResult' => [
+                    1,
+                ],
+                'expectedException' => TException::class,
+                'expectedExceptionMessage' => 'TSocketPool: All hosts in pool are down. (localhost:9090)',
+            ]
+        );
+        yield 'connect to one server on second attempt' => array_merge(
+            $default,
+            [
+                'numRetries' => 2,
+                'fsockopenCallParams' => [
+                    [
+                        'localhost',
+                        9090,
+                        $this->anything(), #$errno,
+                        $this->anything(), #$errstr,
+                        $this->anything(), #$this->sendTimeoutSec_ + ($this->sendTimeoutUsec_ / 1000000),
+                    ],
+                    [
+                        'localhost',
+                        9090,
+                        $this->anything(), #$errno,
+                        $this->anything(), #$errstr,
+                        $this->anything(), #$this->sendTimeoutSec_ + ($this->sendTimeoutUsec_ / 1000000),
+                    ],
+                ],
+                'fsockopenResult' => [
+                    false,
+                    ['php://temp', 'r'],
+                ],
+                'apcuStoreCallParams' => [],
+            ]
+        );
+        yield 'last time fail time is not expired' => array_merge(
+            $default,
+            [
+                'retryInterval' => 5,
+                'apcuFetchResult' => [
+                    99,
+                ],
+                'apcuStoreCallParams' => [
+                    ['thrift_failtime:localhost:9090~', $this->anything()],
+                ],
+                'timeResult' => [
+                    100,
+                ],
+            ]
+        );
+        yield 'last time fail time is expired, store info to debug' => array_merge(
+            $default,
+            [
+                'retryInterval' => 5,
+                'apcuFetchResult' => [
+                    90,
+                ],
+                'apcuStoreCallParams' => [
+                    ['thrift_failtime:localhost:9090~', $this->anything()],
+                ],
+                'timeResult' => [
+                    100,
+                ],
+                'debug' => true,
+                'debugHandlerCall' => [
+                    ['error_log', 'TSocketPool: retryInterval (5) has passed for host localhost:9090'],
+                ],
+            ]
+        );
+        yield 'not accessible server, store info to debug' => array_merge(
+            $default,
+            [
+                'retryInterval' => 5,
+                'functionExistCallParams' => [
+                    ['apcu_fetch'],
+                ],
+                'functionExistResult' => [
+                    true,
+                ],
+                'apcuFetchCallParams' => [
+                    ['thrift_failtime:localhost:9090~', $this->anything()],
+                    ['thrift_consecfails:localhost:9090~', $this->anything()],
+                ],
+                'apcuFetchResult' => [
+                    90,
+                ],
+                'apcuStoreCallParams' => [
+                    ['thrift_failtime:localhost:9090~', $this->anything()],
+                    ['thrift_consecfails:localhost:9090~', 0],
+                ],
+                'timeResult' => [
+                    100,
+                    101,
+                ],
+                'fsockopenResult' => [
+                    false,
+                ],
+                'debug' => true,
+                'debugHandlerCall' => [
+                    ['error_log', 'TSocketPool: retryInterval (5) has passed for host localhost:9090'],
+                    ['error_log', 'TSocket: Could not connect to localhost:9090 ( [])'],
+                    ['error_log', 'TSocketPool: marking localhost:9090 as down for 5 secs after 1 failed attempts.'],
+                    ['error_log', 'TSocketPool: All hosts in pool are down. (localhost:9090)'],
+                ],
+                'expectedException' => TException::class,
+                'expectedExceptionMessage' => 'TSocketPool: All hosts in pool are down. (localhost:9090)',
+            ]
+        );
+        yield 'max consecutive failures' => array_merge(
+            $default,
+            [
+                'maxConsecutiveFailures' => 5,
+                'functionExistCallParams' => [
+                    ['apcu_fetch'],
+                ],
+                'functionExistResult' => [
+                    true,
+                ],
+                'apcuFetchCallParams' => [
+                    ['thrift_failtime:localhost:9090~', $this->anything()],
+                    ['thrift_consecfails:localhost:9090~', $this->anything()],
+                ],
+                'apcuStoreCallParams' => [
+                    ['thrift_consecfails:localhost:9090~', 1],
+                ],
+                'timeResult' => [],
+                'fsockopenResult' => [
+                    false,
+                ],
+                'expectedException' => TException::class,
+                'expectedExceptionMessage' => 'TSocketPool: All hosts in pool are down. (localhost:9090)',
+            ]
+        );
+        yield 'apcu disabled' => array_merge(
+            $default,
+            [
+                'functionExistCallParams' => [
+                    ['apcu_fetch'],
+                ],
+                'functionExistResult' => [
+                    false,
+                ],
+                'fsockopenResult' => [
+                    false,
+                ],
+                'timeResult' => [
+                    1,
+                ],
+                'apcuFetchCallParams' => [],
+                'apcuStoreCallParams' => [],
+                'expectedException' => TException::class,
+                'expectedExceptionMessage' => 'TSocketPool: All hosts in pool are down. (localhost:9090)',
+            ]
+        );
+        yield 'second host accessible' => array_merge(
+            $default,
+            [
+                'hosts' => ['host1', 'host2'],
+                'ports' => [9090, 9091],
+                'servers' => [
+                    ['host' => 'host1', 'port' => 9090],
+                    ['host' => 'host2', 'port' => 9091],
+                ],
+                'fsockopenCallParams' => [
+                    [
+                        'host2',
+                        9091,
+                        $this->anything(), #$errno,
+                        $this->anything(), #$errstr,
+                        $this->anything(), #$this->sendTimeoutSec_ + ($this->sendTimeoutUsec_ / 1000000),
+                    ],
+                    [
+                        'host1',
+                        9090,
+                        $this->anything(), #$errno,
+                        $this->anything(), #$errstr,
+                        $this->anything(), #$this->sendTimeoutSec_ + ($this->sendTimeoutUsec_ / 1000000),
+                    ],
+                ],
+                'fsockopenResult' => [
+                    false,
+                    ['php://temp', 'r'],
+                ],
+                'apcuFetchCallParams' => [
+                    ['thrift_failtime:host2:9091~', $this->anything()],
+                    ['thrift_consecfails:host2:9091~', $this->anything()],
+                    ['thrift_failtime:host1:9090~', $this->anything()],
+                ],
+                'apcuStoreCallParams' => [
+                    ['thrift_failtime:host2:9091~', $this->anything()],
+                    ['thrift_consecfails:host2:9091~', $this->anything(), 0],
+                ],
+                'timeResult' => [
+                    1,
+                ],
+            ]
+        );
+    }
+}
diff --git a/lib/php/test/Unit/Lib/Transport/TSocketTest.php b/lib/php/test/Unit/Lib/Transport/TSocketTest.php
new file mode 100644
index 0000000..6bab297
--- /dev/null
+++ b/lib/php/test/Unit/Lib/Transport/TSocketTest.php
@@ -0,0 +1,669 @@
+<?php
+
+/*
+ * 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 Test\Thrift\Unit\Lib\Transport;
+
+use phpmock\phpunit\PHPMock;
+use PHPUnit\Framework\TestCase;
+use Thrift\Exception\TException;
+use Thrift\Exception\TTransportException;
+use Thrift\Transport\TSocket;
+
+class TSocketTest extends TestCase
+{
+    use PHPMock;
+
+    /**
+     * @dataProvider openExceptionDataProvider
+     */
+    public function testOpenException(
+        $host,
+        $port,
+        $persist,
+        $debugHandler,
+        $fsockopenCallCount,
+        $expectedException,
+        $expectedMessage,
+        $expectedCode
+    ) {
+        $this->expectException($expectedException);
+        $this->expectExceptionMessage($expectedMessage);
+        $this->expectExceptionCode($expectedCode);
+
+        $this->getFunctionMock('Thrift\Transport', 'fsockopen')
+             ->expects($this->exactly($fsockopenCallCount))
+             ->with(
+                 $host,
+                 $port,
+                 $this->anything(), #$errno,
+                 $this->anything(), #$errstr,
+                 $this->anything() #$this->sendTimeoutSec_ + ($this->sendTimeoutUsec_ / 1000000),
+             )
+             ->willReturn(false);
+
+        $socket = new TSocket(
+            $host,
+            $port,
+            $persist,
+            $debugHandler
+        );
+        $socket->open();
+    }
+
+    public function openExceptionDataProvider()
+    {
+        yield 'host is empty' => [
+            'host' => '',
+            'port' => 9090,
+            'persist' => null,
+            'debugHandler' => false,
+            'fsockopenCallCount' => 0,
+            'expectedException' => TTransportException::class,
+            'expectedMessage' => 'Cannot open null host',
+            'expectedCode' => TTransportException::NOT_OPEN,
+        ];
+        yield 'port is not positive' => [
+            'host' => 'localhost',
+            'port' => 0,
+            'persist' => false,
+            'debugHandler' => null,
+            'fsockopenCallCount' => 0,
+            'expectedException' => TTransportException::class,
+            'expectedMessage' => 'Cannot open without port',
+            'expectedCode' => TTransportException::NOT_OPEN,
+        ];
+        yield 'connection failure' => [
+            'host' => 'nonexistent-host',
+            'port' => 9090,
+            'persist' => false,
+            'debugHandler' => null,
+            'fsockopenCallCount' => 1,
+            'expectedException' => TException::class,
+            'expectedMessage' => 'TSocket: Could not connect to',
+            'expectedCode' => TTransportException::UNKNOWN,
+        ];
+    }
+
+    public function testDoubleConnect(): void
+    {
+        $host = 'localhost';
+        $port = 9090;
+        $persist = false;
+        $debugHandler = null;
+        $handle = fopen('php://memory', 'r+');
+        $this->getFunctionMock('Thrift\Transport', 'fsockopen')
+             ->expects($this->once())
+             ->with(
+                 $host,
+                 $port,
+                 $this->anything(), #$errno,
+                 $this->anything(), #$errstr,
+                 $this->anything() #$this->sendTimeoutSec_ + ($this->sendTimeoutUsec_ / 1000000),
+             )
+             ->willReturn($handle);
+
+        $this->getFunctionMock('Thrift\Transport', 'socket_import_stream')
+             ->expects($this->once())
+             ->with($handle)
+             ->willReturn(true);
+
+        $this->getFunctionMock('Thrift\Transport', 'socket_set_option')
+             ->expects($this->once())
+             ->with(
+                 $this->anything(), #$socket,
+                 SOL_TCP, #$level
+                 TCP_NODELAY, #$option
+                 1 #$value
+             )
+             ->willReturn(true);
+
+        $transport = new TSocket(
+            $host,
+            $port,
+            $persist,
+            $debugHandler
+        );
+
+        $transport->open();
+        $this->expectException(TTransportException::class);
+        $this->expectExceptionMessage('Socket already connected');
+        $this->expectExceptionCode(TTransportException::ALREADY_OPEN);
+        $transport->open();
+    }
+
+    public function testDebugHandler()
+    {
+        $host = 'nonexistent-host';
+        $port = 9090;
+        $false = false;
+
+        $debugHandler = function ($error) {
+            $this->assertEquals(
+                'TSocket: Could not connect to nonexistent-host:9090 (Connection refused [999])',
+                $error
+            );
+        };
+
+        $this->getFunctionMock('Thrift\Transport', 'fsockopen')
+             ->expects($this->once())
+             ->with(
+                 $host,
+                 $port,
+                 $this->anything(), #$errno,
+                 $this->anything(), #$errstr,
+                 $this->anything() #$this->sendTimeoutSec_ + ($this->sendTimeoutUsec_ / 1000000),
+             )
+             ->willReturnCallback(
+                 function (
+                     string $hostname,
+                     int $port,
+                     &$error_code,
+                     &$error_message,
+                     ?float $timeout
+                 ) {
+                     $error_code = 999;
+                     $error_message = 'Connection refused';
+
+                     return false;
+                 }
+             );
+
+        $transport = new TSocket(
+            $host,
+            $port,
+            $false,
+            $debugHandler
+        );
+        $transport->setDebug(true);
+
+        $this->expectException(\Exception::class);
+        $this->expectExceptionMessage('TSocket: Could not connect to');
+        $this->expectExceptionCode(0);
+        $transport->open();
+    }
+
+    public function testOpenPersist()
+    {
+        $host = 'persist-localhost';
+        $port = 9090;
+        $persist = true;
+        $debugHandler = null;
+
+        $handle = fopen('php://memory', 'r+');
+
+        $this->getFunctionMock('Thrift\Transport', 'pfsockopen')
+             ->expects($this->once())
+             ->with(
+                 $host,
+                 $port,
+                 $this->anything(), #$errno,
+                 $this->anything(), #$errstr,
+                 $this->anything() #$this->sendTimeoutSec_ + ($this->sendTimeoutUsec_ / 1000000),
+             )
+             ->willReturn($handle);
+
+        $this->getFunctionMock('Thrift\Transport', 'socket_import_stream')
+             ->expects($this->once())
+             ->with($handle)
+             ->willReturn(true);
+
+        $this->getFunctionMock('Thrift\Transport', 'socket_set_option')
+             ->expects($this->once())
+             ->with(
+                 $this->anything(), #$socket,
+                 SOL_TCP, #$level
+                 TCP_NODELAY, #$option
+                 1 #$value
+             )
+             ->willReturn(true);
+
+        $transport = new TSocket(
+            $host,
+            $port,
+            $persist,
+            $debugHandler
+        );
+
+        $transport->open();
+        $this->assertTrue($transport->isOpen());
+    }
+
+    /**
+     * @dataProvider open_THRIFT_5132_DataProvider
+     */
+    public function testOpen_THRIFT_5132(
+        $socketImportResult
+    ) {
+        $host = 'localhost';
+        $port = 9090;
+        $persist = false;
+        $debugHandler = null;
+
+        $this->getFunctionMock('Thrift\Transport', 'fsockopen')
+             ->expects($this->once())
+             ->with(
+                 $host,
+                 $port,
+                 $this->anything(), #$errno,
+                 $this->anything(), #$errstr,
+                 $this->anything() #$this->sendTimeoutSec_ + ($this->sendTimeoutUsec_ / 1000000),
+             )
+             ->willReturn(fopen('php://input', 'r+'));
+
+        $this->getFunctionMock('Thrift\Transport', 'socket_import_stream')
+             ->expects($this->once())
+             ->willReturn($socketImportResult);
+
+        $this->getFunctionMock('Thrift\Transport', 'socket_set_option')
+             ->expects($socketImportResult ? $this->once() : $this->never())
+             ->with(
+                 $this->anything(), #$socket,
+                 SOL_TCP, #$level
+                 TCP_NODELAY, #$option
+                 1 #$value
+             )
+             ->willReturn(true);
+
+        $transport = new TSocket(
+            $host,
+            $port,
+            $persist,
+            $debugHandler
+        );
+
+        $transport->open();
+        $this->assertTrue($transport->isOpen());
+    }
+
+    public function open_THRIFT_5132_DataProvider()
+    {
+        yield 'socket_import_stream success' => [
+            'socketImportResult' => true,
+        ];
+        yield 'socket_import_stream fail' => [
+            'socketImportResult' => false,
+        ];
+    }
+
+    public function testSetHandle()
+    {
+        $host = 'localhost';
+        $port = 9090;
+        $persist = false;
+        $debugHandler = null;
+        $transport = new TSocket(
+            $host,
+            $port,
+            $persist,
+            $debugHandler
+        );
+
+        $this->assertFalse($transport->isOpen());
+        $transport->setHandle(fopen('php://memory', 'r+'));
+        $this->assertTrue($transport->isOpen());
+    }
+
+    public function testSetSendTimeout()
+    {
+        $host = 'localhost';
+        $port = 9090;
+        $persist = false;
+        $debugHandler = null;
+        $transport = new TSocket(
+            $host,
+            $port,
+            $persist,
+            $debugHandler
+        );
+
+        $transport->setSendTimeout(9999);
+        $reflector = new \ReflectionClass($transport);
+        $property = $reflector->getProperty('sendTimeoutSec_');
+        $property->setAccessible(true);
+        $this->assertEquals(9.0, $property->getValue($transport));
+        $property = $reflector->getProperty('sendTimeoutUsec_');
+        $property->setAccessible(true);
+        $this->assertEquals(999000, $property->getValue($transport));
+    }
+
+    public function testSetRecvTimeout()
+    {
+        $host = 'localhost';
+        $port = 9090;
+        $persist = false;
+        $debugHandler = null;
+        $transport = new TSocket(
+            $host,
+            $port,
+            $persist,
+            $debugHandler
+        );
+
+        $transport->setRecvTimeout(9999);
+        $reflector = new \ReflectionClass($transport);
+        $property = $reflector->getProperty('recvTimeoutSec_');
+        $property->setAccessible(true);
+        $this->assertEquals(9.0, $property->getValue($transport));
+        $property = $reflector->getProperty('recvTimeoutUsec_');
+        $property->setAccessible(true);
+        $this->assertEquals(999000, $property->getValue($transport));
+    }
+
+    /**
+     * @dataProvider hostDataProvider
+     */
+    public function testGetHost($host, $expected)
+    {
+        $port = 9090;
+        $persist = false;
+        $debugHandler = null;
+        $transport = new TSocket(
+            $host,
+            $port,
+            $persist,
+            $debugHandler
+        );
+        $this->assertEquals($expected, $transport->getHost());
+    }
+
+    public function hostDataProvider()
+    {
+        yield 'localhost' => ['localhost', 'localhost'];
+        yield 'ssl_localhost' => ['ssl://localhost', 'ssl://localhost'];
+        yield 'http_localhost' => ['http://localhost', 'http://localhost'];
+    }
+
+    public function testGetPort()
+    {
+        $host = 'localhost';
+        $port = 9090;
+        $persist = false;
+        $debugHandler = null;
+        $transport = new TSocket(
+            $host,
+            $port,
+            $persist,
+            $debugHandler
+        );
+        $this->assertEquals($port, $transport->getPort());
+    }
+
+    public function testClose()
+    {
+        $host = 'localhost';
+        $port = 9090;
+        $persist = false;
+        $debugHandler = null;
+        $transport = new TSocket(
+            $host,
+            $port,
+            $persist,
+            $debugHandler
+        );
+        $transport->setHandle(fopen('php://memory', 'r+'));
+        $reflector = new \ReflectionClass($transport);
+        $property = $reflector->getProperty('handle_');
+        $property->setAccessible(true);
+        $this->assertNotNull($property->getValue($transport));
+
+        $transport->close();
+        $reflector = new \ReflectionClass($transport);
+        $property = $reflector->getProperty('handle_');
+        $property->setAccessible(true);
+        $this->assertNull($property->getValue($transport));
+    }
+
+    /**
+     * @dataProvider writeFailDataProvider
+     */
+    public function testWriteFail(
+        $streamSelectResult,
+        $fwriteCallCount,
+        $expectedException,
+        $expectedMessage,
+        $expectedCode
+    ) {
+        $host = 'localhost';
+        $port = 9090;
+        $persist = false;
+        $debugHandler = null;
+        $handle = fopen('php://memory', 'r+');
+
+        $this->getFunctionMock('Thrift\Transport', 'stream_select')
+             ->expects($this->once())
+             ->with(
+                 $this->anything(), #$null,
+                 [$handle],
+                 $this->anything(), #$null,
+                 $this->anything(), #$this->sendTimeoutSec_,
+                 $this->anything() #$this->sendTimeoutUsec_
+             )
+             ->willReturn($streamSelectResult);
+
+        $this->getFunctionMock('Thrift\Transport', 'fwrite')
+             ->expects($this->exactly($fwriteCallCount))
+             ->with(
+                 $handle,
+                 'test1234456789132456798'
+             )
+             ->willReturn(false);
+
+        $this->expectException($expectedException);
+        $this->expectExceptionMessage($expectedMessage);
+        $this->expectExceptionCode($expectedCode);
+
+        $transport = new TSocket(
+            $host,
+            $port,
+            $persist,
+            $debugHandler
+        );
+        $transport->setHandle($handle);
+
+        $transport->write('test1234456789132456798');
+    }
+
+    public function testWrite()
+    {
+        $host = 'localhost';
+        $port = 9090;
+        $persist = false;
+        $debugHandler = null;
+        $transport = new TSocket(
+            $host,
+            $port,
+            $persist,
+            $debugHandler
+        );
+        $fileName = sys_get_temp_dir() . '/' . md5(mt_rand(0, time()) . time());
+        touch($fileName);
+        $handle = fopen($fileName, 'r+');
+        $transport->setHandle($handle);
+        $transport->write('test1234456789132456798');
+        $this->assertEquals('test1234456789132456798', file_get_contents($fileName));
+
+        register_shutdown_function(function () use ($fileName) {
+            is_file($fileName) && unlink($fileName);
+        });
+    }
+
+    public function writeFailDataProvider()
+    {
+        yield 'stream_select timeout' => [
+            'streamSelectResult' => 0,
+            'fwriteCallCount' => 0,
+            'expectedException' => TTransportException::class,
+            'expectedMessage' => 'TSocket: timed out writing 23 bytes from localhost:9090',
+            'expectedCode' => 0,
+        ];
+        yield 'stream_select fail write' => [
+            'streamSelectResult' => 1,
+            'fwriteCallCount' => 1,
+            'expectedException' => TTransportException::class,
+            'expectedMessage' => 'TSocket: Could not write 23 bytes localhost:9090',
+            'expectedCode' => 0,
+        ];
+        yield 'stream_select fail' => [
+            'streamSelectResult' => false,
+            'fwriteCallCount' => 0,
+            'expectedException' => TTransportException::class,
+            'expectedMessage' => 'TSocket: Could not write 23 bytes localhost:9090',
+            'expectedCode' => 0,
+        ];
+    }
+
+    public function testRead()
+    {
+        $host = 'localhost';
+        $port = 9090;
+        $persist = false;
+        $debugHandler = null;
+        $transport = new TSocket(
+            $host,
+            $port,
+            $persist,
+            $debugHandler
+        );
+        $fileName = sys_get_temp_dir() . '/' . md5(mt_rand(0, time()) . time());
+        file_put_contents($fileName, '12345678901234567890');
+        $handle = fopen($fileName, 'r+');
+        $transport->setHandle($handle);
+        $this->assertEquals('12345', $transport->read(5));
+
+        register_shutdown_function(function () use ($fileName) {
+            is_file($fileName) && unlink($fileName);
+        });
+    }
+
+    /**
+     * @dataProvider readFailDataProvider
+     */
+    public function testReadFail(
+        $streamSelectResult,
+        $freadResult,
+        $feofResult,
+        $expectedException,
+        $expectedMessage,
+        $expectedCode
+    ) {
+        $host = 'localhost';
+        $port = 9090;
+        $persist = false;
+        $debugHandler = null;
+        $handle = fopen('php://memory', 'r+');
+
+        $this->getFunctionMock('Thrift\Transport', 'stream_select')
+             ->expects($this->once())
+             ->with(
+                 [$handle],
+                 $this->anything(), #$null,
+                 $this->anything(), #$null,
+                 $this->anything(), #$this->recvTimeoutSec_,
+                 $this->anything() #$this->recvTimeoutUsec_
+             )
+             ->willReturn($streamSelectResult);
+
+        $this->getFunctionMock('Thrift\Transport', 'fread')
+             ->expects($this->exactly($streamSelectResult ? 1 : 0))
+             ->with(
+                 $handle,
+                 5
+             )
+             ->willReturn($freadResult);
+        $this->getFunctionMock('Thrift\Transport', 'feof')
+             ->expects($this->exactly($feofResult ? 1 : 0))
+             ->with($handle)
+             ->willReturn($feofResult);
+
+        $this->expectException($expectedException);
+        $this->expectExceptionMessage($expectedMessage);
+        $this->expectExceptionCode($expectedCode);
+
+        $transport = new TSocket(
+            $host,
+            $port,
+            $persist,
+            $debugHandler
+        );
+        $transport->setHandle($handle);
+
+        $transport->read(5);
+    }
+
+    public function readFailDataProvider()
+    {
+        yield 'stream_select timeout' => [
+            'streamSelectResult' => 0,
+            'freadResult' => '',
+            'feofResult' => false,
+            'expectedException' => TTransportException::class,
+            'expectedMessage' => 'TSocket: timed out reading 5 bytes from localhost:9090',
+            'expectedCode' => 0,
+        ];
+        yield 'stream_select fail read' => [
+            'streamSelectResult' => 1,
+            'freadResult' => '',
+            'feofResult' => true,
+            'expectedException' => TTransportException::class,
+            'expectedMessage' => 'TSocket read 0 bytes',
+            'expectedCode' => 0,
+        ];
+        yield 'stream_select fail' => [
+            'streamSelectResult' => false,
+            'freadResult' => '',
+            'feofResult' => false,
+            'expectedException' => TTransportException::class,
+            'expectedMessage' => 'TSocket: Could not read 5 bytes from localhost:9090',
+            'expectedCode' => 0,
+        ];
+        yield 'fread false' => [
+            'streamSelectResult' => 1,
+            'freadResult' => false,
+            'feofResult' => false,
+            'expectedException' => TTransportException::class,
+            'expectedMessage' => 'TSocket: Could not read 5 bytes from localhost:9090',
+            'expectedCode' => 0,
+        ];
+        yield 'fread empty' => [
+            'streamSelectResult' => 1,
+            'freadResult' => '',
+            'feofResult' => true,
+            'expectedException' => TTransportException::class,
+            'expectedMessage' => 'TSocket read 0 bytes',
+            'expectedCode' => 0,
+        ];
+    }
+
+    public function testFlush()
+    {
+        $host = 'localhost';
+        $port = 9090;
+        $persist = false;
+        $debugHandler = null;
+        $transport = new TSocket(
+            $host,
+            $port,
+            $persist,
+            $debugHandler
+        );
+        $this->assertNUll($transport->flush());
+    }
+}
diff --git a/lib/php/test/Unit/TJSONProtocolTest.php b/lib/php/test/Unit/TJSONProtocolTest.php
deleted file mode 100644
index 9837803..0000000
--- a/lib/php/test/Unit/TJSONProtocolTest.php
+++ /dev/null
@@ -1,514 +0,0 @@
-<?php
-
-/*
- * 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 Test\Thrift\Unit;
-
-use PHPUnit\Framework\TestCase;
-use Test\Thrift\Fixtures\Fixtures;
-use Test\Thrift\Fixtures\TJSONProtocolFixtures;
-use Thrift\ClassLoader\ThriftClassLoader;
-use Thrift\Protocol\TJSONProtocol;
-use Thrift\Transport\TMemoryBuffer;
-
-/***
- * This test suite depends on running the compiler against the ./Resources/ThriftTest.thrift file:
- * lib/php/test$ ../../../compiler/cpp/thrift --gen php -r  --out ./Resources/packages/php ./Resources/ThriftTest.thrift
- */
-class TJSONProtocolTest extends TestCase
-{
-    private $transport;
-    private $protocol;
-
-    public static function setUpBeforeClass(): void
-    {
-        $loader = new ThriftClassLoader();
-        $loader->registerNamespace('ThriftTest', __DIR__ . '/../Resources/packages/php');
-        $loader->registerDefinition('ThriftTest', __DIR__ . '/../Resources/packages/php');
-        $loader->register();
-
-        Fixtures::populateTestArgs();
-        TJSONProtocolFixtures::populateTestArgsJSON();
-    }
-
-    public function setUp(): void
-    {
-        $this->transport = new TMemoryBuffer();
-        $this->protocol = new TJSONProtocol($this->transport);
-        $this->transport->open();
-    }
-
-    /**
-     * WRITE TESTS
-     */
-    public function testVoidWrite()
-    {
-        $args = new \ThriftTest\ThriftTest_testVoid_args();
-        $args->write($this->protocol);
-
-        $actual = $this->transport->read(Fixtures::$bufsize);
-        $expected = TJSONProtocolFixtures::$testArgsJSON['testVoid'];
-
-        $this->assertEquals($expected, $actual);
-    }
-
-    public function testString1Write()
-    {
-        $args = new \ThriftTest\ThriftTest_testString_args();
-        $args->thing = Fixtures::$testArgs['testString1'];
-        $args->write($this->protocol);
-
-        $actual = $this->transport->read(Fixtures::$bufsize);
-        $expected = TJSONProtocolFixtures::$testArgsJSON['testString1'];
-
-        $this->assertEquals($expected, $actual);
-    }
-
-    public function testString2Write()
-    {
-        $args = new \ThriftTest\ThriftTest_testString_args();
-        $args->thing = Fixtures::$testArgs['testString2'];
-        $args->write($this->protocol);
-
-        $actual = $this->transport->read(Fixtures::$bufsize);
-        $expected = TJSONProtocolFixtures::$testArgsJSON['testString2'];
-
-        $this->assertEquals($expected, $actual);
-    }
-
-    public function testDoubleWrite()
-    {
-        $args = new \ThriftTest\ThriftTest_testDouble_args();
-        $args->thing = Fixtures::$testArgs['testDouble'];
-        $args->write($this->protocol);
-
-        $actual = $this->transport->read(Fixtures::$bufsize);
-        $expected = TJSONProtocolFixtures::$testArgsJSON['testDouble'];
-
-        $this->assertEquals($expected, $actual);
-    }
-
-    public function testByteWrite()
-    {
-        $args = new \ThriftTest\ThriftTest_testByte_args();
-        $args->thing = Fixtures::$testArgs['testByte'];
-        $args->write($this->protocol);
-
-        $actual = $this->transport->read(Fixtures::$bufsize);
-        $expected = TJSONProtocolFixtures::$testArgsJSON['testByte'];
-
-        $this->assertEquals($expected, $actual);
-    }
-
-    public function testI32Write()
-    {
-        $args = new \ThriftTest\ThriftTest_testI32_args();
-        $args->thing = Fixtures::$testArgs['testI32'];
-        $args->write($this->protocol);
-
-        $actual = $this->transport->read(Fixtures::$bufsize);
-        $expected = TJSONProtocolFixtures::$testArgsJSON['testI32'];
-
-        $this->assertEquals($expected, $actual);
-    }
-
-    public function testI64Write()
-    {
-        $args = new \ThriftTest\ThriftTest_testI64_args();
-        $args->thing = Fixtures::$testArgs['testI64'];
-        $args->write($this->protocol);
-
-        $actual = $this->transport->read(Fixtures::$bufsize);
-        $expected = TJSONProtocolFixtures::$testArgsJSON['testI64'];
-
-        $this->assertEquals($expected, $actual);
-    }
-
-    public function testStructWrite()
-    {
-        $args = new \ThriftTest\ThriftTest_testStruct_args();
-        $args->thing = Fixtures::$testArgs['testStruct'];
-
-        $args->write($this->protocol);
-
-        $actual = $this->transport->read(Fixtures::$bufsize);
-        $expected = TJSONProtocolFixtures::$testArgsJSON['testStruct'];
-
-        $this->assertEquals($expected, $actual);
-    }
-
-    public function testNestWrite()
-    {
-        $args = new \ThriftTest\ThriftTest_testNest_args();
-        $args->thing = Fixtures::$testArgs['testNest'];
-
-        $args->write($this->protocol);
-
-        $actual = $this->transport->read(Fixtures::$bufsize);
-        $expected = TJSONProtocolFixtures::$testArgsJSON['testNest'];
-
-        $this->assertEquals($expected, $actual);
-    }
-
-    public function testMapWrite()
-    {
-        $args = new \ThriftTest\ThriftTest_testMap_args();
-        $args->thing = Fixtures::$testArgs['testMap'];
-
-        $args->write($this->protocol);
-
-        $actual = $this->transport->read(Fixtures::$bufsize);
-        $expected = TJSONProtocolFixtures::$testArgsJSON['testMap'];
-
-        $this->assertEquals($expected, $actual);
-    }
-
-    public function testStringMapWrite()
-    {
-        $args = new \ThriftTest\ThriftTest_testStringMap_args();
-        $args->thing = Fixtures::$testArgs['testStringMap'];
-
-        $args->write($this->protocol);
-
-        $actual = $this->transport->read(Fixtures::$bufsize);
-        $expected = TJSONProtocolFixtures::$testArgsJSON['testStringMap'];
-
-        /*
-         * The $actual returns unescaped string.
-         * It is required to to decode then encode it again
-         * to get the expected escaped unicode.
-         */
-        $this->assertEquals($expected, json_encode(json_decode($actual)));
-    }
-
-    public function testSetWrite()
-    {
-        $args = new \ThriftTest\ThriftTest_testSet_args();
-        $args->thing = Fixtures::$testArgs['testSet'];
-
-        $args->write($this->protocol);
-
-        $actual = $this->transport->read(Fixtures::$bufsize);
-        $expected = TJSONProtocolFixtures::$testArgsJSON['testSet'];
-
-        $this->assertEquals($expected, $actual);
-    }
-
-    public function testListWrite()
-    {
-        $args = new \ThriftTest\ThriftTest_testList_args();
-        $args->thing = Fixtures::$testArgs['testList'];
-
-        $args->write($this->protocol);
-
-        $actual = $this->transport->read(Fixtures::$bufsize);
-        $expected = TJSONProtocolFixtures::$testArgsJSON['testList'];
-
-        $this->assertEquals($expected, $actual);
-    }
-
-    public function testEnumWrite()
-    {
-        $args = new \ThriftTest\ThriftTest_testEnum_args();
-        $args->thing = Fixtures::$testArgs['testEnum'];
-
-        $args->write($this->protocol);
-
-        $actual = $this->transport->read(Fixtures::$bufsize);
-        $expected = TJSONProtocolFixtures::$testArgsJSON['testEnum'];
-
-        $this->assertEquals($expected, $actual);
-    }
-
-    public function testTypedefWrite()
-    {
-        $args = new \ThriftTest\ThriftTest_testTypedef_args();
-        $args->thing = Fixtures::$testArgs['testTypedef'];
-
-        $args->write($this->protocol);
-
-        $actual = $this->transport->read(Fixtures::$bufsize);
-        $expected = TJSONProtocolFixtures::$testArgsJSON['testTypedef'];
-
-        $this->assertEquals($expected, $actual);
-    }
-
-    /**
-     * READ TESTS
-     */
-    public function testVoidRead()
-    {
-        $this->transport->write(
-            TJSONProtocolFixtures::$testArgsJSON['testVoid']
-        );
-        $args = new \ThriftTest\ThriftTest_testVoid_args();
-        $result = $args->read($this->protocol);
-
-        $this->assertEquals(0, $result);
-    }
-
-    public function testString1Read()
-    {
-        $this->transport->write(
-            TJSONProtocolFixtures::$testArgsJSON['testString1']
-        );
-        $args = new \ThriftTest\ThriftTest_testString_args();
-        $args->read($this->protocol);
-
-        $actual = $args->thing;
-        $expected = Fixtures::$testArgs['testString1'];
-
-        $this->assertEquals($expected, $actual);
-    }
-
-    public function testString2Read()
-    {
-        $this->transport->write(
-            TJSONProtocolFixtures::$testArgsJSON['testString2']
-        );
-        $args = new \ThriftTest\ThriftTest_testString_args();
-        $args->read($this->protocol);
-
-        $actual = $args->thing;
-        $expected = Fixtures::$testArgs['testString2'];
-
-        $this->assertEquals($expected, $actual);
-    }
-
-    public function testString3Write()
-    {
-        $args = new \ThriftTest\ThriftTest_testString_args();
-        $args->thing = Fixtures::$testArgs['testString3'];
-        $args->write($this->protocol);
-
-        $actual = $this->transport->read(Fixtures::$bufsize);
-        $expected = TJSONProtocolFixtures::$testArgsJSON['testString3'];
-
-        $this->assertEquals($expected, $actual);
-    }
-
-    public function testString4Write()
-    {
-        $args = new \ThriftTest\ThriftTest_testString_args();
-        $args->thing = Fixtures::$testArgs['testUnicodeStringWithNonBMP'];
-        $args->write($this->protocol);
-
-        $actual = $this->transport->read(Fixtures::$bufsize);
-        $expected = TJSONProtocolFixtures::$testArgsJSON['testUnicodeStringWithNonBMP'];
-
-        $this->assertEquals($expected, $actual);
-    }
-
-    public function testDoubleRead()
-    {
-        $this->transport->write(
-            TJSONProtocolFixtures::$testArgsJSON['testDouble']
-        );
-        $args = new \ThriftTest\ThriftTest_testDouble_args();
-        $args->read($this->protocol);
-
-        $actual = $args->thing;
-        $expected = Fixtures::$testArgs['testDouble'];
-
-        $this->assertEquals($expected, $actual);
-    }
-
-    public function testByteRead()
-    {
-        $this->transport->write(
-            TJSONProtocolFixtures::$testArgsJSON['testByte']
-        );
-        $args = new \ThriftTest\ThriftTest_testByte_args();
-        $args->read($this->protocol);
-
-        $actual = $args->thing;
-        $expected = Fixtures::$testArgs['testByte'];
-
-        $this->assertEquals($expected, $actual);
-    }
-
-    public function testI32Read()
-    {
-        $this->transport->write(
-            TJSONProtocolFixtures::$testArgsJSON['testI32']
-        );
-        $args = new \ThriftTest\ThriftTest_testI32_args();
-        $args->read($this->protocol);
-
-        $actual = $args->thing;
-        $expected = Fixtures::$testArgs['testI32'];
-
-        $this->assertEquals($expected, $actual);
-    }
-
-    public function testI64Read()
-    {
-        $this->transport->write(
-            TJSONProtocolFixtures::$testArgsJSON['testI64']
-        );
-        $args = new \ThriftTest\ThriftTest_testI64_args();
-        $args->read($this->protocol);
-
-        $actual = $args->thing;
-        $expected = Fixtures::$testArgs['testI64'];
-
-        $this->assertEquals($expected, $actual);
-    }
-
-    public function testStructRead()
-    {
-        $this->transport->write(
-            TJSONProtocolFixtures::$testArgsJSON['testStruct']
-        );
-        $args = new \ThriftTest\ThriftTest_testStruct_args();
-        $args->read($this->protocol);
-
-        $actual = $args->thing;
-        $expected = Fixtures::$testArgs['testStruct'];
-
-        $this->assertEquals($expected, $actual);
-    }
-
-    public function testNestRead()
-    {
-        $this->transport->write(
-            TJSONProtocolFixtures::$testArgsJSON['testNest']
-        );
-        $args = new \ThriftTest\ThriftTest_testNest_args();
-        $args->read($this->protocol);
-
-        $actual = $args->thing;
-        $expected = Fixtures::$testArgs['testNest'];
-
-        $this->assertEquals($expected, $actual);
-    }
-
-    public function testMapRead()
-    {
-        $this->transport->write(
-            TJSONProtocolFixtures::$testArgsJSON['testMap']
-        );
-        $args = new \ThriftTest\ThriftTest_testMap_args();
-        $args->read($this->protocol);
-
-        $actual = $args->thing;
-        $expected = Fixtures::$testArgs['testMap'];
-
-        $this->assertEquals($expected, $actual);
-    }
-
-    public function testStringMapRead()
-    {
-        $this->transport->write(
-            TJSONProtocolFixtures::$testArgsJSON['testStringMap']
-        );
-        $args = new \ThriftTest\ThriftTest_testStringMap_args();
-        $args->read($this->protocol);
-
-        $actual = $args->thing;
-        $expected = Fixtures::$testArgs['testStringMap'];
-
-        $this->assertEquals($expected, $actual);
-    }
-
-    public function testSetRead()
-    {
-        $this->transport->write(
-            TJSONProtocolFixtures::$testArgsJSON['testSet']
-        );
-        $args = new \ThriftTest\ThriftTest_testSet_args();
-        $args->read($this->protocol);
-
-        $actual = $args->thing;
-        $expected = Fixtures::$testArgs['testSet'];
-
-        $this->assertEquals($expected, $actual);
-    }
-
-    public function testListRead()
-    {
-        $this->transport->write(
-            TJSONProtocolFixtures::$testArgsJSON['testList']
-        );
-        $args = new \ThriftTest\ThriftTest_testList_args();
-        $args->read($this->protocol);
-
-        $actual = $args->thing;
-        $expected = Fixtures::$testArgs['testList'];
-
-        $this->assertEquals($expected, $actual);
-    }
-
-    public function testEnumRead()
-    {
-        $this->transport->write(
-            TJSONProtocolFixtures::$testArgsJSON['testEnum']
-        );
-        $args = new \ThriftTest\ThriftTest_testEnum_args();
-        $args->read($this->protocol);
-
-        $actual = $args->thing;
-        $expected = Fixtures::$testArgs['testEnum'];
-
-        $this->assertEquals($expected, $actual);
-    }
-
-    public function testTypedefRead()
-    {
-        $this->transport->write(
-            TJSONProtocolFixtures::$testArgsJSON['testTypedef']
-        );
-        $args = new \ThriftTest\ThriftTest_testTypedef_args();
-        $args->read($this->protocol);
-
-        $actual = $args->thing;
-        $expected = Fixtures::$testArgs['testTypedef'];
-
-        $this->assertEquals($expected, $actual);
-    }
-
-    public function testMapMapRead()
-    {
-        $this->transport->write(
-            TJSONProtocolFixtures::$testArgsJSON['testMapMap']
-        );
-        $result = new \ThriftTest\ThriftTest_testMapMap_result();
-        $result->read($this->protocol);
-
-        $actual = $result->success;
-        $expected = Fixtures::$testArgs['testMapMapExpectedResult'];
-
-        $this->assertEquals($expected, $actual);
-    }
-
-    public function testInsanityRead()
-    {
-        $this->transport->write(
-            TJSONProtocolFixtures::$testArgsJSON['testInsanity']
-        );
-        $result = new \ThriftTest\ThriftTest_testInsanity_result();
-        $result->read($this->protocol);
-
-        $actual = $result->success;
-        $expected = Fixtures::$testArgs['testInsanityExpectedResult'];
-
-        $this->assertEquals($expected, $actual);
-    }
-}
diff --git a/lib/php/test/Unit/TSimpleJSONProtocolTest.php b/lib/php/test/Unit/TSimpleJSONProtocolTest.php
deleted file mode 100644
index 8e6a6d9..0000000
--- a/lib/php/test/Unit/TSimpleJSONProtocolTest.php
+++ /dev/null
@@ -1,247 +0,0 @@
-<?php
-
-/*
- * 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 Test\Thrift\Unit;
-
-use PHPUnit\Framework\TestCase;
-use Test\Thrift\Fixtures\Fixtures;
-use Test\Thrift\Fixtures\TSimpleJSONProtocolFixtures;
-use Thrift\ClassLoader\ThriftClassLoader;
-use Thrift\Protocol\TSimpleJSONProtocol;
-use Thrift\Transport\TMemoryBuffer;
-
-/***
- * This test suite depends on running the compiler against the ./Resources/ThriftTest.thrift file:
- * lib/php/test$ ../../../compiler/cpp/thrift --gen php -r  --out ./Resources/packages/php ./Resources/ThriftTest.thrift
- */
-class TSimpleJSONProtocolTest extends TestCase
-{
-    private $transport;
-    private $protocol;
-
-    public static function setUpBeforeClass(): void
-    {
-        $loader = new ThriftClassLoader();
-        $loader->registerNamespace('ThriftTest', __DIR__ . '/../Resources/packages/php');
-        $loader->registerDefinition('ThriftTest', __DIR__ . '/../Resources/packages/php');
-        $loader->register();
-
-        Fixtures::populateTestArgs();
-        TSimpleJSONProtocolFixtures::populateTestArgsSimpleJSON();
-    }
-
-    public function setUp(): void
-    {
-        $this->transport = new TMemoryBuffer();
-        $this->protocol = new TSimpleJSONProtocol($this->transport);
-        $this->transport->open();
-    }
-
-    /**
-     * WRITE TESTS
-     */
-    public function testVoidWrite()
-    {
-        $args = new \ThriftTest\ThriftTest_testVoid_args();
-        $args->write($this->protocol);
-
-        $actual = $this->transport->read(Fixtures::$bufsize);
-        $expected = TSimpleJSONProtocolFixtures::$testArgsJSON['testVoid'];
-
-        $this->assertEquals($expected, $actual);
-    }
-
-    public function testString1Write()
-    {
-        $args = new \ThriftTest\ThriftTest_testString_args();
-        $args->thing = Fixtures::$testArgs['testString1'];
-        $args->write($this->protocol);
-
-        $actual = $this->transport->read(Fixtures::$bufsize);
-        $expected = TSimpleJSONProtocolFixtures::$testArgsJSON['testString1'];
-
-        $this->assertEquals($expected, $actual);
-    }
-
-    public function testString2Write()
-    {
-        $args = new \ThriftTest\ThriftTest_testString_args();
-        $args->thing = Fixtures::$testArgs['testString2'];
-        $args->write($this->protocol);
-
-        $actual = $this->transport->read(Fixtures::$bufsize);
-        $expected = TSimpleJSONProtocolFixtures::$testArgsJSON['testString2'];
-
-        $this->assertEquals($expected, $actual);
-    }
-
-    public function testDoubleWrite()
-    {
-        $args = new \ThriftTest\ThriftTest_testDouble_args();
-        $args->thing = Fixtures::$testArgs['testDouble'];
-        $args->write($this->protocol);
-
-        $actual = $this->transport->read(Fixtures::$bufsize);
-        $expected = TSimpleJSONProtocolFixtures::$testArgsJSON['testDouble'];
-
-        $this->assertEquals($expected, $actual);
-    }
-
-    public function testByteWrite()
-    {
-        $args = new \ThriftTest\ThriftTest_testByte_args();
-        $args->thing = Fixtures::$testArgs['testByte'];
-        $args->write($this->protocol);
-
-        $actual = $this->transport->read(Fixtures::$bufsize);
-        $expected = TSimpleJSONProtocolFixtures::$testArgsJSON['testByte'];
-
-        $this->assertEquals($expected, $actual);
-    }
-
-    public function testI32Write()
-    {
-        $args = new \ThriftTest\ThriftTest_testI32_args();
-        $args->thing = Fixtures::$testArgs['testI32'];
-        $args->write($this->protocol);
-
-        $actual = $this->transport->read(Fixtures::$bufsize);
-        $expected = TSimpleJSONProtocolFixtures::$testArgsJSON['testI32'];
-
-        $this->assertEquals($expected, $actual);
-    }
-
-    public function testI64Write()
-    {
-        $args = new \ThriftTest\ThriftTest_testI64_args();
-        $args->thing = Fixtures::$testArgs['testI64'];
-        $args->write($this->protocol);
-
-        $actual = $this->transport->read(Fixtures::$bufsize);
-        $expected = TSimpleJSONProtocolFixtures::$testArgsJSON['testI64'];
-
-        $this->assertEquals($expected, $actual);
-    }
-
-    public function testStructWrite()
-    {
-        $args = new \ThriftTest\ThriftTest_testStruct_args();
-        $args->thing = Fixtures::$testArgs['testStruct'];
-
-        $args->write($this->protocol);
-
-        $actual = $this->transport->read(Fixtures::$bufsize);
-        $expected = TSimpleJSONProtocolFixtures::$testArgsJSON['testStruct'];
-
-        $this->assertEquals($expected, $actual);
-    }
-
-    public function testNestWrite()
-    {
-        $args = new \ThriftTest\ThriftTest_testNest_args();
-        $args->thing = Fixtures::$testArgs['testNest'];
-
-        $args->write($this->protocol);
-
-        $actual = $this->transport->read(Fixtures::$bufsize);
-        $expected = TSimpleJSONProtocolFixtures::$testArgsJSON['testNest'];
-
-        $this->assertEquals($expected, $actual);
-    }
-
-    public function testMapWrite()
-    {
-        $args = new \ThriftTest\ThriftTest_testMap_args();
-        $args->thing = Fixtures::$testArgs['testMap'];
-
-        $args->write($this->protocol);
-
-        $actual = $this->transport->read(Fixtures::$bufsize);
-        $expected = TSimpleJSONProtocolFixtures::$testArgsJSON['testMap'];
-
-        $this->assertEquals($expected, $actual);
-    }
-
-    public function testStringMapWrite()
-    {
-        $args = new \ThriftTest\ThriftTest_testStringMap_args();
-        $args->thing = Fixtures::$testArgs['testStringMap'];
-
-        $args->write($this->protocol);
-
-        $actual = $this->transport->read(Fixtures::$bufsize);
-        $expected = TSimpleJSONProtocolFixtures::$testArgsJSON['testStringMap'];
-
-        $this->assertEquals($expected, $actual);
-    }
-
-    public function testSetWrite()
-    {
-        $args = new \ThriftTest\ThriftTest_testSet_args();
-        $args->thing = Fixtures::$testArgs['testSet'];
-
-        $args->write($this->protocol);
-
-        $actual = $this->transport->read(Fixtures::$bufsize);
-        $expected = TSimpleJSONProtocolFixtures::$testArgsJSON['testSet'];
-
-        $this->assertEquals($expected, $actual);
-    }
-
-    public function testListWrite()
-    {
-        $args = new \ThriftTest\ThriftTest_testList_args();
-        $args->thing = Fixtures::$testArgs['testList'];
-
-        $args->write($this->protocol);
-
-        $actual = $this->transport->read(Fixtures::$bufsize);
-        $expected = TSimpleJSONProtocolFixtures::$testArgsJSON['testList'];
-
-        $this->assertEquals($expected, $actual);
-    }
-
-    public function testEnumWrite()
-    {
-        $args = new \ThriftTest\ThriftTest_testEnum_args();
-        $args->thing = Fixtures::$testArgs['testEnum'];
-
-        $args->write($this->protocol);
-
-        $actual = $this->transport->read(Fixtures::$bufsize);
-        $expected = TSimpleJSONProtocolFixtures::$testArgsJSON['testEnum'];
-
-        $this->assertEquals($expected, $actual);
-    }
-
-    public function testTypedefWrite()
-    {
-        $args = new \ThriftTest\ThriftTest_testTypedef_args();
-        $args->thing = Fixtures::$testArgs['testTypedef'];
-
-        $args->write($this->protocol);
-
-        $actual = $this->transport->read(Fixtures::$bufsize);
-        $expected = TSimpleJSONProtocolFixtures::$testArgsJSON['testTypedef'];
-
-        $this->assertEquals($expected, $actual);
-    }
-}
diff --git a/lib/php/test/Unit/ValidatorTestOop.php b/lib/php/test/Unit/ValidatorTestOop.php
deleted file mode 100644
index 9558182..0000000
--- a/lib/php/test/Unit/ValidatorTestOop.php
+++ /dev/null
@@ -1,41 +0,0 @@
-<?php
-
-/*
- * 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 Test\Thrift\Unit;
-
-use Thrift\ClassLoader\ThriftClassLoader;
-
-/***
- * This test suite depends on running the compiler against the ./Resources/ThriftTest.thrift file:
- * lib/php/test$ ../../../compiler/cpp/thrift --gen php:validate,oop -r --out ./Resources/packages/phpvo ./Resources/ThriftTest.thrift
- */
-class ValidatorTestOop extends BaseValidatorTest
-{
-    public function setUp(): void
-    {
-        $loader = new ThriftClassLoader();
-        $loader->registerNamespace('ThriftTest', __DIR__ . '/../Resources/packages/phpvo');
-        $loader->registerDefinition('ThriftTest', __DIR__ . '/../Resources/packages/phpvo');
-        $loader->registerNamespace('TestValidators', __DIR__ . '/../Resources/packages/phpvo');
-        $loader->registerDefinition('TestValidators', __DIR__ . '/../Resources/packages/phpvo');
-        $loader->register();
-    }
-}
diff --git a/lib/php/test/bootstrap.php b/lib/php/test/bootstrap.php
new file mode 100644
index 0000000..c6291e5
--- /dev/null
+++ b/lib/php/test/bootstrap.php
@@ -0,0 +1,16 @@
+<?php
+
+use Thrift\ClassLoader\ThriftClassLoader;
+
+require_once __DIR__ . '/../../../vendor/autoload.php';
+
+$loader = new ThriftClassLoader();
+$loader->registerNamespace('Basic', __DIR__ . '/Resources/packages/php');
+$loader->registerNamespace('Validate', __DIR__ . '/Resources/packages/phpv');
+$loader->registerNamespace('ValidateOop', __DIR__ . '/Resources/packages/phpvo');
+$loader->registerNamespace('Json', __DIR__ . '/Resources/packages/phpjs');
+
+#do not load this namespace here, it will be loaded in ClassLoaderTest
+//$loader->registerNamespace('Server', __DIR__ . '/Resources/packages/phpcm');
+
+$loader->register();
diff --git a/lib/py/Makefile.am b/lib/py/Makefile.am
index 9b6d33b..4777ccf 100644
--- a/lib/py/Makefile.am
+++ b/lib/py/Makefile.am
@@ -45,7 +45,7 @@
 # Old version (can't put inline because it's not portable).
 #$(PYTHON) setup.py install --prefix=$(prefix) --root=$(DESTDIR) $(PYTHON_SETUPUTIL_ARGS)
 install-exec-hook:
-	$(PYTHON) setup.py install --root=$(DESTDIR) --prefix=$(PY_PREFIX) $(PYTHON_SETUPUTIL_ARGS)
+	$(PYTHON) -m pip install . --root=$(DESTDIR) --prefix=$(PY_PREFIX) $(PYTHON_SETUPUTIL_ARGS)
 
 check-local: all py3-test
 	$(PYTHON) test/thrift_json.py
@@ -69,6 +69,9 @@
 	find $(distdir) -type f \( -iname "*.pyc" \) | xargs rm -f
 	find $(distdir) -type d \( -iname "__pycache__" -or -iname "_trial_temp" \) | xargs rm -rf
 
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
 EXTRA_DIST = \
 	CMakeLists.txt \
 	MANIFEST.in \
diff --git a/lib/py/src/transport/TSSLSocket.py b/lib/py/src/transport/TSSLSocket.py
index 5b3ae59..536d2f3 100644
--- a/lib/py/src/transport/TSSLSocket.py
+++ b/lib/py/src/transport/TSSLSocket.py
@@ -397,8 +397,8 @@
                 self._validate_callback(client.peercert, addr[0])
                 client.is_valid = True
             except Exception:
-                logger.warn('Failed to validate client certificate address: %s',
-                            addr[0], exc_info=True)
+                logger.warning('Failed to validate client certificate address: %s',
+                               addr[0], exc_info=True)
                 client.close()
                 plain_client.close()
                 return None
diff --git a/lib/py/src/transport/TSocket.py b/lib/py/src/transport/TSocket.py
index 50ee67e..459f043 100644
--- a/lib/py/src/transport/TSocket.py
+++ b/lib/py/src/transport/TSocket.py
@@ -151,6 +151,8 @@
     def read(self, sz):
         try:
             buff = self.handle.recv(sz)
+        except socket.timeout as e:
+            raise TTransportException(type=TTransportException.TIMED_OUT, message="read timeout", inner=e)
         except socket.error as e:
             if (e.args[0] == errno.ECONNRESET and
                     (sys.platform == 'darwin' or sys.platform.startswith('freebsd'))):
@@ -161,8 +163,6 @@
                 self.close()
                 # Trigger the check to raise the END_OF_FILE exception below.
                 buff = ''
-            elif e.args[0] == errno.ETIMEDOUT:
-                raise TTransportException(type=TTransportException.TIMED_OUT, message="read timeout", inner=e)
             else:
                 raise TTransportException(message="unexpected exception", inner=e)
         if len(buff) == 0:
@@ -208,7 +208,7 @@
         else:
             # We cann't update backlog when it is already listening, since the
             # handle has been created.
-            logger.warn('You have to set backlog before listen.')
+            logger.warning('You have to set backlog before listen.')
 
     def listen(self):
         res0 = self._resolveAddr()
diff --git a/lib/py/src/transport/sslcompat.py b/lib/py/src/transport/sslcompat.py
index ab00cb2..60616db 100644
--- a/lib/py/src/transport/sslcompat.py
+++ b/lib/py/src/transport/sslcompat.py
@@ -70,7 +70,7 @@
         logger.debug('ipaddress module is available')
         ipaddr = True
     except ImportError:
-        logger.warn('ipaddress module is unavailable')
+        logger.warning('ipaddress module is unavailable')
         ipaddr = False
 
     if sys.hexversion < 0x030500F0:
@@ -82,17 +82,17 @@
             if ver[0] * 10 + ver[1] >= 35:
                 return ipaddr, match
             else:
-                logger.warn('backports.ssl_match_hostname module is too old')
+                logger.warning('backports.ssl_match_hostname module is too old')
                 ipaddr = False
         except ImportError:
-            logger.warn('backports.ssl_match_hostname is unavailable')
+            logger.warning('backports.ssl_match_hostname is unavailable')
             ipaddr = False
     try:
         from ssl import match_hostname
         logger.debug('ssl.match_hostname is available')
         match = match_hostname
     except ImportError:
-        logger.warn('using legacy validation callback')
+        logger.warning('using legacy validation callback')
         match = legacy_validate_callback
     return ipaddr, match
 
diff --git a/lib/py/test/test_socket.py b/lib/py/test/test_socket.py
index b732653..ab56a6e 100644
--- a/lib/py/test/test_socket.py
+++ b/lib/py/test/test_socket.py
@@ -11,6 +11,24 @@
 
 
 class TSocketTest(unittest.TestCase):
+    def test_socket_readtimeout_exception(self):
+        acc = ServerAcceptor(TServerSocket(port=0))
+        acc.start()
+
+        sock = TSocket(host="localhost", port=acc.port)
+        sock.open()
+        sock.setTimeout(1)
+        sock.write(b"sleep")
+
+        with self.assertRaises(TTransportException) as ctx:
+            sock.read(5)
+        exc = ctx.exception
+        self.assertEqual(exc.message, "read timeout")
+
+        acc.client.close() # this also blocks until the other thread is done
+        acc.close()
+        sock.close()
+
     def test_isOpen_checks_for_readability(self):
         # https://docs.python.org/3/library/socket.html#notes-on-socket-timeouts
         # https://docs.python.org/3/library/socket.html#socket.socket.settimeout
diff --git a/lib/py/test/test_sslsocket.py b/lib/py/test/test_sslsocket.py
index a5ea06a..2cbf5f8 100644
--- a/lib/py/test/test_sslsocket.py
+++ b/lib/py/test/test_sslsocket.py
@@ -19,6 +19,7 @@
 
 import inspect
 import logging
+import time
 import os
 import platform
 import ssl
@@ -76,7 +77,9 @@
         try:
             self._client = self._server.accept()
             if self._client:
-                self._client.read(5)  # hello
+                data = self._client.read(5)  # hello/sleep
+                if data == b"sleep":
+                    time.sleep(2)
                 self._client.write(b"there")
         except Exception:
             logging.exception('error on server side (%s):' % self.name)
diff --git a/lib/rb/Makefile.am b/lib/rb/Makefile.am
index 1841065..ab5d903 100644
--- a/lib/rb/Makefile.am
+++ b/lib/rb/Makefile.am
@@ -42,6 +42,9 @@
 dist-hook:
 	$(RM) -r $(distdir)/spec/gen-rb/
 
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
 EXTRA_DIST = \
 	coding_standards.md \
 	Rakefile \
diff --git a/lib/rb/thrift.gemspec b/lib/rb/thrift.gemspec
index 86d2189..1977ec4 100644
--- a/lib/rb/thrift.gemspec
+++ b/lib/rb/thrift.gemspec
@@ -12,7 +12,6 @@
   s.license     = 'Apache-2.0'
   s.extensions  = ['ext/extconf.rb']
 
-  s.has_rdoc      = true
   s.rdoc_options  = %w[--line-numbers --inline-source --title Thrift --main README]
 
   s.rubyforge_project = 'thrift'
diff --git a/lib/rs/Makefile.am b/lib/rs/Makefile.am
index 7a9b30a..3a13403 100644
--- a/lib/rs/Makefile.am
+++ b/lib/rs/Makefile.am
@@ -45,6 +45,9 @@
 	$(CARGO) clean
 	-$(RM) Cargo.lock
 
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
 EXTRA_DIST = \
 	src \
 	Cargo.toml \
diff --git a/lib/rs/test/Makefile.am b/lib/rs/test/Makefile.am
index 017a2c4..73fe156 100644
--- a/lib/rs/test/Makefile.am
+++ b/lib/rs/test/Makefile.am
@@ -47,6 +47,9 @@
 	-$(RM) src/identifiers.rs
 	-$(RM) -r bin
 
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
 EXTRA_DIST = \
 	Cargo.toml \
 	thrifts/Base_One.thrift \
diff --git a/lib/rs/test_recursive/Makefile.am b/lib/rs/test_recursive/Makefile.am
index e676ccd..ec7d4fc 100644
--- a/lib/rs/test_recursive/Makefile.am
+++ b/lib/rs/test_recursive/Makefile.am
@@ -29,5 +29,8 @@
 	$(CARGO) clean
 	-$(RM) Cargo.lock
 
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
 EXTRA_DIST = \
 	Cargo.toml
diff --git a/lib/rs/test_recursive/src/Makefile.am b/lib/rs/test_recursive/src/Makefile.am
index 4bfd557..eeb81ab 100644
--- a/lib/rs/test_recursive/src/Makefile.am
+++ b/lib/rs/test_recursive/src/Makefile.am
@@ -29,6 +29,9 @@
 clean-local:
 	-$(RM) vehicles.rs
 
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
 EXTRA_DIST = \
 	lib.rs \
 	Vehicles.thrift
diff --git a/lib/rs/test_recursive/src/maintenance/Makefile.am b/lib/rs/test_recursive/src/maintenance/Makefile.am
index e2526bd..a1f0ae8 100644
--- a/lib/rs/test_recursive/src/maintenance/Makefile.am
+++ b/lib/rs/test_recursive/src/maintenance/Makefile.am
@@ -29,6 +29,9 @@
 clean-local:
 	-$(RM) maintenance_facility.rs
 
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
 EXTRA_DIST = \
 	mod.rs \
 	MaintenanceFacility.thrift
diff --git a/lib/rs/test_recursive/src/transit/Makefile.am b/lib/rs/test_recursive/src/transit/Makefile.am
index 908becb..217227a 100644
--- a/lib/rs/test_recursive/src/transit/Makefile.am
+++ b/lib/rs/test_recursive/src/transit/Makefile.am
@@ -34,6 +34,9 @@
 	-$(RM) trains.rs
 	-$(RM) transporters.rs
 
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
 EXTRA_DIST = \
 	mod.rs \
 	Buses.thrift \
diff --git a/lib/rs/test_recursive/src/transit/light/Makefile.am b/lib/rs/test_recursive/src/transit/light/Makefile.am
index 88fd531..b0e3c76 100644
--- a/lib/rs/test_recursive/src/transit/light/Makefile.am
+++ b/lib/rs/test_recursive/src/transit/light/Makefile.am
@@ -31,6 +31,9 @@
 	-$(RM) light_rail.rs
 	-$(RM) streetcars.rs
 
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
 EXTRA_DIST = \
 	mod.rs \
 	LightRail.thrift \
diff --git a/lib/rs/test_recursive/src/transit/services/Makefile.am b/lib/rs/test_recursive/src/transit/services/Makefile.am
index 12e9e29..a141c6d 100644
--- a/lib/rs/test_recursive/src/transit/services/Makefile.am
+++ b/lib/rs/test_recursive/src/transit/services/Makefile.am
@@ -29,6 +29,9 @@
 clean-local:
 	-$(RM) city_services.rs
 
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
 EXTRA_DIST = \
 	mod.rs \
 	CityServices.thrift
diff --git a/lib/swift/Makefile.am b/lib/swift/Makefile.am
index 6a6644a..ac61716 100644
--- a/lib/swift/Makefile.am
+++ b/lib/swift/Makefile.am
@@ -35,6 +35,9 @@
 check-local:
 	swift test
 
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
 EXTRA_DIST = \
 	Package.swift \
 	Sources \
diff --git a/lib/ts/Makefile.am b/lib/ts/Makefile.am
index 62ea206..05d71e4 100644
--- a/lib/ts/Makefile.am
+++ b/lib/ts/Makefile.am
@@ -48,6 +48,9 @@
 	$(RM) -r $(distdir)/test/build/
 	$(RM) -r $(distdir)/test/gen-*/
 
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
 EXTRA_DIST = \
     coding_standards.md \
     Gruntfile.js \
diff --git a/lib/ts/package-lock.json b/lib/ts/package-lock.json
index 31e0c52..ee1592e 100644
--- a/lib/ts/package-lock.json
+++ b/lib/ts/package-lock.json
@@ -6,7 +6,7 @@
   "packages": {
     "": {
       "name": "thrift",
-      "version": "0.20.0",
+      "version": "0.21.0",
       "license": "Apache-2.0",
       "dependencies": {
         "bufferutil": "^4.0.1",
@@ -427,12 +427,12 @@
       }
     },
     "node_modules/braces": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
-      "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+      "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
       "dev": true,
       "dependencies": {
-        "fill-range": "^7.0.1"
+        "fill-range": "^7.1.1"
       },
       "engines": {
         "node": ">=8"
@@ -1465,9 +1465,9 @@
       }
     },
     "node_modules/fill-range": {
-      "version": "7.0.1",
-      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
-      "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+      "version": "7.1.1",
+      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+      "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
       "dev": true,
       "dependencies": {
         "to-regex-range": "^5.0.1"
@@ -4951,9 +4951,9 @@
       "dev": true
     },
     "node_modules/ws": {
-      "version": "6.2.2",
-      "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz",
-      "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==",
+      "version": "6.2.3",
+      "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz",
+      "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==",
       "dev": true,
       "dependencies": {
         "async-limiter": "~1.0.0"
diff --git a/lib/xml/Makefile.am b/lib/xml/Makefile.am
index bcad6bd..6a1503a 100644
--- a/lib/xml/Makefile.am
+++ b/lib/xml/Makefile.am
@@ -24,6 +24,9 @@
 SUBDIRS += test
 endif
 
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
 EXTRA_DIST = \
   thrift-idl.xsd \
   test
diff --git a/lib/xml/test/Makefile.am b/lib/xml/test/Makefile.am
index bb87a52..16bcfae 100644
--- a/lib/xml/test/Makefile.am
+++ b/lib/xml/test/Makefile.am
@@ -20,6 +20,9 @@
 check:
 	$(ANT) $(ANT_FLAGS) test
 
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
 # Make sure this doesn't fail if ant is not configured.
 clean-local:
 	ANT=$(ANT) ; if test -z "$$ANT" ; then ANT=: ; fi ; \
diff --git a/package-lock.json b/package-lock.json
index 5c3b06d..8fc75aa 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -6,7 +6,7 @@
   "packages": {
     "": {
       "name": "thrift",
-      "version": "0.20.0",
+      "version": "0.21.0",
       "license": "Apache-2.0",
       "dependencies": {
         "browser-or-node": "^1.2.1",
@@ -3923,9 +3923,9 @@
       }
     },
     "node_modules/ws": {
-      "version": "5.2.3",
-      "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.3.tgz",
-      "integrity": "sha512-jZArVERrMsKUatIdnLzqvcfydI85dvd/Fp1u/VOpfdDWQ4c9qWXe+VIeAbQ5FrDwciAkr+lzofXLz3Kuf26AOA==",
+      "version": "5.2.4",
+      "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.4.tgz",
+      "integrity": "sha512-fFCejsuC8f9kOSu9FYaOw8CdO68O3h5v0lg4p74o8JqWpwTf9tniOD+nOB78aWoVSS6WptVUmDrp/KPsMVBWFQ==",
       "dependencies": {
         "async-limiter": "~1.0.0"
       }
diff --git a/test/Makefile.am b/test/Makefile.am
index d5f1434..bc0cd63 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -120,6 +120,9 @@
 	find $(distdir) -type d -name "__pycache__" | xargs rm -rf
 	find $(distdir) -type f -name "*.pyc" | xargs rm -f
 
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
 EXTRA_DIST = \
 	audit \
 	c_glib \
@@ -144,6 +147,7 @@
 	AnnotationTest.thrift \
 	BrokenConstants.thrift \
 	ConstantsDemo.thrift \
+	v0.16/ConstantsDemo.thrift \
 	DebugProtoTest.thrift \
 	v0.16/DebugProtoTest.thrift \
 	DenseLinkingTest.thrift \
@@ -159,6 +163,7 @@
 	ManyOptionals.thrift \
 	ManyTypedefs.thrift \
 	NameConflictTest.thrift \
+	v0.16/NameConflictTest.thrift \
 	OptionalRequiredTest.thrift \
 	Recursive.thrift \
 	ReuseObjects.thrift \
diff --git a/test/c_glib/Makefile.am b/test/c_glib/Makefile.am
index f55a977..4471425 100644
--- a/test/c_glib/Makefile.am
+++ b/test/c_glib/Makefile.am
@@ -78,5 +78,8 @@
 	$(RM) $(distdir)/libtestcglib.la
 	find $(distdir) -type f -iname "*.o" | xargs rm -f
 
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
 EXTRA_DIST = \
 	src
diff --git a/test/cl/Makefile.am b/test/cl/Makefile.am
index b5e72bc..c9705f1 100755
--- a/test/cl/Makefile.am
+++ b/test/cl/Makefile.am
@@ -35,6 +35,9 @@
 	$(RM) TestServer
 	$(RM) TestClient
 
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
 EXTRA_DIST = \
 	implementation.lisp \
 	make-test-client.lisp \
diff --git a/test/cpp/CMakeLists.txt b/test/cpp/CMakeLists.txt
index f693a27..a6c1fd5 100644
--- a/test/cpp/CMakeLists.txt
+++ b/test/cpp/CMakeLists.txt
@@ -100,7 +100,7 @@
 #
 
 add_custom_command(OUTPUT gen-cpp/SecondService.cpp gen-cpp/SecondService.h gen-cpp/ThriftTest.cpp gen-cpp/ThriftTest.h gen-cpp/ThriftTest_types.cpp gen-cpp/ThriftTest_constants.cpp
-    COMMAND ${THRIFT_COMPILER} --gen cpp:templates,cob_style -r ${PROJECT_SOURCE_DIR}/test/v0.16/ThriftTest.thrift
+    COMMAND ${THRIFT_COMPILER} --gen cpp:templates,cob_style -r ${PROJECT_SOURCE_DIR}/test/ThriftTest.thrift
 )
 
 add_custom_command(OUTPUT gen-cpp/Service.cpp
diff --git a/test/cpp/Makefile.am b/test/cpp/Makefile.am
index 9e8b676..595f7a4 100644
--- a/test/cpp/Makefile.am
+++ b/test/cpp/Makefile.am
@@ -116,6 +116,9 @@
 style-local:
 	$(CPPSTYLE_CMD)
 
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
 EXTRA_DIST = \
 	src/TestClient.cpp \
 	src/TestServer.cpp \
diff --git a/test/cpp/src/StressTest.cpp b/test/cpp/src/StressTest.cpp
index 79a708e..a424620 100644
--- a/test/cpp/src/StressTest.cpp
+++ b/test/cpp/src/StressTest.cpp
@@ -155,7 +155,7 @@
       loopEchoString();
       break;
     default:
-      cerr << "Unexpected loop type" << _loopType << endl;
+      cerr << "Unexpected loop type" << _loopType << '\n';
       break;
     }
 
@@ -280,23 +280,23 @@
   usage << argv[0] << " [--port=<port number>] [--server] [--server-type=<server-type>] "
                       "[--protocol-type=<protocol-type>] [--workers=<worker-count>] "
                       "[--clients=<client-count>] [--loop=<loop-count>] "
-                      "[--client-type=<client-type>]" << endl
+                      "[--client-type=<client-type>]" << '\n'
         << "\tclients        Number of client threads to create - 0 implies no clients, i.e. "
-                            "server only.  Default is " << clientCount << endl
-        << "\thelp           Prints this help text." << endl
-        << "\tcall           Service method to call.  Default is " << callName << endl
-        << "\tloop           The number of remote thrift calls each client makes.  Default is " << loopCount << endl
+                            "server only.  Default is " << clientCount << '\n'
+        << "\thelp           Prints this help text." << '\n'
+        << "\tcall           Service method to call.  Default is " << callName << '\n'
+        << "\tloop           The number of remote thrift calls each client makes.  Default is " << loopCount << '\n'
         << "\tport           The port the server and clients should bind to "
-                            "for thrift network connections.  Default is " << port << endl
-        << "\tserver         Run the Thrift server in this process.  Default is " << runServer << endl
-        << "\tserver-type    Type of server, \"simple\" or \"thread-pool\".  Default is " << serverType << endl
-        << "\tprotocol-type  Type of protocol, \"binary\", \"ascii\", or \"xml\".  Default is " << protocolType << endl
-        << "\tlog-request    Log all request to ./requestlog.tlog. Default is " << logRequests << endl
-        << "\treplay-request Replay requests from log file (./requestlog.tlog) Default is " << replayRequests << endl
+                            "for thrift network connections.  Default is " << port << '\n'
+        << "\tserver         Run the Thrift server in this process.  Default is " << runServer << '\n'
+        << "\tserver-type    Type of server, \"simple\" or \"thread-pool\".  Default is " << serverType << '\n'
+        << "\tprotocol-type  Type of protocol, \"binary\", \"ascii\", or \"xml\".  Default is " << protocolType << '\n'
+        << "\tlog-request    Log all request to ./requestlog.tlog. Default is " << logRequests << '\n'
+        << "\treplay-request Replay requests from log file (./requestlog.tlog) Default is " << replayRequests << '\n'
         << "\tworkers        Number of thread pools workers.  Only valid "
-                            "for thread-pool server type.  Default is " << workerCount << endl
-        << "\tclient-type    Type of client, \"regular\" or \"concurrent\".  Default is " << clientType << endl
-        << endl;
+                            "for thread-pool server type.  Default is " << workerCount << '\n'
+        << "\tclient-type    Type of client, \"regular\" or \"concurrent\".  Default is " << clientType << '\n'
+        << '\n';
 
   map<string, string> args;
 
@@ -386,7 +386,7 @@
     }
 
   } catch (std::exception& e) {
-    cerr << e.what() << endl;
+    cerr << e.what() << '\n';
     cerr << usage.str();
   }
 
@@ -468,7 +468,7 @@
     server->setServerEventHandler(observer);
     std::shared_ptr<Thread> serverThread = threadFactory->newThread(server);
 
-    cerr << "Starting the server on port " << port << endl;
+    cerr << "Starting the server on port " << port << '\n';
 
     serverThread->start();
     observer->waitForService();
@@ -538,7 +538,7 @@
       Synchronized s(monitor);
       threadCount = clientCount;
 
-      cerr << "Launch " << clientCount << " " << clientType << " client threads" << endl;
+      cerr << "Launch " << clientCount << " " << clientType << " client threads" << '\n';
 
       time00 = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::steady_clock::now().time_since_epoch()).count();
 
@@ -591,14 +591,14 @@
     averageTime /= clientCount;
 
     cout << "workers :" << workerCount << ", client : " << clientCount << ", loops : " << loopCount
-         << ", rate : " << (clientCount * loopCount * 1000) / ((double)(time01 - time00)) << endl;
+         << ", rate : " << (clientCount * loopCount * 1000) / ((double)(time01 - time00)) << '\n';
 
     count_map count = serviceHandler->getCount();
     count_map::iterator iter;
     for (iter = count.begin(); iter != count.end(); ++iter) {
       printf("%s => %d\n", iter->first, iter->second);
     }
-    cerr << "done." << endl;
+    cerr << "done." << '\n';
   }
 
   return 0;
diff --git a/test/cpp/src/StressTestNonBlocking.cpp b/test/cpp/src/StressTestNonBlocking.cpp
index e94ecb2..d9d9ae6 100644
--- a/test/cpp/src/StressTestNonBlocking.cpp
+++ b/test/cpp/src/StressTestNonBlocking.cpp
@@ -152,7 +152,7 @@
       loopEchoString();
       break;
     default:
-      cerr << "Unexpected loop type" << _loopType << endl;
+      cerr << "Unexpected loop type" << _loopType << '\n';
       break;
     }
 
@@ -253,24 +253,20 @@
 
   usage << argv[0] << " [--port=<port number>] [--server] [--server-type=<server-type>] "
                       "[--protocol-type=<protocol-type>] [--workers=<worker-count>] "
-                      "[--clients=<client-count>] [--loop=<loop-count>]" << endl
+                      "[--clients=<client-count>] [--loop=<loop-count>]" << '\n'
         << "\tclients        Number of client threads to create - 0 implies no clients, i.e. "
-           "server only.  Default is " << clientCount << endl
-        << "\thelp           Prints this help text." << endl
-        << "\tcall           Service method to call.  Default is " << callName << endl
-        << "\tloop           The number of remote thrift calls each client makes.  Default is "
-        << loopCount << endl << "\tport           The port the server and clients should bind to "
-                                "for thrift network connections.  Default is " << port << endl
-        << "\tserver         Run the Thrift server in this process.  Default is " << runServer
-        << endl << "\tserver-type    Type of server, \"simple\" or \"thread-pool\".  Default is "
-        << serverType << endl
-        << "\tprotocol-type  Type of protocol, \"binary\", \"ascii\", or \"xml\".  Default is "
-        << protocolType << endl
-        << "\tlog-request    Log all request to ./requestlog.tlog. Default is " << logRequests
-        << endl << "\treplay-request Replay requests from log file (./requestlog.tlog) Default is "
-        << replayRequests << endl << "\tworkers        Number of thread pools workers.  Only valid "
-                                     "for thread-pool server type.  Default is " << workerCount
-        << endl;
+                            "server only.  Default is " << clientCount << '\n'
+        << "\thelp           Prints this help text." << '\n'
+        << "\tcall           Service method to call.  Default is " << callName << '\n'
+        << "\tloop           The number of remote thrift calls each client makes.  Default is " << loopCount << '\n'
+        << "\tport           The port the server and clients should bind to for thrift network "
+                            "connections.  Default is " << port << '\n'
+        << "\tserver         Run the Thrift server in this process.  Default is " << runServer << '\n'
+        << "\tserver-type    Type of server, \"simple\" or \"thread-pool\".  Default is " << serverType << '\n'
+        << "\tprotocol-type  Type of protocol, \"binary\", \"ascii\", or \"xml\".  Default is " << protocolType << '\n'
+        << "\tlog-request    Log all request to ./requestlog.tlog. Default is " << logRequests << '\n'
+        << "\treplay-request Replay requests from log file (./requestlog.tlog) Default is " << replayRequests << '\n'
+        << "\tworkers        Number of thread pools workers.  Only valid for thread-pool server type.  Default is " << workerCount << '\n';
 
   map<string, string> args;
 
@@ -338,7 +334,7 @@
     }
 
   } catch (std::exception& e) {
-    cerr << e.what() << endl;
+    cerr << e.what() << '\n';
     cerr << usage.str();
   }
 
@@ -416,7 +412,7 @@
           new TNonblockingServer(serviceProcessor, protocolFactory, nbSocket2, threadManager)));
     }
 
-    cerr << "Starting the server on port " << port << " and " << (port + 1) << endl;
+    cerr << "Starting the server on port " << port << " and " << (port + 1) << '\n';
     serverThread->start();
     serverThread2->start();
 
@@ -475,7 +471,7 @@
       Synchronized s(monitor);
       threadCount = clientCount;
 
-      cerr << "Launch " << clientCount << " client threads" << endl;
+      cerr << "Launch " << clientCount << " client threads" << '\n';
 
       time00 = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::steady_clock::now().time_since_epoch()).count();
 
@@ -528,14 +524,14 @@
     averageTime /= clientCount;
 
     cout << "workers :" << workerCount << ", client : " << clientCount << ", loops : " << loopCount
-         << ", rate : " << (clientCount * loopCount * 1000) / ((double)(time01 - time00)) << endl;
+         << ", rate : " << (clientCount * loopCount * 1000) / ((double)(time01 - time00)) << '\n';
 
     count_map count = serviceHandler->getCount();
     count_map::iterator iter;
     for (iter = count.begin(); iter != count.end(); ++iter) {
       printf("%s => %d\n", iter->first, iter->second);
     }
-    cerr << "done." << endl;
+    cerr << "done." << '\n';
   }
 
   return 0;
diff --git a/test/cpp/src/TestClient.cpp b/test/cpp/src/TestClient.cpp
index c4146cc..6bda294 100644
--- a/test/cpp/src/TestClient.cpp
+++ b/test/cpp/src/TestClient.cpp
@@ -70,7 +70,7 @@
 //
 
 template<typename Proto>
-class TPedanticProtocol : public Proto 
+class TPedanticProtocol : public Proto
 {
     public:
         TPedanticProtocol(std::shared_ptr<TTransport>& transport)
@@ -98,7 +98,7 @@
                 ss << "ERROR: send request with seqid " << m_last_seqid << " and got reply with seqid " << seqid;
                 throw std::logic_error(ss.str());
             } /* else {
-                std::cout << "verified seqid " << m_last_seqid << " round trip OK" << std::endl;
+                std::cout << "verified seqid " << m_last_seqid << " round trip OK" << '\n';
             } */
             return result;
         }
@@ -127,9 +127,9 @@
     std::ostringstream os;
     os << "test" << testNr;
     const bool ok = (s == os.str());
-    cout << "testString: " << s << " " << ((ok) ? "ok" : "failed") << endl;
+    cout << "testString: " << s << " " << ((ok) ? "ok" : "failed") << '\n';
   } catch (TException& exn) {
-    cout << "Error: " << exn.what() << endl;
+    cout << "Error: " << exn.what() << '\n';
   }
 
   if (testNr == 9)
@@ -139,7 +139,7 @@
 static void testVoid_clientReturn(event_base* base, ThriftTestCobClient* client) {
   try {
     client->recv_testVoid();
-    cout << "testVoid" << endl;
+    cout << "testVoid" << '\n';
 
     for (int testNr = 0; testNr < 10; ++testNr) {
       std::ostringstream os;
@@ -151,16 +151,16 @@
                        os.str());
     }
   } catch (TException& exn) {
-    cout << "Error: " << exn.what() << endl;
+    cout << "Error: " << exn.what() << '\n';
   }
 }
 
 // Workaround for absense of C++11 "auto" keyword.
 template <typename T>
 bool print_eq(T expected, T actual) {
-  cout << "(" << actual << ")" << endl;
+  cout << "(" << actual << ")" << '\n';
   if (expected != actual) {
-    cout << "*** FAILED ***" << endl << "Expected: " << expected << " but got: " << actual << endl;
+    cout << "*** FAILED ***" << '\n' << "Expected: " << expected << " but got: " << actual << '\n';
     return false;
   }
   return true;
@@ -174,7 +174,19 @@
   } catch (TTransportException&) {                                                                 \
     throw;                                                                                         \
   } catch (exception & ex) {                                                                       \
-    cout << "*** FAILED ***" << endl << ex.what() << endl;                                         \
+    cout << "*** FAILED ***" << '\n' << ex.what() << '\n';                                         \
+    return_code |= ERR_BASETYPES;                                                                  \
+  }
+
+#define UUID_TEST(func, value, expected)                                                           \
+  cout << #func "(" << value << ") = ";                                                            \
+  try {                                                                                            \
+    if (!print_eq(expected, testClient.func(value)))                                               \
+      return_code |= ERR_BASETYPES;                                                                \
+  } catch (TTransportException&) {                                                                 \
+    throw;                                                                                         \
+  } catch (exception & ex) {                                                                       \
+    cout << "*** FAILED ***" << '\n' << ex.what() << '\n';                                         \
     return_code |= ERR_BASETYPES;                                                                  \
   }
 
@@ -246,7 +258,7 @@
   boost::program_options::notify(vm);
 
   if (vm.count("help")) {
-    cout << desc << endl;
+    cout << desc << '\n';
     return ERR_UNKNOWN;
   }
 
@@ -278,8 +290,8 @@
     }
 
   } catch (exception& e) {
-    cerr << e.what() << endl;
-    cout << desc << endl;
+    cerr << e.what() << '\n';
+    cout << desc << '\n';
     return ERR_UNKNOWN;
   }
 
@@ -307,9 +319,9 @@
   std::shared_ptr<TProtocol> protocol2;  // SecondService for multiplexed
 
   if (ssl) {
-    cout << "Client Certificate File: " << certPath << endl;
-    cout << "Client Key         File: " << keyPath << endl;
-    cout << "CA                 File: " << caPath << endl;
+    cout << "Client Certificate File: " << certPath << '\n';
+    cout << "Client Key         File: " << keyPath << '\n';
+    cout << "CA                 File: " << caPath << '\n';
 
     factory = std::shared_ptr<TSSLSocketFactory>(new TSSLSocketFactory());
     factory->ciphers("ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH");
@@ -374,14 +386,14 @@
   if (port != 0) {
     cout << host << ":" << port;
   }
-  cout << endl;
+  cout << '\n';
 
   if (transport_type.compare("evhttp") == 0) {
     event_base* base = event_base_new();
-    cout << "Libevent Version: " << event_get_version() << endl;
-    cout << "Libevent Method: " << event_base_get_method(base) << endl;
+    cout << "Libevent Version: " << event_get_version() << '\n';
+    cout << "Libevent Method: " << event_base_get_method(base) << '\n';
 #if LIBEVENT_VERSION_NUMBER >= 0x02000000
-    cout << "Libevent Features: 0x" << hex << event_base_get_features(base) << endl;
+    cout << "Libevent Features: 0x" << hex << event_base_get_features(base) << '\n';
 #endif
 
     std::shared_ptr<TProtocolFactory> protocolFactory(new TBinaryProtocolFactory());
@@ -409,7 +421,7 @@
     try {
       transport->open();
     } catch (TTransportException& ex) {
-      cout << "Connect failed: " << ex.what() << endl;
+      cout << "Connect failed: " << ex.what() << '\n';
       return ERR_UNKNOWN;
     }
 
@@ -426,12 +438,12 @@
     try {
       cout << "testVoid()" << flush;
       testClient.testVoid();
-      cout << " = void" << endl;
+      cout << " = void" << '\n';
     } catch (TTransportException&) {
       // Stop here if transport got broken
       throw;
     } catch (exception& ex) {
-      cout << "*** FAILED ***" << endl << ex.what() << endl;
+      cout << "*** FAILED ***" << '\n' << ex.what() << '\n';
       return_code |= ERR_BASETYPES;
     }
 
@@ -441,9 +453,9 @@
     cout << "testString(\"Test\")" << flush;
     string s;
     testClient.testString(s, "Test");
-    cout << " = " << s << endl;
+    cout << " = " << s << '\n';
     if (s != "Test") {
-      cout << "*** FAILED ***" << endl;
+      cout << "*** FAILED ***" << '\n';
       return_code |= ERR_BASETYPES;
     }
 
@@ -459,9 +471,9 @@
           cout << "secondService.secondTestString(\"foo\") => " << flush;
         std::string result;
       ssc.secondtestString(result, "foo");
-      cout << "{" << result << "}" << endl;
+      cout << "{" << result << "}" << '\n';
       } catch (std::exception& e) {
-      cout << "  *** FAILED *** " << e.what() << endl;
+      cout << "  *** FAILED *** " << e.what() << '\n';
       return_code |= ERR_EXCEPTIONS;
     }
     }
@@ -502,16 +514,16 @@
 #endif
       cout << "testString(" << str << ") = " << flush;
       testClient.testString(s, str);
-      cout << s << endl;
+      cout << s << '\n';
       if (s != str) {
         cout.imbue(locale("en_US.UTF8"));
-        cout << "*** FAILED ***" << endl << "Expected string: " << str << " but got: " << s << endl << "CLEAR";
+        cout << "*** FAILED ***" << '\n' << "Expected string: " << str << " but got: " << s << '\n' << "CLEAR";
         return_code |= ERR_BASETYPES;
       }
     } catch (TTransportException&) {
       throw;
     } catch (exception& ex) {
-      cout << "*** FAILED ***" << endl << ex.what() << endl;
+      cout << "*** FAILED ***" << '\n' << ex.what() << '\n';
       return_code |= ERR_BASETYPES;
       return return_code;
     }
@@ -525,11 +537,11 @@
           " char-to-test-json-parsing: ]] \"]] \\\" }}}{ [[[ ");
       cout << "testString(" << str << ") = " << flush;
       testClient.testString(s, str);
-      cout << s << endl;
+      cout << s << '\n';
       if (s != str) {
         cout.imbue(locale("en_US.UTF8"));
-        cout << "*** FAILED ***" << endl
-             << "Expected string: " << str << " but got: " << s << endl
+        cout << "*** FAILED ***" << '\n'
+             << "Expected string: " << str << " but got: " << s << '\n'
              << "CLEAR";
         ;
         return_code |= ERR_BASETYPES;
@@ -537,7 +549,7 @@
     } catch (TTransportException&) {
       throw;
     } catch (exception& ex) {
-      cout << "*** FAILED ***" << endl << ex.what() << endl;
+      cout << "*** FAILED ***" << '\n' << ex.what() << '\n';
       return_code |= ERR_BASETYPES;
       return return_code;
     }
@@ -602,15 +614,15 @@
       double expected = pow(static_cast<double>(10), 307);
       cout << "testDouble(" << expected << ") = " << flush;
       double actual = testClient.testDouble(expected);
-      cout << "(" << actual << ")" << endl;
+      cout << "(" << actual << ")" << '\n';
       if (expected - actual > pow(static_cast<double>(10), 292)) {
-        cout << "*** FAILED ***" << endl
-             << "Expected: " << expected << " but got: " << actual << endl;
+        cout << "*** FAILED ***" << '\n'
+             << "Expected: " << expected << " but got: " << actual << '\n';
       }
     } catch (TTransportException&) {
       throw;
     } catch (exception& ex) {
-      cout << "*** FAILED ***" << endl << ex.what() << endl;
+      cout << "*** FAILED ***" << '\n' << ex.what() << '\n';
       return_code |= ERR_BASETYPES;
     }
 
@@ -618,15 +630,15 @@
       double expected = pow(static_cast<double>(10), -292);
       cout << "testDouble(" << expected << ") = " << flush;
       double actual = testClient.testDouble(expected);
-      cout << "(" << actual << ")" << endl;
+      cout << "(" << actual << ")" << '\n';
       if (expected - actual > pow(static_cast<double>(10), -307)) {
-        cout << "*** FAILED ***" << endl
-             << "Expected: " << expected << " but got: " << actual << endl;
+        cout << "*** FAILED ***" << '\n'
+             << "Expected: " << expected << " but got: " << actual << '\n';
       }
     } catch (TTransportException&) {
       throw;
     } catch (exception& ex) {
-      cout << "*** FAILED ***" << endl << ex.what() << endl;
+      cout << "*** FAILED ***" << '\n' << ex.what() << '\n';
       return_code |= ERR_BASETYPES;
     }
 
@@ -638,6 +650,15 @@
       if (i > 0) { i *= 2; } else { ++i; }
     }
 
+    /**
+     * UUID TEST
+     */
+    const TUuid expected_uuid{"5e2ab188-1726-4e75-a04f-1ed9a6a89c4c"};
+    UUID_TEST(testUuid, TUuid{"{5e2ab188-1726-4e75-a04f-1ed9a6a89c4c}"}, expected_uuid);
+    UUID_TEST(testUuid, TUuid{"5e2ab188-1726-4e75-a04f-1ed9a6a89c4c"}, expected_uuid);
+    UUID_TEST(testUuid, TUuid{"5e2ab18817264e75a04f1ed9a6a89c4c"}, expected_uuid);
+    UUID_TEST(testUuid, TUuid{"{5e2ab18817264e75a04f1ed9a6a89c4c}"}, expected_uuid);
+    UUID_TEST(testUuid, TUuid{}, TUuid{"00000000-0000-0000-0000-000000000000"});
 
     /**
      * STRUCT TEST
@@ -656,7 +677,7 @@
            in.i32_thing,
            in.i64_thing);
     if (in != out) {
-      cout << "*** FAILED ***" << endl;
+      cout << "*** FAILED ***" << '\n';
       return_code |= ERR_STRUCTS;
     }
 
@@ -679,7 +700,7 @@
            in.i64_thing,
            in2.i32_thing);
     if (in2 != out2) {
-      cout << "*** FAILED ***" << endl;
+      cout << "*** FAILED ***" << '\n';
       return_code |= ERR_STRUCTS;
     }
 
@@ -714,9 +735,9 @@
       }
       cout << m_iter->first << " => " << m_iter->second;
     }
-    cout << "}" << endl;
+    cout << "}" << '\n';
     if (mapin != mapout) {
-      cout << "*** FAILED ***" << endl;
+      cout << "*** FAILED ***" << '\n';
       return_code |= ERR_CONTAINERS;
     }
 
@@ -739,15 +760,15 @@
           first = false;
         cout << it->first << " => " << it->second;
       }
-      cout << "}" << endl;
+      cout << "}" << '\n';
       if (smapin != smapout) {
-        cout << "*** FAILED ***" << endl;
+        cout << "*** FAILED ***" << '\n';
         return_code |= ERR_CONTAINERS;
       }
     } catch (TTransportException&) {
       throw;
     } catch (exception& ex) {
-      cout << "*** FAILED ***" << endl << ex.what() << endl;
+      cout << "*** FAILED ***" << '\n' << ex.what() << '\n';
       return_code |= ERR_CONTAINERS;
     }
 
@@ -782,9 +803,9 @@
       }
       cout << *s_iter;
     }
-    cout << "}" << endl;
+    cout << "}" << '\n';
     if (setin != setout) {
-      cout << "*** FAILED ***" << endl;
+      cout << "*** FAILED ***" << '\n';
       return_code |= ERR_CONTAINERS;
     }
 
@@ -796,14 +817,14 @@
       vector<int32_t> listout;
       testClient.testList(listout, vector<int32_t>());
       if (!listout.empty()) {
-        cout << "*** FAILED ***" << endl;
-        cout << "invalid length: " << listout.size() << endl;
+        cout << "*** FAILED ***" << '\n';
+        cout << "invalid length: " << listout.size() << '\n';
         return_code |= ERR_CONTAINERS;
       }
     } catch (TTransportException&) {
       throw;
     } catch (exception& ex) {
-      cout << "*** FAILED ***" << endl << ex.what() << endl;
+      cout << "*** FAILED ***" << '\n' << ex.what() << '\n';
       return_code |= ERR_CONTAINERS;
     }
     try {
@@ -835,15 +856,15 @@
         }
         cout << *l_iter;
       }
-      cout << "}" << endl;
+      cout << "}" << '\n';
       if (listin != listout) {
-        cout << "*** FAILED ***" << endl;
+        cout << "*** FAILED ***" << '\n';
         return_code |= ERR_CONTAINERS;
       }
     } catch (TTransportException&) {
       throw;
     } catch (exception& ex) {
-      cout << "*** FAILED ***" << endl << ex.what() << endl;
+      cout << "*** FAILED ***" << '\n' << ex.what() << '\n';
       return_code |= ERR_CONTAINERS;
     }
 
@@ -852,41 +873,41 @@
      */
     cout << "testEnum(ONE)" << flush;
     Numberz::type ret = testClient.testEnum(Numberz::ONE);
-    cout << " = " << ret << endl;
+    cout << " = " << ret << '\n';
     if (ret != Numberz::ONE) {
-      cout << "*** FAILED ***" << endl;
+      cout << "*** FAILED ***" << '\n';
       return_code |= ERR_STRUCTS;
     }
 
     cout << "testEnum(TWO)" << flush;
     ret = testClient.testEnum(Numberz::TWO);
-    cout << " = " << ret << endl;
+    cout << " = " << ret << '\n';
     if (ret != Numberz::TWO) {
-      cout << "*** FAILED ***" << endl;
+      cout << "*** FAILED ***" << '\n';
       return_code |= ERR_STRUCTS;
     }
 
     cout << "testEnum(THREE)" << flush;
     ret = testClient.testEnum(Numberz::THREE);
-    cout << " = " << ret << endl;
+    cout << " = " << ret << '\n';
     if (ret != Numberz::THREE) {
-      cout << "*** FAILED ***" << endl;
+      cout << "*** FAILED ***" << '\n';
       return_code |= ERR_STRUCTS;
     }
 
     cout << "testEnum(FIVE)" << flush;
     ret = testClient.testEnum(Numberz::FIVE);
-    cout << " = " << ret << endl;
+    cout << " = " << ret << '\n';
     if (ret != Numberz::FIVE) {
-      cout << "*** FAILED ***" << endl;
+      cout << "*** FAILED ***" << '\n';
       return_code |= ERR_STRUCTS;
     }
 
     cout << "testEnum(EIGHT)" << flush;
     ret = testClient.testEnum(Numberz::EIGHT);
-    cout << " = " << ret << endl;
+    cout << " = " << ret << '\n';
     if (ret != Numberz::EIGHT) {
-      cout << "*** FAILED ***" << endl;
+      cout << "*** FAILED ***" << '\n';
       return_code |= ERR_STRUCTS;
     }
 
@@ -895,9 +916,9 @@
      */
     cout << "testTypedef(309858235082523)" << flush;
     UserId uid = testClient.testTypedef(309858235082523LL);
-    cout << " = " << uid << endl;
+    cout << " = " << uid << '\n';
     if (uid != 309858235082523LL) {
-      cout << "*** FAILED ***" << endl;
+      cout << "*** FAILED ***" << '\n';
       return_code |= ERR_STRUCTS;
     }
 
@@ -917,7 +938,7 @@
       }
       cout << "}, ";
     }
-    cout << "}" << endl;
+    cout << "}" << '\n';
     if (mm.size() != 2 ||
         mm[-4][-4] != -4 ||
         mm[-4][-3] != -3 ||
@@ -927,7 +948,7 @@
         mm[4][3] != 3 ||
         mm[4][2] != 2 ||
         mm[4][1] != 1) {
-      cout << "*** FAILED ***" << endl;
+      cout << "*** FAILED ***" << '\n';
       return_code |= ERR_CONTAINERS;
     }
 
@@ -984,7 +1005,7 @@
         }
         cout << "}, ";
       }
-      cout << "}" << endl;
+      cout << "}" << '\n';
       bool failed = false;
       map<UserId, map<Numberz::type, Insanity> >::const_iterator it1 = whoa.find(UserId(1));
       if (whoa.size() != 2) {
@@ -1012,7 +1033,7 @@
         }
       }
       if (failed) {
-        cout << "*** FAILED ***" << endl;
+        cout << "*** FAILED ***" << '\n';
         return_code |= ERR_STRUCTS;
       }
     }
@@ -1020,7 +1041,7 @@
     /**
      * MULTI TEST
      */
-    cout << "testMulti()" << endl;
+    cout << "testMulti()" << '\n';
     try {
       map<int16_t, string> mul_map;
       Xtruct mul_result;
@@ -1033,13 +1054,13 @@
       xxs.i32_thing = 4242;
       xxs.i64_thing = 424242;
       if (mul_result != xxs) {
-        cout << "*** FAILED ***" << endl;
+        cout << "*** FAILED ***" << '\n';
         return_code |= ERR_STRUCTS;
       }
     } catch (TTransportException&) {
       throw;
     } catch (exception& ex) {
-      cout << "*** FAILED ***" << endl << ex.what() << endl;
+      cout << "*** FAILED ***" << '\n' << ex.what() << '\n';
       return_code |= ERR_STRUCTS;
     }
 
@@ -1048,7 +1069,7 @@
     try {
       cout << "testClient.testException(\"Xception\") =>" << flush;
       testClient.testException("Xception");
-      cout << "  void\n*** FAILED ***" << endl;
+      cout << "  void\n*** FAILED ***" << '\n';
       return_code |= ERR_EXCEPTIONS;
 
     } catch (Xception& e) {
@@ -1058,19 +1079,19 @@
     try {
       cout << "testClient.testException(\"TException\") =>" << flush;
       testClient.testException("TException");
-      cout << "  void\n*** FAILED ***" << endl;
+      cout << "  void\n*** FAILED ***" << '\n';
       return_code |= ERR_EXCEPTIONS;
 
     } catch (const TException&) {
-      cout << "  Caught TException" << endl;
+      cout << "  Caught TException" << '\n';
     }
 
     try {
       cout << "testClient.testException(\"success\") =>" << flush;
       testClient.testException("success");
-      cout << "  void" << endl;
+      cout << "  void" << '\n';
     } catch (exception & ex) {                                                                       \
-      cout << "*** FAILED ***" << endl << ex.what() << endl;
+      cout << "*** FAILED ***" << '\n' << ex.what() << '\n';
       return_code |= ERR_EXCEPTIONS;
     }
 
@@ -1080,7 +1101,7 @@
       cout << "testClient.testMultiException(\"Xception\", \"test 1\") =>" << flush;
       Xtruct result;
       testClient.testMultiException(result, "Xception", "test 1");
-      cout << "  result\n*** FAILED ***" << endl;
+      cout << "  result\n*** FAILED ***" << '\n';
       return_code |= ERR_EXCEPTIONS;
     } catch (Xception& e) {
       printf("  {%u, \"%s\"}\n", e.errorCode, e.message.c_str());
@@ -1090,7 +1111,7 @@
       cout << "testClient.testMultiException(\"Xception2\", \"test 2\") =>" << flush;
       Xtruct result;
       testClient.testMultiException(result, "Xception2", "test 2");
-      cout << "  result\n*** FAILED ***" << endl;
+      cout << "  result\n*** FAILED ***" << '\n';
       return_code |= ERR_EXCEPTIONS;
 
     } catch (Xception2& e) {
@@ -1103,7 +1124,7 @@
       testClient.testMultiException(result, "success", "test 3");
       printf("  {{\"%s\"}}\n", result.string_thing.c_str());
     } catch (exception & ex) {                                                                       \
-      cout << "*** FAILED ***" << endl << ex.what() << endl;
+      cout << "*** FAILED ***" << '\n' << ex.what() << '\n';
       return_code |= ERR_EXCEPTIONS;
     }
 
@@ -1134,16 +1155,16 @@
      */
     cout << "re-test testI32(-1)" << flush;
     int i32 = testClient.testI32(-1);
-    cout << " = " << i32 << endl;
+    cout << " = " << i32 << '\n';
     if (i32 != -1)
       return_code |= ERR_BASETYPES;
 
-    cout << endl << "All tests done." << endl << flush;
+    cout << '\n' << "All tests done." << '\n' << flush;
 
     uint64_t stop = now();
     uint64_t tot = stop - start;
 
-    cout << "Total time: " << stop - start << " us" << endl;
+    cout << "Total time: " << stop - start << " us" << '\n';
 
     time_tot += tot;
     if (time_min == 0 || tot < time_min) {
@@ -1160,9 +1181,9 @@
 
   uint64_t time_avg = time_tot / numTests;
 
-  cout << "Min time: " << time_min << " us" << endl;
-  cout << "Max time: " << time_max << " us" << endl;
-  cout << "Avg time: " << time_avg << " us" << endl;
+  cout << "Min time: " << time_min << " us" << '\n';
+  cout << "Max time: " << time_max << " us" << '\n';
+  cout << "Avg time: " << time_avg << " us" << '\n';
 
   return return_code;
 }
@@ -1204,26 +1225,26 @@
     string bin_request;
     string bin_result;
 
-    cout << "testBinary(siz = " << siz << ")" << endl;
+    cout << "testBinary(siz = " << siz << ")" << '\n';
     binary_fill(bin_request, siz);
     try {
         testClient.testBinary(bin_result, bin_request);
 
         if (bin_request.size() != bin_result.size()) {
-            cout << "*** FAILED: request size " << bin_request.size() << "; result size " << bin_result.size() << endl;
+            cout << "*** FAILED: request size " << bin_request.size() << "; result size " << bin_result.size() << '\n';
             return ERR_BASETYPES;
         }
 
         for (string::size_type i = 0; i < siz; ++i) {
             if (bin_request.at(i) != bin_result.at(i)) {
-                cout << "*** FAILED: at position " << i << " request[i] is h" << hex << bin_request.at(i) << " result[i] is h" << hex << bin_result.at(i) << endl;
+                cout << "*** FAILED: at position " << i << " request[i] is h" << hex << bin_request.at(i) << " result[i] is h" << hex << bin_result.at(i) << '\n';
                 return ERR_BASETYPES;
             }
         }
     } catch (TTransportException&) {
         throw;
     } catch (exception& ex) {
-        cout << "*** FAILED ***" << endl << ex.what() << endl;
+        cout << "*** FAILED ***" << '\n' << ex.what() << '\n';
         return ERR_BASETYPES;
     }
 
diff --git a/test/cpp/src/TestServer.cpp b/test/cpp/src/TestServer.cpp
index 65317f8..dc6e69f 100644
--- a/test/cpp/src/TestServer.cpp
+++ b/test/cpp/src/TestServer.cpp
@@ -132,6 +132,11 @@
     _return = thing;
   }
 
+  TUuid testUuid(const TUuid thing) override {
+    printf("testUuid(\"{%s}\")\n", to_string(thing).c_str());
+    return thing;
+  }
+
   void testStruct(Xtruct& out, const Xtruct& thing) override {
     printf("testStruct({\"%s\", %d, %d, %" PRId64 "})\n",
            thing.string_thing.c_str(),
@@ -389,7 +394,7 @@
   }
 
   void communicate(const char* event, void* ctx, const char* fn_name) {
-    std::cout << event << ": " << *static_cast<std::string*>(ctx) << " = " << fn_name << std::endl;
+    std::cout << event << ": " << *static_cast<std::string*>(ctx) << " = " << fn_name << '\n';
   }
 };
 
@@ -442,6 +447,11 @@
     cob(res);
   }
 
+  void testUuid(::std::function<void(TUuid const& _return)> cob, const TUuid thing) override {
+    TUuid res = _delegate->testUuid(thing);
+    cob(res);
+  }
+
   void testStruct(std::function<void(Xtruct const& _return)> cob, const Xtruct& thing) override {
     Xtruct res;
     _delegate->testStruct(res, thing);
@@ -645,7 +655,7 @@
     }
 
   } catch (std::exception& e) {
-    cerr << e.what() << endl;
+    cerr << e.what() << '\n';
     cout << desc << "\n";
     return 1;
   }
@@ -757,7 +767,7 @@
   if (port != 0) {
     cout << port;
   }
-  cout << endl;
+  cout << '\n';
 
   // Multiplexed Processor if needed
   if (boost::starts_with(protocol_type, "multi")) {
@@ -813,7 +823,7 @@
               : new transport::TNonblockingServerSocket(port));
       server.reset(new TNonblockingServer(testProcessor, protocolFactory, nbSocket));
     } else {
-      cerr << "server-type nonblocking requires transport of http or framed" << endl;
+      cerr << "server-type nonblocking requires transport of http or framed" << '\n';
       exit(1);
     }
   }
@@ -847,6 +857,6 @@
     server.reset();
   }
 
-  cout << "done." << endl;
+  cout << "done." << '\n';
   return 0;
 }
diff --git a/test/dart/Makefile.am b/test/dart/Makefile.am
index 81f2f5b..3552668 100644
--- a/test/dart/Makefile.am
+++ b/test/dart/Makefile.am
@@ -48,5 +48,8 @@
 client: stubs
 	${DART} test_client/bin/main.dart
 
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
 EXTRA_DIST = \
 	test_client
diff --git a/test/erl/Makefile.am b/test/erl/Makefile.am
index 5bc90fa..665cb7b 100644
--- a/test/erl/Makefile.am
+++ b/test/erl/Makefile.am
@@ -40,6 +40,9 @@
 	$(RM) -r .rebar/
 	$(RM) -r src/gen-erl/
 
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
 dist-hook:
 	$(RM)    $(distdir)/.generated
 	$(RM) -r $(distdir)/.rebar/
diff --git a/test/features/Makefile.am b/test/features/Makefile.am
index 337d789..4ee56f0 100644
--- a/test/features/Makefile.am
+++ b/test/features/Makefile.am
@@ -14,6 +14,9 @@
 # under the License.
 #
 
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
 EXTRA_DIST = \
 	local_thrift \
 	index.html \
diff --git a/test/go/Makefile.am b/test/go/Makefile.am
index ff7ce68..a00fc37 100644
--- a/test/go/Makefile.am
+++ b/test/go/Makefile.am
@@ -60,7 +60,12 @@
 genmock: gopath
 	sh genmock.sh
 
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
 EXTRA_DIST = \
 	src/bin \
 	src/common \
+	go.mod \
+	go.sum \
 	genmock.sh
diff --git a/test/haxe/Makefile.am b/test/haxe/Makefile.am
index d37aaa7..6274f29 100644
--- a/test/haxe/Makefile.am
+++ b/test/haxe/Makefile.am
@@ -84,6 +84,9 @@
 	sleep 10
 
 
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
 EXTRA_DIST = \
 	src \
 	cpp.hxml \
diff --git a/test/lua/Makefile.am b/test/lua/Makefile.am
index a3ab3e2..00bdf3d 100644
--- a/test/lua/Makefile.am
+++ b/test/lua/Makefile.am
@@ -30,5 +30,8 @@
 clean-local:
 	$(RM) -r gen-lua/
 
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
 dist-hook:
 	$(RM) -r $(distdir)/gen-lua/
diff --git a/test/netstd/Client/Client.csproj b/test/netstd/Client/Client.csproj
index 977303b..62b01dd 100644
--- a/test/netstd/Client/Client.csproj
+++ b/test/netstd/Client/Client.csproj
@@ -35,9 +35,9 @@
   </PropertyGroup>
 
   <ItemGroup>
-    <PackageReference Include="System.Net.Http.WinHttpHandler" Version="8.0.0" />
+    <PackageReference Include="System.Net.Http.WinHttpHandler" Version="8.0.1" />
     <PackageReference Include="System.Runtime.Serialization.Primitives" Version="[4.3,)" />
-    <PackageReference Include="System.ServiceModel.Primitives" Version="6.2.0" />
+    <PackageReference Include="System.ServiceModel.Primitives" Version="8.0.0" />
     <PackageReference Include="System.Threading" Version="[4.3,)" />
   </ItemGroup>
 
diff --git a/test/netstd/Makefile.am b/test/netstd/Makefile.am
index 9712fc2..bd06cd4 100644
--- a/test/netstd/Makefile.am
+++ b/test/netstd/Makefile.am
@@ -32,6 +32,9 @@
 	$(RM) -r Server/obj
 	$(RM) -r ThriftTest/ThriftTest
 
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
 EXTRA_DIST = \
 	Client \
 	README.md \
diff --git a/test/netstd/Server/Server.csproj b/test/netstd/Server/Server.csproj
index 359578a..94cd8b1 100644
--- a/test/netstd/Server/Server.csproj
+++ b/test/netstd/Server/Server.csproj
@@ -36,9 +36,9 @@
 
   <ItemGroup>
     <PackageReference Include="System.IO.Pipes" Version="4.3.0" />
-    <PackageReference Include="System.Net.Http.WinHttpHandler" Version="8.0.0" />
+    <PackageReference Include="System.Net.Http.WinHttpHandler" Version="8.0.1" />
     <PackageReference Include="System.Runtime.Serialization.Primitives" Version="[4.3,)" />
-    <PackageReference Include="System.ServiceModel.Primitives" Version="6.2.0" />
+    <PackageReference Include="System.ServiceModel.Primitives" Version="8.0.0" />
     <PackageReference Include="System.Threading" Version="[4.3,)" />
   </ItemGroup>
 
diff --git a/test/netstd/ThriftTest.sln b/test/netstd/ThriftTest.sln
index 7e101d9..d0a3fa8 100644
--- a/test/netstd/ThriftTest.sln
+++ b/test/netstd/ThriftTest.sln
@@ -1,7 +1,7 @@
 ﻿
 Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio Version 16
-VisualStudioVersion = 16.0.30104.148
+# Visual Studio Version 17
+VisualStudioVersion = 17.0.32112.339
 MinimumVisualStudioVersion = 10.0.40219.1
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Thrift", "..\..\lib\netstd\Thrift\Thrift.csproj", "{C20EA2A9-7660-47DE-9A49-D1EF12FB2895}"
 EndProject
@@ -11,12 +11,16 @@
 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
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Thrift.Compile.net8", "..\..\lib\netstd\Tests\Thrift.Compile.Tests\Thrift.Compile.net8\Thrift.Compile.net8.csproj", "{05FAA75C-06BE-462F-999F-63823D08C75A}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Thrift.Compile.net6", "..\..\lib\netstd\Tests\Thrift.Compile.Tests\Thrift.Compile.net6\Thrift.Compile.net6.csproj", "{761EB615-D476-4423-888E-7D7665E769B1}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Thrift.Compile.netstd2", "..\..\lib\netstd\Tests\Thrift.Compile.Tests\Thrift.Compile.netstd2\Thrift.Compile.netstd2.csproj", "{F27E60D2-23D3-4946-BB6C-A809EDBEFE2C}"
+EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Any CPU = Debug|Any CPU
@@ -75,18 +79,6 @@
 		{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
@@ -111,6 +103,42 @@
 		{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
+		{05FAA75C-06BE-462F-999F-63823D08C75A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{05FAA75C-06BE-462F-999F-63823D08C75A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{05FAA75C-06BE-462F-999F-63823D08C75A}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{05FAA75C-06BE-462F-999F-63823D08C75A}.Debug|x64.Build.0 = Debug|Any CPU
+		{05FAA75C-06BE-462F-999F-63823D08C75A}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{05FAA75C-06BE-462F-999F-63823D08C75A}.Debug|x86.Build.0 = Debug|Any CPU
+		{05FAA75C-06BE-462F-999F-63823D08C75A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{05FAA75C-06BE-462F-999F-63823D08C75A}.Release|Any CPU.Build.0 = Release|Any CPU
+		{05FAA75C-06BE-462F-999F-63823D08C75A}.Release|x64.ActiveCfg = Release|Any CPU
+		{05FAA75C-06BE-462F-999F-63823D08C75A}.Release|x64.Build.0 = Release|Any CPU
+		{05FAA75C-06BE-462F-999F-63823D08C75A}.Release|x86.ActiveCfg = Release|Any CPU
+		{05FAA75C-06BE-462F-999F-63823D08C75A}.Release|x86.Build.0 = Release|Any CPU
+		{761EB615-D476-4423-888E-7D7665E769B1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{761EB615-D476-4423-888E-7D7665E769B1}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{761EB615-D476-4423-888E-7D7665E769B1}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{761EB615-D476-4423-888E-7D7665E769B1}.Debug|x64.Build.0 = Debug|Any CPU
+		{761EB615-D476-4423-888E-7D7665E769B1}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{761EB615-D476-4423-888E-7D7665E769B1}.Debug|x86.Build.0 = Debug|Any CPU
+		{761EB615-D476-4423-888E-7D7665E769B1}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{761EB615-D476-4423-888E-7D7665E769B1}.Release|Any CPU.Build.0 = Release|Any CPU
+		{761EB615-D476-4423-888E-7D7665E769B1}.Release|x64.ActiveCfg = Release|Any CPU
+		{761EB615-D476-4423-888E-7D7665E769B1}.Release|x64.Build.0 = Release|Any CPU
+		{761EB615-D476-4423-888E-7D7665E769B1}.Release|x86.ActiveCfg = Release|Any CPU
+		{761EB615-D476-4423-888E-7D7665E769B1}.Release|x86.Build.0 = Release|Any CPU
+		{F27E60D2-23D3-4946-BB6C-A809EDBEFE2C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{F27E60D2-23D3-4946-BB6C-A809EDBEFE2C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{F27E60D2-23D3-4946-BB6C-A809EDBEFE2C}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{F27E60D2-23D3-4946-BB6C-A809EDBEFE2C}.Debug|x64.Build.0 = Debug|Any CPU
+		{F27E60D2-23D3-4946-BB6C-A809EDBEFE2C}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{F27E60D2-23D3-4946-BB6C-A809EDBEFE2C}.Debug|x86.Build.0 = Debug|Any CPU
+		{F27E60D2-23D3-4946-BB6C-A809EDBEFE2C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{F27E60D2-23D3-4946-BB6C-A809EDBEFE2C}.Release|Any CPU.Build.0 = Release|Any CPU
+		{F27E60D2-23D3-4946-BB6C-A809EDBEFE2C}.Release|x64.ActiveCfg = Release|Any CPU
+		{F27E60D2-23D3-4946-BB6C-A809EDBEFE2C}.Release|x64.Build.0 = Release|Any CPU
+		{F27E60D2-23D3-4946-BB6C-A809EDBEFE2C}.Release|x86.ActiveCfg = Release|Any CPU
+		{F27E60D2-23D3-4946-BB6C-A809EDBEFE2C}.Release|x86.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
diff --git a/test/perl/Makefile.am b/test/perl/Makefile.am
index 589fe62..0064a6e 100644
--- a/test/perl/Makefile.am
+++ b/test/perl/Makefile.am
@@ -27,5 +27,8 @@
 clean-local:
 	$(RM) -r gen-perl/
 
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
 dist-hook:
 	$(RM) -r $(distdir)/gen-perl/
diff --git a/test/php/Client.php b/test/php/Client.php
new file mode 100644
index 0000000..1cd4241
--- /dev/null
+++ b/test/php/Client.php
@@ -0,0 +1,26 @@
+<?php
+
+use Thrift\Protocol\TCompactProtocol;
+use Thrift\Transport\THttpClient;
+
+error_reporting(E_ALL);
+
+require_once __DIR__ . '/../../vendor/autoload.php';
+
+$loader = new Thrift\ClassLoader\ThriftClassLoader();
+$loader->registerDefinition('ThriftTest', __DIR__ . '/../../lib/php/test/Resources/packages/phpcm');
+$loader->register();
+
+
+$transport = new THttpClient('localhost', 80);
+
+$transport->setTimeoutSecs($this->timeoutSec);
+
+$transport->addHeaders($this->generateAuthHeader());
+
+$protocol = new TCompactProtocol($transport);
+
+$transport->open();
+
+$client = new \ThriftTest\ThriftTestClient($protocol);
+$client->testVoid();
diff --git a/test/php/Handler.php b/test/php/Handler.php
new file mode 100644
index 0000000..5ca06a2
--- /dev/null
+++ b/test/php/Handler.php
@@ -0,0 +1,114 @@
+<?php
+
+class Handler implements \ThriftTest\ThriftTestIf
+{
+    public function testVoid()
+    {
+        return;
+    }
+
+    public function testString($thing)
+    {
+        return $thing;
+    }
+
+    public function testBool($thing)
+    {
+        return $thing;
+    }
+
+    public function testByte($thing)
+    {
+        return $thing;
+    }
+
+    public function testI32($thing)
+    {
+        return $thing;
+    }
+
+    public function testI64($thing)
+    {
+        return $thing;
+    }
+
+    public function testDouble($thing)
+    {
+        return $thing;
+    }
+
+    public function testBinary($thing)
+    {
+        return $thing;
+    }
+
+    public function testStruct(\ThriftTest\Xtruct $thing)
+    {
+        return $thing;
+    }
+
+    public function testNest(\ThriftTest\Xtruct2 $thing)
+    {
+        return $thing;
+    }
+
+    public function testMap(array $thing)
+    {
+        return $thing;
+    }
+
+    public function testStringMap(array $thing)
+    {
+        return $thing;
+    }
+
+    public function testSet(array $thing)
+    {
+        return $thing;
+    }
+
+    public function testList(array $thing)
+    {
+        return $thing;
+    }
+
+    public function testEnum($thing)
+    {
+        return $thing;
+    }
+
+    public function testTypedef($thing)
+    {
+        return $thing;
+    }
+
+    public function testMapMap($hello)
+    {
+        return $hello;
+    }
+
+    public function testInsanity(\ThriftTest\Insanity $argument)
+    {
+        return $argument;
+    }
+
+    public function testMulti($arg0, $arg1, $arg2, array $arg3, $arg4, $arg5)
+    {
+        // TODO: Implement testMulti() method.
+    }
+
+    public function testException($arg)
+    {
+        throw new \Exception($arg);
+    }
+
+    public function testMultiException($arg0, $arg1)
+    {
+        throw new \Exception($arg0, $arg1);
+    }
+
+    public function testOneway($secondsToSleep)
+    {
+        sleep($secondsToSleep);
+    }
+}
diff --git a/test/php/Makefile.am b/test/php/Makefile.am
index b1ac686..1cffdd4 100644
--- a/test/php/Makefile.am
+++ b/test/php/Makefile.am
@@ -37,6 +37,9 @@
 	$(RM) -r gen-*/
 	$(RM) -r php_ext_dir
 
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
 dist-hook:
 	$(RM) -r $(distdir)/gen-*/
 	$(RM) -r $(distdir)/php_ext_dir/
diff --git a/test/php/TestServer.php b/test/php/TestServer.php
new file mode 100644
index 0000000..3b01752
--- /dev/null
+++ b/test/php/TestServer.php
@@ -0,0 +1,87 @@
+<?php
+
+error_reporting(E_ALL);
+
+require_once __DIR__ . '/../../vendor/autoload.php';
+
+$opts = getopt(
+    'h::',
+    [
+        'port::',
+        'domain-socket::',
+        'pipe::',
+        'server-type::',
+        'transport::',
+        'protocol::',
+        'multiplex::',
+        'abstract-namespace::',
+        'ssl::',
+        'zlib::',
+        'processor-events::',
+        'workers::',
+    ]
+);
+if (isset($opts['h'])) {
+    echo <<<HELP
+      -h | --help                  produce help message
+      --port=arg (9090)            Port number to listen
+      --domain-socket=arg          Unix Domain Socket (e.g. /tmp/ThriftTest.thrift)
+      --pipe=arg                   Windows Named Pipe (e.g. MyThriftPipe)
+      --server-type=arg (simple)   type of server, "simple", "thread-pool",
+                                   "threaded", or "nonblocking"
+      --transport=arg (buffered)   transport: buffered, framed, http, anonpipe, zlib
+      --protocol=arg (binary)      protocol: binary, compact, header, json
+      --multiplex                  Add TMultiplexedProtocol service name "ThriftTest"
+      --abstract-namespace         Create the domain socket in the Abstract Namespace
+                                   (no connection with filesystem pathnames)
+      --ssl                        Encrypted Transport using SSL
+      --zlib                       Wrapped Transport using Zlib
+      --processor-events           processor-events
+      -n=arg | --workers=arg (=4)  Number of thread pools workers. Only valid for
+                                   thread-pool server type
+HELP;
+    exit(0);
+}
+
+$port = $opts['port'] ?? 9090;
+$transport = $opts['transport'] ?? 'buffered';
+
+
+$loader = new Thrift\ClassLoader\ThriftClassLoader();
+$loader->registerDefinition('ThriftTest', __DIR__ . '/../../lib/php/test/Resources/packages/phpcm');
+$loader->register();
+
+$sslOptions = \stream_context_create(
+    [
+        'ssl' => [
+            'verify_peer' => false,
+            'verify_peer_name' => false,
+        ],
+    ]
+);
+
+require_once __DIR__ . '/Handler.php';
+
+switch ($transport) {
+    case 'framed':
+        $serverTransportFactory = new \Thrift\Factory\TFramedTransportFactory();
+        break;
+    default:
+        $serverTransportFactory = new \Thrift\Factory\TTransportFactory();
+}
+
+$serverTransport = new \Thrift\Server\TServerSocket('localhost', $port);
+$handler = new Handler();
+$processor = new ThriftTest\ThriftTestProcessor($handler);
+
+$server = new \Thrift\Server\TSimpleServer(
+    $processor,
+    $serverTransport,
+    $serverTransportFactory,
+    $serverTransportFactory,
+    new \Thrift\Factory\TBinaryProtocolFactory(),
+    new \Thrift\Factory\TBinaryProtocolFactory()
+);
+
+echo "Starting the Test server...\n";
+$server->serve();
diff --git a/test/php/test_php.ini b/test/php/test_php.ini
index aeb67cb..5eecb32 100644
--- a/test/php/test_php.ini
+++ b/test/php/test_php.ini
@@ -1,3 +1,3 @@
-extension=thrift_protocol.so
-extension=json.so
-extension=sockets.so
+;extension=thrift_protocol.so
+;extension=json.so
+;extension=sockets.so
diff --git a/test/py.tornado/Makefile.am b/test/py.tornado/Makefile.am
index 3b78793..214ded2 100644
--- a/test/py.tornado/Makefile.am
+++ b/test/py.tornado/Makefile.am
@@ -32,6 +32,9 @@
 	find . -type d \( -iname "__pycache__" -or -iname "_trial_temp" \) | xargs rm -rf
 	$(RM) -r gen-py*/
 
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
 dist-hook:
 	find $(distdir) -type f \( -iname "*.pyc" \) | xargs rm -f
 	find $(distdir) -type d \( -iname "__pycache__" -or -iname "_trial_temp" \) | xargs rm -rf
diff --git a/test/py.twisted/Makefile.am b/test/py.twisted/Makefile.am
index bd0cdb1..6461d12 100644
--- a/test/py.twisted/Makefile.am
+++ b/test/py.twisted/Makefile.am
@@ -32,6 +32,9 @@
 	find . -type d \( -iname "__pycache__" -or -iname "_trial_temp" \) | xargs rm -rf
 	$(RM) -r gen-py*/
 
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
 dist-hook:
 	find $(distdir) -type f \( -iname "*.pyc" \) | xargs rm -f
 	find $(distdir) -type d \( -iname "__pycache__" -or -iname "_trial_temp" \) | xargs rm -rf
diff --git a/test/py/Makefile.am b/test/py/Makefile.am
index 7c78f17..e026077 100644
--- a/test/py/Makefile.am
+++ b/test/py/Makefile.am
@@ -54,6 +54,8 @@
         gen-py-enum/DoubleConstantsTest/__init__.py \
         gen-py-enum/Recursive/__init__.py
 
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
 
 precross: $(thrift_gen)
 BUILT_SOURCES = $(thrift_gen)
diff --git a/test/rb/Makefile.am b/test/rb/Makefile.am
index 5dd7559..9c5d557 100644
--- a/test/rb/Makefile.am
+++ b/test/rb/Makefile.am
@@ -33,5 +33,8 @@
 clean-local:
 	$(RM) -r gen-rb/
 
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
 dist-hook:
 	$(RM) -r $(distdir)/gen-rb/
diff --git a/test/rs/Makefile.am b/test/rs/Makefile.am
index 78db5ee..6f5cf93 100644
--- a/test/rs/Makefile.am
+++ b/test/rs/Makefile.am
@@ -34,6 +34,9 @@
 	-$(RM) src/thrift_test.rs
 	-$(RM) -r bin
 
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
 EXTRA_DIST = \
 	Cargo.toml \
 	src/lib.rs \
diff --git a/test/swift/CrossTests/Makefile.am b/test/swift/CrossTests/Makefile.am
index b7d8fbb..5b33232 100644
--- a/test/swift/CrossTests/Makefile.am
+++ b/test/swift/CrossTests/Makefile.am
@@ -30,5 +30,8 @@
 clean-local:
 	$(RM) -r Sources/Common/gen-swift/
 
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
 dist-hook:
 	$(RM) -r $(distdir)/gen-swift/
diff --git a/test/swift/Makefile.am b/test/swift/Makefile.am
index 20c2fe5..f81fba8 100644
--- a/test/swift/Makefile.am
+++ b/test/swift/Makefile.am
@@ -19,6 +19,9 @@
 
 SUBDIRS = CrossTests
 
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
 precross:
 	$(MAKE) -C CrossTests precross
 
diff --git a/test/tests.json b/test/tests.json
index 7eb9f65..91aa767 100644
--- a/test/tests.json
+++ b/test/tests.json
@@ -539,6 +539,31 @@
   },
   {
     "name": "php",
+    "server": {
+      "transports": [
+        "buffered",
+        "framed"
+      ],
+      "sockets": [
+        "ip"
+      ],
+      "protocols": [
+        "binary",
+        "binary:accel",
+        "compact",
+        "json"
+      ],
+      "command": [
+        "php",
+        "-dextension_dir=php_ext_dir",
+        "--php-ini=test_php.ini",
+        "--no-php-ini",
+        "-ddisplay_errors=stderr",
+        "-dlog_errors=0",
+        "-derror_reporting=E_ALL",
+        "TestServer.php"
+      ]
+    },
     "client": {
       "timeout": 6,
       "transports": [
diff --git a/tutorial/Makefile.am b/tutorial/Makefile.am
index 24969d1..ab87c95 100644
--- a/tutorial/Makefile.am
+++ b/tutorial/Makefile.am
@@ -101,6 +101,9 @@
 
 endif
 
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
 # Any folders or files not listed above being added to SUBDIR need to be placed here in
 # EXTRA_DIST to be included in the release
 EXTRA_DIST = \
diff --git a/tutorial/c_glib/Makefile.am b/tutorial/c_glib/Makefile.am
index f376494..253f962 100644
--- a/tutorial/c_glib/Makefile.am
+++ b/tutorial/c_glib/Makefile.am
@@ -79,6 +79,9 @@
 tutorialclient: all
 	./tutorial_client
 
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
 EXTRA_DIST = \
 	c_glib_server.c \
 	c_glib_client.c
diff --git a/tutorial/cl/Makefile.am b/tutorial/cl/Makefile.am
index 70c5e07..aef5840 100755
--- a/tutorial/cl/Makefile.am
+++ b/tutorial/cl/Makefile.am
@@ -57,6 +57,9 @@
 	-$(RM) TutorialServer
 	-$(RM) TutorialClient
 
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
 EXTRA_DIST = \
 	tutorial-implementation.lisp \
 	shared-implementation.lisp \
diff --git a/tutorial/cpp/CppClient.cpp b/tutorial/cpp/CppClient.cpp
index 5208411..02e7b17 100644
--- a/tutorial/cpp/CppClient.cpp
+++ b/tutorial/cpp/CppClient.cpp
@@ -43,9 +43,9 @@
     transport->open();
 
     client.ping();
-    cout << "ping()" << endl;
+    cout << "ping()" << '\n';
 
-    cout << "1 + 1 = " << client.add(1, 1) << endl;
+    cout << "1 + 1 = " << client.add(1, 1) << '\n';
 
     Work work;
     work.op = Operation::DIVIDE;
@@ -54,27 +54,27 @@
 
     try {
       client.calculate(1, work);
-      cout << "Whoa? We can divide by zero!" << endl;
+      cout << "Whoa? We can divide by zero!" << '\n';
     } catch (InvalidOperation& io) {
-      cout << "InvalidOperation: " << io.why << endl;
-      // or using generated operator<<: cout << io << endl;
-      // or by using std::exception native method what(): cout << io.what() << endl;
+      cout << "InvalidOperation: " << io.why << '\n';
+      // or using generated operator<<: cout << io << '\n';
+      // or by using std::exception native method what(): cout << io.what() << '\n';
     }
 
     work.op = Operation::SUBTRACT;
     work.num1 = 15;
     work.num2 = 10;
     int32_t diff = client.calculate(1, work);
-    cout << "15 - 10 = " << diff << endl;
+    cout << "15 - 10 = " << diff << '\n';
 
     // Note that C++ uses return by reference for complex types to avoid
     // costly copy construction
     SharedStruct ss;
     client.getStruct(ss, 1);
-    cout << "Received log: " << ss << endl;
+    cout << "Received log: " << ss << '\n';
 
     transport->close();
   } catch (TException& tx) {
-    cout << "ERROR: " << tx.what() << endl;
+    cout << "ERROR: " << tx.what() << '\n';
   }
 }
diff --git a/tutorial/cpp/CppServer.cpp b/tutorial/cpp/CppServer.cpp
index 635afef..4c66cb8 100644
--- a/tutorial/cpp/CppServer.cpp
+++ b/tutorial/cpp/CppServer.cpp
@@ -48,15 +48,15 @@
 public:
   CalculatorHandler() = default;
 
-  void ping() override { cout << "ping()" << endl; }
+  void ping() override { cout << "ping()" << '\n'; }
 
   int32_t add(const int32_t n1, const int32_t n2) override {
-    cout << "add(" << n1 << ", " << n2 << ")" << endl;
+    cout << "add(" << n1 << ", " << n2 << ")" << '\n';
     return n1 + n2;
   }
 
   int32_t calculate(const int32_t logid, const Work& work) override {
-    cout << "calculate(" << logid << ", " << work << ")" << endl;
+    cout << "calculate(" << logid << ", " << work << ")" << '\n';
     int32_t val;
 
     switch (work.op) {
@@ -95,11 +95,11 @@
   }
 
   void getStruct(SharedStruct& ret, const int32_t logid) override {
-    cout << "getStruct(" << logid << ")" << endl;
+    cout << "getStruct(" << logid << ")" << '\n';
     ret = log[logid];
   }
 
-  void zip() override { cout << "zip()" << endl; }
+  void zip() override { cout << "zip()" << '\n'; }
 
 protected:
   map<int32_t, SharedStruct> log;
@@ -172,8 +172,8 @@
     threadManager);
   */
 
-  cout << "Starting the server..." << endl;
+  cout << "Starting the server..." << '\n';
   server.serve();
-  cout << "Done." << endl;
+  cout << "Done." << '\n';
   return 0;
 }
diff --git a/tutorial/cpp/Makefile.am b/tutorial/cpp/Makefile.am
index 77fd6d5..d093df3 100644
--- a/tutorial/cpp/Makefile.am
+++ b/tutorial/cpp/Makefile.am
@@ -78,6 +78,9 @@
 style-local:
 	$(CPPSTYLE_CMD)
 
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
 EXTRA_DIST = \
 	CMakeLists.txt \
 	CppClient.cpp \
diff --git a/tutorial/d/Makefile.am b/tutorial/d/Makefile.am
index 358294c..3db3d15 100644
--- a/tutorial/d/Makefile.am
+++ b/tutorial/d/Makefile.am
@@ -47,6 +47,9 @@
 	$(RM) -r gen-d/
 	find . -type f -name '*.o' | xargs rm -f
 
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
 dist-hook:
 	$(RM) -f $(distdir)/$(PROGS)
 	$(RM) -r $(distdir)/gen-d/
diff --git a/tutorial/dart/Makefile.am b/tutorial/dart/Makefile.am
index 860f292..e29e3c5 100644
--- a/tutorial/dart/Makefile.am
+++ b/tutorial/dart/Makefile.am
@@ -66,6 +66,9 @@
 tutorialconsoleclient: pub-get-console-client
 	${DART} console_client/bin/main.dart
 
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
 EXTRA_DIST = \
 	client/web/client.dart \
 	client/web/index.html \
diff --git a/tutorial/go/Makefile.am b/tutorial/go/Makefile.am
index b2f70ce..16385b0 100644
--- a/tutorial/go/Makefile.am
+++ b/tutorial/go/Makefile.am
@@ -45,6 +45,9 @@
 clean-local:
 	$(RM) -r gen-* go-tutorial calculator-remote
 
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
 EXTRA_DIST = \
 	src/client.go \
 	src/handler.go \
diff --git a/tutorial/haxe/Makefile.am b/tutorial/haxe/Makefile.am
index e6f2713..d2c84f4 100644
--- a/tutorial/haxe/Makefile.am
+++ b/tutorial/haxe/Makefile.am
@@ -79,6 +79,9 @@
 clean-local:
 	$(RM) -r gen-haxe bin
 
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
 EXTRA_DIST = \
 	src \
 	cpp.hxml \
diff --git a/tutorial/java/Makefile.am b/tutorial/java/Makefile.am
index 59e68ba..afad8f5 100644
--- a/tutorial/java/Makefile.am
+++ b/tutorial/java/Makefile.am
@@ -39,6 +39,9 @@
 tutorialclient: all
 	$(ANT) $(ANT_FLAGS) tutorialclient
 
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
 EXTRA_DIST = \
 	build.properties \
 	build.xml \
diff --git a/tutorial/js/Makefile.am b/tutorial/js/Makefile.am
index 26a3c83..ac0283f 100644
--- a/tutorial/js/Makefile.am
+++ b/tutorial/js/Makefile.am
@@ -33,6 +33,9 @@
 tutorialserver: all
 	$(ANT) $(ANT_FLAGS) tutorialserver
 
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
 EXTRA_DIST = \
 	build.properties \
 	build.xml \
diff --git a/tutorial/netstd/Client/Client.csproj b/tutorial/netstd/Client/Client.csproj
index 399b0e0..ebc63ac 100644
--- a/tutorial/netstd/Client/Client.csproj
+++ b/tutorial/netstd/Client/Client.csproj
@@ -32,7 +32,7 @@
   </PropertyGroup>
 
   <ItemGroup>
-    <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="7.0.0" />
+    <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.0" />
   </ItemGroup>
 
   <ItemGroup>
diff --git a/tutorial/netstd/Interfaces/Interfaces.csproj b/tutorial/netstd/Interfaces/Interfaces.csproj
index 576722b..b0de842 100644
--- a/tutorial/netstd/Interfaces/Interfaces.csproj
+++ b/tutorial/netstd/Interfaces/Interfaces.csproj
@@ -19,7 +19,7 @@
   -->
 
   <PropertyGroup>
-    <TargetFramework>net6.0</TargetFramework>
+    <TargetFramework>net8.0</TargetFramework>
     <AssemblyName>Interfaces</AssemblyName>
     <PackageId>Interfaces</PackageId>
     <Version>0.21.0.0</Version>
@@ -34,15 +34,15 @@
   </ItemGroup>
 
   <ItemGroup>
-    <PackageReference Include="System.ServiceModel.Primitives" Version="6.2.0" />
+    <PackageReference Include="System.ServiceModel.Primitives" Version="8.0.0" />
   </ItemGroup>
 
   <Target Name="PreBuild" BeforeTargets="_GenerateRestoreProjectSpec;Restore;Compile">
     <Exec Condition="'$(OS)' == 'Windows_NT'" Command="where thrift" ConsoleToMSBuild="true">
       <Output TaskParameter="ConsoleOutput" PropertyName="PathToThrift" />
     </Exec>
-    <Exec Condition="Exists('$(PathToThrift)')" Command="$(PathToThrift) -out $(ProjectDir) -gen netstd:wcf,union,serial,net6 -r ./../../tutorial.thrift" />
-    <Exec Condition="Exists('thrift')" Command="thrift -out $(ProjectDir) -gen netstd:wcf,union,serial,net6 -r ./../../tutorial.thrift" />
-    <Exec Condition="Exists('./../../../compiler/cpp/thrift')" Command="./../../../compiler/cpp/thrift -out $(ProjectDir) -gen netstd:wcf,union,serial,net6 -r ./../../tutorial.thrift" />
+    <Exec Condition="Exists('$(PathToThrift)')" Command="$(PathToThrift) -out $(ProjectDir) -gen netstd:wcf,union,serial,net8 -r ./../../tutorial.thrift" />
+    <Exec Condition="Exists('thrift')" Command="thrift -out $(ProjectDir) -gen netstd:wcf,union,serial,net8 -r ./../../tutorial.thrift" />
+    <Exec Condition="Exists('./../../../compiler/cpp/thrift')" Command="./../../../compiler/cpp/thrift -out $(ProjectDir) -gen netstd:wcf,union,serial,net8 -r ./../../tutorial.thrift" />
   </Target>
 </Project>
diff --git a/tutorial/netstd/Makefile.am b/tutorial/netstd/Makefile.am
index f295cc0..522601d 100644
--- a/tutorial/netstd/Makefile.am
+++ b/tutorial/netstd/Makefile.am
@@ -31,6 +31,9 @@
 	$(RM) -r Interfaces/bin
 	$(RM) -r Interfaces/obj
 
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
 EXTRA_DIST = \
 	Client \
 	Interfaces \
diff --git a/tutorial/nodejs/Makefile.am b/tutorial/nodejs/Makefile.am
index 1516fec..3798a31 100644
--- a/tutorial/nodejs/Makefile.am
+++ b/tutorial/nodejs/Makefile.am
@@ -38,6 +38,9 @@
 clean-local:
 	$(RM) -r gen-*
 
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
 EXTRA_DIST = \
 	NodeServer.js \
 	NodeClient.js \
diff --git a/tutorial/perl/Makefile.am b/tutorial/perl/Makefile.am
index fe77213..d28165a 100644
--- a/tutorial/perl/Makefile.am
+++ b/tutorial/perl/Makefile.am
@@ -31,6 +31,9 @@
 clean-local:
 	$(RM) -r gen-*
 
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
 EXTRA_DIST = \
 	PerlServer.pl \
 	PerlClient.pl
diff --git a/tutorial/php/Makefile.am b/tutorial/php/Makefile.am
index 3d30ad9..1d11e05 100644
--- a/tutorial/php/Makefile.am
+++ b/tutorial/php/Makefile.am
@@ -31,6 +31,9 @@
 clean-local:
 	$(RM) -r gen-*
 
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
 EXTRA_DIST = \
 	PhpServer.php \
 	PhpClient.php \
diff --git a/tutorial/py.tornado/Makefile.am b/tutorial/py.tornado/Makefile.am
index 4b73c1e..d8996a7 100644
--- a/tutorial/py.tornado/Makefile.am
+++ b/tutorial/py.tornado/Makefile.am
@@ -31,6 +31,9 @@
 clean-local:
 	$(RM) -r gen-*
 
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
 EXTRA_DIST = \
 	PythonServer.py \
 	PythonClient.py
diff --git a/tutorial/py.twisted/Makefile.am b/tutorial/py.twisted/Makefile.am
index 50cd342..f617d7c 100644
--- a/tutorial/py.twisted/Makefile.am
+++ b/tutorial/py.twisted/Makefile.am
@@ -31,6 +31,9 @@
 clean-local:
 	$(RM) -r gen-*
 
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
 EXTRA_DIST = \
 	PythonClient.py \
 	PythonServer.py \
diff --git a/tutorial/py/Makefile.am b/tutorial/py/Makefile.am
index 7db816d..da59815 100644
--- a/tutorial/py/Makefile.am
+++ b/tutorial/py/Makefile.am
@@ -31,6 +31,9 @@
 clean-local:
 	$(RM) -r gen-*
 
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
 EXTRA_DIST = \
 	setup.cfg \
 	PythonServer.py \
diff --git a/tutorial/rb/Makefile.am b/tutorial/rb/Makefile.am
index 885cd92..3dd4e31 100644
--- a/tutorial/rb/Makefile.am
+++ b/tutorial/rb/Makefile.am
@@ -31,6 +31,9 @@
 clean-local:
 	$(RM) -r gen-*
 
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
 EXTRA_DIST = \
 	RubyServer.rb \
 	RubyClient.rb
diff --git a/tutorial/rs/Makefile.am b/tutorial/rs/Makefile.am
index 13f6707..bbdf7cb 100644
--- a/tutorial/rs/Makefile.am
+++ b/tutorial/rs/Makefile.am
@@ -45,6 +45,9 @@
 	-$(RM) src/tutorial.rs
 	-$(RM) -r bin
 
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
 EXTRA_DIST = \
 	Cargo.toml \
 	src/lib.rs \
diff --git a/tutorial/swift/Makefile.am b/tutorial/swift/Makefile.am
index f484560..bb1e612 100644
--- a/tutorial/swift/Makefile.am
+++ b/tutorial/swift/Makefile.am
@@ -23,6 +23,9 @@
 gen_swift:
 	$(THRIFT) --gen swift -r -o Sources/Common $(top_srcdir)/tutorial/tutorial.thrift
 
+distdir:
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
 tutorial: gen_swift
 	swift run TutorialRunner
 
@@ -31,3 +34,13 @@
 
 tutorialclient: gen_swift
 	swift run TutorialClient
+
+EXTRA_DIST = \
+	Package.swift \
+	swift-dep \
+	Sources/TutorialClient/main.swift \
+	Sources/TutorialRunner/main.swift \
+	Sources/TutorialServer/main.swift \
+	Sources/TutorialServer/CalculatorService.swift \
+	README.md
+
