diff --git a/CMakeLists.txt b/CMakeLists.txt
index 94bad953d..aa7968937 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -151,13 +151,8 @@ OCV_OPTION(BUILD_TESTS              "Build accuracy & regression tests"
 OCV_OPTION(BUILD_WITH_DEBUG_INFO    "Include debug info into debug libs (not MSCV only)" ON )
 OCV_OPTION(BUILD_WITH_STATIC_CRT    "Enables use of staticaly linked CRT for staticaly linked OpenCV" ON IF MSVC )
 OCV_OPTION(BUILD_FAT_JAVA_LIB       "Create fat java wrapper containing the whole OpenCV library" ON IF ANDROID AND NOT BUILD_SHARED_LIBS AND CMAKE_COMPILER_IS_GNUCXX )
-OCV_OPTION(BUILD_ANDROID_SERVICE    "TBD" OFF IF ANDROID AND ANDROID_USE_STLPORT AND ANDROID_SOURCE_TREE )
-
-if(DEFINED BUILD_opencv_nonfree AND NOT BUILD_opencv_nonfree)
-  OCV_OPTION(BUILD_ANDROID_PACKAGE  "TBD" OFF IF ANDROID )
-else()
-  unset(BUILD_ANDROID_PACKAGE CACHE)
-endif()
+OCV_OPTION(BUILD_ANDROID_SERVICE    "Build OpenCV Manager for Google Play" OFF IF ANDROID AND ANDROID_USE_STLPORT AND ANDROID_SOURCE_TREE )
+OCV_OPTION(BUILD_ANDROID_PACKAGE    "Build platform-specific package for Google Play" OFF IF ANDROID )
 
 
 # 3rd party libs
@@ -231,15 +226,15 @@ else()
 endif()
 
 if(ANDROID)
-    set(LIBRARY_OUTPUT_PATH         "${CMAKE_BINARY_DIR}/lib/${ANDROID_NDK_ABI_NAME}")
-    set(3P_LIBRARY_OUTPUT_PATH      "${CMAKE_BINARY_DIR}/3rdparty/lib/${ANDROID_NDK_ABI_NAME}")
+    set(LIBRARY_OUTPUT_PATH         "${OpenCV_BINARY_DIR}/lib/${ANDROID_NDK_ABI_NAME}")
+    set(3P_LIBRARY_OUTPUT_PATH      "${OpenCV_BINARY_DIR}/3rdparty/lib/${ANDROID_NDK_ABI_NAME}")
     set(OPENCV_LIB_INSTALL_PATH     sdk/native/libs/${ANDROID_NDK_ABI_NAME})
     set(OPENCV_3P_LIB_INSTALL_PATH  sdk/native/3rdparty/libs/${ANDROID_NDK_ABI_NAME})
     set(OPENCV_CONFIG_INSTALL_PATH  sdk/native/jni)
     set(OPENCV_INCLUDE_INSTALL_PATH sdk/native/jni/include)
 else()
-    set(LIBRARY_OUTPUT_PATH         "${CMAKE_BINARY_DIR}/lib")
-    set(3P_LIBRARY_OUTPUT_PATH      "${CMAKE_BINARY_DIR}/3rdparty/lib${LIB_SUFFIX}")
+    set(LIBRARY_OUTPUT_PATH         "${OpenCV_BINARY_DIR}/lib")
+    set(3P_LIBRARY_OUTPUT_PATH      "${OpenCV_BINARY_DIR}/3rdparty/lib${LIB_SUFFIX}")
     set(OPENCV_LIB_INSTALL_PATH     lib${LIB_SUFFIX})
     set(OPENCV_3P_LIB_INSTALL_PATH  share/OpenCV/3rdparty/${OPENCV_LIB_INSTALL_PATH})
     set(OPENCV_INCLUDE_INSTALL_PATH include)
diff --git a/android/package/AndroidManifest.xml b/android/package/AndroidManifest.xml
new file mode 100644
index 000000000..3b6bc7d04
--- /dev/null
+++ b/android/package/AndroidManifest.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="org.opencv.lib_v@OPENCV_VERSION_MAJOR@@OPENCV_VERSION_MINOR@_@ANDROID_PACKAGE_PLATFORM@"
+    android:versionCode="@OPENCV_VERSION_PATCH@@ANDROID_PACKAGE_RELEASE@"
+    android:versionName="@OPENCV_VERSION_PATCH@.@ANDROID_PACKAGE_RELEASE@" >
+
+    <uses-sdk android:minSdkVersion="@ANDROID_SDK_VERSION@" />
+    <uses-feature android:name="android.hardware.touchscreen" android:required="false"/>
+
+    <application
+        android:icon="@drawable/icon"
+        android:label="@string/app_name" >
+    </application>
+
+</manifest>
\ No newline at end of file
diff --git a/android/package/CMakeLists.txt b/android/package/CMakeLists.txt
index 16b8469ed..35025b3e8 100644
--- a/android/package/CMakeLists.txt
+++ b/android/package/CMakeLists.txt
@@ -1,2 +1,93 @@
-#tbd
-add_subdirectory(info_lib)
+if(NOT ANDROID_PACKAGE_RELEASE)
+  set(ANDROID_PACKAGE_RELEASE 1)
+endif()
+
+if(NOT ANDROID_PACKAGE_PLATFORM)
+  if(ARMEABI_V7A)
+    if(NEON)
+      set(ANDROID_PACKAGE_PLATFORM armv7a_neon)
+    else()
+      set(ANDROID_PACKAGE_PLATFORM armv7a)
+    endif()
+  elseif(ARMEABI_V6)
+    set(ANDROID_PACKAGE_PLATFORM armv6)
+  elseif(ARMEABI)
+    set(ANDROID_PACKAGE_PLATFORM armv5)
+  elseif(X86)
+    set(ANDROID_PACKAGE_PLATFORM x86)
+  elseif(MIPS)
+    set(ANDROID_PACKAGE_PLATFORM mips)
+  else()
+    message(ERROR "Can not automatically determine the value for ANDROID_PACKAGE_PLATFORM")
+  endif()
+endif()
+
+if(NOT ANDROID_PACKAGE_PLATFORM_NAME)
+  if(ARMEABI_V7A)
+    if(NEON)
+      set(ANDROID_PACKAGE_PLATFORM_NAME "armeabi-v7a with NEON")
+    else()
+      set(ANDROID_PACKAGE_PLATFORM_NAME "armeabi-v7a")
+    endif()
+  elseif(ARMEABI_V6)
+    set(ANDROID_PACKAGE_PLATFORM_NAME "armeabi-v6")
+  elseif(ARMEABI)
+    set(ANDROID_PACKAGE_PLATFORM_NAME "armeabi")
+  elseif(X86)
+    set(ANDROID_PACKAGE_PLATFORM_NAME "x86")
+  elseif(MIPS)
+    set(ANDROID_PACKAGE_PLATFORM_NAME "mips")
+  else()
+    message(ERROR "Can not automatically determine the value for ANDROID_PACKAGE_PLATFORM_NAME")
+  endif()
+endif()
+
+if("${ANDROID_NATIVE_API_LEVEL}" MATCHES "[1-9][0-9]*$")
+  set(ANDROID_SDK_VERSION ${CMAKE_MATCH_0})
+endif()
+
+if(NOT ANDROID_SDK_VERSION GREATER 7)
+  set(ANDROID_SDK_VERSION 8)
+endif()
+
+set(PACKAGE_DIR "${OpenCV_BINARY_DIR}/package")
+
+configure_file("${CMAKE_CURRENT_SOURCE_DIR}/${ANDROID_MANIFEST_FILE}" "${PACKAGE_DIR}/${ANDROID_MANIFEST_FILE}"  @ONLY)
+configure_file("${CMAKE_CURRENT_SOURCE_DIR}/res/values/strings.xml"   "${PACKAGE_DIR}/res/values/strings.xml"    @ONLY)
+configure_file("${CMAKE_CURRENT_SOURCE_DIR}/res/drawable/icon.png"   "${PACKAGE_DIR}/res/drawable/icon.png"   COPYONLY)
+
+set(target_name "OpenCV_${OPENCV_VERSION_MAJOR}.${OPENCV_VERSION_MINOR}.${OPENCV_VERSION_PATCH}_binary_pack_${ANDROID_PACKAGE_PLATFORM}")
+get_target_property(opencv_java_location opencv_java LOCATION)
+
+set(android_proj_target_files ${ANDROID_PROJECT_FILES})
+ocv_list_add_prefix(android_proj_target_files "${PACKAGE_DIR}/")
+android_get_compatible_target(android_proj_sdk_target ${ANDROID_SDK_VERSION})
+set(APK_NAME "${PACKAGE_DIR}/bin/${target_name}-release-unsigned.apk")
+
+file(GLOB camera_wrappers "${OpenCV_SOURCE_DIR}/3rdparty/lib/${ANDROID_NDK_ABI_NAME}/libnative_camera_r*.so")
+set(CAMERA_LIB_COMMANDS "")
+
+foreach(wrapper ${camera_wrappers})
+  list(APPEND CAMERA_LIB_COMMANDS COMMAND ${CMAKE_COMMAND} -E copy "${wrapper}" "${PACKAGE_DIR}/libs/${ANDROID_NDK_ABI_NAME}/")
+endforeach()
+
+add_custom_command(
+         OUTPUT "${APK_NAME}"
+         COMMAND ${CMAKE_COMMAND} -E remove_directory "${PACKAGE_DIR}/libs"
+         COMMAND ${CMAKE_COMMAND} -E remove_directory "${PACKAGE_DIR}/bin"
+         COMMAND ${CMAKE_COMMAND} -E remove_directory "${PACKAGE_DIR}/gen"
+         COMMAND ${CMAKE_COMMAND} -E remove ${android_proj_target_files}
+         COMMAND ${CMAKE_COMMAND} -E make_directory "${PACKAGE_DIR}/src"
+         COMMAND ${CMAKE_COMMAND} -E make_directory "${PACKAGE_DIR}/libs/${ANDROID_NDK_ABI_NAME}/"
+         ${CAMERA_LIB_COMMANDS}
+         COMMAND ${CMAKE_COMMAND} -E copy "${opencv_java_location}" "${PACKAGE_DIR}/libs/${ANDROID_NDK_ABI_NAME}/"
+         COMMAND ${ANDROID_EXECUTABLE} --silent update project --path "${PACKAGE_DIR}" --target "${android_proj_sdk_target}" --name "${target_name}"
+         COMMAND ${ANT_EXECUTABLE} -q -noinput -k release
+         COMMAND ${CMAKE_COMMAND} -E touch "${APK_NAME}"
+         WORKING_DIRECTORY "${PACKAGE_DIR}"
+         MAIN_DEPENDENCY "${opencv_java_location}"
+         DEPENDS "${PACKAGE_DIR}/${ANDROID_MANIFEST_FILE}" "${PACKAGE_DIR}/res/values/strings.xml" "${PACKAGE_DIR}/res/drawable/icon.png" ${camera_wrappers}
+       )
+
+add_custom_target(android_package ALL SOURCES "${APK_NAME}" )
+add_dependencies(android_package opencv_java)
\ No newline at end of file
diff --git a/android/package/info_lib/CMakeLists.txt b/android/package/info_lib/CMakeLists.txt
deleted file mode 100644
index 7e9e9fe11..000000000
--- a/android/package/info_lib/CMakeLists.txt
+++ /dev/null
@@ -1 +0,0 @@
-#tbd
diff --git a/android/package/info_lib/jni/Android.mk b/android/package/info_lib/jni/Android.mk
deleted file mode 100644
index 89cc46279..000000000
--- a/android/package/info_lib/jni/Android.mk
+++ /dev/null
@@ -1,17 +0,0 @@
-LOCAL_PATH := $(call my-dir)
-include $(CLEAR_VARS)
-
-LOCAL_MODULE_TAGS := optional
-
-LOCAL_SRC_FILES := \
-    src/info.c
-
-LOCAL_C_INCLUDES := \
-    $(LOCAL_PATH)/include \
-    $(TOP)/frameworks/base/core/jni
-
-LOCAL_PRELINK_MODULE := false
-
-LOCAL_MODULE := libopencvinfo
-
-include $(BUILD_SHARED_LIBRARY)
diff --git a/android/package/info_lib/jni/Application.mk b/android/package/info_lib/jni/Application.mk
deleted file mode 100644
index c1d3a3fe6..000000000
--- a/android/package/info_lib/jni/Application.mk
+++ /dev/null
@@ -1,2 +0,0 @@
-APP_ABI := armeabi-v7a x86
-APP_PLATFORM := android-8
\ No newline at end of file
diff --git a/android/package/info_lib/jni/include/info.h b/android/package/info_lib/jni/include/info.h
deleted file mode 100644
index b9ba35fba..000000000
--- a/android/package/info_lib/jni/include/info.h
+++ /dev/null
@@ -1,3 +0,0 @@
-// Function return list of shared libs seporated with ";" symbol
-// in load order
-const char* GetLibraryList();
\ No newline at end of file
diff --git a/android/package/info_lib/jni/include/info_jni.h b/android/package/info_lib/jni/include/info_jni.h
deleted file mode 100644
index 28df21758..000000000
--- a/android/package/info_lib/jni/include/info_jni.h
+++ /dev/null
@@ -1,31 +0,0 @@
-/* DO NOT EDIT THIS FILE - it is machine generated */
-#include <jni.h>
-/* Header for class org_opencv_android_OpenCVLoader */
-
-#ifndef _Included_org_opencv_android_OpenCVLoader
-#define _Included_org_opencv_android_OpenCVLoader
-#ifdef __cplusplus
-extern "C" {
-#endif
-#undef org_opencv_android_OpenCVLoader_Success
-#define org_opencv_android_OpenCVLoader_Success 0L
-#undef org_opencv_android_OpenCVLoader_NoService
-#define org_opencv_android_OpenCVLoader_NoService 1L
-#undef org_opencv_android_OpenCVLoader_RestartRequired
-#define org_opencv_android_OpenCVLoader_RestartRequired 2L
-#undef org_opencv_android_OpenCVLoader_MarketError
-#define org_opencv_android_OpenCVLoader_MarketError 3L
-#undef org_opencv_android_OpenCVLoader_InitFailed
-#define org_opencv_android_OpenCVLoader_InitFailed 255L
-/*
- * Class:     org_opencv_android_OpenCVLoader
- * Method:    GetLibraryList
- * Signature: ()Ljava/lang/String;
- */
-JNIEXPORT jstring JNICALL Java_org_opencv_android_StaticHelper_getLibraryList
-  (JNIEnv *, jclass);
-
-#ifdef __cplusplus
-}
-#endif
-#endif
diff --git a/android/package/info_lib/jni/src/info.c b/android/package/info_lib/jni/src/info.c
deleted file mode 100644
index 6d445de8f..000000000
--- a/android/package/info_lib/jni/src/info.c
+++ /dev/null
@@ -1,18 +0,0 @@
-#include "info.h"
-#include <jni.h>
-
-#ifndef LIB_STRING
-    #define LIB_STRING "libtbb.so;libopencv_java.so"
-#endif
-
-const char* GetLibraryList()
-{
-    return LIB_STRING;
-}
-
-JNIEXPORT jstring JNICALL Java_org_opencv_android_StaticHelper_getLibraryList(JNIEnv* jenv, jclass clazz)
-{
-    jstring result = (*jenv)->NewStringUTF(jenv, LIB_STRING);
-
-    return result;
-}
\ No newline at end of file
diff --git a/android/package/res/drawable/icon.png b/android/package/res/drawable/icon.png
new file mode 100644
index 000000000..4e828bafd
Binary files /dev/null and b/android/package/res/drawable/icon.png differ
diff --git a/android/package/res/values/strings.xml b/android/package/res/values/strings.xml
new file mode 100644
index 000000000..c8f59be46
--- /dev/null
+++ b/android/package/res/values/strings.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+    <string name="app_name">OCV @OPENCV_VERSION_MAJOR@.@OPENCV_VERSION_MINOR@ binary pack for @ANDROID_PACKAGE_PLATFORM_NAME@</string>
+
+</resources>
\ No newline at end of file
diff --git a/android/service/engine/jni/NativeService/PackageInfo.h b/android/service/engine/jni/NativeService/PackageInfo.h
index ac82d37eb..d9d93b521 100644
--- a/android/service/engine/jni/NativeService/PackageInfo.h
+++ b/android/service/engine/jni/NativeService/PackageInfo.h
@@ -8,7 +8,7 @@
 #define ARCH_X64_NAME "x64"
 #define ARCH_ARMv5_NAME "armv5"
 #define ARCH_ARMv6_NAME "armv6"
-#define ARCH_ARMv7_NAME "armv7"
+#define ARCH_ARMv7_NAME "armv7a"
 #define ARCH_ARMv8_NAME "armv8"
 
 #define FEATURES_HAS_VFPv3d16_NAME "vfpv3d16"
@@ -26,7 +26,7 @@
 
 
 class PackageInfo
-{ 
+{
 public:
     PackageInfo(const std::string& version, int platform, int cpu_id);
     PackageInfo(const std::string& fullname, const std::string& install_path, const std::string& package_version = "0.0");
@@ -38,7 +38,7 @@ public:
     bool operator==(const PackageInfo& package) const;
     static const std::map<int, std::string> PlatformNameMap;
     bool IsValid() const;
-    
+
 protected:
     static std::map<int, std::string> InitPlatformNameMap();
     std::string Version;
diff --git a/cmake/OpenCVDetectAndroidSDK.cmake b/cmake/OpenCVDetectAndroidSDK.cmake
index 95b5d6910..f1bc5499f 100644
--- a/cmake/OpenCVDetectAndroidSDK.cmake
+++ b/cmake/OpenCVDetectAndroidSDK.cmake
@@ -175,6 +175,7 @@ macro(android_get_compatible_target VAR)
   endif()
 endmacro()
 
+unset(__android_project_chain CACHE)
 #add_android_project(target_name ${path} NATIVE_DEPS opencv_core LIBRARY_DEPS ${OpenCV_BINARY_DIR} SDK_TARGET 11)
 macro(add_android_project target path)
   # parse arguments
@@ -288,17 +289,18 @@ macro(add_android_project target path)
          COMMAND ${CMAKE_COMMAND} -E touch "${android_proj_bin_dir}/bin/${target}-debug.apk" # needed because ant does not update the timestamp of updated apk
          WORKING_DIRECTORY "${android_proj_bin_dir}"
          MAIN_DEPENDENCY "${android_proj_bin_dir}/${ANDROID_MANIFEST_FILE}"
-         DEPENDS ${android_proj_file_deps} ${JNI_LIB_NAME})
+         DEPENDS ${android_proj_file_deps} ${JNI_LIB_NAME} ${__android_project_chain})
     else()
-    add_custom_command(
-       OUTPUT "${android_proj_bin_dir}/bin/${target}-debug.apk"
-       COMMAND ${ANT_EXECUTABLE} -q -noinput -k debug
-       COMMAND ${CMAKE_COMMAND} -E touch "${android_proj_bin_dir}/bin/${target}-debug.apk" # needed because ant does not update the timestamp of updated apk
-       WORKING_DIRECTORY "${android_proj_bin_dir}"
-       MAIN_DEPENDENCY "${android_proj_bin_dir}/${ANDROID_MANIFEST_FILE}"
-       DEPENDS "${OpenCV_BINARY_DIR}/bin/classes.jar" opencv_java # as we are part of OpenCV we can just force this dependency
-       DEPENDS ${android_proj_file_deps} ${JNI_LIB_NAME})
+      add_custom_command(
+         OUTPUT "${android_proj_bin_dir}/bin/${target}-debug.apk"
+         COMMAND ${ANT_EXECUTABLE} -q -noinput -k debug
+         COMMAND ${CMAKE_COMMAND} -E touch "${android_proj_bin_dir}/bin/${target}-debug.apk" # needed because ant does not update the timestamp of updated apk
+         WORKING_DIRECTORY "${android_proj_bin_dir}"
+         MAIN_DEPENDENCY "${android_proj_bin_dir}/${ANDROID_MANIFEST_FILE}"
+         DEPENDS "${OpenCV_BINARY_DIR}/bin/.classes.jar.dephelper" opencv_java # as we are part of OpenCV we can just force this dependency
+         DEPENDS ${android_proj_file_deps} ${JNI_LIB_NAME} ${__android_project_chain})
     endif()
+    set(__android_project_chain ${target} CACHE INTERNAL "auxiliary variable used for Android progects chaining")
 
     unset(JNI_LIB_NAME)
 
diff --git a/modules/core/include/opencv2/core/core.hpp b/modules/core/include/opencv2/core/core.hpp
index f4b60fcf3..e5be8f70d 100644
--- a/modules/core/include/opencv2/core/core.hpp
+++ b/modules/core/include/opencv2/core/core.hpp
@@ -4320,6 +4320,7 @@ public:
     CV_WRAP_AS(setMat) void set(const string& name, const Mat& value);
     CV_WRAP_AS(setMatVector) void set(const string& name, const vector<Mat>& value);
     CV_WRAP_AS(setAlgorithm) void set(const string& name, const Ptr<Algorithm>& value);
+    template<typename _Tp> void set(const string& name, const Ptr<_Tp>& value);
 
     void set(const char* name, int value);
     void set(const char* name, double value);
@@ -4328,6 +4329,7 @@ public:
     void set(const char* name, const Mat& value);
     void set(const char* name, const vector<Mat>& value);
     void set(const char* name, const Ptr<Algorithm>& value);
+    template<typename _Tp> void set(const char* name, const Ptr<_Tp>& value);
 
     CV_WRAP string paramHelp(const string& name) const;
     int paramType(const char* name) const;
diff --git a/modules/core/include/opencv2/core/mat.hpp b/modules/core/include/opencv2/core/mat.hpp
index 1c79f50c1..ccc02571e 100644
--- a/modules/core/include/opencv2/core/mat.hpp
+++ b/modules/core/include/opencv2/core/mat.hpp
@@ -759,7 +759,8 @@ inline SVD::SVD() {}
 inline SVD::SVD( InputArray m, int flags ) { operator ()(m, flags); }
 inline void SVD::solveZ( InputArray m, OutputArray _dst )
 {
-    SVD svd(m);
+    Mat mtx = m.getMat();
+    SVD svd(mtx, (mtx.rows >= mtx.cols ? 0 : SVD::FULL_UV));
     _dst.create(svd.vt.cols, 1, svd.vt.type());
     Mat dst = _dst.getMat();
     svd.vt.row(svd.vt.rows-1).reshape(1,svd.vt.cols).copyTo(dst);
diff --git a/modules/core/include/opencv2/core/operations.hpp b/modules/core/include/opencv2/core/operations.hpp
index c7bc94ca1..1f8184890 100644
--- a/modules/core/include/opencv2/core/operations.hpp
+++ b/modules/core/include/opencv2/core/operations.hpp
@@ -3842,6 +3842,22 @@ template<typename _Tp> inline Ptr<_Tp> Algorithm::create(const string& name)
     return _create(name).ptr<_Tp>();
 }
 
+template<typename _Tp>
+void Algorithm::set(const char* _name, const Ptr<_Tp>& value)
+{
+    Ptr<Algorithm> algo_ptr = value. template ptr<cv::Algorithm>();
+    if (algo_ptr.empty()) {
+        CV_Error( CV_StsUnsupportedFormat, "unknown/unsupported Ptr type of the second parameter of the method Algorithm::set");
+    }
+    info()->set(this, _name, ParamType<Algorithm>::type, &algo_ptr);
+}
+template<typename _Tp>
+void Algorithm::set(const string& _name, const Ptr<_Tp>& value)
+{
+    this->set<_Tp>(_name.c_str(), value);
+}
+    
+
 template<typename _Tp> inline typename ParamType<_Tp>::member_type Algorithm::get(const string& _name) const
 {
     typename ParamType<_Tp>::member_type value;
diff --git a/modules/core/test/test_operations.cpp b/modules/core/test/test_operations.cpp
index 5297f95f2..fd9c42b29 100644
--- a/modules/core/test/test_operations.cpp
+++ b/modules/core/test/test_operations.cpp
@@ -75,6 +75,7 @@ protected:
     bool TestVec();
     bool TestMatxMultiplication();
     bool TestSubMatAccess();
+    bool TestSVD();
     bool operations1();
 
     void checkDiff(const Mat& m1, const Mat& m2, const string& s)
@@ -934,6 +935,29 @@ bool CV_OperationsTest::operations1()
     return true;
 }
 
+
+bool CV_OperationsTest::TestSVD()
+{    
+    try 
+    {
+        Mat A = (Mat_<double>(3,4) << 1, 2, -1, 4, 2, 4, 3, 5, -1, -2, 6, 7);
+        Mat x;
+        SVD::solveZ(A,x);
+        if( norm(A*x, CV_C) > FLT_EPSILON )
+            throw test_excep();
+
+        SVD svd(A, SVD::FULL_UV); 
+        if( norm(A*svd.vt.row(3).t(), CV_C) > FLT_EPSILON )
+            throw test_excep();
+    }
+    catch(const test_excep&)
+    {
+        ts->set_failed_test_info(cvtest::TS::FAIL_MISMATCH);
+        return false;
+    }
+    return true;
+}
+
 void CV_OperationsTest::run( int /* start_from */)
 {
     if (!TestMat())
@@ -959,6 +983,9 @@ void CV_OperationsTest::run( int /* start_from */)
     
     if (!TestSubMatAccess())
         return;
+    
+    if (!TestSVD())
+        return;
 
     if (!operations1())
         return;
diff --git a/modules/java/CMakeLists.txt b/modules/java/CMakeLists.txt
index 020abb282..278ee8a80 100644
--- a/modules/java/CMakeLists.txt
+++ b/modules/java/CMakeLists.txt
@@ -248,9 +248,9 @@ if(ANDROID)
       # build the library project
       # normally we should do this after a native part, but for a library project we can build the java part first
       add_custom_command(
-        OUTPUT "${OpenCV_BINARY_DIR}/bin/classes.jar"
+        OUTPUT "${OpenCV_BINARY_DIR}/bin/classes.jar" "${OpenCV_BINARY_DIR}/bin/.classes.jar.dephelper"
         COMMAND ${ANT_EXECUTABLE} -q -noinput -k debug
-        COMMAND ${CMAKE_COMMAND} -E touch "${OpenCV_BINARY_DIR}/bin/classes.jar" # needed because ant does not update the timestamp of updated jar
+        COMMAND ${CMAKE_COMMAND} -E touch "${OpenCV_BINARY_DIR}/bin/.classes.jar.dephelper" # can not rely on classes.jar because different versions of SDK update timestamp at different times
         WORKING_DIRECTORY "${OpenCV_BINARY_DIR}"
         DEPENDS ${lib_proj_files} ${lib_target_files} ${java_files}
         COMMENT "Building OpenCV Android library project"
diff --git a/modules/nonfree/CMakeLists.txt b/modules/nonfree/CMakeLists.txt
index 873532c3f..8c7bd0efd 100644
--- a/modules/nonfree/CMakeLists.txt
+++ b/modules/nonfree/CMakeLists.txt
@@ -1,2 +1,6 @@
+if(BUILD_ANDROID_PACKAGE)
+  ocv_module_disable(nonfree)
+endif()
+
 set(the_description "Functionality with possible limitations on the use")
 ocv_define_module(nonfree opencv_imgproc opencv_features2d)
diff --git a/samples/cpp/filestorage.cpp b/samples/cpp/filestorage.cpp
index fa48fe63b..45bf9fc6f 100644
--- a/samples/cpp/filestorage.cpp
+++ b/samples/cpp/filestorage.cpp
@@ -150,7 +150,37 @@ int main(int ac, char** av)
 
   }
 
-  cout << "Try opening " << filename << " to see the serialized data." << endl;
+  cout << "Try opening " << filename << " to see the serialized data." << endl << endl;
+
+  //read from string
+  {
+    cout << "Read data from string\n";
+    string dataString = 
+        "%YAML:1.0\n"
+        "mdata:\n"
+        "   A: 97\n"
+        "   X: 3.1415926535897931e+00\n"
+        "   id: mydata1234\n";
+    MyData m;
+    FileStorage fs(dataString, FileStorage::READ | FileStorage::MEMORY);
+    cout << "attempting to read mdata_b from string\n";   //Show default behavior for empty matrix
+    fs["mdata"] >> m;
+    cout << "read mdata\n";
+    cout << m << endl;
+  }
+
+  //write to string
+  {
+    cout << "Write data to string\n";
+    FileStorage fs(filename, FileStorage::WRITE | FileStorage::MEMORY | FileStorage::FORMAT_YAML);
+
+    cout << "writing MyData struct\n";
+    MyData m(1);
+    fs << "mdata" << m;
+    cout << m << endl;
+    string createdString = fs.releaseAndGetString();
+    cout << "Created string:\n" << createdString << "\n";
+  }
 
   return 0;
 }