         public var altitude: Double?
         public var distance: Double?
         public var displacement: Double?
-    }
-    
-    public func geocode(latitude: Double, longitude: Double, completionHandler: (location: String?) -> ()) {
+        public var address: [NSObject: AnyObject]?
+        public var mapItem: MKMapItem?
+    }
+    
+    public struct PGoDirections {
+        public var coordinates: Array<PGoLocationUtils.PGoCoordinate>
+        public var duration: Double
+    }
+    
+    public func geocode(latitude: Double, longitude: Double, completionHandler: (PGoLocationUtils.PGoCoordinate?) -> ()) {
         /*
          
          Example func for completionHandler:
-         func receivedGeocode(location: String?)
+         func receivedGeocode(results:PGoLocationUtils.PGoCoordinate?)
          
          */
         
         let location = CLLocation(latitude: latitude, longitude: longitude)
-        CLGeocoder().reverseGeocodeLocation(location, completionHandler: {(placemarks, error) -> Void in
-            if placemarks?.count > 0 {
-                let addressDictionary = placemarks![0]
-                let address = ABCreateStringWithAddressDictionary(addressDictionary.addressDictionary!, false)
-                completionHandler(location: address.stringByReplacingOccurrencesOfString("\n", withString: ", "))
+        CLGeocoder().reverseGeocodeLocation(location, completionHandler: {(placeData, error) -> Void in
+            if placeData?.count > 0 {
+                let addressDictionary = placeData![0]
+                let address = addressDictionary.addressDictionary!
+                let result = PGoCoordinate(
+                    latitude: latitude,
+                    longitude: longitude,
+                    altitude: nil,
+                    distance: nil,
+                    displacement: nil,
+                    address: address,
+                    mapItem: MKMapItem(
+                        placemark: MKPlacemark(
+                            coordinate: placeData![0].location!.coordinate,
+                            addressDictionary: placeData![0].addressDictionary as! [String:AnyObject]?
+                        )
+                    )
+                )
+                completionHandler(result)
+            } else {
+                completionHandler(nil)
             }
         })
     }


import Foundation
import CoreLocation
import AddressBookUI


public class PGoLocationUtils {

            distanceMove = 1
        }
        
        return PGoCoordinate(
            latitude: startLatitude + ((endLatitude - startLatitude) * distanceMove),
            longitude: startLongitude + ((endLongitude - startLongitude) * distanceMove),
            altitude: nil,
            distance: maxDistance,
            displacement: distanceMove * maxDistance,
            address: nil,
            mapItem: nil
        )
    }
    
    public func moveDistanceWithBearing(startLatitude:Double, startLongitude:Double, bearing: Double, distance: Double, bearingUnits: PGoLocationUtils.bearingUnits? = .Radian, unitOfDistance: PGoLocationUtils.unit? = .Meters) -> PGoLocationUtils.PGoCoordinate {
