diff --git a/AmpScan/pca.py b/AmpScan/pca.py
index 3ee7d5ff74ae19e5ea7f5e81db67cf98bca14340..4db4e9ac8a3abef3e5a108f46deb76ca045b8adc 100644
--- a/AmpScan/pca.py
+++ b/AmpScan/pca.py
@@ -25,8 +25,10 @@ class pca(object):
         r"""
         Function to import multiple stl files from folder
         """
-        self.shapes = [AmpObject(path + f, 'limb', unify=unify) for f in 
-                       os.listdir(path) if f.endswith('.stl')]
+        self.fnames = [f for f in os.listdir(path) if f.endswith('.stl')]
+        self.shapes = [AmpObject(path + f, 'limb', unify=unify) for f in self.fnames]
+        for s in self.shapes:
+            s.lp_smooth(3, brim=True)
         
     def sliceFiles(self, height):
         r"""
@@ -35,12 +37,22 @@ class pca(object):
         for s in self.shapes:
             s.planarTrim(height)
         
-    def register(self, scale=None):
+    def register(self, scale=None, save=None, baseline=True):
         r"""
         Function to register all the shapes to a baseline
         """
-        self.registered = [registration(self.baseline, t, fixBrim=True, steps=10).reg for t in self.shapes]
+        self.registered = []
+        for t in self.shapes:
+            r = registration(self.baseline, t, fixBrim=True, steps=5, scale=scale, smooth=1, neigh=50).reg
+            r.lp_smooth()
+            self.registered.append(r)
+        if save is not None:
+            for f, r in zip(self.fnames, self.registered):
+                r.save(save + f)
         self.X = np.array([r.vert.flatten() for r in self.registered]).T
+        if baseline is True:
+            self.X = np.c_[self.X, self.baseline.vert.flatten()]
+        
         
     def pca(self):
         r"""
diff --git a/AmpScan/registration.py b/AmpScan/registration.py
index b89fc6a8effa41f8727ff814d8a3b1159f3850ab..dde6a091eefc4835f8f19cb418d40ba7761c037a 100644
--- a/AmpScan/registration.py
+++ b/AmpScan/registration.py
@@ -48,7 +48,7 @@ class registration(object):
         
         
     def point2plane(self, steps = 1, neigh = 10, inside = True, subset = None, 
-                    scale=False, smooth=1, fixBrim=False):
+                    scale=None, smooth=1, fixBrim=False):
         r"""
         Point to Plane method for registration between the two meshes 
         
@@ -70,9 +70,6 @@ class registration(object):
             If True, the nodes on the brim line will not be included in the smooth
 		
         """
-        if fixBrim is True:
-            eidx = (self.b.faceEdges == -99999).sum(axis=1).astype(bool)
-            vBrim = np.unique(self.b.edges[eidx, :])
         # Calc FaceCentroids
         fC = self.t.vert[self.t.faces].mean(axis=1)
         # Construct knn tree
@@ -84,7 +81,7 @@ class registration(object):
         if scale is not None:
             tmin = self.t.vert.min(axis=0)[2]
             rmin = self.reg.vert.min(axis=0)[2]
-            SF = 1 - ((tmin-scale)/(rmin-scale))
+            SF = ((tmin-scale)/(rmin-scale)) - 1
             logic = self.reg.vert[:, 2] < scale
             d = (self.reg.vert[logic, 2] - scale) * SF
             self.reg.vert[logic, 2] += d
@@ -122,14 +119,9 @@ class registration(object):
             D = G[np.arange(len(G)), GInd, :]
             rVert += D/step
             if smooth > 0 and step > 1:
-                if fixBrim is True:
-                    bPoints = rVert[vBrim, :].copy()
 #                v = self.reg.vert[~subset]
-                    self.reg.lp_smooth(smooth)
-                    self.reg.vert[vBrim, :] = bPoints
+                self.reg.lp_smooth(smooth, brim = fixBrim)
 #                self.reg.vert[~subset] = v
-                else:
-                    self.reg.lp_smooth(smooth)
             else:
                 self.reg.calcNorm()
         
diff --git a/AmpScan/smooth.py b/AmpScan/smooth.py
index 62878d1f106c05a7b7ebeab9d5c0342bc32f5f62..ff6bb3755371f39872ab9164d80ba5635f189d4d 100644
--- a/AmpScan/smooth.py
+++ b/AmpScan/smooth.py
@@ -9,7 +9,7 @@ import copy
 
 class smoothMixin(object):
     
-    def lp_smooth(self, n=1):
+    def lp_smooth(self, n=1, brim = True):
         r"""
         Function to apply a laplacian smooth to the mesh. This method replaces 
         each vertex with the mean of its connected neighbours 
@@ -21,6 +21,10 @@ class smoothMixin(object):
             number of iterations of smoothing
         
         """
+        if brim is True:
+            eidx = (self.faceEdges == -99999).sum(axis=1).astype(bool)
+            vBrim = np.unique(self.edges[eidx, :])
+        else: vBrim = []
         # Flatten the edges array to 1D
         e = self.edges.flatten()
         # Get the indicies to sort edges 
@@ -36,7 +40,10 @@ class smoothMixin(object):
             # List all vertices 
             vert = copy.deepcopy(self.vert)
             neighVerts = vert[self.edges[row, 1-col], :]
-            for j in np.arange(self.vert.shape[0]):
+            vRange = np.arange(self.vert.shape[0])
+            log = np.isin(vRange, vBrim)
+            vRange = vRange[~log]
+            for j in vRange:
                 # Calculate the mean of the vertex set
                 self.vert[j, :] = neighVerts[ndx[j]:ndx[j+1]].mean(axis=0)
         self.calcNorm()