diff -ruN a/opencv_contrib/modules/xfeatures2d/include/opencv2/xfeatures2d/nonfree.hpp b/opencv_contrib/modules/xfeatures2d/include/opencv2/xfeatures2d/nonfree.hpp
--- a/opencv_contrib/modules/xfeatures2d/include/opencv2/xfeatures2d/nonfree.hpp	2019-12-19 04:02:03.000000000 -0700
+++ b/opencv_contrib/modules/xfeatures2d/include/opencv2/xfeatures2d/nonfree.hpp	2020-03-24 17:09:02.143528875 -0600
@@ -50,40 +50,6 @@
 namespace xfeatures2d
 {
 
-//! @addtogroup xfeatures2d_nonfree
-//! @{
-
-/** @brief Class for extracting keypoints and computing descriptors using the Scale Invariant Feature Transform
-(SIFT) algorithm by D. Lowe @cite Lowe04 .
- */
-class CV_EXPORTS_W SIFT : public Feature2D
-{
-public:
-    /**
-    @param nfeatures The number of best features to retain. The features are ranked by their scores
-    (measured in SIFT algorithm as the local contrast)
-
-    @param nOctaveLayers The number of layers in each octave. 3 is the value used in D. Lowe paper. The
-    number of octaves is computed automatically from the image resolution.
-
-    @param contrastThreshold The contrast threshold used to filter out weak features in semi-uniform
-    (low-contrast) regions. The larger the threshold, the less features are produced by the detector.
-
-    @param edgeThreshold The threshold used to filter out edge-like features. Note that the its meaning
-    is different from the contrastThreshold, i.e. the larger the edgeThreshold, the less features are
-    filtered out (more features are retained).
-
-    @param sigma The sigma of the Gaussian applied to the input image at the octave \#0. If your image
-    is captured with a weak camera with soft lenses, you might want to reduce the number.
-     */
-    CV_WRAP static Ptr<SIFT> create( int nfeatures = 0, int nOctaveLayers = 3,
-                                    double contrastThreshold = 0.04, double edgeThreshold = 10,
-                                    double sigma = 1.6);
-};
-
-typedef SIFT SiftFeatureDetector;
-typedef SIFT SiftDescriptorExtractor;
-
 /** @brief Class for extracting Speeded Up Robust Features from an image @cite Bay06 .
 
 The algorithm parameters:
diff -ruN a/opencv_contrib/modules/xfeatures2d/include/opencv2/xfeatures2d.hpp b/opencv_contrib/modules/xfeatures2d/include/opencv2/xfeatures2d.hpp
--- a/opencv_contrib/modules/xfeatures2d/include/opencv2/xfeatures2d.hpp	2019-12-19 04:02:03.000000000 -0700
+++ b/opencv_contrib/modules/xfeatures2d/include/opencv2/xfeatures2d.hpp	2020-03-24 17:09:02.143528875 -0600
@@ -67,6 +67,39 @@
 namespace xfeatures2d
 {
 
+
+/** @brief Class for extracting keypoints and computing descriptors using the Scale Invariant Feature Transform
+(SIFT) algorithm by D. Lowe @cite Lowe04 .
+*/
+class CV_EXPORTS_W SIFT : public Feature2D
+{
+public:
+    /**
+    @param nfeatures The number of best features to retain. The features are ranked by their scores
+    (measured in SIFT algorithm as the local contrast)
+
+    @param nOctaveLayers The number of layers in each octave. 3 is the value used in D. Lowe paper. The
+    number of octaves is computed automatically from the image resolution.
+
+    @param contrastThreshold The contrast threshold used to filter out weak features in semi-uniform
+    (low-contrast) regions. The larger the threshold, the less features are produced by the detector.
+
+    @param edgeThreshold The threshold used to filter out edge-like features. Note that the its meaning
+    is different from the contrastThreshold, i.e. the larger the edgeThreshold, the less features are
+    filtered out (more features are retained).
+
+    @param sigma The sigma of the Gaussian applied to the input image at the octave \#0. If your image
+    is captured with a weak camera with soft lenses, you might want to reduce the number.
+    */
+    CV_WRAP static Ptr<SIFT> create(int nfeatures = 0, int nOctaveLayers = 3,
+        double contrastThreshold = 0.04, double edgeThreshold = 10,
+        double sigma = 1.6);
+};
+
+typedef SIFT SiftFeatureDetector;
+typedef SIFT SiftDescriptorExtractor;
+
+
 //! @addtogroup xfeatures2d_experiment
 //! @{
 
diff -ruN a/opencv_contrib/modules/xfeatures2d/src/sift.cpp b/opencv_contrib/modules/xfeatures2d/src/sift.cpp
--- a/opencv_contrib/modules/xfeatures2d/src/sift.cpp	2019-12-19 04:02:03.000000000 -0700
+++ b/opencv_contrib/modules/xfeatures2d/src/sift.cpp	2020-03-24 17:09:07.164676799 -0600
@@ -114,8 +114,6 @@
 namespace xfeatures2d
 {
 
-#ifdef OPENCV_ENABLE_NONFREE
-
 /*!
  SIFT implementation.
 
@@ -1202,14 +1200,5 @@
     }
 }
 
-#else // ! #ifdef OPENCV_ENABLE_NONFREE
-Ptr<SIFT> SIFT::create( int, int, double, double, double )
-{
-    CV_Error(Error::StsNotImplemented,
-        "This algorithm is patented and is excluded in this configuration; "
-        "Set OPENCV_ENABLE_NONFREE CMake option and rebuild the library");
-}
-#endif
-
 }
 }
diff -ruN a/opencv_contrib/modules/xfeatures2d/test/test_features2d.cpp b/opencv_contrib/modules/xfeatures2d/test/test_features2d.cpp
--- a/opencv_contrib/modules/xfeatures2d/test/test_features2d.cpp	2019-12-19 04:02:03.000000000 -0700
+++ b/opencv_contrib/modules/xfeatures2d/test/test_features2d.cpp	2020-03-24 17:09:07.165676829 -0600
@@ -94,7 +94,6 @@
 /*
  * Descriptors
  */
-#ifdef OPENCV_ENABLE_NONFREE
 TEST( Features2d_DescriptorExtractor_SIFT, regression )
 {
     CV_DescriptorExtractorTest<L1<float> > test( "descriptor-sift", 1.0f,
@@ -102,6 +101,7 @@
     test.safe_run();
 }
 
+#ifdef OPENCV_ENABLE_NONFREE
 TEST( Features2d_DescriptorExtractor_SURF, regression )
 {
 #ifdef HAVE_OPENCL
@@ -375,8 +375,9 @@
     Ptr<Feature2D> f2d;
 };
 
-#ifdef OPENCV_ENABLE_NONFREE
 TEST(Features2d_SIFTHomographyTest, regression) { CV_DetectPlanarTest test("SIFT", 80, SIFT::create()); test.safe_run(); }
+
+#ifdef OPENCV_ENABLE_NONFREE
 TEST(Features2d_SURFHomographyTest, regression) { CV_DetectPlanarTest test("SURF", 80, SURF::create()); test.safe_run(); }
 #endif
 
@@ -441,13 +442,13 @@
     Ptr<FeatureDetector> featureDetector_;
 };
 
-#ifdef OPENCV_ENABLE_NONFREE
 TEST(Features2d_SIFT_using_mask, regression)
 {
     FeatureDetectorUsingMaskTest test(SIFT::create());
     test.safe_run();
 }
 
+#ifdef OPENCV_ENABLE_NONFREE
 TEST(DISABLED_Features2d_SURF_using_mask, regression)
 {
     FeatureDetectorUsingMaskTest test(SURF::create());
