         return topicsWithFlattenedReplies
     }
     
+    /// Method to seek out coffee roll item from an array of talk page items
+    /// - Parameter items: Array of talk page items
+    /// - Returns: Tuple containing the coffee roll talk page item and the index where it appears in the array
+    func coffeeRollFromItems(_ items: [TalkPageItem]) -> (TalkPageItem, Int)? {
+        if let firstItem = items.first {
+            let otherContent = firstItem.otherContent ?? ""
+            let title = firstItem.html ?? ""
+            if firstItem.type == .heading && firstItem.replies.isEmpty && title.isEmpty && !otherContent.isEmpty {
+                return (firstItem, 0)
+            }
+        }
+            
+        return nil
+    }
+    
     func validTopLevelTopics(items: [TalkPageItem]) -> [TalkPageItem] {
         
-        // Trim any topic item with missing replies (i.e. coffee roll, but also topics can have content without signatures)
-        // Trim any topic item with a missing title (i.e. any threads that occur in the intro area before the first topic title)
-        return items.filter { item in
-            if (item.type == .heading && item.replies.isEmpty) ||
-                (item.type == .heading && (item.html ?? "").isEmpty) {
-                return false
-            }
-            
-            return true
-        }
+        // Trim first item if it indicates it's a coffee roll:
+        if let coffeeRollResult = coffeeRollFromItems(items) {
+            var finalItems = items
+            finalItems.remove(at: coffeeRollResult.1)
+            return finalItems
+        }
+        
+        return items
     }
     
     func recursivelyFlattenReplies(items: [TalkPageItem], flattenedItems: inout [TalkPageItem]) {

        headerDescription = articleSummary?.wikidataDescription
        leadImageURL = articleSummary?.imageURL(forWidth: Self.leadImageSideLength * Int(UIScreen.main.scale))
        
        if let otherContent = items.first?.otherContent,
           !otherContent.isEmpty {
               coffeeRollText = items.first?.otherContent
        } else {
            coffeeRollText = nil
        }


    /// Clean up talk page items so that we can more easily translate them into view models
    ///
    /// The talk page response returns items in a tree structure. To simplify the response to more closely match our design, we are flattening the items into one top-level list of topics, each with one level of replies. We also clear out the first coffee roll item.
    func cleanTalkPageItems(items: [TalkPageItem]) -> [TalkPageItem] {
        let topics = self.removingSubtopics(items: items)
        let validTopics = self.validTopLevelTopics(items: topics)
