diff --git a/BUILD b/BUILD
index 8ce09fa..b55f224 100644
--- a/BUILD
+++ b/BUILD
@@ -26,7 +26,7 @@
 
 exports_files(["LICENSE"])
 
-load("//:build.bzl", "nginx_copts", "nginx_cxxopts")
+load("//:build.bzl", "nginx_copts")
 
 genrule(
     name = "ngx_modules_c",
@@ -42,11 +42,10 @@
 cc_library(
     name = "http_brotli_filter",
     srcs = [
-        "src/ngx_http_brotli_filter_module.cc",
+        "src/ngx_http_brotli_filter_module.c",
     ],
-    copts = nginx_cxxopts,
+    copts = nginx_copts,
     defines = [
-        "NGX_HAVE_BROTLI_ENC_COMPRESSOR_H",
         "NGX_HTTP_BROTLI_FILTER",
     ],
     visibility = [
diff --git a/auto/feature b/auto/feature
deleted file mode 100644
index eede183..0000000
--- a/auto/feature
+++ /dev/null
@@ -1,131 +0,0 @@
-
-# Copyright (C) Igor Sysoev
-# Copyright (C) Nginx, Inc.
-
-
-echo $ngx_n "checking for $ngx_feature ...$ngx_c"
-
-cat << END >> $NGX_AUTOCONF_ERR
-
-----------------------------------------
-checking for $ngx_feature
-
-END
-
-ngx_found=no
-
-if test -n "$ngx_feature_name"; then
-    ngx_have_feature=`echo $ngx_feature_name \
-                   | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`
-fi
-
-if test -n "$ngx_feature_path"; then
-    for ngx_temp in $ngx_feature_path; do
-        ngx_feature_inc_path="$ngx_feature_inc_path -I $ngx_temp"
-    done
-fi
-
-if [ "$ngx_feature_cpp" = "yes" ]; then
-    NGX_AUTOTEST_EXT=cc
-else
-    NGX_AUTOTEST_EXT=c
-fi
-
-cat << END > $NGX_AUTOTEST.$NGX_AUTOTEST_EXT
-
-#include <sys/types.h>
-$NGX_INCLUDE_UNISTD_H
-$ngx_feature_incs
-
-int main() {
-    $ngx_feature_test;
-    return 0;
-}
-
-END
-
-
-ngx_test="$CC $CC_TEST_FLAGS $CC_AUX_FLAGS $ngx_feature_inc_path \
-          -o $NGX_AUTOTEST $NGX_AUTOTEST.$NGX_AUTOTEST_EXT \
-          $NGX_TEST_LD_OPT $ngx_feature_libs"
-
-ngx_feature_inc_path=
-ngx_feature_cpp=
-
-eval "/bin/sh -c \"$ngx_test\" >> $NGX_AUTOCONF_ERR 2>&1"
-
-
-if [ -x $NGX_AUTOTEST ]; then
-
-    case "$ngx_feature_run" in
-
-        yes)
-            # /bin/sh is used to intercept "Killed" or "Abort trap" messages
-            if /bin/sh -c $NGX_AUTOTEST >> $NGX_AUTOCONF_ERR 2>&1; then
-                echo " found"
-                ngx_found=yes
-
-                if test -n "$ngx_feature_name"; then
-                    have=$ngx_have_feature . auto/have
-                fi
-
-            else
-                echo " found but is not working"
-            fi
-        ;;
-
-        value)
-            # /bin/sh is used to intercept "Killed" or "Abort trap" messages
-            if /bin/sh -c $NGX_AUTOTEST >> $NGX_AUTOCONF_ERR 2>&1; then
-                echo " found"
-                ngx_found=yes
-
-                cat << END >> $NGX_AUTO_CONFIG_H
-
-#ifndef $ngx_feature_name
-#define $ngx_feature_name  `$NGX_AUTOTEST`
-#endif
-
-END
-            else
-                echo " found but is not working"
-            fi
-        ;;
-
-        bug)
-            # /bin/sh is used to intercept "Killed" or "Abort trap" messages
-            if /bin/sh -c $NGX_AUTOTEST >> $NGX_AUTOCONF_ERR 2>&1; then
-                echo " not found"
-
-            else
-                echo " found"
-                ngx_found=yes
-
-                if test -n "$ngx_feature_name"; then
-                    have=$ngx_have_feature . auto/have
-                fi
-            fi
-        ;;
-
-        *)
-            echo " found"
-            ngx_found=yes
-
-            if test -n "$ngx_feature_name"; then
-                have=$ngx_have_feature . auto/have
-            fi
-        ;;
-
-    esac
-
-else
-    echo " not found"
-
-    echo "----------"                    >> $NGX_AUTOCONF_ERR
-    cat $NGX_AUTOTEST.$NGX_AUTOTEST_EXT  >> $NGX_AUTOCONF_ERR
-    echo "----------"                    >> $NGX_AUTOCONF_ERR
-    echo $ngx_test                       >> $NGX_AUTOCONF_ERR
-    echo "----------"                    >> $NGX_AUTOCONF_ERR
-fi
-
-rm -rf $NGX_AUTOTEST*
diff --git a/config b/config
index 0f829c7..5194775 100644
--- a/config
+++ b/config
@@ -54,119 +54,58 @@
 fi
 
 #
-# filter module (depends on Brotli C++ library)
+# filter module (depends on Brotli library)
 #
 
-# new C++ API header (compressor.h)
-
-ngx_feature_name=NGX_HAVE_BROTLI_ENC_COMPRESSOR_H
+ngx_feature_name=
 ngx_feature_run=no
-ngx_feature_cpp=yes
-ngx_feature_incs="#include <brotli/enc/compressor.h>"
-ngx_feature_test="brotli::BrotliParams  params;
-                  params.quality = 11"
+ngx_feature_incs="#include <brotli/enc/encode.h>"
+ngx_feature_test="BrotliEncoderCreateInstance(NULL, NULL, NULL)"
 
 # auto-discovery
-ngx_feature="Brotli C++ library (compressor.h)"
-ngx_feature_cpp=yes
+ngx_feature="Brotli library"
 ngx_feature_path=
-ngx_feature_libs="-lbrotlienc -lstdc++"
-. $ngx_addon_dir/auto/feature
+ngx_feature_libs="-lbrotlienc"
+. auto/feature
 
 if [ $ngx_found = no ]; then
     # FreeBSD, OpenBSD
-    ngx_feature="Brotli C++ library (compressor.h) in /usr/local/"
-    ngx_feature_cpp=yes
+    ngx_feature="Brotli library in /usr/local/"
     ngx_feature_path="/usr/local/include"
     if [ $NGX_RPATH = YES ]; then
-        ngx_feature_libs="-R/usr/local/lib -L/usr/local/lib -lbrotlienc -lstdc++"
+        ngx_feature_libs="-R/usr/local/lib -L/usr/local/lib -lbrotlienc"
     else
-        ngx_feature_libs="-L/usr/local/lib -lbrotlienc -lstdc++"
+        ngx_feature_libs="-L/usr/local/lib -lbrotlienc"
     fi
-    . $ngx_addon_dir/auto/feature
+    . auto/feature
 fi
 
 if [ $ngx_found = no ]; then
     # NetBSD
-    ngx_feature="Brotli C++ library (compressor.h) in /usr/pkg/"
-    ngx_feature_cpp=yes
+    ngx_feature="Brotli library in /usr/pkg/"
     ngx_feature_path="/usr/pkg/include"
     if [ $NGX_RPATH = YES ]; then
-        ngx_feature_libs="-R/usr/pkg/lib -L/usr/pkg/lib -lbrotlienc -lstdc++"
+        ngx_feature_libs="-R/usr/pkg/lib -L/usr/pkg/lib -lbrotlienc"
     else
-        ngx_feature_libs="-L/usr/pkg/lib -lbrotlienc -lstdc++"
+        ngx_feature_libs="-L/usr/pkg/lib -lbrotlienc"
     fi
-    . $ngx_addon_dir/auto/feature
+    . auto/feature
 fi
 
 if [ $ngx_found = no ]; then
     # MacPorts
-    ngx_feature="Brotli C++ library (compressor.h) in /opt/local/"
-    ngx_feature_cpp=yes
+    ngx_feature="Brotli library in /opt/local/"
     ngx_feature_path="/opt/local/include"
     if [ $NGX_RPATH = YES ]; then
-        ngx_feature_libs="-R/opt/local/lib -L/opt/local/lib -lbrotlienc -lstdc++"
+        ngx_feature_libs="-R/opt/local/lib -L/opt/local/lib -lbrotlienc"
     else
-        ngx_feature_libs="-L/opt/local/lib -lbrotlienc -lstdc++"
+        ngx_feature_libs="-L/opt/local/lib -lbrotlienc"
     fi
-    . $ngx_addon_dir/auto/feature
-fi
-
-# original C++ API header (encode.h)
-
-ngx_feature_name=
-ngx_feature_incs="#include <brotli/enc/encode.h>"
-
-if [ $ngx_found = no ]; then
-    # auto-discovery
-    ngx_feature="Brotli C++ library (encode.h)"
-    ngx_feature_cpp=yes
-    ngx_feature_path=
-    ngx_feature_libs="-lbrotlienc -lstdc++"
-    . $ngx_addon_dir/auto/feature
+    . auto/feature
 fi
 
 if [ $ngx_found = no ]; then
-    # FreeBSD, OpenBSD
-    ngx_feature="Brotli C++ library (encode.h) in /usr/local/"
-    ngx_feature_cpp=yes
-    ngx_feature_path="/usr/local/include"
-    if [ $NGX_RPATH = YES ]; then
-        ngx_feature_libs="-R/usr/local/lib -L/usr/local/lib -lbrotlienc -lstdc++"
-    else
-        ngx_feature_libs="-L/usr/local/lib -lbrotlienc -lstdc++"
-    fi
-    . $ngx_addon_dir/auto/feature
-fi
-
-if [ $ngx_found = no ]; then
-    # NetBSD
-    ngx_feature="Brotli C++ library (encode.h) in /usr/pkg/"
-    ngx_feature_cpp=yes
-    ngx_feature_path="/usr/pkg/include"
-    if [ $NGX_RPATH = YES ]; then
-        ngx_feature_libs="-R/usr/pkg/lib -L/usr/pkg/lib -lbrotlienc -lstdc++"
-    else
-        ngx_feature_libs="-L/usr/pkg/lib -lbrotlienc -lstdc++"
-    fi
-    . $ngx_addon_dir/auto/feature
-fi
-
-if [ $ngx_found = no ]; then
-    # MacPorts
-    ngx_feature="Brotli C++ library (encode.h) in /opt/local/"
-    ngx_feature_cpp=yes
-    ngx_feature_path="/opt/local/include"
-    if [ $NGX_RPATH = YES ]; then
-        ngx_feature_libs="-R/opt/local/lib -L/opt/local/lib -lbrotlienc -lstdc++"
-    else
-        ngx_feature_libs="-L/opt/local/lib -lbrotlienc -lstdc++"
-    fi
-    . $ngx_addon_dir/auto/feature
-fi
-
-if [ $ngx_found = no ]; then
-    echo "$0: error: ngx_brotli filter module requires Brotli C++ library."
+    echo "$0: error: ngx_brotli filter module requires Brotli library."
     exit 1
 fi
 
@@ -184,7 +123,7 @@
     ngx_module_name=ngx_http_brotli_filter_module
     ngx_module_incs="$ngx_feature_path"
     ngx_module_deps=
-    ngx_module_srcs="$ngx_addon_dir/src/ngx_http_brotli_filter_module.cc"
+    ngx_module_srcs="$ngx_addon_dir/src/ngx_http_brotli_filter_module.c"
     ngx_module_libs="$ngx_feature_libs"
     ngx_module_order="$ngx_module_name \
                       ngx_pagespeed \
@@ -216,14 +155,7 @@
                          | sed "s/$next/$next ngx_http_brotli_filter_module/"`
 
     NGX_ADDON_SRCS="$NGX_ADDON_SRCS \
-                    $ngx_addon_dir/src/ngx_http_brotli_filter_module.cc"
-fi
-
-# workaround for a bug in nginx-1.9.11, see:
-# http://hg.nginx.org/nginx/rev/ff1e625ae55b
-NGX_VERSION=`grep nginx_version src/core/nginx.h | sed -e 's/^.* \(.*\)$/\1/'`
-if [ "$NGX_VERSION" = "1009011" ]; then
-    CFLAGS="$CFLAGS -Wno-write-strings"
+                    $ngx_addon_dir/src/ngx_http_brotli_filter_module.c"
 fi
 
 have=NGX_HTTP_BROTLI_FILTER . auto/have
diff --git a/src/ngx_http_brotli_filter_module.cc b/src/ngx_http_brotli_filter_module.c
similarity index 79%
rename from src/ngx_http_brotli_filter_module.cc
rename to src/ngx_http_brotli_filter_module.c
index 2a6406b..e0ecc5c 100644
--- a/src/ngx_http_brotli_filter_module.cc
+++ b/src/ngx_http_brotli_filter_module.c
@@ -6,65 +6,60 @@
  */
 
 
-extern "C" {
-  #include <ngx_config.h>
-  #include <ngx_core.h>
-  #include <ngx_http.h>
-}
+#include <ngx_config.h>
+#include <ngx_core.h>
+#include <ngx_http.h>
 
-#if (NGX_HAVE_BROTLI_ENC_COMPRESSOR_H)
-#include <brotli/enc/compressor.h>
-#else
 #include <brotli/enc/encode.h>
-#endif
 
 
 typedef struct {
-    ngx_flag_t                  enable;
+    ngx_flag_t            enable;
 
-    ngx_hash_t                  types;
+    ngx_hash_t            types;
 
-    ngx_bufs_t                  bufs;
+    ngx_bufs_t            bufs;
 
-    ngx_int_t                   quality;
-    size_t                      win_bits;
-    ssize_t                     min_length;
+    ngx_int_t             quality;
+    size_t                win_bits;
+    ssize_t               min_length;
 
-    ngx_array_t                *types_keys;
+    ngx_array_t          *types_keys;
 } ngx_http_brotli_conf_t;
 
 
 typedef struct {
-    brotli::BrotliCompressor   *compressor;
-    brotli::BrotliParams        params;
+    BrotliEncoderState   *encoder;
 
-    size_t                      brotli_ring;
-    size_t                      brotli_in;
-    u_char                     *brotli_out;
-    u_char                     *brotli_last;
+    size_t                brotli_ring;
+    size_t                brotli_in;
+    u_char               *brotli_out;
+    u_char               *brotli_last;
 
-    size_t                      bytes_in;
-    size_t                      bytes_out;
+    off_t                 content_length;
 
-    ngx_chain_t                *in;
-    ngx_chain_t                *free;
-    ngx_chain_t                *busy;
-    ngx_chain_t                *out;
-    ngx_chain_t               **last_out;
+    size_t                bytes_in;
+    size_t                bytes_out;
 
-    ngx_buf_t                  *out_buf;
-    ngx_int_t                   bufs;
+    ngx_chain_t          *in;
+    ngx_chain_t          *free;
+    ngx_chain_t          *busy;
+    ngx_chain_t          *out;
+    ngx_chain_t         **last_out;
 
-    unsigned                    done:1;
-    unsigned                    sent:1;
-    unsigned                    last:1;
-    unsigned                    flush:1;
-    unsigned                    nomem:1;
+    ngx_buf_t            *out_buf;
+    ngx_int_t             bufs;
+
+    unsigned              done:1;
+    unsigned              sent:1;
+    unsigned              last:1;
+    unsigned              flush:1;
+    unsigned              nomem:1;
 } ngx_http_brotli_ctx_t;
 
 
-static void ngx_http_brotli_filter_params(ngx_http_request_t *r,
-    ngx_http_brotli_ctx_t *ctx);
+static BrotliEncoderState *ngx_http_brotli_filter_create_encoder(
+    ngx_http_request_t *r);
 static ngx_int_t ngx_http_brotli_filter_add_data(ngx_http_request_t *r,
     ngx_http_brotli_ctx_t *ctx);
 static ngx_int_t ngx_http_brotli_filter_process(ngx_http_request_t *r,
@@ -191,8 +186,7 @@
     ngx_http_brotli_ctx_t   *ctx;
     ngx_http_brotli_conf_t  *conf;
 
-    conf = reinterpret_cast<ngx_http_brotli_conf_t *>(
-               ngx_http_get_module_loc_conf(r, ngx_http_brotli_filter_module));
+    conf = ngx_http_get_module_loc_conf(r, ngx_http_brotli_filter_module);
 
     if (!conf->enable
         || (r->headers_out.status != NGX_HTTP_OK
@@ -214,20 +208,18 @@
         return ngx_http_next_header_filter(r);
     }
 
-    ctx = reinterpret_cast<ngx_http_brotli_ctx_t *>(
-              ngx_pcalloc(r->pool, sizeof(ngx_http_brotli_ctx_t)));
+    ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_brotli_ctx_t));
     if (ctx == NULL) {
         return NGX_ERROR;
     }
 
     ctx->last_out = &ctx->out;
 
-    ngx_http_brotli_filter_params(r, ctx);
+    ctx->content_length = r->headers_out.content_length_n;
 
     ngx_http_set_ctx(r, ctx, ngx_http_brotli_filter_module);
 
-    h = reinterpret_cast<ngx_table_elt_t *>(
-            ngx_list_push(&r->headers_out.headers));
+    h = ngx_list_push(&r->headers_out.headers);
     if (h == NULL) {
         return NGX_ERROR;
     }
@@ -256,8 +248,7 @@
     ngx_pool_cleanup_t     *cln;
     ngx_http_brotli_ctx_t  *ctx;
 
-    ctx = reinterpret_cast<ngx_http_brotli_ctx_t *>(
-              ngx_http_get_module_ctx(r, ngx_http_brotli_filter_module));
+    ctx = ngx_http_get_module_ctx(r, ngx_http_brotli_filter_module);
 
     if (ctx == NULL || ctx->done || r->header_only) {
         return ngx_http_next_body_filter(r, in);
@@ -266,18 +257,13 @@
     ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
                    "http brotli filter");
 
-    if (ctx->compressor == NULL) {
-        ctx->compressor = new brotli::BrotliCompressor(ctx->params);
-        if (ctx->compressor == NULL) {
+    if (ctx->encoder == NULL) {
+        ctx->encoder = ngx_http_brotli_filter_create_encoder(r);
+        if (ctx->encoder == NULL) {
             goto failed;
         }
 
-        ctx->brotli_ring = ctx->compressor->input_block_size();
-
-        ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
-                       "brotli compressor: lvl:%d win:%d blk:%uz",
-                       ctx->params.quality, (1 << ctx->params.lgwin),
-                       ctx->brotli_ring);
+        ctx->brotli_ring = BrotliEncoderInputBlockSize(ctx->encoder);
 
         cln = ngx_pool_cleanup_add(r->pool, 0);
         if (cln == NULL) {
@@ -374,9 +360,9 @@
         if (ctx->done) {
             ctx->sent = 1;
 
-            if (ctx->compressor) {
-                delete ctx->compressor;
-                ctx->compressor = NULL;
+            if (ctx->encoder) {
+                BrotliEncoderDestroyInstance(ctx->encoder);
+                ctx->encoder = NULL;
             }
 
             return rc;
@@ -389,36 +375,73 @@
 
     ctx->done = 1;
 
-    if (ctx->compressor) {
-        delete ctx->compressor;
-        ctx->compressor = NULL;
+    if (ctx->encoder) {
+        BrotliEncoderDestroyInstance(ctx->encoder);
+        ctx->encoder = NULL;
     }
 
     return NGX_ERROR;
 }
 
 
-static void
-ngx_http_brotli_filter_params(ngx_http_request_t *r, ngx_http_brotli_ctx_t *ctx)
+static BrotliEncoderState *
+ngx_http_brotli_filter_create_encoder(ngx_http_request_t *r)
 {
     int                      wbits;
+    BrotliEncoderState      *encoder;
+    ngx_http_brotli_ctx_t   *ctx;
     ngx_http_brotli_conf_t  *conf;
 
-    conf = reinterpret_cast<ngx_http_brotli_conf_t *>(
-               ngx_http_get_module_loc_conf(r, ngx_http_brotli_filter_module));
+    encoder = BrotliEncoderCreateInstance(NULL, NULL, NULL);
+    if (encoder == NULL) {
+        ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,
+                      "BrotliEncoderCreateInstance() failed");
+        return NULL;
+    }
+
+    conf = ngx_http_get_module_loc_conf(r, ngx_http_brotli_filter_module);
+
+    if (!BrotliEncoderSetParameter(encoder, BROTLI_PARAM_QUALITY,
+                                   (uint32_t) conf->quality))
+    {
+        ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,
+                      "BrotliEncoderSetParameter(QUALITY, %uD) failed",
+                      (uint32_t) conf->quality);
+        goto failed;
+    }
+
+    ctx = ngx_http_get_module_ctx(r, ngx_http_brotli_filter_module);
 
     wbits = conf->win_bits;
 
-    if (r->headers_out.content_length_n > 0) {
-        while (r->headers_out.content_length_n < (1 << (wbits - 1))
-               && wbits > brotli::kMinWindowBits)
+    if (ctx->content_length > 0) {
+        while (ctx->content_length < (1 << (wbits - 1))
+               && wbits > kBrotliMinWindowBits)
         {
             wbits--;
         }
     }
 
-    ctx->params.quality = conf->quality;
-    ctx->params.lgwin = wbits;
+    if (!BrotliEncoderSetParameter(encoder, BROTLI_PARAM_LGWIN,
+                                   (uint32_t) wbits)) {
+        ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,
+                      "BrotliEncoderSetParameter(LGWIN, %uD) failed",
+                      (uint32_t) wbits);
+        goto failed;
+    }
+
+    ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
+                   "brotli encoder: lvl:%i win:%d blk:%uz",
+                   conf->quality, (1 << wbits),
+                   BrotliEncoderInputBlockSize(encoder));
+
+    return encoder;
+
+failed:
+
+    BrotliEncoderDestroyInstance(encoder);
+
+    return NULL;
 }
 
 
@@ -465,7 +488,7 @@
         ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
                        "brotli copy: %p, size:%uz", b, size);
 
-        ctx->compressor->CopyInputToRingBuffer(size, b->pos);
+        BrotliEncoderCopyInputToRingBuffer(ctx->encoder, size, b->pos);
 
         ctx->brotli_in += size;
         ctx->bytes_in += size;
@@ -502,7 +525,9 @@
 
     out = NULL;
 
-    if (!ctx->compressor->WriteBrotliData(ctx->last, ctx->flush, &size, &out)) {
+    if (!BrotliEncoderWriteData(ctx->encoder, ctx->last, ctx->flush, &size,
+                                &out))
+    {
         ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,
                       "brotli failed: size:%uz l:%d f:%d",
                       ctx->brotli_in, ctx->last, ctx->flush);
@@ -581,7 +606,7 @@
                 return NGX_ERROR;
             }
 
-            cl->buf = reinterpret_cast<ngx_buf_t *>(ngx_calloc_buf(r->pool));
+            cl->buf = ngx_calloc_buf(r->pool);
             if (cl->buf == NULL) {
                 return NGX_ERROR;
             }
@@ -621,8 +646,7 @@
         return NGX_OK;
     }
 
-    conf = reinterpret_cast<ngx_http_brotli_conf_t *>(
-               ngx_http_get_module_loc_conf(r, ngx_http_brotli_filter_module));
+    conf = ngx_http_get_module_loc_conf(r, ngx_http_brotli_filter_module);
 
     if (ctx->bufs < conf->bufs.num) {
         ctx->out_buf = ngx_create_temp_buf(r->pool, conf->bufs.size);
@@ -646,13 +670,11 @@
 static void
 ngx_http_brotli_cleanup(void *data)
 {
-    ngx_http_brotli_ctx_t  *ctx;
+    ngx_http_brotli_ctx_t  *ctx = data;
 
-    ctx = reinterpret_cast<ngx_http_brotli_ctx_t *>(data);
-
-    if (ctx->compressor) {
-        delete ctx->compressor;
-        ctx->compressor = NULL;
+    if (ctx->encoder) {
+        BrotliEncoderDestroyInstance(ctx->encoder);
+        ctx->encoder = NULL;
     }
 }
 
@@ -693,7 +715,7 @@
 {
     u_char  *p;
 
-    p = ngx_strcasestrn(ae->data, const_cast<char *>("br"), sizeof("br") - 2);
+    p = ngx_strcasestrn(ae->data, "br", sizeof("br") - 2);
     if (p == NULL) {
         return NGX_DECLINED;
     }
@@ -738,16 +760,14 @@
     v->no_cacheable = 0;
     v->not_found = 0;
 
-    ctx = reinterpret_cast<ngx_http_brotli_ctx_t *>(
-              ngx_http_get_module_ctx(r, ngx_http_brotli_filter_module));
+    ctx = ngx_http_get_module_ctx(r, ngx_http_brotli_filter_module);
 
     if (ctx == NULL || ctx->bytes_out == 0 || !ctx->sent) {
         v->not_found = 1;
         return NGX_OK;
     }
 
-    v->data = reinterpret_cast<u_char *>(
-                  ngx_pnalloc(r->pool, NGX_INT32_LEN + 3));
+    v->data = ngx_pnalloc(r->pool, NGX_INT32_LEN + 3);
     if (v->data == NULL) {
         return NGX_ERROR;
     }
@@ -778,8 +798,7 @@
 {
     ngx_http_brotli_conf_t  *conf;
 
-    conf = reinterpret_cast<ngx_http_brotli_conf_t *>(
-               ngx_pcalloc(cf->pool, sizeof(ngx_http_brotli_conf_t)));
+    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_brotli_conf_t));
     if (conf == NULL) {
         return NULL;
     }
@@ -805,11 +824,8 @@
 static char *
 ngx_http_brotli_merge_conf(ngx_conf_t *cf, void *parent, void *child)
 {
-    ngx_http_brotli_conf_t  *prev;
-    ngx_http_brotli_conf_t  *conf;
-
-    prev = reinterpret_cast<ngx_http_brotli_conf_t *>(parent);
-    conf = reinterpret_cast<ngx_http_brotli_conf_t *>(child);
+    ngx_http_brotli_conf_t  *prev = parent;
+    ngx_http_brotli_conf_t  *conf = child;
 
     ngx_conf_merge_value(conf->enable, prev->enable, 0);
 
@@ -825,7 +841,7 @@
                              ngx_http_html_default_types)
         != NGX_OK)
     {
-        return reinterpret_cast<char *>(NGX_CONF_ERROR);
+        return NGX_CONF_ERROR;
     }
 
     return NGX_CONF_OK;
@@ -848,12 +864,11 @@
 static char *
 ngx_http_brotli_window(ngx_conf_t *cf, void *post, void *data)
 {
-    size_t *np = reinterpret_cast<size_t *>(data);
+    size_t  *np = data;
+    size_t   wbits, wsize, mbits;
 
-    size_t  wbits, wsize, mbits;
-
-    wbits = brotli::kMaxWindowBits;
-    mbits = brotli::kMinWindowBits;
+    wbits = kBrotliMaxWindowBits;
+    mbits = kBrotliMinWindowBits;
 
     for (wsize = (1 << wbits); wsize >= (1U << mbits); wsize >>= 1) {
 
@@ -866,6 +881,6 @@
         wbits--;
     }
 
-    return const_cast<char *>("must be 1k, 2k, 4k, 8k, 16k, 32k, 64k, "
-                              "128k, 256k, 512k, 1m, 2m, 4m, 8m or 16m");
+    return "must be 1k, 2k, 4k, 8k, 16k, 32k, 64k, "
+           "128k, 256k, 512k, 1m, 2m, 4m, 8m or 16m";
 }
