better form parsing