diff --git a/modules/features2d/include/opencv2/features2d/features2d.hpp b/modules/features2d/include/opencv2/features2d/features2d.hpp
index 489bf8d1e..a9e973923 100644
--- a/modules/features2d/include/opencv2/features2d/features2d.hpp
+++ b/modules/features2d/include/opencv2/features2d/features2d.hpp
@@ -1248,6 +1248,13 @@ public:
 
 protected:
     virtual void detectImpl( const Mat& image, vector<KeyPoint>& keypoints, const Mat& mask=Mat() ) const = 0;
+
+    /*
+     * Remove keypoints that are not in the mask.
+     * Helper function, useful when wrapping a library call for keypoint detection that
+     * does not support a mask argument.
+     */
+    static void removeInvalidPoints( const Mat& mask, vector<KeyPoint>& keypoints );
 };
 
 class CV_EXPORTS FastFeatureDetector : public FeatureDetector
@@ -1258,7 +1265,7 @@ public:
     virtual void write( FileStorage& fs ) const;
 
 protected:
-	virtual void detectImpl( const Mat& image, vector<KeyPoint>& keypoints, const Mat& mask=Mat() ) const;
+    virtual void detectImpl( const Mat& image, vector<KeyPoint>& keypoints, const Mat& mask=Mat() ) const;
 
     int threshold;
     bool nonmaxSuppression;
@@ -1291,9 +1298,9 @@ public:
     virtual void write( FileStorage& fs ) const;
 
 protected:
-	virtual void detectImpl( const Mat& image, vector<KeyPoint>& keypoints, const Mat& mask=Mat() ) const;
-	
-	Params params;
+    virtual void detectImpl( const Mat& image, vector<KeyPoint>& keypoints, const Mat& mask=Mat() ) const;
+
+    Params params;
 };
 
 class CV_EXPORTS MserFeatureDetector : public FeatureDetector
@@ -1306,7 +1313,7 @@ public:
     virtual void write( FileStorage& fs ) const;
 
 protected:
-	virtual void detectImpl( const Mat& image, vector<KeyPoint>& keypoints, const Mat& mask=Mat() ) const;
+    virtual void detectImpl( const Mat& image, vector<KeyPoint>& keypoints, const Mat& mask=Mat() ) const;
 
     MSER mser;
 };
@@ -1321,7 +1328,7 @@ public:
     virtual void write( FileStorage& fs ) const;
 
 protected:
-	virtual void detectImpl( const Mat& image, vector<KeyPoint>& keypoints, const Mat& mask=Mat() ) const;
+    virtual void detectImpl( const Mat& image, vector<KeyPoint>& keypoints, const Mat& mask=Mat() ) const;
 
     StarDetector star;
 };
@@ -1340,7 +1347,7 @@ public:
     virtual void write( FileStorage& fs ) const;
 
 protected:
-	virtual void detectImpl( const Mat& image, vector<KeyPoint>& keypoints, const Mat& mask=Mat() ) const;
+    virtual void detectImpl( const Mat& image, vector<KeyPoint>& keypoints, const Mat& mask=Mat() ) const;
 
     SIFT sift;
 };
@@ -1353,7 +1360,7 @@ public:
     virtual void write( FileStorage& fs ) const;
 
 protected:
-	virtual void detectImpl( const Mat& image, vector<KeyPoint>& keypoints, const Mat& mask=Mat() ) const;
+    virtual void detectImpl( const Mat& image, vector<KeyPoint>& keypoints, const Mat& mask=Mat() ) const;
 
     SURF surf;
 };
@@ -1425,9 +1432,9 @@ public:
 	// TODO implement read/write
 
 protected:
-	virtual void detectImpl( const Mat& image, vector<KeyPoint>& keypoints, const Mat& mask=Mat() ) const;
+    virtual void detectImpl( const Mat& image, vector<KeyPoint>& keypoints, const Mat& mask=Mat() ) const;
 
-	Params params;
+    Params params;
 };
 
 /*
@@ -1451,7 +1458,7 @@ public:
     virtual bool empty() const;
 
 protected:
-	virtual void detectImpl( const Mat& image, vector<KeyPoint>& keypoints, const Mat& mask=Mat() ) const;
+    virtual void detectImpl( const Mat& image, vector<KeyPoint>& keypoints, const Mat& mask=Mat() ) const;
 
     Ptr<FeatureDetector> detector;
     int maxTotalKeypoints;
@@ -1472,7 +1479,7 @@ public:
     virtual bool empty() const;
 
 protected:
-	virtual void detectImpl( const Mat& image, vector<KeyPoint>& keypoints, const Mat& mask=Mat() ) const;
+    virtual void detectImpl( const Mat& image, vector<KeyPoint>& keypoints, const Mat& mask=Mat() ) const;
 
     Ptr<FeatureDetector> detector;
     int levels;
@@ -1655,6 +1662,12 @@ public:
 
 protected:
     virtual void computeImpl( const Mat& image, vector<KeyPoint>& keypoints, Mat& descriptors ) const = 0;
+
+    /*
+     * Remove keypoints within borderPixels of an image edge.
+     */
+    static void removeBorderKeypoints( vector<KeyPoint>& keypoints,
+                                       Size imageSize, int borderSize );
 };
 
 /*
diff --git a/modules/features2d/src/descriptors.cpp b/modules/features2d/src/descriptors.cpp
index 82dffd3ce..fb0bfb4a0 100644
--- a/modules/features2d/src/descriptors.cpp
+++ b/modules/features2d/src/descriptors.cpp
@@ -89,6 +89,12 @@ bool DescriptorExtractor::empty() const
     return false;
 }
 
+void DescriptorExtractor::removeBorderKeypoints( vector<KeyPoint>& keypoints,
+                                                 Size imageSize, int borderSize )
+{
+    KeyPointsFilter::runByImageBorder( keypoints, imageSize, borderSize );
+}
+
 Ptr<DescriptorExtractor> DescriptorExtractor::create(const string& descriptorExtractorType)
 {
     DescriptorExtractor* de = 0;
diff --git a/modules/features2d/src/detectors.cpp b/modules/features2d/src/detectors.cpp
index 552adf394..c6efe0053 100644
--- a/modules/features2d/src/detectors.cpp
+++ b/modules/features2d/src/detectors.cpp
@@ -82,6 +82,11 @@ bool FeatureDetector::empty() const
     return false;
 }
 
+void FeatureDetector::removeInvalidPoints( const Mat& mask, vector<KeyPoint>& keypoints )
+{
+    KeyPointsFilter::runByPixelsMask( keypoints, mask );
+}
+
 Ptr<FeatureDetector> FeatureDetector::create( const string& detectorType )
 {
     FeatureDetector* fd = 0;