diff --git a/node/Node.cpp b/node/Node.cpp
index c9f38ad30..237da4633 100644
--- a/node/Node.cpp
+++ b/node/Node.cpp
@@ -500,7 +500,7 @@ ZT_PeerList *Node::peers() const
 			p->paths[p->pathCount].trustedPathId = RR->topology->getOutboundPathTrust((*path)->address());
 			p->paths[p->pathCount].expired = 0;
 			p->paths[p->pathCount].preferred = ((*path) == bestp) ? 1 : 0;
-			p->paths[p->pathCount].latency = (*path)->latency();
+			p->paths[p->pathCount].latency = (float)(*path)->latency();
 			p->paths[p->pathCount].packetDelayVariance = (*path)->packetDelayVariance(); 
 			p->paths[p->pathCount].throughputDisturbCoeff = (*path)->throughputDisturbanceCoefficient();
 			p->paths[p->pathCount].packetErrorRatio = (*path)->packetErrorRatio();
diff --git a/node/Path.hpp b/node/Path.hpp
index e1e65cb46..5b966f6b8 100644
--- a/node/Path.hpp
+++ b/node/Path.hpp
@@ -351,7 +351,7 @@ public:
 		_unackedBytes = (ackedBytes > _unackedBytes) ? 0 : _unackedBytes - ackedBytes;
 		int64_t timeSinceThroughputEstimate = (now - _lastThroughputEstimation);
 		if (timeSinceThroughputEstimate >= ZT_PATH_THROUGHPUT_MEASUREMENT_INTERVAL) {
-			uint64_t throughput = (float)(_bytesAckedSinceLastThroughputEstimation * 8) / ((float)timeSinceThroughputEstimate / (float)1000);
+			uint64_t throughput = (uint64_t)((float)(_bytesAckedSinceLastThroughputEstimation * 8) / ((float)timeSinceThroughputEstimate / (float)1000));
 			_throughputSamples.push(throughput);
 			_maxLifetimeThroughput = throughput > _maxLifetimeThroughput ? throughput : _maxLifetimeThroughput;
 			_lastThroughputEstimation = now;
@@ -416,7 +416,7 @@ public:
 			if (it != _outQoSRecords.end()) {
 				uint16_t rtt = (uint16_t)(now - it->second);
 				uint16_t rtt_compensated = rtt - rx_ts[j];
-				float latency = rtt_compensated / 2.0;
+				uint16_t latency = rtt_compensated / 2;
 				updateLatency(latency, now);
 				_outQoSRecords.erase(it);
 			}
diff --git a/node/Peer.cpp b/node/Peer.cpp
index a0b0c1c4c..029e45e71 100644
--- a/node/Peer.cpp
+++ b/node/Peer.cpp
@@ -285,7 +285,7 @@ void Peer::computeAggregateProportionalAllocation(int64_t now)
 	for(unsigned int i=0;i<ZT_MAX_PEER_NETWORK_PATHS;++i) {
 		if (_paths[i].p) {
 			relStability[i] = _paths[i].p->lastComputedStability();
-			relThroughput[i] = _paths[i].p->maxLifetimeThroughput();
+			relThroughput[i] = (float)_paths[i].p->maxLifetimeThroughput();
 			maxStability = relStability[i] > maxStability ? relStability[i] : maxStability;
 			maxThroughput = relThroughput[i] > maxThroughput ? relThroughput[i] : maxThroughput;
 			maxScope = _paths[i].p->ipScope() > maxScope ? _paths[i].p->ipScope() : maxScope;
@@ -296,7 +296,7 @@ void Peer::computeAggregateProportionalAllocation(int64_t now)
 		if (_paths[i].p) {
 			relStability[i] /= maxStability ? maxStability : 1;
 			relThroughput[i] /= maxThroughput ? maxThroughput : 1;
-			float normalized_ma = Utils::normalize(_paths[i].p->ackAge(now), 0, ZT_PATH_MAX_AGE, 0, 10);
+			float normalized_ma = Utils::normalize((float)_paths[i].p->ackAge(now), 0, ZT_PATH_MAX_AGE, 0, 10);
 			float age_contrib = exp((-1)*normalized_ma);
 			float relScope = ((float)(_paths[i].p->ipScope()+1) / (maxScope + 1));
 			float relQuality =
@@ -314,7 +314,7 @@ void Peer::computeAggregateProportionalAllocation(int64_t now)
 	// Convert set of relative performances into an allocation set
 	for(uint16_t i=0;i<ZT_MAX_PEER_NETWORK_PATHS;++i) {
 		if (_paths[i].p) {
-			_paths[i].p->updateComponentAllocationOfAggregateLink((_paths[i].p->relativeQuality() / totalRelativeQuality) * 255);
+			_paths[i].p->updateComponentAllocationOfAggregateLink((unsigned char)((_paths[i].p->relativeQuality() / totalRelativeQuality) * 255));
 		}
 	}
 }
@@ -327,7 +327,7 @@ int Peer::computeAggregateLinkPacketDelayVariance()
 			pdv += _paths[i].p->relativeQuality() * _paths[i].p->packetDelayVariance();
 		}
 	}
-	return pdv;
+	return (int)pdv;
 }
 
 int Peer::computeAggregateLinkMeanLatency()
@@ -337,7 +337,7 @@ int Peer::computeAggregateLinkMeanLatency()
 	for(unsigned int i=0;i<ZT_MAX_PEER_NETWORK_PATHS;++i) {
 		if (_paths[i].p) {
 			pathCount++;
-			ml += _paths[i].p->relativeQuality() * _paths[i].p->meanLatency();
+			ml += (int)(_paths[i].p->relativeQuality() * _paths[i].p->meanLatency());
 		}
 	}
 	return ml / pathCount;
diff --git a/node/RingBuffer.hpp b/node/RingBuffer.hpp
index 8b11e9b1b..0f29a89a9 100644
--- a/node/RingBuffer.hpp
+++ b/node/RingBuffer.hpp
@@ -268,7 +268,7 @@ public:
 		for (size_t i=0; i<curr_cnt; i++) {
 			iterator = (iterator + S - 1) % curr_cnt;
 			float deviation = (buf[i] - cached_mean);
-			sum_of_squared_deviations += (deviation*deviation);
+			sum_of_squared_deviations += (T)(deviation*deviation);
 		}
 		float variance = (float)sum_of_squared_deviations / (float)(S - 1);
 		return variance;
diff --git a/node/Switch.cpp b/node/Switch.cpp
index 55275dc31..a9c882fb4 100644
--- a/node/Switch.cpp
+++ b/node/Switch.cpp
@@ -601,7 +601,7 @@ void Switch::aqm_enqueue(void *tPtr, const SharedPtr<Network> &network, Packet &
 
 uint64_t Switch::control_law(uint64_t t, int count)
 {
-	return t + ZT_QOS_INTERVAL / sqrt(count);
+	return (uint64_t)(t + ZT_QOS_INTERVAL / sqrt(count));
 }
 
 Switch::dqr Switch::dodequeue(ManagedQueue *q, uint64_t now)