Finished 3. Needs refinement.