Right now, Gnus backends return article header data by writing it in a parseable format into the `nntp-server-buffer', and returning one of the symbols 'nov or 'headers, indicating how the data should be parsed. This isn't great because it requires backends to first munge their data into a format that looks like the NNTP format, which is then parsed again, which is an extra layer of data transformation. It also makes use of the `nntp-server-buffer', which is something I'd like to work on reducing because it causes problems with threading and introduces potential encoding bugs. This patch provides the possibility for backends to return their own headers (ie a list of vectors), though it doesn't actually change any of the backends to do that -- that will be another patch. I have one question at this stage: the 'nov or 'headers value gets stored into the `gnus-headers-retrieved-by' variable. That variable is later checked in a couple of places like so: (when (and gnus-fetch-old-headers (eq gnus-headers-retrieved-by 'nov)) (if (eq gnus-fetch-old-headers 'invisible) (gnus-build-all-threads) (gnus-build-old-threads))) If the variable is 'headers, the `gnus-build-*-threads' functions don't get called at all. What's the difference between 'nov and 'headers, and why can we build threads in one case and not the other? If backends were to return their own headers, what value should they return? I'll also note that the nnir version of this function returns 'nov regardless of what the "real" backend function returned -- why is that? I would love to use some other, more direct, heuristic to decide about building threads or not, and get rid of the 'nov/'headers/gnus-headers-retrieved-by stuff altogether, but I don't yet know how to do that. Eric