diff --git a/applications/registration/src/correspondances.cpp b/applications/registration/src/correspondances.cpp
index 91e3948a137fbd32219775d1f18bc495b235f096..07f0c300f3672134f2a3de0cc3cf8549f359c322 100644
--- a/applications/registration/src/correspondances.cpp
+++ b/applications/registration/src/correspondances.cpp
@@ -136,10 +136,10 @@ bool Correspondances::capture(cv::Mat &rgb1, cv::Mat &rgb2) {
 	cv::imshow("smooth d2", d2_v);
 
 	// Should be done in RGB-Depth source class
-	/*cv::Ptr<cv::xphoto::WhiteBalancer> wb;
+	cv::Ptr<cv::xphoto::WhiteBalancer> wb;
 	wb = cv::xphoto::createSimpleWB();
 	wb->balanceWhite(rgb1, rgb1);
-	wb->balanceWhite(rgb2, rgb2);*/
+	wb->balanceWhite(rgb2, rgb2);
 
 	// Build point clouds
 	clear();
@@ -276,6 +276,30 @@ double Correspondances::icp() {
 	return icp.getFitnessScore();
 }
 
+double Correspondances::icp(const Eigen::Matrix4f &T_in, Eigen::Matrix4f &T_out, const vector<int> &idx) {
+	//pcl::PointCloud<pcl::PointXYZ>::Ptr tsrc_cloud(new pcl::PointCloud<pcl::PointXYZ>);
+	pcl::PointCloud<pcl::PointXYZ>::Ptr final_cloud(new pcl::PointCloud<pcl::PointXYZ>);
+
+	pcl::PointCloud<pcl::PointXYZ>::Ptr targ_cloud(new pcl::PointCloud<pcl::PointXYZ>);
+	pcl::PointCloud<pcl::PointXYZ>::Ptr src_cloud(new pcl::PointCloud<pcl::PointXYZ>);
+	pcl::PointCloud<pcl::PointXYZ>::Ptr tsrc_cloud(new pcl::PointCloud<pcl::PointXYZ>);
+
+	for (int i=0; i<idx.size(); i++) {
+		src_cloud->push_back(src_cloud_->at(src_feat_[idx[i]]));
+		targ_cloud->push_back(targ_cloud_->at(targ_feat_[idx[i]]));
+	}
+
+	pcl::transformPointCloud(*src_cloud, *tsrc_cloud, T_in);
+
+	pcl::IterativeClosestPoint<pcl::PointXYZ, pcl::PointXYZ> icp;
+	icp.setInputSource(tsrc_cloud);
+	icp.setInputTarget(targ_cloud);
+	icp.align(*final_cloud);
+	LOG(INFO) << "has converged:" << icp.hasConverged() << " score: " << icp.getFitnessScore();
+	T_out = T_in * icp.getFinalTransformation();
+	return icp.getFitnessScore();
+}
+
 static std::default_random_engine generator;
 
 void Correspondances::convertToPCL(const std::vector<std::tuple<int,int,int,int>> &p, std::vector<std::pair<pcl::PointXYZ, pcl::PointXYZ>> &pp) {
@@ -326,7 +350,7 @@ void Correspondances::getTransformedFeatures2D(std::vector<Eigen::Vector2i> &f)
 
 double Correspondances::findBestSubset(Eigen::Matrix4f &tr, int K, int N) {
 	double score = 10000.0f;
-	vector<tuple<int,int,int,int>> best;
+	vector<int> best;
 	Eigen::Matrix4f bestT;
 
 	std::mt19937 rng(std::chrono::steady_clock::now().time_since_epoch().count());
@@ -348,8 +372,10 @@ double Correspondances::findBestSubset(Eigen::Matrix4f &tr, int K, int N) {
 		sidx.clear();
 		tidx.clear();
 
+		vector<int> idx;
 		for (int k=0; k<K; k++) {
 			int r = dice();
+			idx.push_back(r);
 			sidx.push_back(src_feat_[r]);
 			tidx.push_back(targ_feat_[r]);
 		}
@@ -360,14 +386,17 @@ double Correspondances::findBestSubset(Eigen::Matrix4f &tr, int K, int N) {
 		if (scoreT < score) {
 			score = scoreT;
 			bestT = T;
+			best = idx;
 		}
 	}
 
+	return icp(bestT, tr, best);
+
 	// TODO Add these best points to actual clouds.
 	//log_ = best;
-	tr = bestT;
+	//tr = bestT;
 	//uptodate_ = true;
-	return score;
+	//return score;
 }
 
 Eigen::Matrix4f Correspondances::transform() {
diff --git a/applications/registration/src/correspondances.hpp b/applications/registration/src/correspondances.hpp
index ab73b6aef587b0257cd091af9397a37a05438561..b708815c635fd23cbec5c32a052c1f501513184e 100644
--- a/applications/registration/src/correspondances.hpp
+++ b/applications/registration/src/correspondances.hpp
@@ -69,6 +69,7 @@ class Correspondances {
 	double findBestSubset(Eigen::Matrix4f &tr, int K, int N);
 
 	double icp();
+	double icp(const Eigen::Matrix4f &T_in, Eigen::Matrix4f &T_out, const std::vector<int> &idx);
 
 	void convertToPCL(const std::vector<std::tuple<int,int,int,int>> &p, std::vector<std::pair<pcl::PointXYZ, pcl::PointXYZ>> &p2);