Now uses a QLProgram rather than a temporary file