diff --git a/daemon/media_socket.c b/daemon/media_socket.c
index c57bae540..a9a2a3463 100644
--- a/daemon/media_socket.c
+++ b/daemon/media_socket.c
@@ -1776,11 +1776,11 @@ static void __stream_consume_stats(struct packet_stream *ps, const struct rtpeng
 			continue;
 		struct ssrc_entry_call *parent = ssrc_ctx->parent;
 
-		if (!stats_info->ssrc_stats[u].packets) // no change
+		if (!atomic64_get_na(&stats_info->ssrc_stats[u].packets)) // no change
 			continue;
 
-		atomic64_add(&ssrc_ctx->packets, stats_info->ssrc_stats[u].packets);
-		atomic64_add(&ssrc_ctx->octets, stats_info->ssrc_stats[u].bytes);
+		atomic64_add(&ssrc_ctx->packets, atomic64_get_na(&stats_info->ssrc_stats[u].packets));
+		atomic64_add(&ssrc_ctx->octets, atomic64_get_na(&stats_info->ssrc_stats[u].bytes));
 		parent->packets_lost += stats_info->ssrc_stats[u].total_lost; // XXX should be atomic?
 		atomic64_set(&ssrc_ctx->last_seq, stats_info->ssrc_stats[u].ext_seq);
 		parent->jitter = stats_info->ssrc_stats[u].jitter;
@@ -1811,8 +1811,8 @@ static void __stream_consume_stats(struct packet_stream *ps, const struct rtpeng
 
 			if (ssrc_ctx) {
 				parent = ssrc_ctx->parent;
-				atomic64_add(&ssrc_ctx->packets, stats_info->ssrc_stats[u].packets);
-				atomic64_add(&ssrc_ctx->octets, stats_info->ssrc_stats[u].bytes);
+				atomic64_add(&ssrc_ctx->packets, atomic64_get_na(&stats_info->ssrc_stats[u].packets));
+				atomic64_add(&ssrc_ctx->octets, atomic64_get_na(&stats_info->ssrc_stats[u].bytes));
 			}
 
 			mutex_unlock(&sink->out_lock);
diff --git a/kernel-module/common_stats.h b/kernel-module/common_stats.h
index 52f7cfd06..68686bb41 100644
--- a/kernel-module/common_stats.h
+++ b/kernel-module/common_stats.h
@@ -59,5 +59,15 @@ struct rtp_stats {
 	atomic64		kernel_packets;
 	atomic64		kernel_bytes;
 };
+struct ssrc_stats {
+	atomic64		packets;
+	atomic64		bytes;
+	atomic_t		timestamp;
+	atomic_t		ext_seq;
+	uint32_t		lost_bits; // sliding bitfield, [0] = ext_seq
+	atomic_t		total_lost;
+	atomic_t		transit;
+	atomic_t		jitter;
+};
 
 #endif
diff --git a/kernel-module/xt_RTPENGINE.c b/kernel-module/xt_RTPENGINE.c
index c5ac6ff45..649079b99 100644
--- a/kernel-module/xt_RTPENGINE.c
+++ b/kernel-module/xt_RTPENGINE.c
@@ -321,7 +321,7 @@ struct rtpengine_target {
 	unsigned int			last_pt; // index into pt_input[] and pt_output[]
 
 	spinlock_t			ssrc_stats_lock;
-	struct rtpengine_ssrc_stats	ssrc_stats[RTPE_NUM_SSRC_TRACKING];
+	struct ssrc_stats		ssrc_stats[RTPE_NUM_SSRC_TRACKING];
 
 	struct re_crypto_context	decrypt_rtp;
 	struct re_crypto_context	decrypt_rtcp;
@@ -1864,9 +1864,9 @@ static void target_retrieve_stats(struct rtpengine_target *g, struct rtpengine_s
 		i->ssrc[u] = g->target.ssrc[u];
 		i->ssrc_stats[u] = g->ssrc_stats[u];
 
-		g->ssrc_stats[u].packets = 0;
-		g->ssrc_stats[u].bytes = 0;
-		g->ssrc_stats[u].total_lost = 0;
+		atomic64_set(&g->ssrc_stats[u].packets, 0);
+		atomic64_set(&g->ssrc_stats[u].bytes, 0);
+		atomic_set(&g->ssrc_stats[u].total_lost, 0);
 	}
 
 	for (u = 0; u < g->target.num_destinations; u++) {
@@ -5212,7 +5212,7 @@ static void rtp_stats(struct rtpengine_target *g, struct rtp_parsed *rtp, s64 ar
 		int ssrc_idx)
 {
 	unsigned long flags;
-	struct rtpengine_ssrc_stats *s = &g->ssrc_stats[ssrc_idx];
+	struct ssrc_stats *s = &g->ssrc_stats[ssrc_idx];
 	uint16_t old_seq_trunc;
 	uint32_t last_seq;
 	uint16_t seq_diff;
@@ -5224,15 +5224,15 @@ static void rtp_stats(struct rtpengine_target *g, struct rtp_parsed *rtp, s64 ar
 	uint16_t seq = ntohs(rtp->rtp_header->seq_num);
 	uint32_t ts = ntohl(rtp->rtp_header->timestamp);
 
-	spin_lock_irqsave(&g->ssrc_stats_lock, flags);
+	atomic64_inc(&s->packets);
+	atomic64_add(rtp->payload_len, &s->bytes);
+	atomic_set(&s->timestamp, ts);
 
-	s->packets++;
-	s->bytes += rtp->payload_len;
-	s->timestamp = ts;
+	spin_lock_irqsave(&g->ssrc_stats_lock, flags);
 
 	// track sequence numbers and lost frames
 
-	last_seq = s->ext_seq;
+	last_seq = atomic_read(&s->ext_seq);
 	new_seq = last_seq;
 
 	// old seq or seq reset?
@@ -5243,7 +5243,7 @@ static void rtp_stats(struct rtpengine_target *g, struct rtp_parsed *rtp, s64 ar
 	else if (seq_diff > 0x100) {
 		// reset seq and loss tracker
 		new_seq = seq;
-		s->ext_seq = seq;
+		atomic_set(&s->ext_seq, seq);
 		s->lost_bits = -1;
 	}
 	else {
@@ -5255,19 +5255,19 @@ static void rtp_stats(struct rtpengine_target *g, struct rtp_parsed *rtp, s64 ar
 				break;
 		}
 		seq_diff = new_seq - last_seq;
-		s->ext_seq = new_seq;
+		atomic_set(&s->ext_seq, new_seq);
 
 		// shift loss tracker bit field and count losses
 		if (seq_diff >= (sizeof(s->lost_bits) * 8)) {
 			// complete loss
-			s->total_lost += sizeof(s->lost_bits) * 8;
+			atomic_add(sizeof(s->lost_bits) * 8, &s->total_lost);
 			s->lost_bits = -1;
 		}
 		else {
 			while (seq_diff) {
 				// shift out one bit and see if we lost it
 				if ((s->lost_bits & 0x80000000) == 0)
-					s->total_lost++;
+					atomic_inc(&s->total_lost);
 				s->lost_bits <<= 1;
 				seq_diff--;
 			}
@@ -5283,15 +5283,15 @@ static void rtp_stats(struct rtpengine_target *g, struct rtp_parsed *rtp, s64 ar
 	// RFC 3550 A.8
 	clockrate = g->target.pt_stats[pt_idx]->clock_rate;
 	transit = ((uint32_t) (div64_s64(arrival_time, 1000) * clockrate) / 1000) - ts;
-	d = 0;
-	if (s->transit)
-		d = transit - s->transit;
-	s->transit = transit;
+	d = atomic_read(&s->transit);
+	if (d)
+		d = transit - d;
+	atomic_set(&s->transit, transit);
 	if (d < 0)
 		d = -d;
 	// ignore implausibly large values
 	if (d < 100000)
-		s->jitter += d - ((s->jitter + 8) >> 4);
+		atomic_add(d - ((atomic_read(&s->jitter) + 8) >> 4), &s->jitter);
 
 	spin_unlock_irqrestore(&g->ssrc_stats_lock, flags);
 }
diff --git a/kernel-module/xt_RTPENGINE.h b/kernel-module/xt_RTPENGINE.h
index a1920e2e6..8edfdfe9b 100644
--- a/kernel-module/xt_RTPENGINE.h
+++ b/kernel-module/xt_RTPENGINE.h
@@ -17,17 +17,6 @@ struct xt_rtpengine_info {
 	unsigned int			id;
 };
 
-struct rtpengine_ssrc_stats {
-	uint64_t			packets;
-	uint64_t			bytes;
-	uint32_t			timestamp;
-	uint32_t			ext_seq;
-	uint32_t			lost_bits; // sliding bitfield, [0] = ext_seq
-	uint32_t			total_lost;
-	uint32_t			transit;
-	uint32_t			jitter;
-};
-
 struct re_address {
 	int				family;
 	union {
@@ -172,7 +161,7 @@ struct rtpengine_packet_info {
 
 struct rtpengine_stats_info {
 	uint32_t			ssrc[RTPE_NUM_SSRC_TRACKING];
-	struct rtpengine_ssrc_stats	ssrc_stats[RTPE_NUM_SSRC_TRACKING];
+	struct ssrc_stats		ssrc_stats[RTPE_NUM_SSRC_TRACKING];
 	uint64_t			last_rtcp_index[RTPE_MAX_FORWARD_DESTINATIONS][RTPE_NUM_SSRC_TRACKING];
 };