diff --git a/daemon/src/sip/sdp.cpp b/daemon/src/sip/sdp.cpp
index ce0797931bc78a0be00577563403fe48d718b0f3..5df6c7be82160cb7b83edd63995d8416dfea9208 100644
--- a/daemon/src/sip/sdp.cpp
+++ b/daemon/src/sip/sdp.cpp
@@ -272,12 +272,35 @@ Sdp::setMediaDescriptorLines(bool audio)
     if (!zrtpHelloHash_.empty())
         addZrtpAttribute(med, zrtpHelloHash_);
 
-    if (audio)
+    if (audio) {
         setTelephoneEventRtpmap(med);
+        addRTCPAttribute(med); // video has its own RTCP
+    }
 
     return med;
 }
 
+
+void Sdp::addRTCPAttribute(pjmedia_sdp_media *med)
+{
+    // FIXME: get this from CCRTP directly, don't just assume that the RTCP port is
+    // RTP + 1
+    std::ostringstream os;
+    os << localIpAddr_ << ":" << (localAudioPort_ + 1);
+    const std::string str(os.str());
+    const pj_str_t input_str = {(char*) str.c_str(), str.size()};
+    pj_sockaddr outputAddr;
+    pj_status_t status = pj_sockaddr_parse(PJ_AF_UNSPEC, 0, &input_str, &outputAddr);
+    if (status != PJ_SUCCESS) {
+        ERROR("Could not parse address %s", str.c_str());
+        return;
+    }
+    pjmedia_sdp_attr *attr = pjmedia_sdp_attr_create_rtcp(memPool_, &outputAddr);
+    if (attr)
+        pjmedia_sdp_attr_add(&med->attr_count, med->attr, attr);
+}
+
+
 void Sdp::setTelephoneEventRtpmap(pjmedia_sdp_media *med)
 {
     pjmedia_sdp_attr *attr_rtpmap = static_cast<pjmedia_sdp_attr *>(pj_pool_zalloc(memPool_, sizeof(pjmedia_sdp_attr)));
diff --git a/daemon/src/sip/sdp.h b/daemon/src/sip/sdp.h
index 7e41b63b2fb561e3c5c6b9022864327f24adf4e9..5e1e133dc721a1089ec228dc985ba0fde3b1340f 100644
--- a/daemon/src/sip/sdp.h
+++ b/daemon/src/sip/sdp.h
@@ -357,6 +357,8 @@ class Sdp {
          * @throw SdpException
          */
         void addZrtpAttribute(pjmedia_sdp_media* media, std::string hash);
+
+        void addRTCPAttribute(pjmedia_sdp_media *med);
 };