diff --git a/modules/core/include/opencv2/core/operations.hpp b/modules/core/include/opencv2/core/operations.hpp
index 082fef4440..2c38469446 100644
--- a/modules/core/include/opencv2/core/operations.hpp
+++ b/modules/core/include/opencv2/core/operations.hpp
@@ -256,6 +256,14 @@ Matx<_Tp, n, l> Matx<_Tp, m, n>::solve(const Matx<_Tp, m, l>& rhs, int method) c
     template<typename _Tp, int m, int n> static inline A& operator op (A& a, const Matx<_Tp,m,n>& b) { cvop; return a; } \
     template<typename _Tp, int m, int n> static inline const A& operator op (const A& a, const Matx<_Tp,m,n>& b) { cvop; return a; }
 
+#define CV_MAT_AUG_OPERATOR_FOR1CHANNEL(op, cvop, A)   \
+    CV_MAT_AUG_OPERATOR1(op, CV_Assert(a.channels() == 1); cvop, A, double) \
+    CV_MAT_AUG_OPERATOR1(op, CV_Assert(a.channels() == 1); cvop, const A, double)
+
+#define CV_MAT_AUG_OPERATOR_T_FOR1CHANNEL(op, cvop, A) \
+    template<typename _Tp> CV_MAT_AUG_OPERATOR1(op, CV_Assert(a.channels() == 1); cvop, A, double) \
+    template<typename _Tp> CV_MAT_AUG_OPERATOR1(op, CV_Assert(a.channels() == 1); cvop, const A, double)
+
 CV_MAT_AUG_OPERATOR  (+=, cv::add(a,b,a), Mat, Mat)
 CV_MAT_AUG_OPERATOR  (+=, cv::add(a,b,a), Mat, Scalar)
 CV_MAT_AUG_OPERATOR_T(+=, cv::add(a,b,a), Mat_<_Tp>, Mat)
@@ -263,6 +271,8 @@ CV_MAT_AUG_OPERATOR_T(+=, cv::add(a,b,a), Mat_<_Tp>, Scalar)
 CV_MAT_AUG_OPERATOR_T(+=, cv::add(a,b,a), Mat_<_Tp>, Mat_<_Tp>)
 CV_MAT_AUG_OPERATOR_TN(+=, cv::add(a,Mat(b),a), Mat)
 CV_MAT_AUG_OPERATOR_TN(+=, cv::add(a,Mat(b),a), Mat_<_Tp>)
+CV_MAT_AUG_OPERATOR_FOR1CHANNEL  (+=, cv::add(a, b, a), Mat)
+CV_MAT_AUG_OPERATOR_T_FOR1CHANNEL(+=, cv::add(a, b, a), Mat_<_Tp>)
 
 CV_MAT_AUG_OPERATOR  (-=, cv::subtract(a,b,a), Mat, Mat)
 CV_MAT_AUG_OPERATOR  (-=, cv::subtract(a,b,a), Mat, Scalar)
@@ -271,6 +281,8 @@ CV_MAT_AUG_OPERATOR_T(-=, cv::subtract(a,b,a), Mat_<_Tp>, Scalar)
 CV_MAT_AUG_OPERATOR_T(-=, cv::subtract(a,b,a), Mat_<_Tp>, Mat_<_Tp>)
 CV_MAT_AUG_OPERATOR_TN(-=, cv::subtract(a,Mat(b),a), Mat)
 CV_MAT_AUG_OPERATOR_TN(-=, cv::subtract(a,Mat(b),a), Mat_<_Tp>)
+CV_MAT_AUG_OPERATOR_FOR1CHANNEL  (-=, cv::subtract(a, b, a), Mat)
+CV_MAT_AUG_OPERATOR_T_FOR1CHANNEL(-=, cv::subtract(a, b, a), Mat_<_Tp>)
 
 CV_MAT_AUG_OPERATOR  (*=, cv::gemm(a, b, 1, Mat(), 0, a, 0), Mat, Mat)
 CV_MAT_AUG_OPERATOR_T(*=, cv::gemm(a, b, 1, Mat(), 0, a, 0), Mat_<_Tp>, Mat)
@@ -295,6 +307,8 @@ CV_MAT_AUG_OPERATOR_T(&=, cv::bitwise_and(a,b,a), Mat_<_Tp>, Scalar)
 CV_MAT_AUG_OPERATOR_T(&=, cv::bitwise_and(a,b,a), Mat_<_Tp>, Mat_<_Tp>)
 CV_MAT_AUG_OPERATOR_TN(&=, cv::bitwise_and(a, Mat(b), a), Mat)
 CV_MAT_AUG_OPERATOR_TN(&=, cv::bitwise_and(a, Mat(b), a), Mat_<_Tp>)
+CV_MAT_AUG_OPERATOR_FOR1CHANNEL  (&=, cv::bitwise_and(a, b, a), Mat)
+CV_MAT_AUG_OPERATOR_T_FOR1CHANNEL(&=, cv::bitwise_and(a, b, a), Mat_<_Tp>)
 
 CV_MAT_AUG_OPERATOR  (|=, cv::bitwise_or(a,b,a), Mat, Mat)
 CV_MAT_AUG_OPERATOR  (|=, cv::bitwise_or(a,b,a), Mat, Scalar)
@@ -303,6 +317,8 @@ CV_MAT_AUG_OPERATOR_T(|=, cv::bitwise_or(a,b,a), Mat_<_Tp>, Scalar)
 CV_MAT_AUG_OPERATOR_T(|=, cv::bitwise_or(a,b,a), Mat_<_Tp>, Mat_<_Tp>)
 CV_MAT_AUG_OPERATOR_TN(|=, cv::bitwise_or(a, Mat(b), a), Mat)
 CV_MAT_AUG_OPERATOR_TN(|=, cv::bitwise_or(a, Mat(b), a), Mat_<_Tp>)
+CV_MAT_AUG_OPERATOR_FOR1CHANNEL  (|=, cv::bitwise_or(a, b, a), Mat)
+CV_MAT_AUG_OPERATOR_T_FOR1CHANNEL(|=, cv::bitwise_or(a, b, a), Mat_<_Tp>)
 
 CV_MAT_AUG_OPERATOR  (^=, cv::bitwise_xor(a,b,a), Mat, Mat)
 CV_MAT_AUG_OPERATOR  (^=, cv::bitwise_xor(a,b,a), Mat, Scalar)
@@ -311,7 +327,11 @@ CV_MAT_AUG_OPERATOR_T(^=, cv::bitwise_xor(a,b,a), Mat_<_Tp>, Scalar)
 CV_MAT_AUG_OPERATOR_T(^=, cv::bitwise_xor(a,b,a), Mat_<_Tp>, Mat_<_Tp>)
 CV_MAT_AUG_OPERATOR_TN(^=, cv::bitwise_xor(a, Mat(b), a), Mat)
 CV_MAT_AUG_OPERATOR_TN(^=, cv::bitwise_xor(a, Mat(b), a), Mat_<_Tp>)
+CV_MAT_AUG_OPERATOR_FOR1CHANNEL  (^=, cv::bitwise_xor(a, b, a), Mat)
+CV_MAT_AUG_OPERATOR_T_FOR1CHANNEL(^=, cv::bitwise_xor(a, b, a), Mat_<_Tp>)
 
+#undef CV_MAT_AUG_OPERATOR_T_FOR1CHANNEL
+#undef CV_MAT_AUG_OPERATOR_FOR1CHANNEL
 #undef CV_MAT_AUG_OPERATOR_TN
 #undef CV_MAT_AUG_OPERATOR_T
 #undef CV_MAT_AUG_OPERATOR
diff --git a/modules/core/test/test_mat.cpp b/modules/core/test/test_mat.cpp
index f69140bb8c..14174e560e 100644
--- a/modules/core/test/test_mat.cpp
+++ b/modules/core/test/test_mat.cpp
@@ -1644,7 +1644,43 @@ TEST(Mat, regression_10507_mat_setTo)
     }
 }
 
+template<typename MatType, typename Type>
+static void OverloadingTestFor1Channel_EachOp(const MatType& m, Type c)
+{
+    EXPECT_ANY_THROW(m += c);
+    EXPECT_ANY_THROW(m -= c);
+    EXPECT_ANY_THROW(m &= c);
+    EXPECT_ANY_THROW(m |= c);
+    EXPECT_ANY_THROW(m ^= c);
+}
+
+template<typename MatType>
+static void OverloadingTestFor1Channel_EachType(const MatType& m)
+{
+    OverloadingTestFor1Channel_EachOp< MatType, bool>               (m, true);
+    OverloadingTestFor1Channel_EachOp< MatType, char>               (m, (char)1);
+    OverloadingTestFor1Channel_EachOp< MatType, unsigned char>      (m, (unsigned char)1);
+    OverloadingTestFor1Channel_EachOp< MatType, short>              (m, (short)1);
+    OverloadingTestFor1Channel_EachOp< MatType, unsigned short>     (m, (unsigned short)1);
+    OverloadingTestFor1Channel_EachOp< MatType, int>                (m, 1);
+    OverloadingTestFor1Channel_EachOp< MatType, unsigned int>       (m, (unsigned int)1);
+    OverloadingTestFor1Channel_EachOp< MatType, long>               (m, (long)1);
+    OverloadingTestFor1Channel_EachOp< MatType, unsigned long>      (m, (unsigned long)1);
+    OverloadingTestFor1Channel_EachOp< MatType, float>              (m, 1.0f);
+    OverloadingTestFor1Channel_EachOp< MatType, double>             (m, 1.0);
+}
+
+TEST(Mat, regression_13586)
+{
+    Mat m1(2, 2, CV_8UC3, Scalar::all(1));
+    OverloadingTestFor1Channel_EachType(m1);
+    Mat4b m2(2, 2);
+    m2.setTo(0);
+    OverloadingTestFor1Channel_EachType(m2);
+}
+
 #ifdef CV_CXX_STD_ARRAY
+
 TEST(Core_Mat_array, outputArray_create_getMat)
 {
     cv::Mat_<uchar> src_base(5, 1);
diff --git a/modules/dnn/test/test_tf_importer.cpp b/modules/dnn/test/test_tf_importer.cpp
index ce4997cd4e..cc7f26196b 100644
--- a/modules/dnn/test/test_tf_importer.cpp
+++ b/modules/dnn/test/test_tf_importer.cpp
@@ -40,7 +40,7 @@ TEST(Test_TensorFlow, read_inception)
     ASSERT_TRUE(!sample.empty());
     Mat input;
     resize(sample, input, Size(224, 224));
-    input -= 128; // mean sub
+    input -= Scalar::all(117); // mean sub
 
     Mat inputBlob = blobFromImage(input);