diff --git a/googlemock/include/gmock/gmock-generated-matchers.h b/googlemock/include/gmock/gmock-generated-matchers.h
index 346b145e3c722a9f8a55e12fd13f62f30fcc814c..539d6570c23966e25eb83802f8a704221772a61e 100644
--- a/googlemock/include/gmock/gmock-generated-matchers.h
+++ b/googlemock/include/gmock/gmock-generated-matchers.h
@@ -50,10 +50,8 @@
 #define GMOCK_INTERNAL_MATCHER(name, description)\
   class name##Matcher : public \
       ::testing::internal::MatcherBaseImpl<name##Matcher> {\
-    using __internal_base_type = \
-        ::testing::internal::MatcherBaseImpl<name##Matcher>;\
    public:\
-    using __internal_base_type::__internal_base_type;\
+    using name##Matcher::MatcherBaseImpl::MatcherBaseImpl;\
     template <typename arg_type>\
     class gmock_Impl : public ::testing::MatcherInterface<\
         GTEST_REFERENCE_TO_CONST_(arg_type)> {\
@@ -95,10 +93,8 @@
   template <typename p0##_type>\
   class name##MatcherP : public \
       ::testing::internal::MatcherBaseImpl<name##MatcherP<p0##_type>> {\
-    using __internal_base_type = \
-        ::testing::internal::MatcherBaseImpl<name##MatcherP>;\
    public:\
-    using __internal_base_type::__internal_base_type;\
+    using name##MatcherP::MatcherBaseImpl::MatcherBaseImpl;\
     template <typename arg_type>\
     class gmock_Impl : public ::testing::MatcherInterface<\
         GTEST_REFERENCE_TO_CONST_(arg_type)> {\
@@ -144,10 +140,8 @@
   class name##MatcherP2 : public \
       ::testing::internal::MatcherBaseImpl<name##MatcherP2<p0##_type, \
       p1##_type>> {\
-    using __internal_base_type = \
-        ::testing::internal::MatcherBaseImpl<name##MatcherP2>;\
    public:\
-    using __internal_base_type::__internal_base_type;\
+    using name##MatcherP2::MatcherBaseImpl::MatcherBaseImpl;\
     template <typename arg_type>\
     class gmock_Impl : public ::testing::MatcherInterface<\
         GTEST_REFERENCE_TO_CONST_(arg_type)> {\
@@ -196,10 +190,8 @@
   class name##MatcherP3 : public \
       ::testing::internal::MatcherBaseImpl<name##MatcherP3<p0##_type, \
       p1##_type, p2##_type>> {\
-    using __internal_base_type = \
-        ::testing::internal::MatcherBaseImpl<name##MatcherP3>;\
    public:\
-    using __internal_base_type::__internal_base_type;\
+    using name##MatcherP3::MatcherBaseImpl::MatcherBaseImpl;\
     template <typename arg_type>\
     class gmock_Impl : public ::testing::MatcherInterface<\
         GTEST_REFERENCE_TO_CONST_(arg_type)> {\
@@ -251,10 +243,8 @@
   class name##MatcherP4 : public \
       ::testing::internal::MatcherBaseImpl<name##MatcherP4<p0##_type, \
       p1##_type, p2##_type, p3##_type>> {\
-    using __internal_base_type = \
-        ::testing::internal::MatcherBaseImpl<name##MatcherP4>;\
    public:\
-    using __internal_base_type::__internal_base_type;\
+    using name##MatcherP4::MatcherBaseImpl::MatcherBaseImpl;\
     template <typename arg_type>\
     class gmock_Impl : public ::testing::MatcherInterface<\
         GTEST_REFERENCE_TO_CONST_(arg_type)> {\
@@ -313,10 +303,8 @@
   class name##MatcherP5 : public \
       ::testing::internal::MatcherBaseImpl<name##MatcherP5<p0##_type, \
       p1##_type, p2##_type, p3##_type, p4##_type>> {\
-    using __internal_base_type = \
-        ::testing::internal::MatcherBaseImpl<name##MatcherP5>;\
    public:\
-    using __internal_base_type::__internal_base_type;\
+    using name##MatcherP5::MatcherBaseImpl::MatcherBaseImpl;\
     template <typename arg_type>\
     class gmock_Impl : public ::testing::MatcherInterface<\
         GTEST_REFERENCE_TO_CONST_(arg_type)> {\
@@ -377,10 +365,8 @@
   class name##MatcherP6 : public \
       ::testing::internal::MatcherBaseImpl<name##MatcherP6<p0##_type, \
       p1##_type, p2##_type, p3##_type, p4##_type, p5##_type>> {\
-    using __internal_base_type = \
-        ::testing::internal::MatcherBaseImpl<name##MatcherP6>;\
    public:\
-    using __internal_base_type::__internal_base_type;\
+    using name##MatcherP6::MatcherBaseImpl::MatcherBaseImpl;\
     template <typename arg_type>\
     class gmock_Impl : public ::testing::MatcherInterface<\
         GTEST_REFERENCE_TO_CONST_(arg_type)> {\
@@ -444,10 +430,8 @@
   class name##MatcherP7 : public \
       ::testing::internal::MatcherBaseImpl<name##MatcherP7<p0##_type, \
       p1##_type, p2##_type, p3##_type, p4##_type, p5##_type, p6##_type>> {\
-    using __internal_base_type = \
-        ::testing::internal::MatcherBaseImpl<name##MatcherP7>;\
    public:\
-    using __internal_base_type::__internal_base_type;\
+    using name##MatcherP7::MatcherBaseImpl::MatcherBaseImpl;\
     template <typename arg_type>\
     class gmock_Impl : public ::testing::MatcherInterface<\
         GTEST_REFERENCE_TO_CONST_(arg_type)> {\
@@ -519,10 +503,8 @@
       ::testing::internal::MatcherBaseImpl<name##MatcherP8<p0##_type, \
       p1##_type, p2##_type, p3##_type, p4##_type, p5##_type, p6##_type, \
       p7##_type>> {\
-    using __internal_base_type = \
-        ::testing::internal::MatcherBaseImpl<name##MatcherP8>;\
    public:\
-    using __internal_base_type::__internal_base_type;\
+    using name##MatcherP8::MatcherBaseImpl::MatcherBaseImpl;\
     template <typename arg_type>\
     class gmock_Impl : public ::testing::MatcherInterface<\
         GTEST_REFERENCE_TO_CONST_(arg_type)> {\
@@ -597,10 +579,8 @@
       ::testing::internal::MatcherBaseImpl<name##MatcherP9<p0##_type, \
       p1##_type, p2##_type, p3##_type, p4##_type, p5##_type, p6##_type, \
       p7##_type, p8##_type>> {\
-    using __internal_base_type = \
-        ::testing::internal::MatcherBaseImpl<name##MatcherP9>;\
    public:\
-    using __internal_base_type::__internal_base_type;\
+    using name##MatcherP9::MatcherBaseImpl::MatcherBaseImpl;\
     template <typename arg_type>\
     class gmock_Impl : public ::testing::MatcherInterface<\
         GTEST_REFERENCE_TO_CONST_(arg_type)> {\
@@ -679,10 +659,8 @@
       ::testing::internal::MatcherBaseImpl<name##MatcherP10<p0##_type, \
       p1##_type, p2##_type, p3##_type, p4##_type, p5##_type, p6##_type, \
       p7##_type, p8##_type, p9##_type>> {\
-    using __internal_base_type = \
-        ::testing::internal::MatcherBaseImpl<name##MatcherP10>;\
    public:\
-    using __internal_base_type::__internal_base_type;\
+    using name##MatcherP10::MatcherBaseImpl::MatcherBaseImpl;\
     template <typename arg_type>\
     class gmock_Impl : public ::testing::MatcherInterface<\
         GTEST_REFERENCE_TO_CONST_(arg_type)> {\
diff --git a/googlemock/include/gmock/gmock-generated-matchers.h.pump b/googlemock/include/gmock/gmock-generated-matchers.h.pump
index fc0ffdcf9dec6170982672c28968c3472ced7f3e..0ea3aad95d4e0782334100c39658a9fa82621dbb 100644
--- a/googlemock/include/gmock/gmock-generated-matchers.h.pump
+++ b/googlemock/include/gmock/gmock-generated-matchers.h.pump
@@ -80,9 +80,8 @@ $var param_field_decls2 = [[$for j
 
 #define $macro_name(name, description$for j [[, p$j]])\$template
   class $class_name : public ::testing::internal::MatcherBaseImpl<$class_name$param_types> {\
-    using __internal_base_type = ::testing::internal::MatcherBaseImpl<$class_name>;\
    public:\
-    using __internal_base_type::__internal_base_type;\
+    using $class_name::MatcherBaseImpl::MatcherBaseImpl;\
     template <typename arg_type>\
     class gmock_Impl : public ::testing::MatcherInterface<\
         GTEST_REFERENCE_TO_CONST_(arg_type)> {\
diff --git a/googlemock/include/gmock/gmock-matchers.h b/googlemock/include/gmock/gmock-matchers.h
index 222112105c73b630d3485680852dd17f23d57430..473b3aa89023fd4fa5932c79033a75425292f6a4 100644
--- a/googlemock/include/gmock/gmock-matchers.h
+++ b/googlemock/include/gmock/gmock-matchers.h
@@ -462,28 +462,18 @@ class MatcherBaseImpl {
   }
 };
 
-// Template specialization for Matcher with 1 parameter.
-template <template <typename...> class Derived, typename T>
-class MatcherBaseImpl<Derived<T>> {
- public:
-  explicit MatcherBaseImpl(T param) : param_(std::move(param)) {}
-
-  template <typename F>
-  operator ::testing::Matcher<F>() const {  // NOLINT(runtime/explicit)
-    return ::testing::Matcher<F>(
-        new typename Derived<T>::template gmock_Impl<F>(param_));
-  }
-
- private:
-  const T param_;
-};
-
-// Template specialization for Matcher with multiple parameters.
+// Template specialization for Matcher with parameters.
 template <template <typename...> class Derived, typename... Ts>
 class MatcherBaseImpl<Derived<Ts...>> {
  public:
-  MatcherBaseImpl(Ts... params)
-      : params_(std::move(params)...) {}  // NOLINT(runtime/explicit)
+  // Mark the constructor explicit for single argument T to avoid implicit
+  // conversions.
+  template <typename E = std::enable_if<sizeof...(Ts) == 1>,
+            typename E::type* = nullptr>
+  explicit MatcherBaseImpl(Ts... params) : params_(std::move(params)...) {}
+  template <typename E = std::enable_if<sizeof...(Ts) != 1>,
+            typename = typename E::type>
+  MatcherBaseImpl(Ts... params) : params_(std::move(params)...) {}  // NOLINT
 
   template <typename F>
   operator ::testing::Matcher<F>() const {  // NOLINT(runtime/explicit)
diff --git a/googlemock/test/gmock-matchers_test.cc b/googlemock/test/gmock-matchers_test.cc
index c667ecbe3ad8c792bc07c13992fbef4002f7788c..2bcbe5cf8da6ccf5c3145e1174364c54eb8d3369 100644
--- a/googlemock/test/gmock-matchers_test.cc
+++ b/googlemock/test/gmock-matchers_test.cc
@@ -2875,6 +2875,33 @@ TEST(ExplainMatchResultTest, WorksWithMonomorphicMatcher) {
   EXPECT_EQ("", listener2.str());
 }
 
+MATCHER(ConstructNoArg, "") { return true; }
+MATCHER_P(Construct1Arg, arg1, "") { return true; }
+MATCHER_P2(Construct2Args, arg1, arg2, "") { return true; }
+
+TEST(MatcherConstruct, ExplicitVsImplicit) {
+  {
+    // No arg constructor can be constructed with empty brace.
+    ConstructNoArgMatcher m = {};
+    (void)m;
+    // And with no args
+    ConstructNoArgMatcher m2;
+    (void)m2;
+  }
+  {
+    // The one arg constructor has an explicit constructor.
+    // This is to prevent the implicit conversion.
+    using M = Construct1ArgMatcherP<int>;
+    EXPECT_TRUE((std::is_constructible<M, int>::value));
+    EXPECT_FALSE((std::is_convertible<int, M>::value));
+  }
+  {
+    // Multiple arg matchers can be constructed with an implicit construction.
+    Construct2ArgsMatcherP2<int, double> m = {1, 2.2};
+    (void)m;
+  }
+}
+
 MATCHER_P(Really, inner_matcher, "") {
   return ExplainMatchResult(inner_matcher, arg, result_listener);
 }