Looks fine so far. Although 3NF would dictate that Property has a CityID and City table has a StateID, generally I would have CityID and City and StateID and State in the Property table - they are after all static data and not subject to change (how often do they rename a state?). It just makes it much easier to get the whole address without needing joins and the whole address is generally what we want; let alone querying for addresses in a given state, etc
Indeed, both city and state can be derived from the ZIP code so purists might argue that only the zip is in the properties table and city.state resolved from that.
However, I've just integrated a Post Office database into an address system, enter a postcode and it looks up the correct postal town and county. Yet I still store the plain text names in the address table because it makes using the full address so much easier and disk space is too cheap to worry about these days.