union is slow, please improove