added optional mode parameter