backport from trunk