diff --git a/CMakeLists.txt b/CMakeLists.txt
index 7288faf7c84c21e3d116279cf31b94db21821e59..ba8d1d90bdb54de37a3e23de29fce1b859fd62d6 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -3,6 +3,9 @@ cmake_minimum_required(VERSION 3.11)
 set (CMAKE_CONFIGURATION_TYPES "Debug;Release")
 set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
 
+#set(dir ${CMAKE_CURRENT_SOURCE_DIR}/build)
+
+
 project(aes67)
 
 ################
@@ -130,8 +133,8 @@ elseif("${AES67_MDNS}" STREQUAL "avahi")
     set(AES67_MDNS_INCLUDE_DIRS ${Avahi_CLIENT_INCLUDE_DIRS})
     set(AES67_MDNS_LIBRARIES ${Avahi_COMMON_LIBRARY} ${Avahi_CLIENT_LIBRARY})
 
-else()
-    message(FATAL_ERROR "mDNS option '${AES67_MDNS}' unknown")
+elseif(DEFINED AES67_MDNS)
+    message(ERROR "mDNS option '${AES67_MDNS}' unknown")
 endif()
 
 
@@ -172,15 +175,17 @@ set_property(TARGET aes67 PROPERTY LINKER_LANGUAGE C)
 
 add_subdirectory("${AES67_DIR}/test" EXCLUDE_FROM_ALL)
 
-add_subdirectory("${AES67_DIR}/src/utils")
+#if(NOT ${AES67_WITHOUT_UTILS})
+    add_subdirectory("${AES67_DIR}/src/utils")
+#endif()
 
-list(APPEND AES67_TARGET_LIST mytest)
-add_executable(mytest test.c)
-target_include_directories(mytest PRIVATE
-        ${AES67_DIR}
-        ${AES67_PORT_INCLUDE_DIRS}
-        )
-target_link_libraries(mytest aes67 ${AES67_PORT_LIB})
+#list(APPEND AES67_TARGET_LIST mytest)
+#add_executable(mytest test.c)
+#target_include_directories(mytest PRIVATE
+#        ${AES67_DIR}
+#        ${AES67_PORT_INCLUDE_DIRS}
+#        )
+#target_link_libraries(mytest aes67 ${AES67_PORT_LIB})
 
 if(CMAKE_BUILD_TYPE MATCHES Debug)
     foreach(TARGET IN LISTS AES67_TARGET_LIST)
diff --git a/README.md b/README.md
index 6c3938c77d04ce04a0404bd649fab303fb9ac2e7..a0d58d92b539a07bb3e340900f362daa616ee803 100644
--- a/README.md
+++ b/README.md
@@ -52,20 +52,25 @@ https://github.com/tschiemer/aes67
     - [ ] rtsp/http combo server?
   - RAVENNA
     - [ ] ~~RAV2SAP~~ -> [sapd](#sapd)
-    - [x] [rav-lookup](#rav-lookup): browse for RAVENNA sessions/devices
-    - [ ] [rav-publish](#rav-publish): publish RAVENNA sessions and optionally serve SDP files
+    - [x] [rav-lookup](#rav-lookup): browse for sessions/devices
+    - [ ] [rav-publish](#rav-publish): publish sessions and optionally serve SDP files
   - PTP
-    - [ ] ptp-monitor? -> https://www.ptptrackhound.com/
+    - [ ] ptp-monitor? -> [ptptrackhound](https://www.ptptrackhound.com/) & [ptpmonkey](https://github.com/martim01/ptpmonkey)
     - [ ] ptp-server?
   - RTP/RTCP
     - [ ] rtp-send: send RTP (from STDIN)
     - [ ] rtp-recv: receive RTP (to STDOUT)
   - Support
-    - mDNS (abstraction for service *discovery*)
-      - [ ] dns-sd
+    - mDNS (abstraction for mdns service)
+      - [x] dns-sd
          - [x] discovery
-         - [ ] registration (?)
-      - [ ] ahavi
+         - [x] registration
+      - [ ] avahi
+         - [ ] dns-sd compat layer
+    - [ ] RTSP describe
+      - [x] retrieve SDP from server
+      - [ ] serve SDPs  on request
+    
 
 
 
diff --git a/src/core/sap.c b/src/core/sap.c
index 7fd58562ec6f67e2c26687144d0bccc6a68c117c..10d5eb56896418ac6b197f7011c2dcdd57f19cf7 100644
--- a/src/core/sap.c
+++ b/src/core/sap.c
@@ -108,7 +108,7 @@ struct aes67_sap_session * aes67_sap_service_find(struct aes67_sap_service * sap
     struct aes67_sap_session * current = sap->first_session;
 
     while(current != NULL){
-        if ((current->stat & AES67_SAP_SESSION_STAT_SET) && current->hash == hash && current->src.ipver == ipver && 0 == aes67_memcmp(current->src.addr, ip, AES67_NET_IPVER_SIZE(ipver))){
+        if ((current->stat & AES67_SAP_SESSION_STAT_SET) && current->hash == hash && current->src.ipver == ipver && 0 == aes67_memcmp(current->src.ip, ip, AES67_NET_IPVER_SIZE(ipver))){
             return current;
         }
         current = current->next;
@@ -413,7 +413,7 @@ void aes67_sap_service_announcement_check(struct aes67_sap_service *sap, void *u
 
             if (timeout_after < age){
 
-                aes67_sap_service_event(sap, aes67_sap_event_announcement_request, current->hash, current->src.ipver, current->src.addr, NULL, 0, NULL, 0, user_data);
+                aes67_sap_service_event(sap, aes67_sap_event_announcement_request, current->hash, current->src.ipver, current->src.ip, NULL, 0, NULL, 0, user_data);
 
             }
         }
@@ -500,7 +500,7 @@ void aes67_sap_service_timeouts_cleanup(struct aes67_sap_service *sap, void *use
 
             if (timeout_after < age){
 
-                aes67_sap_service_event(sap, aes67_sap_event_timeout, current->hash, current->src.ipver, current->src.addr, NULL, 0, NULL, 0, user_data);
+                aes67_sap_service_event(sap, aes67_sap_event_timeout, current->hash, current->src.ipver, current->src.ip, NULL, 0, NULL, 0, user_data);
 
                 aes67_sap_service_unregister(sap, current);
             }
diff --git a/src/include/aes67/arch.h b/src/include/aes67/arch.h
index 47a1e53cd7b328a30a6cc0c65389a821e67675a8..77951252f8d91f0dd01bd9301724032b0369bb6b 100644
--- a/src/include/aes67/arch.h
+++ b/src/include/aes67/arch.h
@@ -77,4 +77,8 @@ typedef struct {
 #define WEAK_FUN __attribute__((weak))
 #endif
 
+#ifndef INLINE_FUN
+#define INLINE_FUN __attribute__((always_inline)) inline
+#endif
+
 #endif //AES67_ARCH_H
diff --git a/src/include/aes67/net.h b/src/include/aes67/net.h
index 5a75544d1a1a468c8dba695db8be8e882f2a8044..45e380620b72dd4b3d5dcd3f7f8795238fb0c027 100644
--- a/src/include/aes67/net.h
+++ b/src/include/aes67/net.h
@@ -63,17 +63,17 @@ struct aes67_net_addr {
 s32_t aes67_net_str2ip(enum aes67_net_ipver * ipver, u8_t * addr, u16_t * port, u8_t * str, u16_t slen);
 u16_t aes67_net_ip2str(u8_t * str, enum aes67_net_ipver ipver, u8_t * addr, u16_t port);
 
-inline s32_t aes67_net_str2addr(struct aes67_net_addr * addr, u8_t * str, u16_t slen)
+INLINE_FUN s32_t aes67_net_str2addr(struct aes67_net_addr * addr, u8_t * str, u16_t slen)
 {
     return aes67_net_str2ip(&addr->ipver, addr->ip, &addr->port, str, slen);
 }
 
-inline u16_t aes67_net_addr2str(u8_t * str, struct aes67_net_addr * addr)
+INLINE_FUN u16_t aes67_net_addr2str(u8_t * str, struct aes67_net_addr * addr)
 {
     return aes67_net_ip2str(str, addr->ipver, addr->ip, addr->port);
 }
 
-inline u8_t aes67_net_addr2mem(u8_t * to, const struct aes67_net_addr * from)
+INLINE_FUN u8_t aes67_net_addr2mem(u8_t * to, const struct aes67_net_addr * from)
 {
     if (from->ipver == aes67_net_ipver_4){
         ((u32_t*)to)[0] = ((u32_t*)from->ip)[0];
@@ -88,7 +88,7 @@ inline u8_t aes67_net_addr2mem(u8_t * to, const struct aes67_net_addr * from)
     return 0;
 }
 
-inline void aes67_net_addrcp(struct aes67_net_addr * to, const struct aes67_net_addr * from)
+INLINE_FUN void aes67_net_addrcp(struct aes67_net_addr * to, const struct aes67_net_addr * from)
 {
     aes67_memcmp(to, from, sizeof(struct aes67_net_addr));
 }
@@ -96,7 +96,7 @@ inline void aes67_net_addrcp(struct aes67_net_addr * to, const struct aes67_net_
 
 u8_t aes67_net_ipeq(const struct aes67_net_addr * lhs, const struct aes67_net_addr * rhs);
 
-inline u8_t aes67_net_ismcastip(const enum aes67_net_ipver ipver, const u8_t * ip)
+INLINE_FUN u8_t aes67_net_ismcastip(const enum aes67_net_ipver ipver, const u8_t * ip)
 {
     if (ipver == aes67_net_ipver_4){
         // 224.0.0.0 - 239.255.255.255
@@ -108,12 +108,12 @@ inline u8_t aes67_net_ismcastip(const enum aes67_net_ipver ipver, const u8_t * i
     return 0;
 }
 
-inline u8_t aes67_net_ismcastip_addr(const struct aes67_net_addr * addr)
+INLINE_FUN u8_t aes67_net_ismcastip_addr(const struct aes67_net_addr * addr)
 {
     return aes67_net_ismcastip(addr->ipver, (u8_t *)addr->ip);
 }
 
-inline u8_t aes67_net_isallip(const enum aes67_net_ipver ipver, const u8_t * ip)
+INLINE_FUN u8_t aes67_net_isallip(const enum aes67_net_ipver ipver, const u8_t * ip)
 {
     if (ipver == aes67_net_ipver_4){
         return ((u32_t*)ip)[0] == 0;
@@ -122,12 +122,12 @@ inline u8_t aes67_net_isallip(const enum aes67_net_ipver ipver, const u8_t * ip)
     }
     return 0;
 }
-inline u8_t aes67_net_isallip_addr(const struct aes67_net_addr * addr)
+INLINE_FUN u8_t aes67_net_isallip_addr(const struct aes67_net_addr * addr)
 {
     return aes67_net_isallip(addr->ipver, addr->ip);
 }
 
-inline u8_t aes67_net_addreq(const struct aes67_net_addr * lhs, const struct aes67_net_addr * rhs)
+INLINE_FUN u8_t aes67_net_addreq(const struct aes67_net_addr * lhs, const struct aes67_net_addr * rhs)
 {
     if (aes67_net_ipeq(lhs, rhs) == false) return false;
     if (lhs->port != rhs->port) return false;
diff --git a/src/include/aes67/sap.h b/src/include/aes67/sap.h
index d02841020b8b2e991bd14348c7e6c18d2f188073..98ead3dbc0f1cdb79ba371ca5a582d2443e0a534 100644
--- a/src/include/aes67/sap.h
+++ b/src/include/aes67/sap.h
@@ -282,7 +282,7 @@ void aes67_sap_service_unregister(struct aes67_sap_service * sap, struct aes67_s
 #define aes67_sap_service_unregister(session, sap)
 #endif
 
-inline u16_t aes67_sap_no_of_ads(struct aes67_sap_service * sap)
+INLINE_FUN u16_t aes67_sap_no_of_ads(struct aes67_sap_service * sap)
 {
     return sap->no_of_ads_other + sap->no_of_ads_self;
 }
@@ -307,7 +307,7 @@ void aes67_sap_compute_times_sec(s32_t no_of_ads, s32_t announcement_size, u32_t
  * @param sap
  * @return true iff announcement may/should occur now
  */
-inline enum aes67_timer_state aes67_sap_service_announcement_timer_state(struct aes67_sap_service * sap)
+INLINE_FUN enum aes67_timer_state aes67_sap_service_announcement_timer_state(struct aes67_sap_service * sap)
 {
     return aes67_timer_getstate(&sap->announcement_timer);
 }
@@ -330,7 +330,7 @@ void aes67_sap_service_set_announcement_timer(struct aes67_sap_service * sap);
  * @param sap
  * @return true iff the timeout timer expired
  */
-inline enum aes67_timer_state aes67_sap_service_timeout_timer_state(struct aes67_sap_service * sap)
+INLINE_FUN enum aes67_timer_state aes67_sap_service_timeout_timer_state(struct aes67_sap_service * sap)
 {
     return aes67_timer_getstate(&sap->timeout_timer);
 }
diff --git a/src/include/aes67/sdp.h b/src/include/aes67/sdp.h
index c3a0c0a0f6e4d4eb41174e6420fe02af3a849163..3f644134f6bb9764d9aace8d6a54895c5d0b674b 100644
--- a/src/include/aes67/sdp.h
+++ b/src/include/aes67/sdp.h
@@ -335,7 +335,7 @@ void aes67_sdp_origin_init(struct aes67_sdp_originator * origin);
  */
 void aes67_sdp_init(struct aes67_sdp * sdp);
 
-inline u16_t aes67_sdp_origin_size(struct aes67_sdp_originator * origin)
+INLINE_FUN u16_t aes67_sdp_origin_size(struct aes67_sdp_originator * origin)
 {
 #if 0 < AES67_SDP_MAXUSERNAME
     return sizeof("o=   IN IP4 \n") + (origin->username.length ? origin->username.length : 1) + origin->session_id.length + origin->session_version.length +  + origin->address.length;
@@ -350,7 +350,7 @@ inline u16_t aes67_sdp_origin_size(struct aes67_sdp_originator * origin)
  * @param sdp
  * @return
  */
-inline u8_t aes67_sdp_get_ptpdomain(struct aes67_sdp * sdp)
+INLINE_FUN u8_t aes67_sdp_get_ptpdomain(struct aes67_sdp * sdp)
 {
     return AES67_SDP_PTPDOMAIN_VALUE & sdp->ptp_domain;
 }
@@ -362,7 +362,7 @@ inline u8_t aes67_sdp_get_ptpdomain(struct aes67_sdp * sdp)
  * @param domain
  * @return
  */
-inline u8_t aes67_sdp_set_ptpdomain(struct aes67_sdp * sdp, u8_t domain)
+INLINE_FUN u8_t aes67_sdp_set_ptpdomain(struct aes67_sdp * sdp, u8_t domain)
 {
     return sdp->ptp_domain = AES67_SDP_PTPDOMAIN_SET | (AES67_SDP_PTPDOMAIN_VALUE & domain);
 }
@@ -374,7 +374,7 @@ inline u8_t aes67_sdp_set_ptpdomain(struct aes67_sdp * sdp, u8_t domain)
  * @param domain
  * @return
  */
-inline u8_t aes67_sdp_unset_ptpdomain(struct aes67_sdp * sdp)
+INLINE_FUN u8_t aes67_sdp_unset_ptpdomain(struct aes67_sdp * sdp)
 {
     return sdp->ptp_domain = 0;
 }
@@ -387,7 +387,7 @@ inline u8_t aes67_sdp_unset_ptpdomain(struct aes67_sdp * sdp)
  * @param sdp
  * @return
  */
-inline u8_t aes67_sdp_get_connection_count(struct aes67_sdp * sdp)
+INLINE_FUN u8_t aes67_sdp_get_connection_count(struct aes67_sdp * sdp)
 {
     AES67_ASSERT("sdp != NULL", sdp != NULL);
 
@@ -415,7 +415,7 @@ struct aes67_sdp_connection * aes67_sdp_get_connection(struct aes67_sdp * sdp, a
  * @param di
  * @return
  */
-inline struct aes67_sdp_connection * aes67_sdp_add_connection(struct aes67_sdp * sdp, aes67_sdp_flags flags)
+INLINE_FUN struct aes67_sdp_connection * aes67_sdp_add_connection(struct aes67_sdp * sdp, aes67_sdp_flags flags)
 {
     AES67_ASSERT("sdp != NULL", sdp != NULL);
     AES67_ASSERT("sdp->connections.count < AES67_SDP_MAXCONNECTIONS", sdp->connections.count < AES67_SDP_MAXCONNECTIONS);
@@ -435,7 +435,7 @@ inline struct aes67_sdp_connection * aes67_sdp_add_connection(struct aes67_sdp *
  * @param sdp
  * @return
  */
-inline u8_t aes67_sdp_get_stream_count(struct aes67_sdp * sdp)
+INLINE_FUN u8_t aes67_sdp_get_stream_count(struct aes67_sdp * sdp)
 {
     AES67_ASSERT("sdp != NULL", sdp != NULL);
 
@@ -449,7 +449,7 @@ inline u8_t aes67_sdp_get_stream_count(struct aes67_sdp * sdp)
  * @param si    stream index
  * @return
  */
-inline struct aes67_sdp_stream * aes67_sdp_get_stream(struct aes67_sdp * sdp, u8_t si)
+INLINE_FUN struct aes67_sdp_stream * aes67_sdp_get_stream(struct aes67_sdp * sdp, u8_t si)
 {
     AES67_ASSERT("sdp != NULL", sdp != NULL);
     AES67_ASSERT("si < sdp->streams.count", si < sdp->streams.count);
@@ -464,7 +464,7 @@ inline struct aes67_sdp_stream * aes67_sdp_get_stream(struct aes67_sdp * sdp, u8
  * @param si        if not NULL, is set to stream index
  * @return
  */
-inline struct aes67_sdp_stream * aes67_sdp_add_stream(struct aes67_sdp * sdp, u8_t * si)
+INLINE_FUN struct aes67_sdp_stream * aes67_sdp_add_stream(struct aes67_sdp * sdp, u8_t * si)
 {
     AES67_ASSERT("sdp != NULL", sdp != NULL);
     AES67_ASSERT("si < sdp->streams.count", sdp->streams.count < AES67_SDP_MAXSTREAMS);
@@ -486,7 +486,7 @@ inline struct aes67_sdp_stream * aes67_sdp_add_stream(struct aes67_sdp * sdp, u8
  * @param si    stream index
  * @return
  */
-inline u8_t aes67_sdp_get_stream_encoding_count(struct aes67_sdp * sdp, u8_t si)
+INLINE_FUN u8_t aes67_sdp_get_stream_encoding_count(struct aes67_sdp * sdp, u8_t si)
 {
     AES67_ASSERT("sdp != NULL", sdp != NULL);
     AES67_ASSERT("si < sdp->streams.count", si < sdp->streams.count);
@@ -511,7 +511,7 @@ struct aes67_sdp_attr_encoding * aes67_sdp_get_stream_encoding(struct aes67_sdp
  * @param si
  * @return
  */
-inline struct aes67_sdp_attr_encoding * aes67_sdp_add_stream_encoding(struct aes67_sdp * sdp, u8_t si)
+INLINE_FUN struct aes67_sdp_attr_encoding * aes67_sdp_add_stream_encoding(struct aes67_sdp * sdp, u8_t si)
 {
     AES67_ASSERT("sdp != NULL", sdp != NULL);
     AES67_ASSERT("si < sdp->streams.count", si < sdp->streams.count);
@@ -529,7 +529,7 @@ inline struct aes67_sdp_attr_encoding * aes67_sdp_add_stream_encoding(struct aes
 }
 
 
-inline u8_t aes67_sdp_get_refclk_count(struct aes67_sdp * sdp, aes67_sdp_flags flags)
+INLINE_FUN u8_t aes67_sdp_get_refclk_count(struct aes67_sdp * sdp, aes67_sdp_flags flags)
 {
     AES67_ASSERT("sdp != NULL", sdp != NULL);
 
@@ -571,7 +571,7 @@ struct aes67_sdp_attr_refclk * aes67_sdp_get_refclk(struct aes67_sdp * sdp, aes6
  * @param pi
  * @return
  */
-inline struct aes67_sdp_attr_refclk * aes67_sdp_add_refclk(struct aes67_sdp * sdp, aes67_sdp_flags flags)
+INLINE_FUN struct aes67_sdp_attr_refclk * aes67_sdp_add_refclk(struct aes67_sdp * sdp, aes67_sdp_flags flags)
 {
     AES67_ASSERT("sdp != NULL", sdp != NULL);
     AES67_ASSERT("(flags & AES67_SDP_FLAG_DEFLVL_MASK) != 0", (flags & AES67_SDP_FLAG_DEFLVL_MASK) != 0);
@@ -600,7 +600,7 @@ inline struct aes67_sdp_attr_refclk * aes67_sdp_add_refclk(struct aes67_sdp * sd
  * @param flags     either AES67_SDP_FLAG_DEFLVL_SESSION or AES67_SDP_FLAG_DEFLVL_STREAM | <stream-index>
  * @return
  */
-inline enum aes67_sdp_attr_mode aes67_sdp_get_mode(struct aes67_sdp * sdp, aes67_sdp_flags flags)
+INLINE_FUN enum aes67_sdp_attr_mode aes67_sdp_get_mode(struct aes67_sdp * sdp, aes67_sdp_flags flags)
 {
     // if specifically requested session level mode return it
     if ((flags & AES67_SDP_FLAG_DEFLVL_SESSION) == AES67_SDP_FLAG_DEFLVL_SESSION){
@@ -621,7 +621,7 @@ inline enum aes67_sdp_attr_mode aes67_sdp_get_mode(struct aes67_sdp * sdp, aes67
  * @param flags
  * @param mode
  */
-inline void aes67_sdp_set_mode(struct aes67_sdp * sdp, aes67_sdp_flags flags, enum aes67_sdp_attr_mode mode)
+INLINE_FUN void aes67_sdp_set_mode(struct aes67_sdp * sdp, aes67_sdp_flags flags, enum aes67_sdp_attr_mode mode)
 {
     if ((flags & AES67_SDP_FLAG_DEFLVL_SESSION) == AES67_SDP_FLAG_DEFLVL_SESSION){
         sdp->mode = mode;
@@ -639,7 +639,7 @@ inline void aes67_sdp_set_mode(struct aes67_sdp * sdp, aes67_sdp_flags flags, en
  * @param flags
  * @return
  */
-inline struct aes67_sdp_attr_mediaclk * aes67_sdp_get_mediaclock(struct aes67_sdp * sdp, aes67_sdp_flags flags)
+INLINE_FUN struct aes67_sdp_attr_mediaclk * aes67_sdp_get_mediaclock(struct aes67_sdp * sdp, aes67_sdp_flags flags)
 {
     // if specifically requested session level mode return it
     if ((flags & AES67_SDP_FLAG_DEFLVL_SESSION) == AES67_SDP_FLAG_DEFLVL_SESSION){
@@ -661,7 +661,7 @@ inline struct aes67_sdp_attr_mediaclk * aes67_sdp_get_mediaclock(struct aes67_sd
  * @param set
  * @param offset
  */
-inline void aes67_sdp_set_mediaclock(struct aes67_sdp * sdp, aes67_sdp_flags flags, u8_t set, u32_t offset)
+INLINE_FUN void aes67_sdp_set_mediaclock(struct aes67_sdp * sdp, aes67_sdp_flags flags, u8_t set, u32_t offset)
 {
     if ((flags & AES67_SDP_FLAG_DEFLVL_SESSION) == AES67_SDP_FLAG_DEFLVL_SESSION){
         sdp->mediaclock.set = set;
diff --git a/src/include/aes67/utils/sapsrv.h b/src/include/aes67/utils/sapsrv.h
index 5e9f582e5e0315cbcd952c103b0b11299f7f14c8..338da40257c89142070431dba1c7fe837268fbe7 100644
--- a/src/include/aes67/utils/sapsrv.h
+++ b/src/include/aes67/utils/sapsrv.h
@@ -30,6 +30,8 @@
 #include "aes67/opt.h"
 //#include "aes67/debug.h"
 
+#include <stdbool.h>
+
 #if AES67_SAP_MEMORY != AES67_MEMORY_DYNAMIC
 #error sap-server requires dynamic memory allocation (at this point in time)
 #endif
diff --git a/src/utils/mdns-avahi.c b/src/utils/mdns-avahi.c
index 481b7f181a75400529fe0d1c2492d29c9c8d54f7..1fb13c6d1bbeec034f7139ee5493d891bc85a8f3 100644
--- a/src/utils/mdns-avahi.c
+++ b/src/utils/mdns-avahi.c
@@ -27,7 +27,7 @@
 #include <avahi-common/malloc.h>
 #include <avahi-common/error.h>
 
-#error TODO see https://www.avahi.org/doxygen/html/client-browse-services_8c-example.html
+//#error TODO see https://www.avahi.org/doxygen/html/client-browse-services_8c-example.html
 
 typedef struct {
     AvahiServiceBrowser *sb;
@@ -36,7 +36,7 @@ typedef struct {
 typedef struct {
     AvahiSimplePoll *simple_poll;
     AvahiClient *client;
-} ahavi_context_t;
+} avahi_context_t;
 
 
 static void resolve_callback(
@@ -134,7 +134,7 @@ static void client_callback(AvahiClient *c, AvahiClientState state, AVAHI_GCC_UN
 
 aes67_mdns_context_t  aes67_mdns_new(void)
 {
-    ahavi_context_t * context = calloc(1, sizeof(ahavi_context_t);
+    avahi_context_t * context = calloc(1, sizeof(avahi_context_t);
 
     /* Allocate main loop object */
     if (!(context->simple_poll = avahi_simple_poll_new())) {
@@ -160,7 +160,7 @@ void aes67_mdns_delete(aes67_mdns_context_t ctx)
 {
     assert(ctx != NULL);
 
-    ahavi_context_t * context = ctx;
+    avahi_context_t * context = ctx;
 
 
 
diff --git a/src/utils/rav-publish/rav-publish.c b/src/utils/rav-publish/rav-publish.c
index 3b0facaf710dd86ce8f5f76d757c426f7c8567f5..ade1a7386817504b9e72100ef12d03f6b09b63e2 100644
--- a/src/utils/rav-publish/rav-publish.c
+++ b/src/utils/rav-publish/rav-publish.c
@@ -31,6 +31,8 @@
 #include <fcntl.h>
 #include <ctype.h>
 #include <sys/stat.h>
+#include <sys/socket.h>
+#include <dns_util.h>
 
 typedef struct sdpres_st {
     char * name;
@@ -61,6 +63,10 @@ static struct {
 
 static volatile bool keep_running;
 
+static struct {
+    int sockfd;
+} rtsp;
+
 static aes67_mdns_context_t mdns;
 
 static sdpres_t * first_sdpres = NULL;
@@ -99,6 +105,97 @@ static void publish_callback(aes67_mdns_resource_t res, enum aes67_mdns_result r
     }
 }
 
+static void fd_blocking(int fd, bool yes){
+
+    // set non-blocking
+    int flags = fcntl(fd, F_GETFL, 0);
+    flags = (flags & ~O_NONBLOCK) | (yes ? 0 : O_NONBLOCK);
+    if (fcntl(fd, F_SETFL, flags) == -1){
+        perror("fcntl()");
+        close(fd);
+        exit(EXIT_FAILURE);
+    }
+}
+
+static int rtsp_setup()
+{
+    rtsp.sockfd = socket(AF_INET, SOCK_STREAM, 0);
+    if (rtsp.sockfd == -1){
+        perror("socket()");
+        return EXIT_FAILURE;
+    }
+
+    struct sockaddr_in addr;
+
+    addr.sin_family = AF_INET;
+    addr.sin_port = htons(opts.port);
+    addr.sin_addr.s_addr = INADDR_ANY;
+
+    if (bind(rtsp.sockfd, (struct sockaddr*)&addr, sizeof(struct sockaddr_in)) == -1){
+        perror("bind()");
+        close(rtsp.sockfd);
+        rtsp.sockfd = - 1;
+        return EXIT_FAILURE;
+    }
+
+    if (listen(rtsp.sockfd, 10) == -1){
+        close(rtsp.sockfd);
+        rtsp.sockfd = -1;
+        perror ("listen()");
+        return EXIT_FAILURE;
+    }
+
+    fd_blocking(rtsp.sockfd, false);
+
+    return EXIT_SUCCESS;
+}
+
+static void rtsp_teardown() {
+    if (!opts.rtsp || rtsp.sockfd == -1) {
+        return;
+    }
+
+    close(rtsp.sockfd);
+    rtsp.sockfd = -1;
+
+
+}
+
+static void rtsp_process()
+{
+    static int sockfd = -1;
+
+    if (sockfd == -1){
+        struct sockaddr_in addr;
+        socklen_t socklen;
+
+        memset(&addr, 0, sizeof(struct sockaddr_in));
+
+        if ((sockfd = accept(rtsp.sockfd, (struct sockaddr *)&addr, &socklen)) != -1) {
+
+            fd_blocking(sockfd, true);
+
+            u8_t ip[4];
+            *(u32_t*)ip = addr.sin_addr.s_addr;
+            u16_t port = ntohs(addr.sin_port);
+
+            printf("Connected! from %d.%d.%d.%d:%hu\n", ip[0], ip[1], ip[2], ip[3], port);
+
+            u8_t buf[1024];
+
+            ssize_t rlen = read(sockfd, buf, sizeof(buf));
+
+            if (rlen > 0){
+                buf[rlen] = '\0';
+                printf("%s\n", buf);
+            }
+
+            close(sockfd);
+            sockfd = -1;
+        }
+    }
+}
+
 static int load_sdpres(char * fname, size_t maxlen)
 {
     if (access(fname, F_OK) != 0){
@@ -280,6 +377,14 @@ int main(int argc, char * argv[])
         }
     }
 
+    if (opts.rtsp){
+        if (rtsp_setup()){
+            fprintf(stderr, "failed rtsp setup\n");
+            goto shutdown;
+        }
+    }
+
+
     mdns = aes67_mdns_new();
 
 
@@ -324,13 +429,49 @@ int main(int argc, char * argv[])
     signal(SIGTERM, sig_stop);
     keep_running = true;
     while(keep_running){
-        aes67_mdns_process(mdns, NULL);
+
+        int nfds = rtsp.sockfd;
+        struct fd_set fds;
+//    sigset_t sigmask;
+
+        FD_ZERO(&fds);
+
+        // set all AF_LOCAL sockets
+        FD_SET(rtsp.sockfd, &fds);
+
+        int * sockfds;
+        size_t count = 0;
+        aes67_mdns_getsockfds(mdns, &sockfds, &count);
+        for (size_t i = 0; i < count; i++) {
+            FD_SET(sockfds[i], &fds);
+            if (sockfds[i] > nfds) {
+                nfds = sockfds[i];
+            }
+        }
+
+        nfds++;
+
+        // just wait until something interesting happens
+        select(nfds, &fds, NULL, &fds, NULL);
+
+
+
+        struct timeval tv = {
+                .tv_usec = 0,
+                .tv_sec = 0
+        };
+        aes67_mdns_process(mdns, &tv);
+
+        rtsp_process();
     }
 
 shutdown:
 
-    aes67_mdns_delete(mdns);
+    if (mdns) {
+        aes67_mdns_delete(mdns);
+    }
 
+    rtsp_teardown();
 
     cleanup_sdpres();
 
diff --git a/src/utils/rtsp-describe/rtsp-describe.c b/src/utils/rtsp-describe/rtsp-describe.c
index d2753df45f10260521c191854967f7da6005c4b6..af11dd581e97a692f0a01f2ab9febbb49af24634 100644
--- a/src/utils/rtsp-describe/rtsp-describe.c
+++ b/src/utils/rtsp-describe/rtsp-describe.c
@@ -144,15 +144,21 @@ static int lookup2(char * rtsp)
     if (opts.verbose){
         char str[256];
         ssize_t l = snprintf(str, sizeof(str), "RTSP-DESCRIBE %s %s\n", res.statuscode == AES67_RTSP_STATUS_OK ? "OK" : "FAIL", rtsp);
-        write(STDERR_FILENO,str, l);
+        if (write(STDERR_FILENO,str, l) == -1){
+            //
+        }
     }
 
     if (opts.print_rtsp && res.hdrlen > 0){
-        write(STDERR_FILENO, res.buf, res.hdrlen);
+        if (write(STDERR_FILENO, res.buf, res.hdrlen) == -1){
+            //
+        }
     }
 
     if (res.contentlen > 0){
-        write(STDOUT_FILENO, aes67_rtsp_dsc_content(&res), res.contentlen);
+        if (write(STDOUT_FILENO, aes67_rtsp_dsc_content(&res), res.contentlen) == -1){
+            //
+        }
     }
 
     aes67_rtsp_dsc_deinit(&res);
diff --git a/src/utils/sap-pack/sap-pack.c b/src/utils/sap-pack/sap-pack.c
index fdaf135ce81db764dc6cf7f896f6f0f7e23b8f57..79532ddb4bc850597fab7d50f1a3a4e32be5f856 100644
--- a/src/utils/sap-pack/sap-pack.c
+++ b/src/utils/sap-pack/sap-pack.c
@@ -19,8 +19,12 @@
 #include "aes67/sap.h"
 #include "aes67/sdp.h"
 
-#include <getopt.h>
+#include <stdbool.h>
 #include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <getopt.h>
+#include <fcntl.h>
 
 enum extract_mode {
     explicit_with_sdp_fallback,
@@ -128,7 +132,7 @@ static int generate_packet(u8_t * payload, size_t plen, size_t typelen)
         parsed_sdp = get_originator(&payload[typelen], plen, &origin);
     }
 
-    u16_t hash;
+    u16_t hash = 0;
 
     if (opts.extractMode == sdp_with_explicit_fallback){
         if (parsed_sdp){
@@ -201,7 +205,9 @@ static int generate_packet(u8_t * payload, size_t plen, size_t typelen)
         return EXIT_FAILURE;
     }
 
-    write(STDOUT_FILENO, packet, len);
+    if (write(STDOUT_FILENO, packet, len) == -1){
+        fprintf(stderr, "error writing to stdout\n");
+    }
 
     return EXIT_SUCCESS;
 }
diff --git a/src/utils/sap-unpack/sap-unpack.c b/src/utils/sap-unpack/sap-unpack.c
index 39d06a44f7012c716c4d9092ace457619a82d7c1..45203d3f169ebdc1bfbf839d948d7dac8d2d87e6 100644
--- a/src/utils/sap-unpack/sap-unpack.c
+++ b/src/utils/sap-unpack/sap-unpack.c
@@ -18,11 +18,12 @@
 
 #include "aes67/sap.h"
 
-#include <getopt.h>
+#include <stdbool.h>
 #include <stdio.h>
 #include <unistd.h>
 #include <fcntl.h>
 #include <sys/errno.h>
+#include <getopt.h>
 
 
 static char * argv0;
@@ -83,7 +84,9 @@ aes67_sap_service_event(struct aes67_sap_service *sap, enum aes67_sap_event even
         printf("\n");
     }
 
-    write(STDOUT_FILENO, payload, payloadlen);
+    if (write(STDOUT_FILENO, payload, payloadlen) == -1){
+        fprintf(stderr, "error writing to stdout\n");
+    }
 
     fflush(stdout);
 }
diff --git a/src/utils/sapd/sapd.c b/src/utils/sapd/sapd.c
index eef7e837f89df8cac04341c1aaef18419b066114..19208dd028aa66cdfae10facc6d90b5f1b559c9f 100644
--- a/src/utils/sapd/sapd.c
+++ b/src/utils/sapd/sapd.c
@@ -28,7 +28,10 @@
 #include "dnmfarrell/URI-Encode-C/src/uri_encode.h"
 #endif
 
+#include <stdbool.h>
 #include <stdlib.h>
+#include <unistd.h>
+#include <stddef.h>
 #include <string.h>
 #include <getopt.h>
 #include <signal.h>
@@ -37,6 +40,9 @@
 #include <sys/un.h>
 #include <net/if.h>
 #include <assert.h>
+#include <sys/errno.h>
+#include <fcntl.h>
+#include <sys/select.h>
 #include <dirent.h>
 
 //#define BUFSIZE 1024
@@ -357,18 +363,22 @@ static int sock_nonblock(int sockfd){
 static void block_until_event()
 {
     int nfds = 0;
-    struct fd_set fds;
+    fd_set rfds;
+    fd_set xfds;
 //    sigset_t sigmask;
 
-    FD_ZERO(&fds);
+    FD_ZERO(&rfds);
+    FD_ZERO(&xfds);
 
     // set all AF_LOCAL sockets
-    FD_SET(local.sockfd, &fds);
+    FD_SET(local.sockfd, &rfds);
+    FD_SET(local.sockfd, &xfds);
     nfds = local.sockfd;
 
     struct connection_st * con = local.first_connection;
     for(;con != NULL; con = con->next){
-        FD_SET(con->sockfd, &fds);
+        FD_SET(con->sockfd, &rfds);
+        FD_SET(con->sockfd, &xfds);
         if (con->sockfd > nfds){
             nfds = con->sockfd;
         }
@@ -378,7 +388,8 @@ static void block_until_event()
     size_t count = 0;
     aes67_sapsrv_getsockfds(sapsrv, &sockfds, &count);
     for(size_t i = 0; i < count; i++){
-        FD_SET(sockfds[i], &fds);
+        FD_SET(sockfds[i], &rfds);
+        FD_SET(sockfds[i], &xfds);
         if (sockfds[i] > nfds){
             nfds = sockfds[i];
         }
@@ -389,14 +400,16 @@ static void block_until_event()
 
         aes67_mdns_getsockfds(rav.mdns_context, &sockfds, &count);
         for (size_t i = 0; i < count; i++) {
-            FD_SET(sockfds[i], &fds);
+            FD_SET(sockfds[i], &rfds);
+            FD_SET(sockfds[i], &xfds);
             if (sockfds[i] > nfds) {
                 nfds = sockfds[i];
             }
         }
 
         if (rav.rtsp.state == aes67_rtsp_dsc_state_awaiting_response && rav.rtsp.sockfd != -1){
-            FD_SET(rav.rtsp.sockfd, &fds);
+            FD_SET(rav.rtsp.sockfd, &rfds);
+            FD_SET(rav.rtsp.sockfd, &xfds);
             if (rav.rtsp.sockfd > nfds){
                 nfds = rav.rtsp.sockfd;
             }
@@ -408,7 +421,7 @@ static void block_until_event()
     nfds++;
 
     // just wait until something interesting happens
-    select(nfds, &fds, NULL, &fds, NULL);
+    select(nfds, &rfds, NULL, &xfds, NULL);
 }
 
 static int sapsrv_setup()
@@ -1027,7 +1040,7 @@ static int load_sdp_dir(const char * dname)
     }
 
     while ((dir = readdir(d)) != NULL) {
-        u8_t l = dir->d_namlen;
+        u8_t l = strlen(dir->d_name);
         if (l >= sizeof(".sdp") && strcmp(&dir->d_name[l - sizeof(".sdp")], ".sdp")){
             printf("%s\n", dir->d_name);
         }
@@ -1059,7 +1072,7 @@ static struct connection_st * connection_new(int sockfd, struct sockaddr_un * ad
     con->euid = 0;
     con->egid = 0;
 
-    getpeereid(sockfd, &con->euid, &con->egid);
+//    getpeereid(sockfd, &con->euid, &con->egid);
 
     con->next = local.first_connection;
 
@@ -1115,10 +1128,10 @@ static int local_setup(const char * fname)
     strncpy (local.addr.sun_path, AES67_SAPD_LOCAL_SOCK, sizeof (local.addr.sun_path));
     local.addr.sun_path[sizeof (local.addr.sun_path) - 1] = '\0';
 
-    local.addr.sun_len = (offsetof (struct sockaddr_un, sun_path)
+    socklen_t un_len = (offsetof (struct sockaddr_un, sun_path)
                           + strlen (local.addr.sun_path));
 
-    if (bind (local.sockfd, (struct sockaddr *) &local.addr, local.addr.sun_len) < 0){
+    if (bind (local.sockfd, (struct sockaddr *) &local.addr, un_len) < 0){
         close(local.sockfd);
         local.sockfd = -1;
         perror ("bind(AF_LOCAL)");
@@ -1193,7 +1206,9 @@ static void local_accept()
 
             struct connection_st * con = connection_new(sockfd, &addr, socklen);
 
-            write(sockfd, MSG_VERSIONWELCOME "\n", sizeof(MSG_VERSIONWELCOME));
+            if (write(sockfd, MSG_VERSIONWELCOME "\n", sizeof(MSG_VERSIONWELCOME)) == -1){
+                syslog(LOG_ERR, "local_accept(): %s", strerror(errno));
+            }
 
             syslog(LOG_INFO, "client connected: uid %d gid %d (count = %d)", con->euid, con->egid, local.nconnections);
 
@@ -1322,12 +1337,16 @@ static void write_error(struct connection_st * con, const u32_t code, const char
         return;
     }
 
-    write(con->sockfd, buf, len);
+    if (write(con->sockfd, buf, len) == -1){
+        syslog(LOG_ERR, "write_error(): %s", strerror(errno));
+    }
 }
 
 static void write_ok(struct connection_st * con)
 {
-    write(con->sockfd, AES67_SAPD_MSG_OK "\n", sizeof(AES67_SAPD_MSG_OK));
+    if (write(con->sockfd, AES67_SAPD_MSG_OK "\n", sizeof(AES67_SAPD_MSG_OK)) == -1){
+        syslog(LOG_ERR, "write_ok(): %s", strerror(errno));
+    }
 }
 
 static void write_toall_except(u8_t * msg, u16_t len, struct connection_st * except)
@@ -1337,7 +1356,10 @@ static void write_toall_except(u8_t * msg, u16_t len, struct connection_st * exc
     while(current != NULL){
 
         if (current != except){
-            write(current->sockfd, msg, len);
+            if (write(current->sockfd, msg, len) == -1){
+                syslog(LOG_ERR, "write_toall_except(): %s", strerror(errno));
+            }
+
         }
 
         current = current->next;
@@ -1511,7 +1533,9 @@ static void write_list_entry(struct connection_st * con, aes67_sapsrv_session_t
         blen += payloadlen;
     }
 
-    write(con->sockfd, buf, blen);
+    if (write(con->sockfd, buf, blen) == -1){
+        syslog(LOG_ERR, "write_list_entry: %s", strerror(errno));
+    }
 }
 
 static void cmd_list(struct connection_st * con, u8_t * cmdline, size_t len)
@@ -1582,7 +1606,9 @@ static void cmd_set(struct connection_st * con, u8_t * cmdline, size_t len)
         // consume sdp data
         u8_t t;
         while(len--){
-            read(con->sockfd, &t, 1);
+            if (read(con->sockfd, &t, 1) == -1){
+                syslog(LOG_ERR, "cmd_set(): %s", strerror(errno));
+            }
         }
 
         return;
@@ -1857,12 +1883,16 @@ static void write_rav_list_entry(struct connection_st * con, struct rav_session_
                           session->name
     );
 
-    write(con->sockfd, buf, blen);
+    if (write(con->sockfd, buf, blen) == -1){
+        syslog(LOG_ERR,"write_rav_list_entry() %s", strerror(errno));
+    }
 
     if (return_payload && session->sdplen > 0){
         assert(session->sdp != NULL);
 
-        write(con->sockfd, session->sdp, session->sdplen);
+        if (write(con->sockfd, session->sdp, session->sdplen) == -1){
+            syslog(LOG_ERR,"write_rav_list_entry() %s", strerror(errno));
+        }
     }
 }
 
diff --git a/src/utils/sapsrv.c b/src/utils/sapsrv.c
index efe0a8b47ef18071b9fb8afba9784cdb54c67006..43b838de732b9641232bcc5dd8915d8a3867d6cd 100644
--- a/src/utils/sapsrv.c
+++ b/src/utils/sapsrv.c
@@ -21,10 +21,13 @@
 #include "aes67/sap.h"
 #include "aes67/sdp.h"
 
-#include "assert.h"
+#include <unistd.h>
+#include <assert.h>
 #include <sys/socket.h>
+#include <netinet/in.h>
 #include <netdb.h>
-#include <libproc.h>
+#include <fcntl.h>
+//#include <libproc.h>
 #include <ifaddrs.h>
 #include <syslog.h>
 #include <errno.h>
@@ -306,7 +309,7 @@ int aes67_sapsrv_leave_mcast_group(int sockfd, u32_t scope, unsigned int ipv6_if
         return EXIT_FAILURE;
     }
 
-    if (setsockopt(sockfd, IPPROTO_IP, optname, &mreq, optlen) < 0){
+    if (setsockopt(sockfd, proto, optname, &mreq, optlen) < 0){
         syslog(LOG_ERR, "setsockopt(IP_DROP_MEMBERSHIP/IPV6_LEAVE_GROUP): %s", strerror(errno));
         return EXIT_FAILURE;
     }
@@ -408,11 +411,9 @@ static void sap_send(sapsrv_t * server, sapsrv_session_t * session, u8_t opt)
     struct sockaddr_in addr_in;
     struct sockaddr_in6 addr_in6;
 
-    addr_in.sin_len = sizeof(struct sockaddr_in);
     addr_in.sin_family = AF_INET;
     addr_in.sin_port = htons(server->port);
 
-    addr_in6.sin6_len = sizeof(struct sockaddr_in6);
     addr_in6.sin6_family = AF_INET6;
     addr_in6.sin6_port = htons(server->port);
 
@@ -420,7 +421,7 @@ static void sap_send(sapsrv_t * server, sapsrv_session_t * session, u8_t opt)
 
     if ( (server->send_scopes & AES67_SAPSRV_SCOPE_IPv4_GLOBAL)){
         memcpy(&addr_in.sin_addr, (u8_t[])AES67_SAP_IPv4_GLOBAL, 4);
-        if ( (s = sendto(server->sockfd4, sap, saplen, 0, (struct sockaddr*)&addr_in, addr_in.sin_len)) != saplen){
+        if ( (s = sendto(server->sockfd4, sap, saplen, 0, (struct sockaddr*)&addr_in, sizeof(struct sockaddr_in))) != saplen){
             syslog(LOG_ERR, "ipv4-g tx (%zd)", s);
         } else {
             syslog(LOG_DEBUG, "ipv4-g tx %zd", s);
@@ -428,7 +429,7 @@ static void sap_send(sapsrv_t * server, sapsrv_session_t * session, u8_t opt)
     }
     if ( (server->send_scopes & AES67_SAPSRV_SCOPE_IPv4_ADMINISTERED)){
         memcpy(&addr_in.sin_addr, (u8_t[])AES67_SAP_IPv4_ADMIN, 4);
-        if ( (s = sendto(server->sockfd4, sap, saplen, 0, (struct sockaddr*)&addr_in, addr_in.sin_len)) != saplen){
+        if ( (s = sendto(server->sockfd4, sap, saplen, 0, (struct sockaddr*)&addr_in, sizeof(struct sockaddr_in))) != saplen){
             syslog(LOG_ERR, "ipv4-a tx (%zd)", s);
         } else {
             syslog(LOG_DEBUG, "ipv4-a tx %zd", s);
@@ -436,7 +437,7 @@ static void sap_send(sapsrv_t * server, sapsrv_session_t * session, u8_t opt)
     }
     if ( (server->send_scopes & AES67_SAPSRV_SCOPE_IPv6_LINKLOCAL)){
         memcpy(&addr_in6.sin6_addr, (u8_t[])AES67_SAP_IPv6_LL, 16);
-        if ( (s = sendto(server->sockfd6, sap, saplen, 0, (struct sockaddr*)&addr_in6, addr_in6.sin6_len)) != saplen){
+        if ( (s = sendto(server->sockfd6, sap, saplen, 0, (struct sockaddr*)&addr_in6, sizeof(struct sockaddr_in6))) != saplen){
             syslog(LOG_ERR, "ipv6-ll tx (%zd)", s);
         } else {
             syslog(LOG_DEBUG, "ipv6-ll tx %zd", s);
@@ -444,7 +445,7 @@ static void sap_send(sapsrv_t * server, sapsrv_session_t * session, u8_t opt)
     }
     if ( (server->send_scopes & AES67_SAPSRV_SCOPE_IPv6_ADMINLOCAL)){
         memcpy(&addr_in6.sin6_addr, (u8_t[])AES67_SAP_IPv6_AL, 16);
-        if ( (s = sendto(server->sockfd6, sap, saplen, 0, (struct sockaddr*)&addr_in6, addr_in6.sin6_len)) != saplen){
+        if ( (s = sendto(server->sockfd6, sap, saplen, 0, (struct sockaddr*)&addr_in6, sizeof(struct sockaddr_in6))) != saplen){
             syslog(LOG_ERR, "ipv6-al tx (%zd)", s);
         } else {
             syslog(LOG_DEBUG, "ipv6-al tx %zd", s);
@@ -452,7 +453,7 @@ static void sap_send(sapsrv_t * server, sapsrv_session_t * session, u8_t opt)
     }
     if ( (server->send_scopes & AES67_SAPSRV_SCOPE_IPv6_IPv4)){
         memcpy(&addr_in6.sin6_addr, (u8_t[])AES67_SAP_IPv6_IP4, 16);
-        if ( (s = sendto(server->sockfd6, sap, saplen, 0, (struct sockaddr*)&addr_in6, addr_in6.sin6_len)) != saplen){
+        if ( (s = sendto(server->sockfd6, sap, saplen, 0, (struct sockaddr*)&addr_in6, sizeof(struct sockaddr_in6))) != saplen){
             syslog(LOG_ERR, "ipv6-v4 tx (%zd)", s);
         } else {
             syslog(LOG_DEBUG, "ipv6-v4 tx %zd", s);
@@ -460,7 +461,7 @@ static void sap_send(sapsrv_t * server, sapsrv_session_t * session, u8_t opt)
     }
     if ( (server->send_scopes & AES67_SAPSRV_SCOPE_IPv6_SITELOCAL)){
         memcpy(&addr_in6.sin6_addr, (u8_t[])AES67_SAP_IPv6_SL, 16);
-        if ( (s = sendto(server->sockfd6, sap, saplen, 0, (struct sockaddr*)&addr_in6, addr_in6.sin6_len)) != saplen){
+        if ( (s = sendto(server->sockfd6, sap, saplen, 0, (struct sockaddr*)&addr_in6, sizeof(struct sockaddr_in6))) != saplen){
             syslog(LOG_ERR, "ipv6-sl tx (%zd)", s);
         } else {
             syslog(LOG_DEBUG, "ipv6-sl tx %zd", s);
@@ -667,7 +668,6 @@ aes67_sapsrv_start(u32_t send_scopes, u16_t port, u32_t listen_scopes, unsigned
     server->first_session = NULL;
 
     if ((listen_scopes | send_scopes) & AES67_SAPSRV_SCOPE_IPv4){
-        server->addr4.sin_len = sizeof(struct sockaddr_in);
         server->addr4.sin_family = AF_INET;
         server->addr4.sin_port = htons(port);
 
@@ -684,7 +684,7 @@ aes67_sapsrv_start(u32_t send_scopes, u16_t port, u32_t listen_scopes, unsigned
             return NULL;
         }
 
-        if (bind(server->sockfd4, (struct sockaddr*)&server->addr4, server->addr4.sin_len) == -1){
+        if (bind(server->sockfd4, (struct sockaddr*)&server->addr4, sizeof(struct sockaddr_in)) == -1){
             syslog(LOG_ERR, "sapsrv ipv4 bind(): %s", strerror(errno));
             if (server->sockfd4 != -1){
                 close(server->sockfd4);
@@ -707,7 +707,6 @@ aes67_sapsrv_start(u32_t send_scopes, u16_t port, u32_t listen_scopes, unsigned
     }
 
     if ((listen_scopes | send_scopes) & AES67_SAPSRV_SCOPE_IPv6){
-        server->addr6.sin6_len = sizeof(struct sockaddr_in6);
         server->addr6.sin6_family = AF_INET6;
         server->addr6.sin6_port = htons(port);
 
@@ -729,7 +728,7 @@ aes67_sapsrv_start(u32_t send_scopes, u16_t port, u32_t listen_scopes, unsigned
             free(server);
         }
 
-        if (bind(server->sockfd6, (struct sockaddr*)&server->addr6, server->addr6.sin6_len) == -1){
+        if (bind(server->sockfd6, (struct sockaddr*)&server->addr6, sizeof(struct sockaddr_in6)) == -1){
             syslog(LOG_ERR, "sapsrv ipv6 bind(): %s", strerror(errno));
             if (server->sockfd4 != -1){
                 close(server->sockfd4);
@@ -805,17 +804,22 @@ void aes67_sapsrv_process(aes67_sapsrv_t sapserver)
     if (server->blocking){
 
         int nfds = (server->sockfd4 > server->sockfd6 ? server->sockfd4 : server->sockfd6) + 1;
-        struct fd_set fds;
+        fd_set rfds;
+        fd_set xfds;
+
+        FD_ZERO(&rfds);
+        FD_ZERO(&xfds);
 
-        FD_ZERO(&fds);
         if (server->sockfd4 != -1){
-            FD_SET(server->sockfd4, &fds);
+            FD_SET(server->sockfd4, &rfds);
+            FD_SET(server->sockfd4, &xfds);
         }
         if (server->sockfd6 != -1){
-            FD_SET(server->sockfd6, &fds);
+            FD_SET(server->sockfd6, &rfds);
+            FD_SET(server->sockfd6, &xfds);
         }
 
-        int s = select(nfds, &fds, NULL, &fds, NULL);
+        int s = select(nfds, &rfds, NULL, &xfds, NULL);
         if (s > 0){
             if ( (rlen = recv(s, buf, sizeof(buf), 0)) > 0){
                 syslog(LOG_DEBUG, "sapsrv %s rx %zd", s == server->sockfd4 ? "ipv4" : "ipv6", rlen);
diff --git a/src/utils/sdp-gen/sdp-gen.c b/src/utils/sdp-gen/sdp-gen.c
index f8ac506e578c2e086787b56e7a83ea2af96983ca..16d8a713cf51e619961ed45983bbe0b6ef55ca88 100644
--- a/src/utils/sdp-gen/sdp-gen.c
+++ b/src/utils/sdp-gen/sdp-gen.c
@@ -404,7 +404,9 @@ int main(int argc, char * argv[])
         return EXIT_FAILURE;
     }
 
-    write(STDOUT_FILENO, str, len);
+    if (write(STDOUT_FILENO, str, len) == -1){
+        fprintf(stderr, "error writing to stdout\n");
+    }
 
     return EXIT_SUCCESS;
 }
\ No newline at end of file