diff --git a/daemon/call.c b/daemon/call.c
index 3451ab724..27d74d49f 100644
--- a/daemon/call.c
+++ b/daemon/call.c
@@ -553,7 +553,7 @@ void call_timer(void *ptr) {
 	stats_counters_min_max(&rtpe_stats_graphite_min_max, &rtpe_stats.intv);
 
 	// stats derived while iterating calls
-	atomic64_set(&rtpe_stats_gauge.transcoded_media, hlp.transcoded_media);
+	RTPE_GAUGE_SET(transcoded_media, hlp.transcoded_media);
 
 	i = kernel_list();
 	while (i) {
diff --git a/daemon/statistics.c b/daemon/statistics.c
index 4434ff080..617941e79 100644
--- a/daemon/statistics.c
+++ b/daemon/statistics.c
@@ -98,15 +98,15 @@ void statistics_update_ip46_inc_dec(struct call* c, int op) {
 	if (c->is_ipv4_media_offer && !c->is_ipv6_media_offer) {
 		// answer is ipv4 only
 		if (c->is_ipv4_media_answer && !c->is_ipv6_media_answer) {
-			(op == CMC_INCREMENT) ? atomic64_inc(&rtpe_stats_gauge.ipv4_sessions) : atomic64_dec(&rtpe_stats_gauge.ipv4_sessions);
+			RTPE_GAUGE_ADD(ipv4_sessions, op == CMC_INCREMENT ? 1 : -1);
 
 		// answer is ipv6 only
 		} else if (!c->is_ipv4_media_answer && c->is_ipv6_media_answer) {
-			(op == CMC_INCREMENT) ? atomic64_inc(&rtpe_stats_gauge.mixed_sessions) : atomic64_dec(&rtpe_stats_gauge.mixed_sessions);
+			RTPE_GAUGE_ADD(mixed_sessions, op == CMC_INCREMENT ? 1 : -1);
 
 		// answer is both ipv4 and ipv6
 		} else if (c->is_ipv4_media_answer && c->is_ipv6_media_answer) {
-			(op == CMC_INCREMENT) ? atomic64_inc(&rtpe_stats_gauge.ipv4_sessions) : atomic64_dec(&rtpe_stats_gauge.ipv4_sessions);
+			RTPE_GAUGE_ADD(ipv4_sessions, op == CMC_INCREMENT ? 1 : -1);
 
 		// answer is neither ipv4 nor ipv6
 		} else {
@@ -117,15 +117,15 @@ void statistics_update_ip46_inc_dec(struct call* c, int op) {
 	} else if (!c->is_ipv4_media_offer && c->is_ipv6_media_offer) {
 		// answer is ipv4 only
 		if (c->is_ipv4_media_answer && !c->is_ipv6_media_answer) {
-			(op == CMC_INCREMENT) ? atomic64_inc(&rtpe_stats_gauge.mixed_sessions) : atomic64_dec(&rtpe_stats_gauge.mixed_sessions);
+			RTPE_GAUGE_ADD(mixed_sessions, op == CMC_INCREMENT ? 1 : -1);
 
 		// answer is ipv6 only
 		} else if (!c->is_ipv4_media_answer && c->is_ipv6_media_answer) {
-			(op == CMC_INCREMENT) ? atomic64_inc(&rtpe_stats_gauge.ipv6_sessions) : atomic64_dec(&rtpe_stats_gauge.ipv6_sessions);
+			RTPE_GAUGE_ADD(ipv6_sessions, op == CMC_INCREMENT ? 1 : -1);
 
 		// answer is both ipv4 and ipv6
 		} else if (c->is_ipv4_media_answer && c->is_ipv6_media_answer) {
-			(op == CMC_INCREMENT) ? atomic64_inc(&rtpe_stats_gauge.ipv6_sessions) : atomic64_dec(&rtpe_stats_gauge.ipv6_sessions);
+			RTPE_GAUGE_ADD(ipv6_sessions, op == CMC_INCREMENT ? 1 : -1);
 
 		// answer is neither ipv4 nor ipv6
 		} else {
@@ -136,15 +136,15 @@ void statistics_update_ip46_inc_dec(struct call* c, int op) {
 	} else if (c->is_ipv4_media_offer && c->is_ipv6_media_offer) {
 		// answer is ipv4 only
 		if (c->is_ipv4_media_answer && !c->is_ipv6_media_answer) {
-			(op == CMC_INCREMENT) ? atomic64_inc(&rtpe_stats_gauge.ipv4_sessions) : atomic64_dec(&rtpe_stats_gauge.ipv4_sessions);
+			RTPE_GAUGE_ADD(ipv4_sessions, op == CMC_INCREMENT ? 1 : -1);
 
 		// answer is ipv6 only
 		} else if (!c->is_ipv4_media_answer && c->is_ipv6_media_answer) {
-			(op == CMC_INCREMENT) ? atomic64_inc(&rtpe_stats_gauge.ipv6_sessions) : atomic64_dec(&rtpe_stats_gauge.ipv6_sessions);
+			RTPE_GAUGE_ADD(ipv6_sessions, op == CMC_INCREMENT ? 1 : -1);
 
 		// answer is both ipv4 and ipv6
 		} else if (c->is_ipv4_media_answer && c->is_ipv6_media_answer) {
-			(op == CMC_INCREMENT) ? atomic64_inc(&rtpe_stats_gauge.mixed_sessions) : atomic64_dec(&rtpe_stats_gauge.mixed_sessions);
+			RTPE_GAUGE_ADD(mixed_sessions, op == CMC_INCREMENT ? 1 : -1);
 
 		// answer is neither ipv4 nor ipv6
 		} else {
@@ -162,7 +162,7 @@ void statistics_update_ip46_inc_dec(struct call* c, int op) {
 
 void statistics_update_foreignown_dec(struct call* c) {
 	if (IS_FOREIGN_CALL(c)) {
-		atomic64_dec(&rtpe_stats_gauge.foreign_sessions);
+		RTPE_GAUGE_DEC(foreign_sessions);
 	}
 
 	if(IS_OWN_CALL(c)) 	{
@@ -184,7 +184,7 @@ void statistics_update_foreignown_inc(struct call* c) {
 		mutex_unlock(&rtpe_totalstats_interval.managed_sess_lock);
 	}
 	else if (IS_FOREIGN_CALL(c)) { /* foreign call*/
-		atomic64_inc(&rtpe_stats_gauge.foreign_sessions);
+		RTPE_GAUGE_INC(foreign_sessions);
 		RTPE_STATS_INC(foreign_sess);
 	}
 
diff --git a/include/call.h b/include/call.h
index 8dcf481bc..3de93caec 100644
--- a/include/call.h
+++ b/include/call.h
@@ -542,6 +542,18 @@ extern GHashTable *rtpe_callhash;
 extern struct call_iterator_list rtpe_call_iterators[NUM_CALL_ITERATORS];
 
 extern struct global_stats_gauge rtpe_stats_gauge;
+
+#define RTPE_GAUGE_SET(field, num) \
+	do { \
+		atomic64_set(&rtpe_stats_gauge.field, num); \
+	} while (0)
+#define RTPE_GAUGE_ADD(field, num) \
+	do { \
+		atomic64_add(&rtpe_stats_gauge.field, num); \
+	} while (0)
+#define RTPE_GAUGE_INC(field) RTPE_GAUGE_ADD(field, 1)
+#define RTPE_GAUGE_DEC(field) RTPE_GAUGE_ADD(field, -1)
+
 extern struct global_stats_ax rtpe_stats;
 extern struct global_stats_counter rtpe_stats_interval;	// accumulators copied out once per interval
 extern struct global_stats_counter rtpe_stats_cumulative;	// total, cumulative
diff --git a/include/gauge_stats_fields.inc b/include/gauge_stats_fields.inc
new file mode 100644
index 000000000..9fcee8b85
--- /dev/null
+++ b/include/gauge_stats_fields.inc
@@ -0,0 +1,5 @@
+F(foreign_sessions)
+F(transcoded_media)
+F(ipv4_sessions)
+F(ipv6_sessions)
+F(mixed_sessions)
diff --git a/include/statistics.h b/include/statistics.h
index 40c7d2140..bd59f9782 100644
--- a/include/statistics.h
+++ b/include/statistics.h
@@ -21,11 +21,9 @@ struct stream_stats {
 
 // "gauge" style stats
 struct global_stats_gauge {
-	atomic64			foreign_sessions; // unresponsible via redis notification
-	atomic64			transcoded_media;
-	atomic64			ipv4_sessions;
-	atomic64			ipv6_sessions;
-	atomic64			mixed_sessions;
+#define F(x) atomic64 x;
+#include "gauge_stats_fields.inc"
+#undef F
 };
 
 // "counter" style stats that are incremental and are kept cumulative or per-interval