diff --git a/GUIs/AmpScanGUI.py b/GUIs/AmpScanGUI.py
index db9610a845798515752084c44bcb40f30859ec6c..2ed12338c98b54a0b34cb57c1c5f968a60568baf 100644
--- a/GUIs/AmpScanGUI.py
+++ b/GUIs/AmpScanGUI.py
@@ -1,6 +1,7 @@
 import sys
 import numpy as np
 from vtk.util import numpy_support
+import vtk
 from AmpScan import AmpObject
 from AmpScan.registration import registration
 from AmpScan.align import align
@@ -34,7 +35,7 @@ class AmpScanGUI(QMainWindow):
         super(AmpScanGUI, self).__init__()
         self.vtkWidget = qtVtkWindow()
         self.renWin = self.vtkWidget._RenderWindow
-        self.renWin.setBackground()
+        self.renWin.setBackground([1,1,1])
         self.mainWidget = QWidget()
         self.files = {}
         self.filesDrop = list(self.files.keys())
@@ -59,10 +60,6 @@ class AmpScanGUI(QMainWindow):
         
         More writing...
 
-        Note
-        ----
-
-        @Josh_Steer if no stl is selected then the window crashes!
 
         """
         fname = QFileDialog.getOpenFileName(self, 'Open file',
@@ -73,6 +70,10 @@ class AmpScanGUI(QMainWindow):
         self.files[name] = AmpObject(fname[0], 'limb')
         amp = self.files[name]
         amp.addActor()
+        amp.tform = vtk.vtkTransform()
+        amp.tform.PostMultiply()
+        amp.actor.SetUserTransform(amp.tform)
+#        amp.centre()
         self.fileManager.addRow(name, amp)
         self.display()
         self.filesDrop.append(name)
@@ -82,6 +83,14 @@ class AmpScanGUI(QMainWindow):
             self.regCont.getNames()
 #        self.AmpObj.lp_smooth()
         
+    def chooseSaveFile(self):
+        fname = QFileDialog.getSaveFileName(self, 'Save file',
+                                            filter="Meshes (*.stl)")
+        if fname[0] == '':
+            return
+        moving = str(self.alCont.moving.currentText())
+        self.files[moving].save(fname[0])
+    
     def display(self):
         render = []
         for r in range(self.fileManager.n):
@@ -102,6 +111,7 @@ class AmpScanGUI(QMainWindow):
         """
         self.alCont = AlignControls(self.filesDrop, self)
         self.alCont.show()
+        self.alCont.centre.clicked.connect(self.centreMesh)
         self.alCont.icp.clicked.connect(self.runICP)
         self.alCont.xrotButton.buttonClicked[QAbstractButton].connect(self.rotatex)
         self.alCont.yrotButton.buttonClicked[QAbstractButton].connect(self.rotatey)
@@ -112,66 +122,81 @@ class AmpScanGUI(QMainWindow):
         
     def rotatex(self, button):
         moving = str(self.alCont.moving.currentText())
-        ang = [float(button.text()), 0, 0]
-        self.files[moving].rotateAng(ang, 'deg')
-        self.files[moving].actor.setVert(self.files[moving].vert)
+        ang = float(button.text())
+        idx = [1, 0, 0]
+        self.files[moving].rotateAng([ang*i for i in idx], 'deg')
+        self.files[moving].tform.RotateX(ang)
         self.renWin.Render()
 #        print('rotate x by %.1f' % ang)
 
     def rotatey(self, button):
         moving = str(self.alCont.moving.currentText())
-        ang = [0, float(button.text()), 0]
-        self.files[moving].rotateAng(ang, 'deg')
-        self.files[moving].actor.setVert(self.files[moving].vert)
+        ang = float(button.text())
+        idx = [0, 1, 0]
+        self.files[moving].rotateAng([ang*i for i in idx], 'deg')
+        self.files[moving].tform.RotateY(ang)
         self.renWin.Render()
 #        print('rotate y by %.1f' % ang)
 
     def rotatez(self, button):
         moving = str(self.alCont.moving.currentText())
-        ang = [0, 0, float(button.text())]
-        self.files[moving].rotateAng(ang, 'deg')
-        self.files[moving].actor.setVert(self.files[moving].vert)
+        ang = float(button.text())
+        idx = [0, 0, 1]
+        self.files[moving].rotateAng([ang*i for i in idx], 'deg')
+        print(self.files[moving].actor.GetOrigin())
+        self.files[moving].tform.RotateZ(ang)
         self.renWin.Render()
 
     def transx(self, button):
         moving = str(self.alCont.moving.currentText())
-        ang = [float(button.text()), 0, 0]
-        self.files[moving].translate(ang)
-        self.files[moving].actor.setVert(self.files[moving].vert)
+        t = [float(button.text()),0, 0]
+        self.files[moving].translate(t)
+        self.files[moving].tform.Translate(t)
         self.renWin.Render()
 #        print('rotate x by %.1f' % ang)
 
     def transy(self, button):
         moving = str(self.alCont.moving.currentText())
-        ang = [0, float(button.text()), 0]
-        self.files[moving].translate(ang)
-        self.files[moving].actor.setVert(self.files[moving].vert)
+        t = [0, float(button.text()), 0]
+        self.files[moving].translate(t)
+        self.files[moving].tform.Translate(t)
         self.renWin.Render()
 #        print('rotate y by %.1f' % ang)
 
     def transz(self, button):
         moving = str(self.alCont.moving.currentText())
-        ang = [0, 0, float(button.text())]
-        self.files[moving].translate(ang)
-        self.files[moving].actor.setVert(self.files[moving].vert)
+        t = [0, 0, float(button.text())]
+        self.files[moving].translate(t)
+        self.files[moving].tform.Translate(t)
         self.renWin.Render()
 #        print('rotate z by %.1f' % ang)
 #        self.files[moving].rotateAng(ang, 'deg')
 
+    def centreMesh(self):
+        moving = str(self.alCont.moving.currentText())
+        c = -1 * self.files[moving].vert.mean(axis=0)
+        t = c.tolist()
+        self.files[moving].centre()
+        self.files[moving].tform.Translate(t)
+        self.renWin.Render()
     
     def runICP(self):
         
         static = str(self.alCont.static.currentText())
         moving = str(self.alCont.moving.currentText())
-        self.fileManager.setTable(static, [1,0,0], 0.5, 2)
-        self.fileManager.setTable(moving, [0,0,1], 0.5, 2)
         al = align(self.files[moving], self.files[static], 
                    maxiter=10, method='linPoint2Plane').m
+        al.tform = vtk.vtkTransform()
+        al.tform.PostMultiply()
+        al.actor.SetUserTransform(al.tform)
         al.addActor()
         alName = moving + '_al'
         self.files[alName] = al
         self.filesDrop.append(alName)
         self.fileManager.addRow(alName, self.files[alName])
+        self.fileManager.setTable(static, [1,0,0], 0.5, 2)
+        self.fileManager.setTable(moving, [1,1,1], 1, 0)
+        self.fileManager.setTable(alName, [0,0,1], 0.5, 2)
         if hasattr(self, 'alCont'):
             self.alCont.getNames()
         if hasattr(self, 'regCont'):
@@ -271,6 +296,9 @@ class AmpScanGUI(QMainWindow):
         self.openFile = QAction(QIcon('open.png'), 'Open', self,
                                 shortcut='Ctrl+O',
                                 triggered=self.chooseOpenFile)
+        self.saveFile = QAction(QIcon('open.png'), 'Save', self,
+                                shortcut='Ctrl+S',
+                                triggered=self.chooseSaveFile)
         self.openFE = QAction(QIcon('open.png'), 'Open FE', self,
                                 triggered=self.chooseFE)
         self.openPress = QAction(QIcon('open.png'), 'Open Press', self,
@@ -291,6 +319,7 @@ class AmpScanGUI(QMainWindow):
         """
         self.fileMenu = self.menuBar().addMenu("&File")
         self.fileMenu.addAction(self.openFile)
+        self.fileMenu.addAction(self.saveFile)
         self.fileMenu.addSeparator()
         self.fileMenu.addAction(self.exitAct)
         self.alignMenu = self.menuBar().addMenu("&Align")
@@ -377,13 +406,15 @@ class AlignControls(QMainWindow):
         self.static = QComboBox()
         self.moving = QComboBox()
         self.icp = QPushButton("Run ICP")
+        self.centre = QPushButton("Centre")
         self.setCentralWidget(self.main)
         self.layout = QGridLayout()
         self.layout.addWidget(QLabel('Static'), 0, 0)
         self.layout.addWidget(QLabel('Moving'), 1, 0)
         self.layout.addWidget(self.static, 0, 1)
         self.layout.addWidget(self.moving, 1, 1)
-        self.layout.addWidget(self.icp, 2, 0, 1, -1)
+        self.layout.addWidget(self.centre, 2, 0, 1, -1)
+        self.layout.addWidget(self.icp, 3, 0, 1, -1)
         rots = ['x', 'y', 'z']
         vals = ['-5', '-0.5', '+0.5', '+5']
         for i, r in enumerate(rots):
@@ -395,7 +426,7 @@ class AlignControls(QMainWindow):
                 button = QPushButton(v)
                 getattr(self, r + 'rotBox').addWidget(button)
                 getattr(self, r + 'rotButton').addButton(button)
-            self.layout.addLayout(getattr(self, r + 'rotBox'), i+3, 0, 1, -1)
+            self.layout.addLayout(getattr(self, r + 'rotBox'), i+4, 0, 1, -1)
         for i, r in enumerate(rots):
             setattr(self, r + 'traBox', QHBoxLayout())
             setattr(self, r + 'traButton', QButtonGroup())
@@ -405,7 +436,7 @@ class AlignControls(QMainWindow):
                 button = QPushButton(v)
                 getattr(self, r + 'traBox').addWidget(button)
                 getattr(self, r + 'traButton').addButton(button)
-            self.layout.addLayout(getattr(self, r + 'traBox'), i+6, 0, 1, -1)
+            self.layout.addLayout(getattr(self, r + 'traBox'), i+7, 0, 1, -1)
         self.main.setLayout(self.layout)
         self.setWindowTitle("Alignment Manager")
         self.getNames()