                         existingDealers.map({ $0.identifier }).forEach(transaction.deleteDealer)
                     }
 
-                    transaction.saveEvents(response.events.changed)
-                    transaction.saveRooms(response.rooms.changed)
-                    transaction.saveTracks(response.tracks.changed)
-                    transaction.saveConferenceDays(response.conferenceDays.changed)
-                    transaction.saveMaps(response.maps.changed)
-                    transaction.saveDealers(response.dealers.changed)
-                    transaction.saveKnowledgeGroups(response.knowledgeGroups.changed)
-                    transaction.saveKnowledgeEntries(response.knowledgeEntries.changed)
-                    transaction.saveAnnouncements(response.announcements.changed)
-
-                    transaction.saveLastRefreshDate(self.clock.currentDate)
-                    transaction.saveImages(response.images.changed)
+                    self.save(characteristics: response, in: transaction)
+
                     response.images.deleted.forEach(transaction.deleteImage)
                     response.images.deleted.forEach(self.imageCache.deleteImage)
                 })

        return progress
    }

}

                self.eventBus.post(DomainEvent.LatestDataFetchedEvent(response: response))

                self.dataStore.performTransaction({ (transaction) in
                    self.deleteExistingEntities(imageIdentifiersToDelete: imageIdentifiersToDelete,
                                                response: response,
                                                transaction: transaction)

                    let isFullStoreRefresh: Bool = lastSyncTime == nil
                    if isFullStoreRefresh {
                        func not<T>(_ predicate: @escaping (T) -> Bool) -> (T) -> Bool {
                            return { (element) in return !predicate(element) }
                        }
