private boolean matchesStepFour() {
		RubiksCube rc = this.initialRcConfig; 
		
		// First we turn the entire cubie upside down to match the previous steps
		for (int i = 1; i <= rc.getSize(); i++) {
			rc.move(new DefinedMove(Move.DOUBLE_ROLL, i));
		}
		
		if (! matchesStepThreePlaceTheMiddleLayerEdges())
			return false;
		
		// Then we move back the entire cubie upside down to go on with the next steps
		for (int i = 1; i <= rc.getSize(); i++) {
			rc.move(new DefinedMove(Move.DOUBLE_ROLL, i));
		}
		
		// Now we check each corner cubie of top face
		// First we get the top color
		Facelet topColor = rc.getCubie(2, 3, 2).getTopFace();
		
		// Then check front right corner cubie
		Cubie frontRightCornerCubie     = rc.getCubie(3, 3, 3);
		Cubie frontFaceMiddleRightCubie = rc.getCubie(3, 2, 3); 
		if (! matchesCornerCubieOnFacelets(frontRightCornerCubie, topColor, frontFaceMiddleRightCubie.getFrontFace(), frontFaceMiddleRightCubie.getRightFace()))
			return false;
		
		// Then check back right corner cubie
		Cubie backRightCornerCubie      = rc.getCubie(3, 3, 1);
		Cubie backFaceMiddleRightCubie  = rc.getCubie(3, 2, 1); 
		if (! matchesCornerCubieOnFacelets(backRightCornerCubie, topColor, backFaceMiddleRightCubie.getBackFace(), backFaceMiddleRightCubie.getRightFace()))
			return false;
		
		// Then check back left corner cubie
		Cubie backLeftCornerCubie       = rc.getCubie(1, 3, 1);
		Cubie backFaceMiddleLeftCubie   = rc.getCubie(1, 2, 1); 
		if (! matchesCornerCubieOnFacelets(backLeftCornerCubie, topColor, backFaceMiddleLeftCubie.getBackFace(), backFaceMiddleLeftCubie.getLeftFace()))
			return false;
		
		// Then check front left corner cubie
		Cubie frontLeftCornerCubie      = rc.getCubie(1, 3, 3);
		Cubie frontFaceMiddleLeftCubie  = rc.getCubie(1, 2, 3); 
		if (! matchesCornerCubieOnFacelets(frontLeftCornerCubie, topColor, frontFaceMiddleLeftCubie.getFrontFace(), frontFaceMiddleLeftCubie.getLeftFace()))
			return false;
		
		return true;
	}