     private func hotspotsDidLoad(forId publicationId: PublicationId, initialPageIndex: Int?, result: Result<[HotspotModel]>) {
         switch result {
         case .success(let hotspotModels):
-            self.hotspotsState = .loaded(publicationId, hotspotModels)
+            // key hotspots by their pageLocations
+            let hotspotsByPage: [IndexSet: [HotspotModel]] = hotspotModels.reduce(into: [:], {
+                let pageKey = IndexSet($1.pageLocations.keys)
+                $0[pageKey] = $0[pageKey, default: []] + [$1]
+            })
+            
+            self.hotspotsState = .loaded(publicationId, hotspotsByPage)
             self.delegate?.didLoad(hotspots: hotspotModels, in: self)
         case .error(let error):
             self.hotspotsState = .error(publicationId, error)

        init(coreProperties: CoreProperties,
             publicationState: LoadingState<PublicationId, PublicationModel>,
             pagesState: LoadingState<PublicationId, [PageModel]>,
             hotspotsState: LoadingState<PublicationId, [HotspotModel]>) {
            
            switch (publicationState, pagesState, hotspotsState) {
            case (.error(_, let error), _, _),

    public internal(set) var coreProperties: CoreProperties = (nil, .white, 1.0)
    var publicationState: LoadingState<PublicationId, PublicationModel> = .unloaded
    var pagesState: LoadingState<PublicationId, [PageModel]> = .unloaded
    var hotspotsState: LoadingState<PublicationId, [IndexSet: [HotspotModel]]> = .unloaded
    
    var currentViewState: ViewState = .initial
    
