diff --git a/NEWS.md b/NEWS.md
index dbe2e16..2fcfb25 100644
--- a/NEWS.md
+++ b/NEWS.md
@@ -2,6 +2,7 @@
 
 - warnings are now issued, when queries had to be rewritten (for licensing reasons)
 - fixed `fetchAnnotations()` morphology so MarMoT and other foundries keep all features from nested spans ([#30](https://github.com/KorAP/RKorAPClient/issues/30))
+- reimplemented annotation parsing with `xml2`, retaining multiple lemma/POS values and improving robustness of token alignment
 
 # RKorAPClient 1.2.0
 
diff --git a/R/KorAPQuery.R b/R/KorAPQuery.R
index 1afb122..fa78884 100644
--- a/R/KorAPQuery.R
+++ b/R/KorAPQuery.R
@@ -771,6 +771,79 @@
   return(fetchNext(kqo, maxFetch = NA, verbose = verbose, ...))
 })
 
+# Helper to collapse multiple annotation values while preserving order
+collapse_features <- function(values) {
+  if (length(values) == 0) {
+    return(NA_character_)
+  }
+  unique_values <- values[!duplicated(values)]
+  paste(unique_values, collapse = "|")
+}
+
+# Extract token-level annotations from a DOM node
+collect_token_annotations <- function(parent_node) {
+  if (inherits(parent_node, "xml_missing")) {
+    return(list(
+      node = list(),
+      token = character(0),
+      lemma = character(0),
+      pos = character(0),
+      morph = character(0)
+    ))
+  }
+
+  leaf_nodes <- xml2::xml_find_all(parent_node, ".//span[not(.//span)]")
+
+  if (length(leaf_nodes) == 0) {
+    return(list(
+      node = list(),
+      token = character(0),
+      lemma = character(0),
+      pos = character(0),
+      morph = character(0)
+    ))
+  }
+
+  tokens <- character(0)
+  lemmas <- character(0)
+  pos_tags <- character(0)
+  morph_tags <- character(0)
+  kept_nodes <- list()
+
+  for (idx in seq_along(leaf_nodes)) {
+    leaf <- leaf_nodes[[idx]]
+    token_text <- trimws(xml2::xml_text(leaf))
+    if (identical(token_text, "")) {
+      next
+    }
+
+    kept_nodes[[length(kept_nodes) + 1]] <- leaf
+    tokens <- c(tokens, token_text)
+
+    ancestors <- xml2::xml_find_all(leaf, "ancestor-or-self::span")
+    titles <- xml2::xml_attr(ancestors, "title")
+    titles <- titles[!is.na(titles)]
+
+    feature_pieces <- if (length(titles) > 0) unlist(strsplit(titles, "[[:space:]]+")) else character(0)
+
+    lemma_values <- sub('.*?/l:(.*)$', '\\1', feature_pieces[grepl('/l:', feature_pieces)], perl = TRUE)
+    pos_values <- sub('.*?/p:(.*)$', '\\1', feature_pieces[grepl('/p:', feature_pieces)], perl = TRUE)
+    morph_values <- sub('.*?/m:(.*)$', '\\1', feature_pieces[grepl('/m:', feature_pieces)], perl = TRUE)
+
+    lemmas <- c(lemmas, collapse_features(lemma_values))
+    pos_tags <- c(pos_tags, collapse_features(pos_values))
+    morph_tags <- c(morph_tags, collapse_features(morph_values))
+  }
+
+  list(
+    node = kept_nodes,
+    token = tokens,
+    lemma = lemmas,
+    pos = pos_tags,
+    morph = morph_tags
+  )
+}
+
 #'
 #' Parse XML annotations into linguistic layers
 #'
@@ -785,198 +858,27 @@
     return(list(token = character(0), lemma = character(0), pos = character(0), morph = character(0)))
   }
 
-  extract_morph_via_xml <- function(fragment) {
-    snippet <- paste0("<root>", fragment, "</root>")
-    doc <- tryCatch(xml2::read_html(snippet), error = function(e) NULL)
-    if (is.null(doc)) return(NULL)
-
-    nodes <- xml2::xml_find_all(doc, ".//span[not(.//span)]")
-    if (length(nodes) == 0) return(list(tokens = character(0), morph = character(0)))
-
-    tokens_xml <- character(0)
-    morph_vals <- character(0)
-
-    for (node in nodes) {
-      token_text <- trimws(xml2::xml_text(node))
-      if (identical(token_text, "")) next
-
-      tokens_xml <- c(tokens_xml, token_text)
-
-      ancestors <- xml2::xml_find_all(node, "ancestor-or-self::span")
-      titles <- xml2::xml_attr(ancestors, "title")
-      titles <- titles[!is.na(titles)]
-
-      feature_tokens <- character(0)
-      if (length(titles) > 0) {
-        bits <- unlist(strsplit(titles, "[[:space:]]+"))
-        bits <- bits[grepl('/m:', bits)]
-        if (length(bits) > 0) {
-          feature_tokens <- sub('.*?/m:(.*)$', '\\1', bits, perl = TRUE)
-          feature_tokens <- feature_tokens[!duplicated(feature_tokens)]
-        }
-      }
-
-      if (length(feature_tokens) == 0) {
-        morph_vals <- c(morph_vals, NA_character_)
-      } else {
-        morph_vals <- c(morph_vals, paste(feature_tokens, collapse = "|"))
-      }
-    }
-
-    list(tokens = tokens_xml, morph = morph_vals)
+  doc <- tryCatch(xml2::read_html(paste0("<root>", xml_snippet, "</root>")), error = function(e) NULL)
+  if (is.null(doc)) {
+    return(list(token = character(0), lemma = character(0), pos = character(0), morph = character(0)))
   }
 
-  # Extract content within <span class="match">...</span> using a more robust approach
-  if (grepl('<span class="match">', xml_snippet)) {
-    # Find the start of match span
-    start_pos <- regexpr('<span class="match">', xml_snippet)
-    if (start_pos > 0) {
-      # Find the end by counting nested spans
-      content_start <- start_pos + attr(start_pos, "match.length")
-      remaining <- substr(xml_snippet, content_start, nchar(xml_snippet))
-
-      # Simple approach: extract everything until we hit context-right or end
-      if (grepl('<span class="context-right">', remaining)) {
-        content_to_parse <- gsub('(.*?)<span class="context-right">.*', '\\1', remaining)
-      } else {
-        # Find the closing </span> that matches our opening span
-        # For now, use a simpler approach - take everything until the last </span> sequence
-        content_to_parse <- gsub('(.*)</span>\\s*$', '\\1', remaining)
-      }
-    } else {
-      content_to_parse <- xml_snippet
-    }
-  } else {
-    content_to_parse <- xml_snippet
-  }
-
-  # Initialize result vectors
-  tokens <- character(0)
-  lemmas <- character(0)
-  pos_tags <- character(0)
-  morph_tags <- character(0)
-
-  # Split the content by </span> and process each meaningful part
-  parts <- unlist(strsplit(content_to_parse, '</span>'))
-
-  for (part in parts) {
-    part <- trimws(part)
-    if (nchar(part) == 0) next
-
-    # Look for parts that have title attributes and end with text
-    if (grepl('<span[^>]*title=', part)) {
-      # Extract the text content (everything after the last >)
-      text_content <- gsub('.*>([^<]*)$', '\\1', part)
-      text_content <- trimws(text_content)
-
-      if (nchar(text_content) > 0 && !grepl('^<', text_content)) {
-        tokens <- c(tokens, text_content)
-
-        # Extract all title attributes from this part
-        title_pattern <- 'title="([^"]*)"'
-        title_matches <- gregexpr(title_pattern, part)
-
-        lemma <- NA
-        pos_tag <- NA
-        morph_features <- character(0)
-
-        if (title_matches[[1]][1] != -1) {
-          all_titles <- regmatches(part, title_matches)[[1]]
-          for (title_match in all_titles) {
-            title_content <- gsub(title_pattern, '\\1', title_match)
-
-            # Split by spaces and process each annotation
-            annotations <- unlist(strsplit(title_content, "\\s+"))
-            for (annotation in annotations) {
-              if (grepl('^[^/]+/l:', annotation)) {
-                lemma <- gsub('^[^/]+/l:(.*)$', '\\1', annotation)
-              } else if (grepl('^[^/]+/p:', annotation)) {
-                pos_tag <- gsub('^[^/]+/p:(.*)$', '\\1', annotation)
-              } else if (grepl('^[^/]+/m:', annotation)) {
-                morph_features <- c(morph_features, gsub('^[^/]+/m:(.*)$', '\\1', annotation))
-              }
-            }
-          }
-        }
-
-        lemmas <- c(lemmas, lemma)
-        pos_tags <- c(pos_tags, pos_tag)
-        morph_tag <- if (length(morph_features) > 0) {
-          paste(unique(morph_features), collapse = "|")
-        } else {
-          NA
-        }
-        morph_tags <- c(morph_tags, morph_tag)
-      }
+  match_node <- xml2::xml_find_first(doc, ".//span[contains(@class, 'match')]")
+  if (inherits(match_node, "xml_missing")) {
+    match_node <- xml2::xml_find_first(doc, ".//span")
+    if (inherits(match_node, "xml_missing")) {
+      return(list(token = character(0), lemma = character(0), pos = character(0), morph = character(0)))
     }
   }
 
-  # If no tokens found with the splitting approach, try a different method
-  if (length(tokens) == 0) {
-    # Look for the innermost spans that contain actual text
-    innermost_pattern <- '<span[^>]*title="([^"]*)"[^>]*>([^<]+)</span>'
-    innermost_matches <- gregexpr(innermost_pattern, content_to_parse, perl = TRUE)
+  token_info <- collect_token_annotations(match_node)
 
-    if (innermost_matches[[1]][1] != -1) {
-      matches <- regmatches(content_to_parse, innermost_matches)[[1]]
-
-      for (match in matches) {
-        title <- gsub(innermost_pattern, '\\1', match, perl = TRUE)
-        text <- gsub(innermost_pattern, '\\2', match, perl = TRUE)
-        text <- trimws(text)
-
-        if (nchar(text) > 0) {
-          tokens <- c(tokens, text)
-
-          # Parse space-separated annotations in title
-          lemma <- NA
-          pos_tag <- NA
-          morph_features <- character(0)
-
-          annotations <- unlist(strsplit(title, "\\s+"))
-          for (annotation in annotations) {
-            if (grepl('^[^/]+/l:', annotation)) {
-              lemma <- gsub('^[^/]+/l:(.*)$', '\\1', annotation)
-            } else if (grepl('^[^/]+/p:', annotation)) {
-              pos_tag <- gsub('^[^/]+/p:(.*)$', '\\1', annotation)
-            } else if (grepl('^[^/]+/m:', annotation)) {
-              morph_features <- c(morph_features, gsub('^[^/]+/m:(.*)$', '\\1', annotation))
-            }
-          }
-
-          lemmas <- c(lemmas, lemma)
-          pos_tags <- c(pos_tags, pos_tag)
-          morph_tag <- if (length(morph_features) > 0) {
-            paste(unique(morph_features), collapse = "|")
-          } else {
-            NA
-          }
-          morph_tags <- c(morph_tags, morph_tag)
-        }
-      }
-    }
-  }
-
-  xml_morph <- extract_morph_via_xml(xml_snippet)
-  if (!is.null(xml_morph) && length(xml_morph$morph) > 0) {
-    morph_tags <- xml_morph$morph
-  }
-
-  # Ensure all vectors have the same length
-  max_length <- max(length(tokens), length(lemmas), length(pos_tags), length(morph_tags))
-  if (max_length > 0) {
-    tokens <- c(tokens, rep(NA, max_length - length(tokens)))
-    lemmas <- c(lemmas, rep(NA, max_length - length(lemmas)))
-    pos_tags <- c(pos_tags, rep(NA, max_length - length(pos_tags)))
-    morph_tags <- c(morph_tags, rep(NA, max_length - length(morph_tags)))
-  }
-
-  return(list(
-    token = tokens,
-    lemma = lemmas,
-    pos = pos_tags,
-    morph = morph_tags
-  ))
+  list(
+    token = token_info$token,
+    lemma = token_info$lemma,
+    pos = token_info$pos,
+    morph = token_info$morph
+  )
 }
 
 #'
@@ -1000,239 +902,103 @@
     ))
   }
 
-  extract_morphological_features_via_xml <- function(section_content) {
-    snippet <- paste0("<root>", section_content, "</root>")
-    doc <- tryCatch(xml2::read_html(snippet), error = function(e) NULL)
-    if (is.null(doc)) return(NULL)
-
-    nodes <- xml2::xml_find_all(doc, ".//span[not(.//span)]")
-    if (length(nodes) == 0) {
-      return(list(tokens = character(0), morph = character(0)))
-    }
-
-    tokens_xml <- character(0)
-    morph_vals <- character(0)
-
-    for (node in nodes) {
-      token_text <- trimws(xml2::xml_text(node))
-      if (identical(token_text, "")) next
-
-      tokens_xml <- c(tokens_xml, token_text)
-
-      ancestors <- xml2::xml_find_all(node, "ancestor-or-self::span")
-      titles <- xml2::xml_attr(ancestors, "title")
-      titles <- titles[!is.na(titles)]
-
-      feature_tokens <- character(0)
-      if (length(titles) > 0) {
-        bits <- unlist(strsplit(titles, "[[:space:]]+"))
-        bits <- bits[grepl('/m:', bits)]
-        if (length(bits) > 0) {
-          feature_tokens <- sub('.*?/m:(.*)$', '\\1', bits, perl = TRUE)
-          feature_tokens <- feature_tokens[!duplicated(feature_tokens)]
-        }
-      }
-
-      if (length(feature_tokens) == 0) {
-        morph_vals <- c(morph_vals, NA_character_)
-      } else {
-        morph_vals <- c(morph_vals, paste(feature_tokens, collapse = "|"))
-      }
-    }
-
-    list(tokens = tokens_xml, morph = morph_vals)
-  }
-
-  # Helper function to extract annotations from a span section
-  extract_annotations_from_section <- function(section_content) {
-    # Remove any <mark>...</mark> tags that may interrupt token boundaries
-    section_no_marks <- gsub('</?mark[^>]*>', '', section_content, perl = TRUE)
-    # Normalize separators between adjacent top-level spans so splitting is robust.
-    # Replace any punctuation/entity/space run between one-or-more closing spans and the next opening span
-    # with a single space, preserving all closing spans.
-    section_norm <- gsub('((?:</span>)+)[[:space:]]*(?:&[^;]+;|[[:punct:]]|[[:space:]])*[[:space:]]*(<span)', '\\1 \\2', section_no_marks, perl = TRUE)
-    # Handle both spaced tokens and nested single tokens by scanning innermost spans with direct text
-    tokens <- character(0)
-    lemmas <- character(0)
-    pos_tags <- character(0)
-    morph_tags <- character(0)
-
-    pat_token <- '<span[^>]*title="([^"]*)"[^>]*>([^<]+)</span>'
-    mm <- gregexpr(pat_token, section_norm, perl = TRUE)
-    if (mm[[1]][1] != -1) {
-      starts <- mm[[1]]
-      lens <- attr(mm[[1]], 'match.length')
-      for (k in seq_along(starts)) {
-        s <- starts[k]
-        e <- s + lens[k] - 1
-        fragment <- substr(section_norm, s, e)
-        text_content <- sub(pat_token, '\\2', fragment, perl = TRUE)
-        text_content <- trimws(text_content)
-        title_content <- sub(pat_token, '\\1', fragment, perl = TRUE)
-
-        if (nchar(text_content) == 0) next
-
-        lemma <- NA
-        pos_tag <- NA
-        morph_features <- character(0)
-
-        # parse inner title
-        ann <- unlist(strsplit(title_content, "[[:space:]]+"))
-        for (a in ann) {
-          if (grepl('/l:', a)) {
-            lemma <- sub('.*?/l:(.*)$', '\\1', a, perl = TRUE)
-          } else if (grepl('/p:', a)) {
-            pos_tag <- sub('.*?/p:(.*)$', '\\1', a, perl = TRUE)
-          } else if (grepl('/m:', a)) {
-            morph_features <- c(morph_features, sub('.*?/m:(.*)$', '\\1', a, perl = TRUE))
-          }
-        }
-
-        # If lemma missing, look back in nearby context for the nearest title containing l:
-        if (is.na(lemma) || nchar(lemma) == 0) {
-          ctx_start <- max(1, s - 500)
-          context <- substr(section_norm, ctx_start, s - 1)
-          tmm <- gregexpr('title="([^"]*)"', context, perl = TRUE)
-          if (tmm[[1]][1] != -1) {
-            ctx_titles <- regmatches(context, tmm)[[1]]
-            for (ti in rev(ctx_titles)) {
-              cont <- sub('title="([^"]*)"', '\\1', ti, perl = TRUE)
-              if (grepl('/l:', cont)) {
-                lemma <- sub('.*?/l:([^ ]+).*', '\\1', cont, perl = TRUE)
-                break
-              }
-            }
-          }
-        }
-
-        # If POS missing, keep NA; morphological features may also appear in outer titles
-        ctx_start <- max(1, s - 500)
-        context <- substr(section_norm, ctx_start, s - 1)
-        tmm <- gregexpr('title="([^"]*)"', context, perl = TRUE)
-        if (tmm[[1]][1] != -1) {
-          ctx_titles <- regmatches(context, tmm)[[1]]
-          collecting <- FALSE
-          for (ti in rev(ctx_titles)) {
-            cont <- sub('title="([^"]*)"', '\\1', ti, perl = TRUE)
-            if (grepl('/m:', cont)) {
-              collecting <- TRUE
-              mparts <- unlist(strsplit(cont, "[[:space:]]+"))
-              features <- sub('.*?/m:(.*)$', '\\1', mparts[grepl('/m:', mparts)], perl = TRUE)
-              if (length(features) > 0) {
-                new_features <- features[!features %in% morph_features]
-                morph_features <- c(morph_features, new_features)
-              }
-            } else if (collecting) {
-              break
-            }
-          }
-        }
-
-        tokens <- c(tokens, text_content)
-        lemmas <- c(lemmas, if (!is.null(lemma)) lemma else NA)
-        pos_tags <- c(pos_tags, if (!is.null(pos_tag)) pos_tag else NA)
-        morph_tags <- c(morph_tags, if (length(morph_features) > 0) paste(unique(morph_features), collapse = "|") else NA)
-      }
-    }
-
-    # Optionally replace morphological tags using XML-based extraction if it aligns with tokens
-    xml_morph <- extract_morphological_features_via_xml(section_content)
-    if (!is.null(xml_morph) && length(xml_morph$morph) > 0) {
-      morph_tags <- xml_morph$morph
-    }
-
-    # Ensure all vectors have the same length
-    max_length <- max(length(tokens), length(lemmas), length(pos_tags), length(morph_tags))
-    if (max_length > 0) {
-      tokens <- c(tokens, rep(NA, max_length - length(tokens)))
-      lemmas <- c(lemmas, rep(NA, max_length - length(lemmas)))
-      pos_tags <- c(pos_tags, rep(NA, max_length - length(pos_tags)))
-      morph_tags <- c(morph_tags, rep(NA, max_length - length(morph_tags)))
-    }
-
+  doc <- tryCatch(xml2::read_html(paste0("<root>", xml_snippet, "</root>")), error = function(e) NULL)
+  if (is.null(doc)) {
+    empty_result <- list(left = character(0), match = character(0), right = character(0))
     return(list(
-      tokens = tokens,
-      lemmas = lemmas,
-      pos_tags = pos_tags,
-      morph_tags = morph_tags
+      atokens = empty_result,
+      lemma = empty_result,
+      pos = empty_result,
+      morph = empty_result
     ))
   }
 
-  # Split the XML into three parts: left context, match content, and right context
-  # The structure is: <span class="match">...left...<mark>...match...</mark>...right...</span>
-
-  # First extract the content within the match span using DOTALL modifier
-  match_span_pattern <- '(?s)<span class="match">(.*?)</span>\\s*<span class="context-right">'
-  match_span_match <- regexpr(match_span_pattern, xml_snippet, perl = TRUE)
-
-  if (match_span_match == -1) {
-    # Try alternative pattern if no context-right
-    match_span_pattern <- '(?s)<span class="match">(.*?)</span>\\s*$'
-    match_span_match <- regexpr(match_span_pattern, xml_snippet, perl = TRUE)
+  match_node <- xml2::xml_find_first(doc, ".//span[contains(@class, 'match')]")
+  if (inherits(match_node, "xml_missing")) {
+    empty_result <- list(left = character(0), match = character(0), right = character(0))
+    return(list(
+      atokens = empty_result,
+      lemma = empty_result,
+      pos = empty_result,
+      morph = empty_result
+    ))
   }
 
-  if (match_span_match > 0) {
-    match_span_content <- gsub(match_span_pattern, '\\1', xml_snippet, perl = TRUE)
+  token_info <- collect_token_annotations(match_node)
+  tokens <- token_info$token
+  lemmas <- token_info$lemma
+  pos_tags <- token_info$pos
+  morph_tags <- token_info$morph
+  nodes <- token_info$node
 
-    # Now find the <mark> and </mark> positions within this content
-    mark_start <- regexpr('<mark[^>]*>', match_span_content, perl = TRUE)
-    # Use the LAST closing </mark> to cover multi-part matches
-    mark_end_gre <- gregexpr('</mark>', match_span_content, perl = TRUE)
-    mark_end_positions <- mark_end_gre[[1]]
-    mark_end <- if (!is.null(mark_end_positions) && length(mark_end_positions) > 0 && mark_end_positions[1] != -1)
-      mark_end_positions[length(mark_end_positions)] else -1
-    mark_end_len <- if (mark_end != -1) attr(mark_end_gre[[1]], "match.length")[length(mark_end_positions)] else 0
+  if (length(tokens) == 0) {
+    empty_result <- list(left = character(0), match = character(0), right = character(0))
+    return(list(
+      atokens = empty_result,
+      lemma = empty_result,
+      pos = empty_result,
+      morph = empty_result
+    ))
+  }
 
-    if (mark_start > 0 && mark_end > 0) {
-      # Left context: everything before first <mark>
-      left_content <- substr(match_span_content, 1, mark_start - 1)
+  mark_flags <- vapply(nodes, function(n) {
+    !inherits(xml2::xml_find_first(n, "ancestor::mark"), "xml_missing")
+  }, logical(1))
 
-      # Match content: everything between first <mark> and last </mark>
-      match_content <- substr(match_span_content, mark_start, mark_end + mark_end_len - 1)
-
-      # Right context: everything after last </mark>
-      right_content_start <- mark_end + mark_end_len
-      right_content <- substr(match_span_content, right_content_start, nchar(match_span_content))
-    } else {
-      # No mark tags found, treat entire match span as match content
-      left_content <- ""
-      match_content <- match_span_content
-      right_content <- ""
-    }
+  if (any(mark_flags)) {
+    first_idx <- which(mark_flags)[1]
+    last_idx <- tail(which(mark_flags), 1)
   } else {
-    # No match span found, treat entire content as match
-    left_content <- ""
-    match_content <- xml_snippet
-    right_content <- ""
+    first_idx <- 1
+    last_idx <- length(tokens)
   }
 
-  # Process each section
-  left_annotations <- extract_annotations_from_section(left_content)
-  match_annotations <- extract_annotations_from_section(match_content)
-  right_annotations <- extract_annotations_from_section(right_content)
+  sections <- rep("match", length(tokens))
+  if (first_idx > 1) {
+    sections[seq_len(first_idx - 1)] <- "left"
+  }
+  if (last_idx < length(tokens)) {
+    sections[seq(from = last_idx + 1, to = length(tokens))] <- "right"
+  }
 
-  return(list(
-    atokens = list(
-      left = left_annotations$tokens,
-      match = match_annotations$tokens,
-      right = right_annotations$tokens
-    ),
-    lemma = list(
-      left = left_annotations$lemmas,
-      match = match_annotations$lemmas,
-      right = right_annotations$lemmas
-    ),
-    pos = list(
-      left = left_annotations$pos_tags,
-      match = match_annotations$pos_tags,
-      right = right_annotations$pos_tags
-    ),
-    morph = list(
-      left = left_annotations$morph_tags,
-      match = match_annotations$morph_tags,
-      right = right_annotations$morph_tags
-    )
-  ))
+  subset_by_section <- function(values, section) {
+    idx <- sections == section
+    if (!any(idx)) {
+      return(character(0))
+    }
+    values[idx]
+  }
+
+  atokens <- list(
+    left = subset_by_section(tokens, "left"),
+    match = subset_by_section(tokens, "match"),
+    right = subset_by_section(tokens, "right")
+  )
+
+  lemma <- list(
+    left = subset_by_section(lemmas, "left"),
+    match = subset_by_section(lemmas, "match"),
+    right = subset_by_section(lemmas, "right")
+  )
+
+  pos <- list(
+    left = subset_by_section(pos_tags, "left"),
+    match = subset_by_section(pos_tags, "match"),
+    right = subset_by_section(pos_tags, "right")
+  )
+
+  morph <- list(
+    left = subset_by_section(morph_tags, "left"),
+    match = subset_by_section(morph_tags, "match"),
+    right = subset_by_section(morph_tags, "right")
+  )
+
+  list(
+    atokens = atokens,
+    lemma = lemma,
+    pos = pos,
+    morph = morph
+  )
 }
 
 #' Fetch annotations for all collected matches
