synchronized UserImpl setUIN(String uin, boolean override, boolean save) throws InterruptedException {
        //get the current user before trying to use it
        //that will collect the hardware keys and try to read the current user
        //avoid NPE for m_currentUser and m_hwkeycont
        UserImpl oldUser = getUser();
        
        if(override || !oldUser.isActivated()) { 
            if(LOG.isDebug()) {
                LOG.debug("UserDataStore.setUIN()", "New UIN is " + uin);
            }
            m_currentUser = new UserImpl(uin, m_hwkeycont);
            if(save) {
                if(LOG.isTrace()) {
                    LOG.trace("UserDataStore.setUIN()", 
                              "Storing UIN on disk");
                }
                UserDataPersistenceRequest req = new UserDataPersistenceRequest(this, m_currentUser);
                m_persModule.pendingWritePersistenceRequest(req, PersistenceModule.SETTING_USER_DATA);
            }
            readyToAdvance();
        } else {
            if(LOG.isWarn()) {
                LOG.warn("UserDataStore.setUIN()",
                         "Core already activated, ignoring new UIN");
            }
        }
        return getUser();
    }