         return fmod(radiansToDegrees(atan2(y, x)), 360.0) + 90.0;
     }
 
-    func greatCircleDistanceTo(coordinate:CLLocationCoordinate2D) -> CLLocationDistance {
-        guard self.isValid() && coordinate.isValid() else {
+    func greatCircleDistanceTo(location:CLLocationCoordinate2D) -> CLLocationDistance {
+        guard self.isValid() && location.isValid() else {
             return CLLocationDistance.NaN
         }
 
         let sourceLocation:CLLocation = CLLocation(latitude: self.latitude, longitude: self.longitude)
-        let destinationLocation:CLLocation = CLLocation(latitude: coordinate.latitude, longitude: coordinate.longitude)
+        let destinationLocation:CLLocation = CLLocation(latitude: location.latitude, longitude: location.longitude)
         return sourceLocation.distanceFromLocation(destinationLocation)
+    }
+
+    func tween(location:CLLocationCoordinate2D, percent:Double) -> CLLocationCoordinate2D {
+        var progressCoordinate:CLLocationCoordinate2D = self
+        progressCoordinate.latitude -= (self.latitude - location.latitude) * percent
+        progressCoordinate.longitude -= (self.longitude - location.longitude) * percent
+        return progressCoordinate
     }
 }
 

    return radians * 180.0 / M_PI;
}

extension CLLocationDirection {
    func isValid() -> Bool {
        return self >= 0.0
    }
}


        self.y = mapPoint.y
    }

    func distanceTo(point:MKMapPoint) -> CLLocationDistance {
        return MKMetersBetweenMapPoints(self, point)
    }

    func bearingTo(otherPoint: MKMapPoint) -> CLLocationDirection {
        let x = otherPoint.x - self.x
        let y = otherPoint.y - self.y

        var result = radiansToDegrees(atan2(y, x)) % 360.0 + 90.0
        if result < 0.0 {
            result = 360.0 + result
        }

        return result
    }

    var coordinate:CLLocationCoordinate2D {
