Fix Trac #4302, plus a little refactoring