diff --git a/src/main/java/org/nrg/xnat/event/listeners/SiteConfigPreferenceHandler.java b/src/main/java/org/nrg/xnat/event/listeners/SiteConfigPreferenceHandler.java
index 9bfb37682226014efbcb899e875cb6a3bf0c1514..2eb63876ac84953db7e60ea8b820ec1db0464b35 100644
--- a/src/main/java/org/nrg/xnat/event/listeners/SiteConfigPreferenceHandler.java
+++ b/src/main/java/org/nrg/xnat/event/listeners/SiteConfigPreferenceHandler.java
@@ -4,6 +4,8 @@ import org.apache.commons.codec.binary.StringUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.nrg.framework.event.entities.EventSpecificFields;
+import org.nrg.prefs.events.AbstractPreferenceHandler;
+import org.nrg.prefs.events.PreferenceHandlerMethod;
 import org.nrg.xdat.XDAT;
 import org.nrg.xdat.preferences.SiteConfigPreferenceEvent;
 import org.nrg.xdat.preferences.SiteConfigPreferences;
@@ -21,107 +23,92 @@ import reactor.bus.EventBus;
 import reactor.fn.Consumer;
 
 import javax.inject.Inject;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.Set;
+import java.util.*;
 import java.util.concurrent.ScheduledFuture;
 
-import static reactor.bus.selector.Selectors.type;
-
 @Service
-public class SiteConfigPreferenceHandler implements Consumer<Event<SiteConfigPreferenceEvent>> {
-
-	@Inject public SiteConfigPreferenceHandler( EventBus eventBus ){
-		eventBus.on(type(SiteConfigPreferenceEvent.class), this);
-	}
-
-	@Override
-	public void accept(Event<SiteConfigPreferenceEvent> event) {
-		final SiteConfigPreferenceEvent scpEvent = event.getData();
-		handleEvent(scpEvent);
-	}
+public class SiteConfigPreferenceHandler extends AbstractPreferenceHandler<SiteConfigPreferenceEvent> {
 
-    public void handleEvent(SiteConfigPreferenceEvent e) {
-    	Set<EventSpecificFields> fields = e.getEventSpecificFields();
-		if(fields!=null) {
-			for (EventSpecificFields field : fields) {
-				if (StringUtils.equals(field.getFieldName(), "aliasTokenTimeout")) {
-					updateAliasTokenTimeout(e);	
-				}
-				else if (StringUtils.equals(field.getFieldName(), "aliasTokenTimeoutSchedule")) {
-					updateAliasTokenTimeout(e);
-				}
-				else if (StringUtils.equals(field.getFieldName(), "inactivityBeforeLockout")) {
-					updateInactivityBeforeLockout(e);
-				}
-				else if (StringUtils.equals(field.getFieldName(), "inactivityBeforeLockoutSchedule")) {
-					updateInactivityBeforeLockout(e);
-				}
-				else if (StringUtils.equals(field.getFieldName(), "maxFailedLoginsLockoutDuration")) {
-					updateResetFailedLogins(e);
-				}
-				else if (StringUtils.equals(field.getFieldName(), "resetFailedLoginsSchedule")) {
-					updateResetFailedLogins(e);
-				}
-			}
-		}
-    }
-	
-	private void updateAliasTokenTimeout(SiteConfigPreferenceEvent e){
-		try {
-			XDAT.getContextService().getBeansOfType(ThreadPoolTaskScheduler.class).get("taskScheduler").getScheduledThreadPoolExecutor().setRemoveOnCancelPolicy(true);
-			Iterator<Runnable> iter = XDAT.getContextService().getBeansOfType(ThreadPoolTaskScheduler.class).get("taskScheduler").getScheduledThreadPoolExecutor().getQueue().iterator();
-
-			for(ScheduledFuture temp: scheduledAliasTokenTimeouts){
-				temp.cancel(false);
-			}
-
-			scheduledAliasTokenTimeouts.add(XDAT.getContextService().getBeansOfType(ThreadPoolTaskScheduler.class).get("taskScheduler").schedule(new ClearExpiredAliasTokens(_template),new CronTrigger(XDAT.getSiteConfigPreferences().getAliasTokenTimeoutSchedule())));
-
-		} catch (Exception e1) {
-			_log.error("", e1);
-		}	
+	@Inject
+	public SiteConfigPreferenceHandler(final EventBus eventBus){
+		super(SiteConfigPreferences.SITE_CONFIG_TOOL_ID, eventBus);
 	}
 
-	private void updateInactivityBeforeLockout(SiteConfigPreferenceEvent e){
-		try {
-			XDAT.getContextService().getBeansOfType(ThreadPoolTaskScheduler.class).get("taskScheduler").getScheduledThreadPoolExecutor().setRemoveOnCancelPolicy(true);
-			Iterator<Runnable> iter = XDAT.getContextService().getBeansOfType(ThreadPoolTaskScheduler.class).get("taskScheduler").getScheduledThreadPoolExecutor().getQueue().iterator();
-
-			for(ScheduledFuture temp: scheduledInactivityBeforeLockout){
-				temp.cancel(false);
-			}
-
-			scheduledInactivityBeforeLockout.add(XDAT.getContextService().getBeansOfType(ThreadPoolTaskScheduler.class).get("taskScheduler").schedule(new DisableInactiveUsers((new Long(SiteConfigPreferences.convertPGIntervalToSeconds(XDAT.getSiteConfigPreferences().getInactivityBeforeLockout()))).intValue(),(new Long(SiteConfigPreferences.convertPGIntervalToSeconds(XDAT.getSiteConfigPreferences().getMaxFailedLoginsLockoutDuration()))).intValue()),new CronTrigger(XDAT.getSiteConfigPreferences().getInactivityBeforeLockoutSchedule())));
-
-		} catch (Exception e1) {
-			_log.error("", e1);
-		}
-	}
-
-	private void updateResetFailedLogins(SiteConfigPreferenceEvent e){
-		try {
-			XDAT.getContextService().getBeansOfType(ThreadPoolTaskScheduler.class).get("taskScheduler").getScheduledThreadPoolExecutor().setRemoveOnCancelPolicy(true);
-			Iterator<Runnable> iter = XDAT.getContextService().getBeansOfType(ThreadPoolTaskScheduler.class).get("taskScheduler").getScheduledThreadPoolExecutor().getQueue().iterator();
-
-			for(ScheduledFuture temp: scheduledResetFailedLogins){
-				temp.cancel(false);
-			}
-
-			scheduledResetFailedLogins.add(XDAT.getContextService().getBeansOfType(ThreadPoolTaskScheduler.class).get("taskScheduler").schedule(new ResetFailedLogins(_template,XDAT.getSiteConfigPreferences().getMaxFailedLoginsLockoutDuration()),new CronTrigger(XDAT.getSiteConfigPreferences().getResetFailedLoginsSchedule())));
-
-		} catch (Exception e1) {
-			_log.error("", e1);
-		}
-	}
+//		if (StringUtils.equals(field.getFieldName(), "aliasTokenTimeout")) {
+//			updateAliasTokenTimeout(e);
+//		}
+//		else if (StringUtils.equals(field.getFieldName(), "aliasTokenTimeoutSchedule")) {
+//			updateAliasTokenTimeout(e);
+//		}
+//		else if (StringUtils.equals(field.getFieldName(), "inactivityBeforeLockout")) {
+//			updateInactivityBeforeLockout(e);
+//		}
+//		else if (StringUtils.equals(field.getFieldName(), "inactivityBeforeLockoutSchedule")) {
+//			updateInactivityBeforeLockout(e);
+//		}
+//		else if (StringUtils.equals(field.getFieldName(), "maxFailedLoginsLockoutDuration")) {
+//			updateResetFailedLogins(e);
+//		}
+//		else if (StringUtils.equals(field.getFieldName(), "resetFailedLoginsSchedule")) {
+//			updateResetFailedLogins(e);
+//		}
+//
+//	}
+//
+//	private void updateAliasTokenTimeout(SiteConfigPreferenceEvent e){
+//		try {
+//			XDAT.getContextService().getBeansOfType(ThreadPoolTaskScheduler.class).get("taskScheduler").getScheduledThreadPoolExecutor().setRemoveOnCancelPolicy(true);
+//			Iterator<Runnable> iter = XDAT.getContextService().getBeansOfType(ThreadPoolTaskScheduler.class).get("taskScheduler").getScheduledThreadPoolExecutor().getQueue().iterator();
+//
+//			for(ScheduledFuture temp: scheduledAliasTokenTimeouts){
+//				temp.cancel(false);
+//			}
+//
+//			scheduledAliasTokenTimeouts.add(XDAT.getContextService().getBeansOfType(ThreadPoolTaskScheduler.class).get("taskScheduler").schedule(new ClearExpiredAliasTokens(_template),new CronTrigger(XDAT.getSiteConfigPreferences().getAliasTokenTimeoutSchedule())));
+//
+//		} catch (Exception e1) {
+//			_log.error("", e1);
+//		}
+//	}
+//
+//	private void updateInactivityBeforeLockout(SiteConfigPreferenceEvent e){
+//		try {
+//			XDAT.getContextService().getBeansOfType(ThreadPoolTaskScheduler.class).get("taskScheduler").getScheduledThreadPoolExecutor().setRemoveOnCancelPolicy(true);
+//			Iterator<Runnable> iter = XDAT.getContextService().getBeansOfType(ThreadPoolTaskScheduler.class).get("taskScheduler").getScheduledThreadPoolExecutor().getQueue().iterator();
+//
+//			for(ScheduledFuture temp: scheduledInactivityBeforeLockout){
+//				temp.cancel(false);
+//			}
+//
+//			scheduledInactivityBeforeLockout.add(XDAT.getContextService().getBeansOfType(ThreadPoolTaskScheduler.class).get("taskScheduler").schedule(new DisableInactiveUsers((new Long(SiteConfigPreferences.convertPGIntervalToSeconds(XDAT.getSiteConfigPreferences().getInactivityBeforeLockout()))).intValue(),(new Long(SiteConfigPreferences.convertPGIntervalToSeconds(XDAT.getSiteConfigPreferences().getMaxFailedLoginsLockoutDuration()))).intValue()),new CronTrigger(XDAT.getSiteConfigPreferences().getInactivityBeforeLockoutSchedule())));
+//
+//		} catch (Exception e1) {
+//			_log.error("", e1);
+//		}
+//	}
+//
+//	private void updateResetFailedLogins(SiteConfigPreferenceEvent e){
+//		try {
+//			XDAT.getContextService().getBeansOfType(ThreadPoolTaskScheduler.class).get("taskScheduler").getScheduledThreadPoolExecutor().setRemoveOnCancelPolicy(true);
+//			Iterator<Runnable> iter = XDAT.getContextService().getBeansOfType(ThreadPoolTaskScheduler.class).get("taskScheduler").getScheduledThreadPoolExecutor().getQueue().iterator();
+//
+//			for(ScheduledFuture temp: scheduledResetFailedLogins){
+//				temp.cancel(false);
+//			}
+//
+//			scheduledResetFailedLogins.add(XDAT.getContextService().getBeansOfType(ThreadPoolTaskScheduler.class).get("taskScheduler").schedule(new ResetFailedLogins(_template,XDAT.getSiteConfigPreferences().getMaxFailedLoginsLockoutDuration()),new CronTrigger(XDAT.getSiteConfigPreferences().getResetFailedLoginsSchedule())));
+//
+//		} catch (Exception e1) {
+//			_log.error("", e1);
+//		}
+//	}
 
 	@Autowired
 	@Lazy
 	private JdbcTemplate _template;
 
 	private static final Log _log = LogFactory.getLog(SiteConfigPreferenceHandler.class);
-
-	private ArrayList<ScheduledFuture> scheduledAliasTokenTimeouts = new ArrayList<ScheduledFuture>();
 	private ArrayList<ScheduledFuture> scheduledInactivityBeforeLockout = new ArrayList<ScheduledFuture>();
+
 	private ArrayList<ScheduledFuture> scheduledResetFailedLogins = new ArrayList<ScheduledFuture>();
 }
diff --git a/src/main/java/org/nrg/xnat/event/listeners/methods/AbstractSiteConfigPreferenceHandlerMethod.java b/src/main/java/org/nrg/xnat/event/listeners/methods/AbstractSiteConfigPreferenceHandlerMethod.java
new file mode 100644
index 0000000000000000000000000000000000000000..43c7ef720b720878266965802b787736f07b6572
--- /dev/null
+++ b/src/main/java/org/nrg/xnat/event/listeners/methods/AbstractSiteConfigPreferenceHandlerMethod.java
@@ -0,0 +1,11 @@
+package org.nrg.xnat.event.listeners.methods;
+
+import org.nrg.prefs.events.PreferenceHandlerMethod;
+import org.nrg.xdat.preferences.SiteConfigPreferences;
+
+public abstract class AbstractSiteConfigPreferenceHandlerMethod implements PreferenceHandlerMethod {
+    @Override
+    public String getToolId() {
+        return SiteConfigPreferences.SITE_CONFIG_TOOL_ID;
+    }
+}
diff --git a/src/main/java/org/nrg/xnat/event/listeners/methods/AliasTokenPreferenceHandlerMethod.java b/src/main/java/org/nrg/xnat/event/listeners/methods/AliasTokenPreferenceHandlerMethod.java
new file mode 100644
index 0000000000000000000000000000000000000000..b7b068b3a397bbd754821a5d6c2e4caa1a3820b1
--- /dev/null
+++ b/src/main/java/org/nrg/xnat/event/listeners/methods/AliasTokenPreferenceHandlerMethod.java
@@ -0,0 +1,61 @@
+package org.nrg.xnat.event.listeners.methods;
+
+import com.google.common.collect.ImmutableList;
+import org.nrg.prefs.events.PreferenceHandlerMethod;
+import org.nrg.xdat.XDAT;
+import org.nrg.xdat.preferences.SiteConfigPreferenceEvent;
+import org.nrg.xnat.security.alias.ClearExpiredAliasTokens;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
+import org.springframework.scheduling.support.CronTrigger;
+import org.springframework.stereotype.Component;
+
+import java.util.*;
+import java.util.concurrent.ScheduledFuture;
+
+@Component
+public class AliasTokenPreferenceHandlerMethod extends AbstractSiteConfigPreferenceHandlerMethod {
+    @Override
+    public List<String> getHandledPreferences() {
+        return PREFERENCES;
+    }
+
+    @Override
+    public void handlePreferences(final Map<String, String> values) {
+
+    }
+
+    @Override
+    public void handlePreference(final String preference, final String value) {
+
+    }
+
+    private void updateAliasTokenTimeout(SiteConfigPreferenceEvent e){
+        try {
+            XDAT.getContextService().getBeansOfType(ThreadPoolTaskScheduler.class).get("taskScheduler").getScheduledThreadPoolExecutor().setRemoveOnCancelPolicy(true);
+            Iterator<Runnable> iter = XDAT.getContextService().getBeansOfType(ThreadPoolTaskScheduler.class).get("taskScheduler").getScheduledThreadPoolExecutor().getQueue().iterator();
+
+            for(ScheduledFuture temp: scheduledAliasTokenTimeouts){
+                temp.cancel(false);
+            }
+
+            scheduledAliasTokenTimeouts.add(XDAT.getContextService().getBeansOfType(ThreadPoolTaskScheduler.class).get("taskScheduler").schedule(new ClearExpiredAliasTokens(_template), new CronTrigger(XDAT.getSiteConfigPreferences().getAliasTokenTimeoutSchedule())));
+
+        } catch (Exception e1) {
+            _log.error("", e1);
+        }
+    }
+
+    private static final Logger       _log        = LoggerFactory.getLogger(AliasTokenPreferenceHandlerMethod.class);
+    private static final List<String> PREFERENCES = ImmutableList.copyOf(Arrays.asList("aliasTokenTimeout", "aliasTokenTimeoutSchedule"));
+
+    @Autowired
+    @Lazy
+    private JdbcTemplate _template;
+
+    private              ArrayList<ScheduledFuture> scheduledAliasTokenTimeouts = new ArrayList<>();
+}