split from celements-core