internal_add is more abstract now