add abstract communication layer