diff --git a/geosolver/clsolver.py b/geosolver/clsolver.py
index 48eeb04..fce4c6a 100644
--- a/geosolver/clsolver.py
+++ b/geosolver/clsolver.py
@@ -12,7 +12,7 @@ from multimethod import MultiVariable, MultiMethod
 from cluster import *
 from configuration import Configuration
 from gmatch import gmatch
-from method import OrMethod
+from method import OrMethod,SetMethod
 from incremental import MutableSet,Union,Filter
 
 # --------------------------------------------------
@@ -521,8 +521,10 @@ class ClusterSolver(Notifier):
                 diag_print("keep top-level: "+str(cluster),"clsolver")
         
         # add method to determine root-variable
-        self._add_root_method(merge.input_clusters(),merge.outputs()[0])
-        
+        if hasattr(merge,"noremove") and merge.noremove == True:
+            self._add_root_false(merge.outputs()[0]) 
+        else:
+            self._add_root_method(merge.input_clusters(),merge.outputs()[0])
         # add solution selection methods, only if information increasing
         if infinc:
             output2 = self._add_prototype_selector(merge)
@@ -542,6 +544,14 @@ class ClusterSolver(Notifier):
         # make sure its deleted when cluster is deleted
         self._add_dependency(outcluster, method) 
 
+    def _add_root_false(self,outcluster):
+        outroot = rootname(outcluster)
+        method = SetMethod(outroot, False)
+        # add method
+        self._add_method(method)
+        # make sure its deleted when cluster is deleted
+        self._add_dependency(outcluster, method) 
+
 
     # -- removing objects
 
diff --git a/geosolver/geometric.py b/geosolver/geometric.py
index 0adb79e..314c68b 100644
--- a/geosolver/geometric.py
+++ b/geosolver/geometric.py
@@ -119,7 +119,7 @@ class GeometricProblem (Notifier, Listener):
         return self.has_variable(variable)
 
     def set_point(self, variable, prototype):
-        """deprictaed - use set_prototype"""
+        """depricated - use set_prototype"""
         return self.set_prototype(variable, prototype)
 
     def get_point(self, variable):
@@ -326,6 +326,12 @@ class GeometricSolver (Listener):
         # add constraints
         toadd = set(self.cg.constraints())
 
+        # add coincidences first. Prevents re-mapping of primitves and re-solving of problem 
+        for con in list(toadd):
+            if isinstance(con, CoincidenceConstraint): 
+                self._add_constraint(con)
+                toadd.remove(con)
+
         # add selection constraints first. Prevents re-evaluation 
         for con in list(toadd):
             if isinstance(con, SelectionConstraint): 
@@ -649,11 +655,17 @@ class GeometricSolver (Listener):
             v0 = vars[0]
             v1 = vars[1]
             dist = con.get_parameter()
-            p0 = vector.vector([0.0,0.0])
-            p1 = vector.vector([dist,0.0])
-            if self.dimension == 3:
-                p0.append(0.0)
-                p1.append(0.0)
+            #p0 = vector.vector([0.0,0.0])
+            #p1 = vector.vector([dist,0.0])
+            # use prototype to orient rigid - minimize difference solution and prototype
+            p0 = self.problem.get_prototype(v0)
+            v = self.problem.get_prototype(v1) - p0
+            if vector.norm(v) != 0:
+                v = v / vector.norm(v)
+            else:
+                v = vector.vector([0.0 for i in range(self.dimension)])
+                v[0] = 1.0
+            p1 = p0+v*dist
             conf = Configuration({v0:p0,v1:p1})
             self.dr.set(rig, [conf])
             assert con.satisfied(conf.map)
diff --git a/test/test_3d.py b/test/test_3d.py
index 6474234..b602f7b 100644
--- a/test/test_3d.py
+++ b/test/test_3d.py
@@ -357,19 +357,19 @@ def selection_problem():
 
 def test3d():
     #diag_select("clsolver")
-    test(double_tetrahedron_problem())
-    test(ada_tetrahedron_problem())
-    test(double_banana_problem())
-    test(double_banana_plus_one_problem())
-    test(random_triangular_problem_3D(10,10.0,0.0,0.5))
-    test(random_distance_problem_3D(10,1.0,0.0))
+    #test(double_tetrahedron_problem())
+    #test(ada_tetrahedron_problem())
+    #test(double_banana_problem())
+    #test(double_banana_plus_one_problem())
+    #test(random_triangular_problem_3D(10,10.0,0.0,0.5))
+    #test(random_distance_problem_3D(10,1.0,0.0))
     test(fix1_problem_3d())
     test(fix2_problem_3d())
     test(fix3_problem_3d())
-    test(selection_problem())
-    selection_test()
-    test(overconstrained_tetra())
-    test(diamond_3d())
+    #test(selection_problem())
+    #selection_test()
+    #test(overconstrained_tetra())
+    #test(diamond_3d())
 
 if __name__ == "__main__": 
     test3d()