public BackingBean() { persistentFacesState = PersistentFacesState.getInstance(); } public String asyncStuff() { // Remeber the viewID so we can use it later to restore the view. final String viewID = persistentFacesState.getFacesContext().getViewRoot().getViewId(); Runnable r = new Runnable() { public void run() { // Here goes my code which must be executed asynchronously // Begin of the workaround // FacesContext facesContext = persistentFacesState.getFacesContext(); // Create a ViewRoot if it's null if (facesContext.getViewRoot() == null) { UIViewRoot viewRoot = facesContext.getApplication().getViewHandler().restoreView(facesContext, viewID); if (viewRoot != null) { facesContext.setViewRoot(viewRoot); } } // End of the workaround try { persistentFacesState.render(); } catch (RenderingException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }; Thread t = new Thread(r); t.start(); return null; }