diff --git a/modules/core/include/opencv2/core/utility.hpp b/modules/core/include/opencv2/core/utility.hpp
index d7211d05bf4472e56e9170e180b76e854ebf05e0..8ee82b82cff2ee60692c61f0be3ae56c50b9fc61 100644
--- a/modules/core/include/opencv2/core/utility.hpp
+++ b/modules/core/include/opencv2/core/utility.hpp
@@ -247,6 +247,23 @@ architecture.
  */
 CV_EXPORTS_W const String& getBuildInformation();
 
+/** @brief Returns library version string
+
+For example "3.4.1-dev".
+
+@sa getMajorVersion, getMinorVersion, getRevisionVersion
+*/
+CV_EXPORTS_W String getVersionString();
+
+/** @brief Returns major library version */
+CV_EXPORTS_W int getVersionMajor();
+
+/** @brief Returns minor library version */
+CV_EXPORTS_W int getVersionMinor();
+
+/** @brief Returns revision field of the library version */
+CV_EXPORTS_W int getVersionRevision();
+
 /** @brief Returns the number of ticks.
 
 The function returns the number of ticks after the certain event (for example, when the machine was
diff --git a/modules/core/misc/java/src/java/core+Core.jcode.in b/modules/core/misc/java/src/java/core+Core.jcode.in
index 1a0fe21cd8e0aa85cd4b20f74fdc712311aad841..f002d0f5a566f3b416b775e22e347c91d4180073 100644
--- a/modules/core/misc/java/src/java/core+Core.jcode.in
+++ b/modules/core/misc/java/src/java/core+Core.jcode.in
@@ -1,14 +1,14 @@
     // these constants are wrapped inside functions to prevent inlining
     private static String getVersion() { return "@OPENCV_VERSION@"; }
     private static String getNativeLibraryName() { return "opencv_java@OPENCV_VERSION_MAJOR@@OPENCV_VERSION_MINOR@@OPENCV_VERSION_PATCH@"; }
-    private static int getVersionMajor() { return @OPENCV_VERSION_MAJOR@; }
-    private static int getVersionMinor() { return @OPENCV_VERSION_MINOR@; }
-    private static int getVersionRevision() { return @OPENCV_VERSION_PATCH@; }
-    private static String getVersionStatus() { return "@OPENCV_VERSION_STATUS@"; }
+    private static int getVersionMajorJ() { return @OPENCV_VERSION_MAJOR@; }
+    private static int getVersionMinorJ() { return @OPENCV_VERSION_MINOR@; }
+    private static int getVersionRevisionJ() { return @OPENCV_VERSION_PATCH@; }
+    private static String getVersionStatusJ() { return "@OPENCV_VERSION_STATUS@"; }
 
     public static final String VERSION = getVersion();
     public static final String NATIVE_LIBRARY_NAME = getNativeLibraryName();
-    public static final int VERSION_MAJOR = getVersionMajor();
-    public static final int VERSION_MINOR = getVersionMinor();
-    public static final int VERSION_REVISION = getVersionRevision();
-    public static final String VERSION_STATUS = getVersionStatus();
+    public static final int VERSION_MAJOR = getVersionMajorJ();
+    public static final int VERSION_MINOR = getVersionMinorJ();
+    public static final int VERSION_REVISION = getVersionRevisionJ();
+    public static final String VERSION_STATUS = getVersionStatusJ();
diff --git a/modules/core/misc/java/test/CoreTest.java b/modules/core/misc/java/test/CoreTest.java
index 549bcd84dde1cee9380cc1947083e741816cd556..c608fb2053a12d36fa1d069b68f95648cd2be61f 100644
--- a/modules/core/misc/java/test/CoreTest.java
+++ b/modules/core/misc/java/test/CoreTest.java
@@ -2048,4 +2048,11 @@ public class CoreTest extends OpenCVTestCase {
         assertEquals(5f, val2);
     }
 
+    public void testVersion() {
+        assertEquals(Core.VERSION_MAJOR, Core.getVersionMajor());
+        assertEquals(Core.VERSION_MINOR, Core.getVersionMinor());
+        assertEquals(Core.VERSION_REVISION, Core.getVersionRevision());
+        assertEquals(Core.VERSION, Core.getVersionString());
+    }
+
 }
diff --git a/modules/core/src/system.cpp b/modules/core/src/system.cpp
index e0113c5b9fa2ce16140db92acc50a6bd4d007ee0..b53f7c9c43682bef419536a12d1f982df45919f2 100644
--- a/modules/core/src/system.cpp
+++ b/modules/core/src/system.cpp
@@ -745,6 +745,14 @@ const String& getBuildInformation()
     return build_info;
 }
 
+String getVersionString() { return String(CV_VERSION); }
+
+int getVersionMajor() { return CV_VERSION_MAJOR; }
+
+int getVersionMinor() { return CV_VERSION_MINOR; }
+
+int getVersionRevision() { return CV_VERSION_REVISION; }
+
 String format( const char* fmt, ... )
 {
     AutoBuffer<char, 1024> buf;
diff --git a/modules/core/test/test_misc.cpp b/modules/core/test/test_misc.cpp
index 3f62ed199dbbb9cfc55524b05981a69b99642191..0f083bd9510177ccb1caa34875dfc3f6223445a9 100644
--- a/modules/core/test/test_misc.cpp
+++ b/modules/core/test/test_misc.cpp
@@ -189,4 +189,14 @@ TEST(Core_Parallel, propagate_exceptions)
     }, cv::Exception);
 }
 
+TEST(Core_Version, consistency)
+{
+    // this test verifies that OpenCV version loaded in runtime
+    //   is the same this test has been built with
+    EXPECT_EQ(CV_VERSION_MAJOR, cv::getVersionMajor());
+    EXPECT_EQ(CV_VERSION_MINOR, cv::getVersionMinor());
+    EXPECT_EQ(CV_VERSION_REVISION, cv::getVersionRevision());
+    EXPECT_EQ(String(CV_VERSION), cv::getVersionString());
+}
+
 }} // namespace