diff --git a/server/server.go b/server/server.go
index 0382b51d..f54df434 100644
--- a/server/server.go
+++ b/server/server.go
@@ -188,39 +188,14 @@ func createFirebaseSubscriber(conf *config.Config) (subscriber, error) {
 // Run executes the main server. It listens on HTTP (+ HTTPS, if configured), and starts
 // a manager go routine to print stats and prune messages.
 func (s *Server) Run() error {
-	go func() {
-		ticker := time.NewTicker(s.config.ManagerInterval)
-		for {
-			<-ticker.C
-			s.updateStatsAndPrune()
-		}
-	}()
-	go func() {
-		ticker := time.NewTicker(s.config.AtSenderInterval)
-		for {
-			<-ticker.C
-			if err := s.sendDelayedMessages(); err != nil {
-				log.Printf("error sending scheduled messages: %s", err.Error())
-			}
-		}
-	}()
-	if s.firebase != nil {
-		go func() {
-			ticker := time.NewTicker(s.config.FirebaseKeepaliveInterval)
-			for {
-				<-ticker.C
-				if err := s.firebase(newKeepaliveMessage(firebaseControlTopic)); err != nil {
-					log.Printf("error sending Firebase keepalive message: %s", err.Error())
-				}
-			}
-		}()
-	}
+	go s.runManager()
+	go s.runAtSender()
+	go s.runFirebaseKeepliver()
 	listenStr := fmt.Sprintf("%s/http", s.config.ListenHTTP)
 	if s.config.ListenHTTPS != "" {
 		listenStr += fmt.Sprintf(" %s/https", s.config.ListenHTTPS)
 	}
 	log.Printf("Listening on %s", listenStr)
-
 	http.HandleFunc("/", s.handle)
 	errChan := make(chan error)
 	go func() {
@@ -611,6 +586,38 @@ func (s *Server) updateStatsAndPrune() {
 		s.messages, len(s.topics), subscribers, messages, len(s.visitors))
 }
 
+func (s *Server) runManager() {
+	func() {
+		ticker := time.NewTicker(s.config.ManagerInterval)
+		for {
+			<-ticker.C
+			s.updateStatsAndPrune()
+		}
+	}()
+}
+
+func (s *Server) runAtSender() {
+	ticker := time.NewTicker(s.config.AtSenderInterval)
+	for {
+		<-ticker.C
+		if err := s.sendDelayedMessages(); err != nil {
+			log.Printf("error sending scheduled messages: %s", err.Error())
+		}
+	}
+}
+
+func (s *Server) runFirebaseKeepliver() {
+	if s.firebase == nil {
+		return
+	}
+	ticker := time.NewTicker(s.config.FirebaseKeepaliveInterval)
+	for {
+		<-ticker.C
+		if err := s.firebase(newKeepaliveMessage(firebaseControlTopic)); err != nil {
+			log.Printf("error sending Firebase keepalive message: %s", err.Error())
+		}
+	}
+}
 func (s *Server) sendDelayedMessages() error {
 	s.mu.Lock()
 	defer s.mu.Unlock()