diff --git a/eth/backend.go b/eth/backend.go
index d5b767b12560b5cc5e807bac13d5d8d6b9f119f6..f98c9b72402ecae9712f1446fc287331a65483e7 100644
--- a/eth/backend.go
+++ b/eth/backend.go
@@ -104,6 +104,7 @@ type Config struct {
 
 type LesServer interface {
 	Start(srvr *p2p.Server)
+	Synced()
 	Stop()
 	Protocols() []p2p.Protocol
 }
@@ -145,6 +146,7 @@ type Ethereum struct {
 
 func (s *Ethereum) AddLesServer(ls LesServer) {
 	s.lesServer = ls
+	s.protocolManager.lesServer = ls
 }
 
 // New creates a new Ethereum object (including the
diff --git a/eth/handler.go b/eth/handler.go
index 8f05cc5b1af7546941fcfa73331f9760d99ef319..771e69b8dff73cacf180c4b98981d2515f720f7b 100644
--- a/eth/handler.go
+++ b/eth/handler.go
@@ -87,6 +87,8 @@ type ProtocolManager struct {
 	quitSync    chan struct{}
 	noMorePeers chan struct{}
 
+	lesServer LesServer
+
 	// wait group is used for graceful shutdowns during downloading
 	// and processing
 	wg sync.WaitGroup
@@ -171,7 +173,7 @@ func NewProtocolManager(config *params.ChainConfig, fastSync bool, networkId int
 		return blockchain.CurrentBlock().NumberU64()
 	}
 	inserter := func(blocks types.Blocks) (int, error) {
-		atomic.StoreUint32(&manager.synced, 1) // Mark initial sync done on any fetcher import
+		manager.setSynced() // Mark initial sync done on any fetcher import
 		return manager.insertChain(blocks)
 	}
 	manager.fetcher = fetcher.New(blockchain.GetBlockByHash, validator, manager.BroadcastBlock, heighter, inserter, manager.removePeer)
diff --git a/eth/sync.go b/eth/sync.go
index 6584bb1e2a1888d2943cde661a0d9e4655b7dc8c..b6918c2be3e90326a2da0acff318584dde74adc4 100644
--- a/eth/sync.go
+++ b/eth/sync.go
@@ -180,7 +180,7 @@ func (pm *ProtocolManager) synchronise(peer *peer) {
 	if err := pm.downloader.Synchronise(peer.id, pHead, pTd, mode); err != nil {
 		return
 	}
-	atomic.StoreUint32(&pm.synced, 1) // Mark initial sync done
+	pm.setSynced() // Mark initial sync done
 
 	// If fast sync was enabled, and we synced up, disable it
 	if atomic.LoadUint32(&pm.fastSync) == 1 {
@@ -191,3 +191,10 @@ func (pm *ProtocolManager) synchronise(peer *peer) {
 		}
 	}
 }
+
+// setSynced sets the synced flag and notifies the light server if present
+func (pm *ProtocolManager) setSynced() {
+	if atomic.SwapUint32(&pm.synced, 1) == 0 && pm.lesServer != nil {
+		pm.lesServer.Synced()
+	}
+}
diff --git a/les/handler.go b/les/handler.go
index 3fc80e19a14400c1de77c96616c02f71639179bd..048f302172caba56fa6ddf2d342b6b0921000371 100644
--- a/les/handler.go
+++ b/les/handler.go
@@ -267,9 +267,9 @@ func (pm *ProtocolManager) Start(srvr *p2p.Server) {
 	} else {
 		if topicDisc != nil {
 			go func() {
-				glog.V(logger.Debug).Infoln("Starting registering topic", string(lesTopic))
+				glog.V(logger.Info).Infoln("Starting registering topic", string(lesTopic))
 				topicDisc.RegisterTopic(lesTopic, pm.quitSync)
-				glog.V(logger.Debug).Infoln("Stopped registering topic", string(lesTopic))
+				glog.V(logger.Info).Infoln("Stopped registering topic", string(lesTopic))
 			}()
 		}
 		go func() {
diff --git a/les/server.go b/les/server.go
index c763e8c63200f494fcd796afd0a66a82d39eb24c..03cc2bb5e3e7e77a936a12abc4d01829520f816c 100644
--- a/les/server.go
+++ b/les/server.go
@@ -42,6 +42,9 @@ type LesServer struct {
 	fcManager       *flowcontrol.ClientManager // nil if our node is client only
 	fcCostStats     *requestCostStats
 	defParams       *flowcontrol.ServerParams
+	srvr            *p2p.Server
+	synced, stopped bool
+	lock            sync.Mutex
 }
 
 func NewLesServer(eth *eth.Ethereum, config *eth.Config) (*LesServer, error) {
@@ -67,12 +70,35 @@ func (s *LesServer) Protocols() []p2p.Protocol {
 	return s.protocolManager.SubProtocols
 }
 
+// Start only starts the actual service if the ETH protocol has already been synced,
+// otherwise it will be started by Synced()
 func (s *LesServer) Start(srvr *p2p.Server) {
-	s.protocolManager.Start(srvr)
+	s.lock.Lock()
+	defer s.lock.Unlock()
+
+	s.srvr = srvr
+	if s.synced {
+		s.protocolManager.Start(s.srvr)
+	}
+}
+
+// Synced notifies the server that the ETH protocol has been synced and LES service can be started
+func (s *LesServer) Synced() {
+	s.lock.Lock()
+	defer s.lock.Unlock()
 
+	s.synced = true
+	if s.srvr != nil && !s.stopped {
+		s.protocolManager.Start(s.srvr)
+	}
 }
 
+// Stop stops the LES service
 func (s *LesServer) Stop() {
+	s.lock.Lock()
+	defer s.lock.Unlock()
+
+	s.stopped = true
 	s.fcCostStats.store()
 	s.fcManager.Stop()
 	go func() {