Great branch, thanks Toshio. There are a few minor things I'd like to clean up on the branch, but I'm happy to do that and land this for you. I'll mention them here just for future reference. In common.rst: >>> len (os.listdir(archivepath)) >= 1 True it's better to write it like the following (aside from the PEP 8 violation of spaces after the 'len' :) so that it's easier to debug: >>> len(os.listdir(archive_path)) 1 Also, there's no need to re-import os (since it's imported earlier in the file) or to import config, since the doctest framework injects that into the doctest globals. Minor nit: two blank lines between major sections in rst and .py files. In prototype.py: hashlib and base64 modules are unused (pyflakes ftw! :). Very minor nit: I like using just `log` when there's only one logger in a module. I prefer full sentences (e.g. capitalized and period at the end) for docstrings and comments. I generally prefer `error` as targets for except clauses. Abbreviations in general make for less readable code, though there are occasional exceptions . I wonder if config.py's ensure_directories_exist() should create the maildir for the prototype archiver? This would avoid having the archiver do this every time a message is added to the archive, where it will almost always fail with EEXIST. It would have to be part of the IArchive interface though to keep things separated, possibly a `prepare()` method that gets called on startup. OTOH, it's possible that an archiver will have to do additional preparation specifically for the mailing list, and it's probably not a good idea to have to call this every time a mailing list is created. So I guess for now, having archive_message() create the directory is the best choice. We can't add an __init__() to the archiver though because it never gets instantiated (maybe that should change too). Just thinking out loud here. I think I'll pull the os.path.join() out of the Lock() instantiation. I'm kind of favoring .format() rather than % interpolation these days, but of course we have to use '{0}' instead of '{}' until we switch to Python 3 :). Python 2.6 doesn't support '{}'. Do you think the lock timeout needs to be configurable? I think I'm going to rewrite the comment above mailbox.add() and not store it in message_key. It makes pyflakes (since message_key) is unused, but the comment will preserve the fact that the return value could be useful in the future. test_prototype: Generally, I like sticking to PEP 8 for test class names, e.g. TestPrototypeArchiver. I've started to put these into the __all__ of the module. I'm not sure it matters, but it looks a bit better to me these days. ;) I almost always prefer double-triple-quoted strings for multiline string delimiters. For consistency, I generally use