         return imageView
     }
     
-    // MARK: size and frame calculation
-    public override func sizeThatFits(size: CGSize) -> CGSize {
-        let imageLocationAdjustment = imageLocationSizeAdjustment()
-        let labelSize = calculateLabelSize()
-        
-        let height = labelSize.height + config.contentInsets.topAndBottom + imageLocationAdjustment.height
-        let width = labelSize.width + config.contentInsets.leftAndRight + imageLocationAdjustment.width
-        
-        return CGSizeMake(width, height)
-    }
-    
-    private func calculateLabelSize() -> CGSize {
-        let imageLocationAdjustment = imageLocationSizeAdjustment()
-        let screenSize = UIScreen.mainScreen().bounds
-        let maxLabelWidth = screenSize.width - 2 * margin - config.contentInsets.leftAndRight - imageLocationAdjustment.width
-        let size = config.font.sizeFor(message, constrain: CGSizeMake(maxLabelWidth, 0))
-        
-        return CGSizeMake(ceil(size.width), ceil(size.height))
-    }
-    
-    private func imageLocationSizeAdjustment() -> CGSize {
-        var widthAdjustment: CGFloat = 0
-        var heightAdjustment: CGFloat = 0
+    private func createLabelFrame() -> CGRect {
+        var x: CGFloat = config.contentInsets.left
+        var y: CGFloat = config.contentInsets.top
+        var width: CGFloat = contentSize().width
+        var height: CGFloat = contentSize().height
         
         switch config.imageAlignment {
-        case .Left, .Right:
-            widthAdjustment = imageWithMarginsSize().width
-        case .Top, .Bottom:
-            heightAdjustment = imageWithMarginsSize().height
-        }
-        
-        return CGSizeMake(widthAdjustment, heightAdjustment)
-    }
-    
-    private func imageViewFrame() -> CGRect {
+        case .Left:
+            x += imageWithMarginsSize().width
+            fallthrough
+        case .Right:
+            width -= imageWithMarginsSize().width
+        case .Top:
+            y += config.imageMargins.topAndBottom + imageSize().height
+            fallthrough
+        case .Bottom:
+            height = height - config.imageMargins.topAndBottom - imageSize().height
+        }
+        
+        return CGRectMake(x, y, width, height)
+    }
+    
+    private func createImageViewFrame() -> CGRect {
         var x: CGFloat = 0
         var y: CGFloat = 0
         var width: CGFloat = 0
         var height: CGFloat = 0
-
+        
         let allInsets = config.contentInsets + config.imageMargins
         
         switch config.imageAlignment {

            x = allInsets.left
            y = allInsets.top
            width = imageSize().width
            height = contentHeight() - config.imageMargins.topAndBottom
        case .Right:
            x = frame.width - allInsets.right - imageSize().width
            y = allInsets.top
            width = imageSize().width
            height = contentHeight() - config.imageMargins.topAndBottom
        case .Top:
            x = allInsets.left
            y = allInsets.top

        
        return CGRectMake(x, y, width, height)
    }
    
    // MARK: size and frame calculation
    public override func sizeThatFits(size: CGSize) -> CGSize {
        let imageLocationAdjustment = imageLocationSizeAdjustment()
        let labelSize = calculateLabelSize()
        
        let height = labelSize.height + config.contentInsets.topAndBottom + imageLocationAdjustment.height
        let width = labelSize.width + config.contentInsets.leftAndRight + imageLocationAdjustment.width
        
        return CGSizeMake(width, height)
    }
    
    private func calculateLabelSize() -> CGSize {
        let imageLocationAdjustment = imageLocationSizeAdjustment()
        let screenSize = UIScreen.mainScreen().bounds
        let maxLabelWidth = screenSize.width - 2 * margin - config.contentInsets.leftAndRight - imageLocationAdjustment.width
        let size = config.font.sizeFor(message, constrain: CGSizeMake(maxLabelWidth, 0))
        
        return CGSizeMake(ceil(size.width), ceil(size.height))
    }
    
    private func imageLocationSizeAdjustment() -> CGSize {
        var widthAdjustment: CGFloat = 0
        var heightAdjustment: CGFloat = 0
        
        switch config.imageAlignment {
        case .Left, .Right:
            widthAdjustment = imageWithMarginsSize().width
        case .Top, .Bottom:
            heightAdjustment = imageWithMarginsSize().height
        }
        
        return CGSizeMake(widthAdjustment, heightAdjustment)
    }
    
    private func imageWithMarginsSize() -> CGSize {
