diff --git a/Code/Mantid/scripts/Calibration/tube_calib.py b/Code/Mantid/scripts/Calibration/tube_calib.py
index 9b49344363c0e3d7d06eb3744e10da48bb17d58d..7e2338f52bee2c11a3a59005a95a22c93785d265 100644
--- a/Code/Mantid/scripts/Calibration/tube_calib.py
+++ b/Code/Mantid/scripts/Calibration/tube_calib.py
@@ -305,15 +305,38 @@ def getCalibratedPixelPositions( ws, tubePts, idealTubePts, whichTube, peakTestM
     if( len(pixels) != nDets):
        print "Tube correction failed."
        return detIDs, detPositions 
-       
+    
+    # Work out distant between first and last detectors in tube 
+    det0 = ws.getDetector( whichTube[0])
+    detN = ws.getDetector (whichTube[nDets-1])
+    d0x = det0.getPos().X()
+    d0y = det0.getPos().Y()
+    d0z = det0.getPos().Z()
+    dNx = detN.getPos().X()
+    dNy = detN.getPos().Y()
+    dNz = detN.getPos().Z()
+    tubeLength = math.sqrt( (dNx - d0x)*(dNx - d0x) + (dNy - d0y)*(dNy - d0y) + (dNz - d0z)*(dNz - d0z) )
+    if( tubeLength <= 0.0):
+        print "Zero length tube cannot be calibrated, calibration failed."
+        return detIDs, detPositions
+    
+    # Move the pixel detectors
     for i in range(nDets):
         deti = ws.getDetector( whichTube[i])
 	detiPositionX = deti.getPos().X()
+	detiPositionY = deti.getPos().Y()
 	detiPositionZ = deti.getPos().Z()
-	yNew = pixels[i]
+	# yNew = pixels[i]
 	detIDs.append( deti.getID() )
-	detPositions.append(  V3D( detiPositionX, yNew, detiPositionZ ) )
-	# print i, detIDs[i], detPositions[i]
+	#detPositions.append(  V3D( detiPositionX, yNew, detiPositionZ ) )
+	uX = ( detiPositionX - d0x)/tubeLength
+	uY = ( detiPositionY - d0y)/tubeLength
+	uZ = ( detiPositionZ - d0z)/tubeLength
+	xNew = (1.0 - uX)*d0x + uX*dNx
+	yNew = (1.0 - uY)*d0y + uY*dNy
+	zNew = (1.0 - uZ)*d0z + uZ*dNz	
+	detPositions.append( V3D( xNew, yNew, zNew ) )
+        # print i, detIDs[i], detPositions[i]
 
     return detIDs, detPositions