First pass at 2d solver