Merge from google.

Lots of change - see the commit list for detail.