better floating/pushing logic