diff -rN -u old-mediaproxy/mediaproxy/dispatcher.py new-mediaproxy/mediaproxy/dispatcher.py
--- old-mediaproxy/mediaproxy/dispatcher.py	2014-04-23 16:44:16.190847017 +0200
+++ new-mediaproxy/mediaproxy/dispatcher.py	2014-04-23 16:44:16.242847015 +0200
@@ -224,10 +224,14 @@
                 if session.relay_ip != self.ip:
                     log.error("session with call_id %s expired at relay %s, but is actually at relay %s, ignoring" % (call_id, self.ip, session.relay_ip))
                     return
-                log.msg("session with call_id %s from relay %s did timeout" % (call_id, session.relay_ip))
-                stats["dialog_id"] = session.dialog_id
-                stats["timed_out"] = True
                 all_streams_ice = all(stream_info["status"] == "unselected ICE candidate" for stream_info in stats["streams"])
+                if all_streams_ice:
+                    log.msg("session with call_id %s from relay %s removed because ICE was used" % (call_id, session.relay_ip))
+                    stats["timed_out"] = False
+                else:
+                    log.msg("session with call_id %s from relay %s did timeout" % (call_id, session.relay_ip))
+                    stats["timed_out"] = True
+                stats["dialog_id"] = session.dialog_id
                 stats["all_streams_ice"] = all_streams_ice
                 self.factory.dispatcher.update_statistics(stats)
                 if session.dialog_id is not None and stats["start_time"] is not None and not all_streams_ice:
diff -rN -u old-mediaproxy/mediaproxy/mediacontrol.py new-mediaproxy/mediaproxy/mediacontrol.py
--- old-mediaproxy/mediaproxy/mediacontrol.py	2014-04-23 16:44:16.194847017 +0200
+++ new-mediaproxy/mediaproxy/mediacontrol.py	2014-04-23 16:44:16.242847015 +0200
@@ -423,8 +423,11 @@
         getattr(self, party).remote_sdp = (media_ip, media_port)
 
     def substream_expired(self, substream, reason, timeout_wait):
-        if substream is self.rtp and reason == "no-traffic timeout" and self.caller.uses_ice and self.callee.uses_ice and (substream.caller.got_stun_probing or substream.callee.got_stun_probing):
+        if substream is self.rtp and self.caller.uses_ice and self.callee.uses_ice:
+            log.debug("RTP stream expired for session %s: %s" % (self.session, reason))
             reason = "unselected ICE candidate"
+            if not substream.caller.got_stun_probing and not substream.callee.got_stun_probing:
+                log.debug("unselected ICE candidate for session %s but no STUN was received" % self.session)
         if substream is self.rtcp or (self.is_on_hold and reason=='conntrack timeout'):
             # Forget about the remote addresses, this will cause any
             # re-occurence of the same traffic to be forwarded again
