diff --git a/BUILD b/BUILD
index 79871d621..51b3a063f 100644
--- a/BUILD
+++ b/BUILD
@@ -26,7 +26,7 @@ config_setting(
 # ZLIB configuration
 ################################################################################

-ZLIB_DEPS = ["@zlib//:zlib"]
+ZLIB_DEPS = ["@zlib"]

 ################################################################################
 # Protobuf Runtime Library
@@ -157,6 +157,7 @@ cc_library(
     includes = ["src/"],
     linkopts = LINK_OPTS,
     visibility = ["//visibility:public"],
+    alwayslink = 1,
 )

 PROTOBUF_DEPS = select({
@@ -230,6 +231,7 @@ cc_library(
     linkopts = LINK_OPTS,
     visibility = ["//visibility:public"],
     deps = [":protobuf_lite"] + PROTOBUF_DEPS,
+    alwayslink = 1,
 )

 # This provides just the header files for use in projects that need to build
@@ -318,13 +320,13 @@ cc_proto_library(

 [native_cc_proto_library(
     name = proto + "_cc_proto",
-    deps = [proto + "_proto"],
     visibility = ["//visibility:private"],
+    deps = [proto + "_proto"],
 ) for proto in WELL_KNOWN_PROTO_MAP.keys()]

 cc_proto_blacklist_test(
     name = "cc_proto_blacklist_test",
-    deps = [proto + "_cc_proto" for proto in WELL_KNOWN_PROTO_MAP.keys()]
+    deps = [proto + "_cc_proto" for proto in WELL_KNOWN_PROTO_MAP.keys()],
 )

 ################################################################################
@@ -900,7 +902,6 @@ py_proto_library(
     py_extra_srcs = glob(["python/**/__init__.py"]),
     py_libs = [
         ":python_srcs",
-        "@six//:six",
     ],
     srcs_version = "PY2AND3",
     visibility = ["//visibility:public"],
@@ -1002,7 +1003,9 @@ cc_library(
 # Note: We use `native_proto_common` here because we depend on an implementation-detail of
 # `proto_lang_toolchain`, which may not be available on `proto_common`.
 reject_blacklisted_files = hasattr(native_proto_common, "proto_lang_toolchain_rejects_files_do_not_use_or_we_will_break_you_without_mercy")
+
 cc_toolchain_blacklisted_protos = [proto + "_proto" for proto in WELL_KNOWN_PROTO_MAP.keys()] if reject_blacklisted_files else [":well_known_protos"]
+
 proto_lang_toolchain(
     name = "cc_toolchain",
     blacklisted_protos = cc_toolchain_blacklisted_protos,
diff --git a/protobuf.bzl b/protobuf.bzl
index 829464d44..4ac23594b 100644
--- a/protobuf.bzl
+++ b/protobuf.bzl
@@ -87,6 +87,8 @@ def _proto_gen_impl(ctx):
     for dep in ctx.attr.deps:
         import_flags += dep.proto.import_flags
         deps += dep.proto.deps
+    import_flags = depset(import_flags).to_list()
+    deps = depset(deps).to_list()

     if not ctx.attr.gen_cc and not ctx.attr.gen_py and not ctx.executable.plugin:
         return struct(
diff --git a/src/google/protobuf/io/gzip_stream.h b/src/google/protobuf/io/gzip_stream.h
index b1ce1d36c..d5d560ea7 100644
--- a/src/google/protobuf/io/gzip_stream.h
+++ b/src/google/protobuf/io/gzip_stream.h
@@ -47,10 +47,12 @@
 #include <google/protobuf/stubs/common.h>
 #include <google/protobuf/io/zero_copy_stream.h>
 #include <google/protobuf/port.h>
-#include <zlib.h>
-
 #include <google/protobuf/port_def.inc>

+#if HAVE_ZLIB
+#include <zlib.h>
+#endif  // HAVE_ZLIB
+
 namespace google {
 namespace protobuf {
 namespace io {
@@ -76,8 +78,10 @@ class PROTOBUF_EXPORT GzipInputStream : public ZeroCopyInputStream {
   virtual ~GzipInputStream();

   // Return last error message or NULL if no error.
+#if HAVE_ZLIB
   inline const char* ZlibErrorMessage() const { return zcontext_.msg; }
   inline int ZlibErrorCode() const { return zerror_; }
+#endif  // HAVE_ZLIB

   // implements ZeroCopyInputStream ----------------------------------
   bool Next(const void** data, int* size);
@@ -90,8 +94,10 @@ class PROTOBUF_EXPORT GzipInputStream : public ZeroCopyInputStream {

   ZeroCopyInputStream* sub_stream_;

+ #if HAVE_ZLIB
   z_stream zcontext_;
   int zerror_;
+ #endif // HAVE_ZLIB

   void* output_buffer_;
   void* output_position_;
@@ -142,9 +148,11 @@ class PROTOBUF_EXPORT GzipOutputStream : public ZeroCopyOutputStream {

   virtual ~GzipOutputStream();

+#if HAVE_ZLIB
   // Return last error message or NULL if no error.
   inline const char* ZlibErrorMessage() const { return zcontext_.msg; }
   inline int ZlibErrorCode() const { return zerror_; }
+#endif  // HAVE_ZLIB

   // Flushes data written so far to zipped data in the underlying stream.
   // It is the caller's responsibility to flush the underlying stream if
@@ -177,8 +185,10 @@ class PROTOBUF_EXPORT GzipOutputStream : public ZeroCopyOutputStream {
   void* sub_data_;
   int sub_data_size_;

+#if HAVE_ZLIB
   z_stream zcontext_;
   int zerror_;
+#endif  //HAVE_ZLIB
   void* input_buffer_;
   size_t input_buffer_length_;

