diff --git a/node/node.go b/node/node.go
index 8311e1a166dc289e669fb35ab90d26e8c89397af..e2d11b43feb187f153ea36485e58852727cfb2d7 100644
--- a/node/node.go
+++ b/node/node.go
@@ -3,6 +3,7 @@ package node
 import (
 	"bytes"
 	"encoding/json"
+	"flag"
 	"log"
 	"net"
 	"os"
@@ -18,6 +19,9 @@ import (
 )
 
 var (
+	masterElectionTtl = flag.Int("master-election-ttl", 5, "TTL for the master election protocol (s)")
+	nodeHeartbeat     = flag.Int("heartbeat", 3, "Period for the node presence heartbeat (s)")
+
 	icecastReloadErrors = instrumentation.NewCounter("icecast.reload_errors")
 	icecastReloads      = instrumentation.NewCounter("icecast.reload")
 	configIndex         = instrumentation.NewGauge("config.etcd_index")
@@ -280,12 +284,12 @@ func NewRadioNode(name string, ips []net.IP, netDev string, bwLimit float64, cli
 			client,
 			autoradio.MasterElectionPath,
 			string(minfodata),
-			5,
+			uint64(*masterElectionTtl),
 			mech),
 		watcher:     newConfigSyncer(client, config, upch),
 		icecast:     NewIcecastController(name),
 		reloadDelay: 1000 * time.Millisecond,
-		heartbeat:   2,
+		heartbeat:   uint64(*nodeHeartbeat),
 		bw:          bwmonitor.NewBandwidthUsageMonitor(netDev, bwLimit),
 		upch:        upch,
 		stop:        stopch,
@@ -318,7 +322,7 @@ func (rc *RadioNode) presence(stop chan bool) {
 			var buf bytes.Buffer
 			json.NewEncoder(&buf).Encode(&nodeStatus)
 			if _, err := rc.client.Set(key, buf.String(), rc.heartbeat); err != nil {
-				rc.Log.Printf("presence: Set(): %s", err)
+				rc.Log.Printf("presence: Set(): %v", err)
 			}
 
 		case <-stop:
@@ -359,7 +363,7 @@ func (rc *RadioNode) updater(stop chan bool) {
 			rc.Log.Printf("reloading icecast config")
 			if err := rc.icecast.Update(rc.config, rc.me.IsMaster(), rc.getMasterAddr()); err != nil {
 				icecastReloadErrors.Incr()
-				rc.Log.Printf("Update(): %s", err)
+				rc.Log.Printf("Update(): %v", err)
 			}
 
 			// Limit the rate of icecast reloads.