class HistoryEventHandlerService implements ValueChangeHandler<String> {

    @Override
    public void onValueChange(ValueChangeEvent<String> event) {
        HistoryToken newHistoryToken =
                HistoryToken.fromTokenString(event.getValue());
        Log.info("[gwt-history] Responding to history token: "
                + event.getValue());

        processForDocumentListPresenter(newHistoryToken);
        processForProjectWideSearch(newHistoryToken);

        configHolder.setFilterByUntranslated(newHistoryToken
                .isFilterUntranslated());
        configHolder.setFilterByFuzzy(newHistoryToken.isFilterFuzzy());
        configHolder
                .setFilterByTranslated(newHistoryToken.isFilterTranslated());
        configHolder.setFilterByApproved(newHistoryToken.isFilterApproved());
        configHolder.setFilterByRejected(newHistoryToken.isFilterRejected());
        configHolder.setFilterByHasError(newHistoryToken.isFilterHasError());
        configHolder.setFilterByMT(newHistoryToken.isFilterMT());

        DocumentId documentId =
                documentListPresenter.getDocumentId(newHistoryToken
                        .getDocumentPath());
        EditorFilter editorFilter = getEditorFilterFromToken(newHistoryToken);
        if (!getTransUnitActionContextHolder.isContextInitialized()
                && documentId != null) {
            DocumentInfo documentInfo =
                    documentListPresenter.getDocumentInfo(documentId);
            // if editor is not yet initialized, we want to load document with
            // search and target trans unit all at once
            Long textFlowId = newHistoryToken.getTextFlowId();
            TransUnitId transUnitId =
                    textFlowId == null ? null : new TransUnitId(textFlowId);
            getTransUnitActionContextHolder.initContext(documentInfo,
                    transUnitId, editorFilter);
            eventBus.fireEvent(new InitEditorEvent());
        }

        processForAppPresenter(documentId);
        processForBookmarkedTextFlow(newHistoryToken);
        processMessageFilterOptions(newHistoryToken);

        currentHistoryState = newHistoryToken;
        appPresenter.showView(newHistoryToken.getView());
    }

    @Inject public  HistoryEventHandlerService(EventBus eventBus,
            DocumentListPresenter documentListPresenter,
            AppPresenter appPresenter,
            SearchResultsPresenter searchResultsPresenter,
            GetTransUnitActionContextHolder getTransUnitActionContextHolder,
            ModalNavigationStateHolder modalStateHolder,
            UserConfigHolder configHolder);

}