 		
 		if (isMovingFromParentViewController() || isBeingDismissed()) {
 			completion?(location)
+		}
+	}
+	
+	func updateAnnotation() {
+		if let location = location {
+			// whether it's just update from reverse geocoding or new annotation
+			var needsUpdate = true
+			
+			if let annotations = mapView.annotations as? [MKAnnotation],
+				let pointAnnotation = annotations.first as? MKPointAnnotation {
+					// if we're updating annotation after getting reverse geocoding results
+					if pointAnnotation.coordinate.latitude == location.coordinate.latitude
+						&& pointAnnotation.coordinate.longitude == location.coordinate.longitude {
+							pointAnnotation.title = location.title
+							needsUpdate = false
+					}
+			}
+			
+			if needsUpdate {
+				cleanAnnotations()
+				mapView.addAnnotation(location)
+			}
+		} else {
+			cleanAnnotations()
 		}
 	}
 	

			let coordinates = mapView.convertPoint(point, toCoordinateFromView: mapView)
			let location = CLLocation(latitude: coordinates.latitude, longitude: coordinates.longitude)
			
			// remove current location
			cleanAnnotations()
			
			// add annotation to map
			let annotation = MKPointAnnotation()
			annotation.coordinate = coordinates
			mapView.addAnnotation(annotation)
			
			geocoder.cancelGeocode()
			geocoder.reverseGeocodeLocation(location) { response, error in
				let placemark = (response as? [CLPlacemark])?.first
				if let placemark = placemark {
					// get POI name from placemark if any
					let name = (placemark.areasOfInterest as? [String])?.first
					self.location = Location(name: name, placemark: placemark)
					
					// set annotatio title
					annotation.title = self.location!.title
				}
			}
		}

	
	public var location: Location? {
		didSet {
			searchBar.text = flatMap(location, { $0.title }) ?? ""
			updateAnnotation()
		}
	}
	
