         self.userInteractionEnabled = true
 
         // Establish the text store with our current text
-        updateTextStoreWithText()
-    }
-    
-    func updateTextStoreWithText() {
-        var mutableAttributedString: NSMutableAttributedString?
-        
-        if text != nil {
-            mutableAttributedString = NSMutableAttributedString(string: text!, attributes: attributesFromProperties())
-        }
-        
-        if mutableAttributedString != nil {
-            
-            // Get link ranges
-            linkRangeResults = getRangesForLinksInAttributedString(mutableAttributedString!)
-            
-            // Set attributedText
-            attributedText = mutableAttributedString
-            
-            // Set the string on the storage
-            textStorage?.setAttributedString(mutableAttributedString)
-            
-            // Addd attributes to link ranges
-            if let linkRangeResults = linkRangeResults {
-                addLinkAttributesToAttributedStringWithLinkRangeResults(linkRangeResults)
-            }
-        }
+        setContextLabelDataWithText(nil)
     }
     
     // Returns array of ranges for all special words, user handles, hashtags and urls
-    func getRangesForLinksInAttributedString(attributedString: NSAttributedString) -> [LinkRangeResult] {
+    private func getRangesForLinksInAttributedString(attributedString: NSAttributedString) -> [LinkRangeResult] {
         var rangesForLinks = [LinkRangeResult]()
 
-        if linkDetectionTypes & .UserHandle {
-            rangesForLinks += getRangesForUserHandles(attributedString.string)
-        }
-
-        if linkDetectionTypes & .Hashtag {
-            rangesForLinks += getRangesForHashtags(attributedString.string)
-        }
-
-        if linkDetectionTypes & .URL {
-            rangesForLinks += getRangesForURLs(attributedString)
+        if textLinks?.count > 0 {
+            rangesForLinks += getRangesForTextLinks(attributedString.string)
+        }
+        
+        if linkDetectionTypes & .UserHandle != nil {
+            rangesForLinks += getRangesForUserHandlesInText(attributedString.string)
+        }
+
+        if linkDetectionTypes & .Hashtag != nil {
+            rangesForLinks += getRangesForHashtagsInText(attributedString.string)
+        }
+
+        if linkDetectionTypes & .URL != nil {
+            rangesForLinks += getRangesForURLsInAttributedString(attributedString)
         }
 
         return rangesForLinks
     }
 
-    func getRangesForUserHandles(text: String) -> [LinkRangeResult] {
+    private func getRangesForTextLinks(text: String) -> [LinkRangeResult] {
+        var rangesForLinkType = [LinkRangeResult]()
+        
+        if let textLinks = textLinks {
+            for textLink in textLinks {
+                let linkType = LinkDetectionType.TextLink
+                let matchString = textLink.text
+                if let stringIndexRange = text.rangeOfString(textLink.text, options: .CaseInsensitiveSearch) {
+                    rangesForLinkType.append(LinkRangeResult(linkDetectionType: linkType, linkRange: stringIndexRange, linkString: matchString, textLink: textLink))
+                }
+            }
+        }
+        
+        return rangesForLinkType
+    }
+    
+    private func getRangesForUserHandlesInText(text: String) -> [LinkRangeResult] {
         let rangesForUserHandles = getRangesForLinkType(LinkDetectionType.UserHandle, regexPattern: "(?<!\\w)@([\\w\\_]+)?", text: text)
         return rangesForUserHandles
     }
 
-    func getRangesForHashtags(text: String) -> [LinkRangeResult] {
+    private func getRangesForHashtagsInText(text: String) -> [LinkRangeResult] {
         let rangesForHashtags = getRangesForLinkType(LinkDetectionType.Hashtag, regexPattern: "(?<!\\w)#([\\w\\_]+)?", text: text)
         return rangesForHashtags
     }
 
-    func getRangesForLinkType(linkType: LinkDetectionType, regexPattern: String, text: String) -> [LinkRangeResult] {
+    private func getRangesForLinkType(linkType: LinkDetectionType, regexPattern: String, text: String) -> [LinkRangeResult] {
         var rangesForLinkType = [LinkRangeResult]()
 
         // Setup a regular expression for user handles and hashtags

        return nil
    }
    
    func highlightedTextColorForTextColor(textColor: UIColor) -> UIColor {
        return textColor.colorWithAlphaComponent(0.5)
    }
}
        super.touchesEnded(touches, withEvent: event)
    }
    
    public override func touchesCancelled(touches: NSSet, withEvent event: UIEvent!) {
        addLinkAttributesToLinkRangeResultWithTouches(touches, highlighted: false)
        super.touchesCancelled(touches, withEvent: event)
    }
    
    
    // MARK: Functions
    
    public func setContextLabelDataWithText(text: String?) {
        var text = text
        
        if text == nil {
            text = self.text
        }
        
        if let text = text {
            self.contextLabelData = contextLabelDataWithText(text)
        }
    }
    
    public func contextLabelDataWithText(text: String?) -> ContextLabelData? {
        if let text = text {
            var mutableAttributedString = NSMutableAttributedString(string: text, attributes: attributesFromProperties())
            var linkRangeResults = getRangesForLinksInAttributedString(mutableAttributedString)
            
            // Addd attributes to link ranges
            let attributedString = addLinkAttributesToAttributedString(mutableAttributedString, withLinkRangeResults: linkRangeResults)
            
            return ContextLabelData(attributedString: attributedString, linkRangeResults: linkRangeResults)
        }
        
        return nil
    }
    
    public func setText(text:String, withTextLinks textLinks: [TextLink]) {
        self.textLinks = textLinks
        
        self.contextLabelData = contextLabelDataWithText(text)
    }
    
    // TEST testAttributesFromProperties()
    public func attributesFromProperties() -> [NSObject : AnyObject] {
        
        // Shadow attributes
        let shadow = NSShadow()
