diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 6000975813f082960f579f3d3d12a54f77212d61..e564d333c679de85d2746d51720b986ab6731ffe 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -39,6 +39,8 @@ SET(sources
 	detectors/gftt/detector_gftt_load_yaml.cpp
 	detectors/harris/detector_harris.cpp
 	detectors/harris/detector_harris_load_yaml.cpp
+	detectors/quickharris/detector_quickharris.cpp
+	detectors/quickharris/detector_quickharris_load_yaml.cpp	
 	detectors/sbd/detector_sbd.cpp
 	detectors/sbd/detector_sbd_load_yaml.cpp
 	detectors/kaze/detector_kaze.cpp
@@ -126,6 +128,8 @@ SET(headers_det_gftt
 	detectors/gftt/detector_gftt.h)
 SET(headers_det_harris	
 	detectors/harris/detector_harris.h)
+SET(headers_det_quickharris	
+	detectors/quickharris/detector_quickharris.h)	
 SET(headers_det_sbd	
 	detectors/sbd/detector_sbd.h)
 SET(headers_det_kaze	
@@ -265,6 +269,7 @@ INSTALL(FILES ${headers_det_brisk} DESTINATION include/${PROJECT_NAME}/detectors
 INSTALL(FILES ${headers_det_mser} DESTINATION include/${PROJECT_NAME}/detectors/mser)
 INSTALL(FILES ${headers_det_gftt} DESTINATION include/${PROJECT_NAME}/detectors/gftt)
 INSTALL(FILES ${headers_det_harris} DESTINATION include/${PROJECT_NAME}/detectors/harris)
+INSTALL(FILES ${headers_det_quickharris} DESTINATION include/${PROJECT_NAME}/detectors/quickharris)
 INSTALL(FILES ${headers_det_sbd} DESTINATION include/${PROJECT_NAME}/detectors/sbd)
 INSTALL(FILES ${headers_det_kaze} DESTINATION include/${PROJECT_NAME}/detectors/kaze)
 INSTALL(FILES ${headers_det_akaze} DESTINATION include/${PROJECT_NAME}/detectors/akaze)
diff --git a/src/common_class/trifocaltensor.cpp b/src/common_class/trifocaltensor.cpp
index 24c0fd52604f70aeffe8ce6d5e7093a687687064..c6e884aa16434c93483d67b1861e308dbbea1a88 100644
--- a/src/common_class/trifocaltensor.cpp
+++ b/src/common_class/trifocaltensor.cpp
@@ -299,41 +299,4 @@ void TrifocalTensor::transfer(const Eigen::Vector3d& p1 , Eigen::Vector3d& p2, E
 	p3(2) = 1;
 }
 
-Eigen::MatrixXd TrifocalTensor::normalizePoints(const Eigen::MatrixXd& l_in, Eigen::MatrixXd& l_out)
-{
-	// Centroid
-	Eigen::Vector3d centroid = l_in.colwise().mean();
-
-	// Compute norm mean
-	double sum_norm = 0;
-	for (int ii = 0; ii < l_in.rows(); ++ii )
-	{
-		// Center the coordinates
-		l_out(ii,0) = l_in(ii,0)-centroid(0);
-		l_out(ii,1) = l_in(ii,1)-centroid(1);
-		l_out(ii,2) = l_in(ii,2);
-		sum_norm = sum_norm + l_out.block(ii,0,1,2).norm();
-	}
-
-	double mean_norm = sum_norm/l_out.rows();
-
-	double scale = 1.41421356237/mean_norm;
-
-	// Isotropic scale (average distance equal to sqrt(2) )
-	for (int ii = 0; ii < l_in.rows(); ++ii )
-	{
-		l_out(ii,0) = scale*l_out(ii,0);
-		l_out(ii,1) = scale*l_out(ii,1);
-	}
-
-	// Composition of the normalization matrix
-	Eigen::MatrixXd T = Eigen::MatrixXd::Identity(3,3);
-	T(0,0) = scale;
-	T(1,1) = scale;
-	T(0,2) = -scale*centroid(0);
-	T(1,2) = -scale*centroid(1);
-
-	return T;
-}
-
 } /* namespace vision_utils */
diff --git a/src/common_class/trifocaltensor.h b/src/common_class/trifocaltensor.h
index 84a29675770e02029b8fb7e46f0354f82dad81be..62a1207e06f0667818142c0c8cb2df8f8b6e8145 100644
--- a/src/common_class/trifocaltensor.h
+++ b/src/common_class/trifocaltensor.h
@@ -93,11 +93,6 @@ private:
 	 * \brief Get random candidates
 	 */
 	Eigen::VectorXd getRandomCandidates(const int& min_points, const Eigen::MatrixXd& list1, const Eigen::MatrixXd& list2, const Eigen::MatrixXd& list3, Eigen::MatrixXd& l1, Eigen::MatrixXd& l2, Eigen::MatrixXd& l3);
-
-
-//	void normalizePoints(const Eigen::MatrixXd& list1, const Eigen::MatrixXd& list2, const Eigen::MatrixXd& list3, Eigen::MatrixXd& l1, Eigen::MatrixXd& l2, Eigen::MatrixXd& l3);
-	Eigen::MatrixXd normalizePoints(const Eigen::MatrixXd& list1, Eigen::MatrixXd& l1);
-
 };
 
 } /* namespace vision_utils */
diff --git a/src/test/gtest_vision_utils.cpp b/src/test/gtest_vision_utils.cpp
index 5ab8b79e2e6b75294dd41ea9cfc6cdb8033a7246..6ce0507335172b43680fe06fef8a11da32cecf46 100644
--- a/src/test/gtest_vision_utils.cpp
+++ b/src/test/gtest_vision_utils.cpp
@@ -241,6 +241,32 @@ TEST(VisionUtils, nextCombination)
 	ASSERT_EQ(list[29].compare("bcde"),0);
 }
 
+TEST(VisionUtils, normalizePointsIsotrop)
+{
+	Eigen::MatrixXd l_in(5,3);
+	l_in.row(0) << 1,1,1;
+	l_in.row(1) << 2,2,1;
+	l_in.row(2) << 3,3,1;
+	l_in.row(3) << 4,4,1;
+	l_in.row(4) << 5,5,1;
+
+	// Check function result
+	Eigen::MatrixXd l_out(l_in);
+	Eigen::MatrixXd T = vision_utils::normalizePointsIsotrop(l_in,l_out);
+	Eigen::MatrixXd l_test = T.inverse() * l_out.transpose();
+	Eigen::MatrixXd result = l_in-l_test.transpose();
+	ASSERT_EQ(result.norm(),0);
+
+	// Check result mean distances to origin is sqrt(2)
+	double avg_norm = 0;
+	for (int ii=0;ii<l_out.rows();++ii)
+	{
+		avg_norm = avg_norm + l_out.row(ii).block(0,0,1,2).norm();
+	}
+	avg_norm = avg_norm/l_out.rows();
+	ASSERT_TRUE(avg_norm-std::sqrt(2)<1e-16);
+}
+
 int main(int argc, char **argv) {
 	testing::InitGoogleTest(&argc, argv);
 	return RUN_ALL_TESTS();
diff --git a/src/vision_utils.cpp b/src/vision_utils.cpp
index e478e36732b4a7e1669f4474ee1f102e20e1ddbf..dadf4b21c3d2735b6064f2e5c90922facf28906a 100644
--- a/src/vision_utils.cpp
+++ b/src/vision_utils.cpp
@@ -331,5 +331,43 @@ double factorial(const int& n)
 	return fact;
 }
 
+Eigen::MatrixXd normalizePointsIsotrop(const Eigen::MatrixXd& l_in, Eigen::MatrixXd& l_out)
+{
+	// Centroid
+	Eigen::Vector3d centroid = l_in.colwise().mean();
+
+	// Compute norm mean
+	double sum_norm = 0;
+	for (int ii = 0; ii < l_in.rows(); ++ii )
+	{
+		// Center the coordinates
+		l_out(ii,0) = l_in(ii,0)-centroid(0);
+		l_out(ii,1) = l_in(ii,1)-centroid(1);
+		l_out(ii,2) = l_in(ii,2);
+		sum_norm = sum_norm + l_out.block(ii,0,1,2).norm();
+	}
+
+	double mean_norm = sum_norm/l_out.rows();
+
+	double scale = 1.41421356237/mean_norm;
+
+	// Isotropic scale (average distance equal to sqrt(2) )
+	for (int ii = 0; ii < l_in.rows(); ++ii )
+	{
+		l_out(ii,0) = scale*l_out(ii,0);
+		l_out(ii,1) = scale*l_out(ii,1);
+	}
+
+	// Composition of the normalization matrix
+	Eigen::MatrixXd T = Eigen::MatrixXd::Identity(3,3);
+	T(0,0) = scale;
+	T(1,1) = scale;
+	T(0,2) = -scale*centroid(0);
+	T(1,2) = -scale*centroid(1);
+
+	return T;
+}
+
+
 } /* namespace vision_utils */
 
diff --git a/src/vision_utils.h b/src/vision_utils.h
index 133c5a24d53038be8a27a9b7bb648d662756aa97..937090ce098efcb0b84420b009cc7c3dce4067d7 100644
--- a/src/vision_utils.h
+++ b/src/vision_utils.h
@@ -240,6 +240,8 @@ bool next_combination(const Iterator first, Iterator k, const Iterator last)
    return false;
 }
 
+Eigen::MatrixXd normalizePointsIsotrop(const Eigen::MatrixXd& list1, Eigen::MatrixXd& l1);
+
 } /* namespace vision_utils */
 
 #endif