Hello Stefan, Emacs developers, below is an initial sketch of the first refactoring step I had outlined in my previous message. Hope this helps make things more tangible. All comments invited & welcome! What it does: - it updates the variable message-completion-alist instead of just a function, to use a plist as its cdr type; - the plist contains the completion category to use, the completion styles associated with that category, and the completion function to use to generate candidates. How it improves over the previous version: - makes the completion category visible in a defcustom, so users know which category applies, without diving into the code of message.el; - for the first time defines a completion category for newsgroup names, and adds that category to the newsgroups completion table, and consequently resolves a FIXME; - all completion-category-defaults changes instead of hard-coded values now use values configured in message-completion-alist. Where it still needs improvement: - message-completion-alist should probably have a setter function, since changes to the completion styles will only take effect after Emacs restart; - there should probably be convenience functions for users to change the settings in the plist in message-completion-alist from their init files (too easy to get wrong). What do I have in mind beyond this first step? - Could message-complete-name be replaced by eudc-capf-message-expand-name as the default function in message-completion-alist? - Could, or should the field separator for scanning backwards on the message header line be specified in message-completion-alist? - In principle, all code dealing with bbdb, ecomplete, and mailabbrev could be removed from message.el, and these packages could deliver their completion candidates to EUDC. EUDC would do the search results merging, and it has a back-end for bbdb already. Thus, new EUDC back-ends would need to be written for ecomplete, and mailabbrev only. Many thanks and looking forward to your thoughts, --alexander