diff --git a/applications/registration/src/manual.cpp b/applications/registration/src/manual.cpp
index ca7f1cbf5361305c8fa30042eceb82dfb08db03f..6c4783eb06c4ec9ba251eff53bc2edaf32ea31e2 100644
--- a/applications/registration/src/manual.cpp
+++ b/applications/registration/src/manual.cpp
@@ -128,7 +128,7 @@ static void build_correspondances(const vector<Source*> &sources, map<string, Co
 	}
 }
 
-void averageDepth(vector<Mat> &in, Mat &out) {
+static void averageDepth(vector<Mat> &in, Mat &out, float varThresh) {
 	const int rows = in[0].rows;
 	const int cols = in[0].cols;
 
@@ -138,16 +138,36 @@ void averageDepth(vector<Mat> &in, Mat &out) {
 	for (int i = 0; i < rows * cols; ++i) {
 		float sum = 0;
 		int good_values = 0;
+
+		// Calculate mean
 		for (int i_in = 0; i_in < in.size(); ++i_in) {
 			float d = in[i_in].at<float>(i);
-			if (d < 40) {
+			if (d < 40.0f) {
 				good_values++;
 				sum += d;
 			}
 		}
 
 		if (good_values > 0) {
-			out.at<float>(i) = sum / (float) good_values;
+			sum /= (float)good_values;
+
+			// Calculate variance
+			float var = 0.0f;
+			for (int i_in = 0; i_in < in.size(); ++i_in) {
+				float d = in[i_in].at<float>(i);
+				if (d < 40.0f) {
+					float delta = d - sum;
+					var += delta*delta;
+				}
+			}
+			if (good_values > 1) var /= (good_values-1);
+			else var = 0.0f;
+
+			if (var < varThresh) {
+				out.at<float>(i) = sum;
+			} else {
+				out.at<float>(i) = 41.0f;
+			}
 		} else {
 			out.at<float>(i) = 41.0f;
 		}
@@ -368,8 +388,8 @@ void ftl::registration::manual(ftl::Configurable *root) {
 
 				std::this_thread::sleep_for(std::chrono::milliseconds(20));
 			}
-			averageDepth(buffer[0], d1);
-			averageDepth(buffer[1], d2);
+			averageDepth(buffer[0], d1, 1.0f);
+			averageDepth(buffer[1], d2, 1.0f);
 			Mat d1_v, d2_v;
 			d1.convertTo(d1_v, CV_8U, 255.0f / 10.0f);
 			d2.convertTo(d2_v, CV_8U, 255.0f / 10.0f);