     }
 }
 
+// MARK: - Message Map Image
+
+private var messageMapImageAssociatedKey: Void?
+
+extension UIImageView {
+
+    private var yep_messageMapImageKey: String? {
+        return objc_getAssociatedObject(self, &messageMapImageAssociatedKey) as? String
+    }
+
+    private func yep_setMessageMapImageKey(messageMapImageKey: String) {
+        objc_setAssociatedObject(self, &messageMapImageAssociatedKey, messageMapImageKey, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
+    }
+
+    func yep_setMapImageOfMessage(message: Message, withSize size: CGSize, tailDirection: MessageImageTailDirection) {
+
+        let imageKey = message.mapImageKey
+
+        yep_setMessageMapImageKey(imageKey)
+
+        let locationName = message.textContent
+        ImageCache.sharedInstance.mapImageOfMessage(message, withSize: CGSize(width: 192, height: 108), tailDirection: .Right, bottomShadowEnabled: !locationName.isEmpty) { [weak self] mapImage in
+
+            guard let strongSelf = self, _imageKey = strongSelf.yep_messageMapImageKey where _imageKey == imageKey else {
+                return
+            }
+
+            SafeDispatch.async { [weak self] in
+                self?.image = mapImage
+            }
+        }
+    }
+}
+
 // MARK: - AttachmentURL
 
-private var attachmentURLKey: Void?
+private var attachmentURLAssociatedKey: Void?
 
 extension UIImageView {
 
     private var yep_attachmentURL: NSURL? {
-        return objc_getAssociatedObject(self, &attachmentURLKey) as? NSURL
+        return objc_getAssociatedObject(self, &attachmentURLAssociatedKey) as? NSURL
     }
 
     private func yep_setAttachmentURL(URL: NSURL) {
-        objc_setAssociatedObject(self, &attachmentURLKey, URL, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
+        objc_setAssociatedObject(self, &attachmentURLAssociatedKey, URL, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
     }
 
     func yep_setImageOfAttachment(attachment: DiscoveredAttachment, withSize size: CGSize) {

                    yep_setActivityIndicator(nil)
                }

                objc_setAssociatedObject(self, &showActivityIndicatorWhenLoadingKey, NSNumber(bool: newValue), .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
            }
        }
    }
}

// MARK: - Message

private var messageKey: Void?

extension UIImageView {

    private var yep_messageImageKey: String? {
        return objc_getAssociatedObject(self, &messageKey) as? String
    }

    private func yep_setMessageImageKey(messageImageKey: String) {
        objc_setAssociatedObject(self, &messageKey, messageImageKey, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
    }

    func yep_setImageOfMessage(message: Message, withSize size: CGSize, tailDirection: MessageImageTailDirection, completion: (loadingProgress: Double, image: UIImage?) -> Void) {


// MARK: - Location

private var locationAssociatedKey: Void?

extension UIImageView {

    private var yep_location: CLLocation? {
        return objc_getAssociatedObject(self, &locationAssociatedKey) as? CLLocation
    }

    private func yep_setLocation(location: CLLocation) {
        objc_setAssociatedObject(self, &locationAssociatedKey, location, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
    }

    func yep_setImageOfLocation(location: CLLocation, withSize size: CGSize) {
