public synchronized void applyConfigurationChanges()
    {
        if ( isStarted != (room.isFmucEnabled() && FMUC_ENABLED.getValue()) ) {
            Log.debug( "(room: '{}'): Changing availability of FMUC functionality to {}.", room.getJID(), (room.isFmucEnabled() && FMUC_ENABLED.getValue()) );
            if ((room.isFmucEnabled() && FMUC_ENABLED.getValue())) {
                startOutbound();
            } else {
                stop();
                return;
            }
        }

        final OutboundJoinConfiguration desiredConfig;
        if ( room.getFmucOutboundNode() != null ) {
            desiredConfig = new OutboundJoinConfiguration( room.getFmucOutboundNode(), room.getFmucOutboundMode() );
        } else {
            desiredConfig = null;
        }
        Log.debug("(room: '{}'): Changing outbound join configuration. Existing: {}, New: {}", room.getJID(), this.outboundJoinConfiguration, desiredConfig );

        if ( this.outboundJoinProgress != null ) {
            if (desiredConfig == null) {
                Log.trace( "(room: '{}'): Had, but now no longer has, outbound join configuration. Aborting ongoing federation attempt...", room.getJID() );
                abortOutboundJoinProgress();
            } else if ( this.outboundJoinProgress.getPeer().equals( desiredConfig.getPeer() ) ) {
                Log.trace( "(room: '{}'): New configuration matches peer that ongoing federation attempt is made with. Allowing attempt to continue.", room.getJID() );
            } else {
                Log.trace( "(room: '{}'): New configuration targets a different peer that ongoing federation attempt is made with. Aborting attempt.", room.getJID() );
                abortOutboundJoinProgress();
            }
        }

        if ( this.outboundJoinConfiguration == null && desiredConfig != null ) {
            Log.trace( "(room: '{}'): Did not, but now has, outbound join configuration. Starting federation...", room.getJID() );
            this.outboundJoinConfiguration = desiredConfig;
            startOutbound();
        } else if ( this.outboundJoinConfiguration != null && desiredConfig == null ) {
            Log.trace( "(room: '{}'): Had, but now no longer has, outbound join configuration. Stopping federation...", room.getJID() );
            this.outboundJoinConfiguration = desiredConfig;
            stopOutbound();
        } else if ( this.outboundJoinConfiguration != null && desiredConfig != null ) {
            if ( outboundJoin == null ) {
                if ( this.outboundJoinConfiguration.equals(desiredConfig ) ) {
                    // no change
                } else {
                    Log.trace( "(room: '{}'): Applying new configuration.", room.getJID() );
                    this.outboundJoinConfiguration = desiredConfig;
                    startOutbound();
                }
            } else {
                if ( outboundJoin.getConfiguration().equals( desiredConfig ) ) {
                    Log.trace( "(room: '{}'): New configuration matches configuration of established federation. Not applying any change.", room.getJID() );
                } else {
                    Log.trace( "(room: '{}'): Already had outbound join configuration, now got a different config. Restarting federation...", room.getJID() );
                    stopOutbound();
                    this.outboundJoinConfiguration = desiredConfig;
                    startOutbound();
                }
            }
        }
        isStarted = true;
    }
Reads configuration from the room instance that is being services by this handler, and applies relevant changes.
xmppserver/src/main/java/org/jivesoftware/openfire/muc/spi/FMUCHandler.java