diff --git a/src/main/java/com/gitblit/DaggerModule.java b/src/main/java/com/gitblit/DaggerModule.java
index 840ba60..2f060c0 100644
--- a/src/main/java/com/gitblit/DaggerModule.java
+++ b/src/main/java/com/gitblit/DaggerModule.java
@@ -28,6 +28,7 @@
 import com.gitblit.manager.IRuntimeManager;
 import com.gitblit.manager.ISessionManager;
 import com.gitblit.manager.IUserManager;
+import com.gitblit.manager.NotificationManager;
 import com.gitblit.manager.RuntimeManager;
 import com.gitblit.wicket.GitBlitWebApp;
 import com.gitblit.wicket.GitblitWicketFilter;
@@ -95,8 +96,8 @@
 		return new RuntimeManager(settings);
 	}
 
-	@Provides @Singleton INotificationManager provideNotificationManager() {
-		return gitblit;
+	@Provides @Singleton INotificationManager provideNotificationManager(IStoredSettings settings) {
+		return new NotificationManager(settings);
 	}
 
 	@Provides @Singleton IUserManager provideUserManager() {
diff --git a/src/main/java/com/gitblit/GitBlit.java b/src/main/java/com/gitblit/GitBlit.java
index 91a44b7..4e77974 100644
--- a/src/main/java/com/gitblit/GitBlit.java
+++ b/src/main/java/com/gitblit/GitBlit.java
@@ -56,10 +56,6 @@
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicReference;
 
-import javax.mail.Message;
-import javax.mail.MessagingException;
-import javax.mail.internet.MimeBodyPart;
-import javax.mail.internet.MimeMultipart;
 import javax.naming.Context;
 import javax.naming.InitialContext;
 import javax.naming.NamingException;
@@ -166,8 +162,7 @@
  */
 @WebListener
 public class GitBlit extends DaggerContextListener
-					 implements INotificationManager,
-								IUserManager,
+					 implements IUserManager,
 								ISessionManager,
 								IRepositoryManager,
 								IProjectManager,
@@ -211,8 +206,6 @@
 
 	private IStoredSettings settings;
 
-	private MailExecutor mailExecutor;
-
 	private LuceneExecutor luceneExecutor;
 
 	private GCExecutor gcExecutor;
@@ -2860,7 +2853,7 @@
 		}
 
 		// send an email, if possible
-		sendMailToAdministrators("Federation proposal from " + proposal.url,
+		getManager(INotificationManager.class).sendMailToAdministrators("Federation proposal from " + proposal.url,
 				"Please review the proposal @ " + gitblitUrl + "/proposal/" + proposal.token);
 		return true;
 	}
@@ -3156,110 +3149,6 @@
 	}
 
 	/**
-	 * Notify the administrators by email.
-	 *
-	 * @param subject
-	 * @param message
-	 */
-	@Override
-	public void sendMailToAdministrators(String subject, String message) {
-		List<String> toAddresses = settings.getStrings(Keys.mail.adminAddresses);
-		sendMail(subject, message, toAddresses);
-	}
-
-	/**
-	 * Notify users by email of something.
-	 *
-	 * @param subject
-	 * @param message
-	 * @param toAddresses
-	 */
-	@Override
-	public void sendMail(String subject, String message, Collection<String> toAddresses) {
-		this.sendMail(subject, message, toAddresses.toArray(new String[0]));
-	}
-
-	/**
-	 * Notify users by email of something.
-	 *
-	 * @param subject
-	 * @param message
-	 * @param toAddresses
-	 */
-	@Override
-	public void sendMail(String subject, String message, String... toAddresses) {
-		if (toAddresses == null || toAddresses.length == 0) {
-			logger.debug(MessageFormat.format("Dropping message {0} because there are no recipients", subject));
-			return;
-		}
-		try {
-			Message mail = mailExecutor.createMessage(toAddresses);
-			if (mail != null) {
-				mail.setSubject(subject);
-
-				MimeBodyPart messagePart = new MimeBodyPart();
-				messagePart.setText(message, "utf-8");
-				messagePart.setHeader("Content-Type", "text/plain; charset=\"utf-8\"");
-				messagePart.setHeader("Content-Transfer-Encoding", "quoted-printable");
-
-				MimeMultipart multiPart = new MimeMultipart();
-				multiPart.addBodyPart(messagePart);
-				mail.setContent(multiPart);
-
-				mailExecutor.queue(mail);
-			}
-		} catch (MessagingException e) {
-			logger.error("Messaging error", e);
-		}
-	}
-
-	/**
-	 * Notify users by email of something.
-	 *
-	 * @param subject
-	 * @param message
-	 * @param toAddresses
-	 */
-	@Override
-	public void sendHtmlMail(String subject, String message, Collection<String> toAddresses) {
-		this.sendHtmlMail(subject, message, toAddresses.toArray(new String[0]));
-	}
-
-	/**
-	 * Notify users by email of something.
-	 *
-	 * @param subject
-	 * @param message
-	 * @param toAddresses
-	 */
-	@Override
-	public void sendHtmlMail(String subject, String message, String... toAddresses) {
-		if (toAddresses == null || toAddresses.length == 0) {
-			logger.debug(MessageFormat.format("Dropping message {0} because there are no recipients", subject));
-			return;
-		}
-		try {
-			Message mail = mailExecutor.createMessage(toAddresses);
-			if (mail != null) {
-				mail.setSubject(subject);
-
-				MimeBodyPart messagePart = new MimeBodyPart();
-				messagePart.setText(message, "utf-8");
-				messagePart.setHeader("Content-Type", "text/html; charset=\"utf-8\"");
-				messagePart.setHeader("Content-Transfer-Encoding", "quoted-printable");
-
-				MimeMultipart multiPart = new MimeMultipart();
-				multiPart.addBodyPart(messagePart);
-				mail.setContent(multiPart);
-
-				mailExecutor.queue(mail);
-			}
-		} catch (MessagingException e) {
-			logger.error("Messaging error", e);
-		}
-	}
-
-	/**
 	 * Parse the properties file and aggregate all the comments by the setting
 	 * key. A setting model tracks the current value, the default value, the
 	 * description of the setting and and directives about the setting.
@@ -3327,15 +3216,6 @@
 		return settingsModel;
 	}
 
-	protected void configureMailExecutor() {
-		if (mailExecutor.isReady()) {
-			logger.info("Mail executor is scheduled to process the message queue every 2 minutes.");
-			scheduledExecutor.scheduleAtFixedRate(mailExecutor, 1, 2, TimeUnit.MINUTES);
-		} else {
-			logger.warn("Mail server is not properly configured.  Mail services disabled.");
-		}
-	}
-
 	protected void configureLuceneIndexing() {
 		scheduledExecutor.scheduleAtFixedRate(luceneExecutor, 1, 2,  TimeUnit.MINUTES);
 		logger.info("Lucene executor is scheduled to process indexed branches every 2 minutes.");
@@ -3440,7 +3320,7 @@
 				// HACK temporary pending manager separation and injection
 				Gitblit gitblit = new Gitblit(
 						getManager(IRuntimeManager.class),
-						this,
+						getManager(INotificationManager.class),
 						this,
 						this,
 						this,
@@ -3549,13 +3429,14 @@
 		runtime.getStatus().isGO = goSettings != null;
 		runtime.getStatus().servletContainer = context.getServerInfo();
 
+		startManager(injector, INotificationManager.class);
+
 		repositoriesFolder = getRepositoriesFolder();
 
 		logger.info("Gitblit base folder     = " + baseFolder.getAbsolutePath());
 		logger.info("Git repositories folder = " + repositoriesFolder.getAbsolutePath());
 
 		// prepare service executors
-		mailExecutor = new MailExecutor(runtimeSettings);
 		luceneExecutor = new LuceneExecutor(runtimeSettings, getManager(IRepositoryManager.class));
 		gcExecutor = new GCExecutor(runtimeSettings, getManager(IRepositoryManager.class));
 		mirrorExecutor = new MirrorExecutor(runtimeSettings, getManager(IRepositoryManager.class));
@@ -3592,7 +3473,6 @@
 		projectConfigs = new FileBasedConfig(runtime.getFileOrFolder(Keys.web.projectsFile, "${baseFolder}/projects.conf"), FS.detect());
 		getProjectConfigs();
 
-		configureMailExecutor();
 		configureLuceneIndexing();
 		configureGarbageCollector();
 		configureMirrorExecutor();
diff --git a/src/main/java/com/gitblit/manager/INotificationManager.java b/src/main/java/com/gitblit/manager/INotificationManager.java
index f53ae68..29d8f54 100644
--- a/src/main/java/com/gitblit/manager/INotificationManager.java
+++ b/src/main/java/com/gitblit/manager/INotificationManager.java
@@ -17,7 +17,7 @@
 
 import java.util.Collection;
 
-public interface INotificationManager {
+public interface INotificationManager extends IManager {
 
 	/**
 	 * Notify the administrators by email.
diff --git a/src/main/java/com/gitblit/manager/NotificationManager.java b/src/main/java/com/gitblit/manager/NotificationManager.java
new file mode 100644
index 0000000..eae563f
--- /dev/null
+++ b/src/main/java/com/gitblit/manager/NotificationManager.java
@@ -0,0 +1,181 @@
+/*
+ * Copyright 2013 gitblit.com.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.gitblit.manager;
+
+import java.text.MessageFormat;
+import java.util.Collection;
+import java.util.List;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+
+import javax.mail.Message;
+import javax.mail.MessagingException;
+import javax.mail.internet.MimeBodyPart;
+import javax.mail.internet.MimeMultipart;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.gitblit.IStoredSettings;
+import com.gitblit.Keys;
+import com.gitblit.MailExecutor;
+
+/**
+ * The notification manager dispatches notifications.  Currently, email is the
+ * only supported transport, however there is no reason why other transports
+ * could be supported (tweets, irc, sms, etc).
+ *
+ * @author James Moger
+ *
+ */
+public class NotificationManager implements INotificationManager {
+
+	private final Logger logger = LoggerFactory.getLogger(getClass());
+
+	private final ScheduledExecutorService scheduledExecutor = Executors.newScheduledThreadPool(1);
+
+	private final IStoredSettings settings;
+
+	private final MailExecutor mailExecutor;
+
+	public NotificationManager(IStoredSettings settings) {
+		this.settings = settings;
+		this.mailExecutor = new MailExecutor(settings);
+	}
+
+	@Override
+	public IManager setup() {
+		if (mailExecutor.isReady()) {
+			logger.info("Mail executor is scheduled to process the message queue every 2 minutes.");
+			scheduledExecutor.scheduleAtFixedRate(mailExecutor, 1, 2, TimeUnit.MINUTES);
+		} else {
+			logger.warn("Mail server is not properly configured.  Mail services disabled.");
+		}
+		return this;
+	}
+
+	@Override
+	public IManager stop() {
+		scheduledExecutor.shutdownNow();
+		return this;
+	}
+
+	/**
+	 * Notify the administrators by email.
+	 *
+	 * @param subject
+	 * @param message
+	 */
+	@Override
+	public void sendMailToAdministrators(String subject, String message) {
+		List<String> toAddresses = settings.getStrings(Keys.mail.adminAddresses);
+		sendMail(subject, message, toAddresses);
+	}
+
+	/**
+	 * Notify users by email of something.
+	 *
+	 * @param subject
+	 * @param message
+	 * @param toAddresses
+	 */
+	@Override
+	public void sendMail(String subject, String message, Collection<String> toAddresses) {
+		this.sendMail(subject, message, toAddresses.toArray(new String[0]));
+	}
+
+	/**
+	 * Notify users by email of something.
+	 *
+	 * @param subject
+	 * @param message
+	 * @param toAddresses
+	 */
+	@Override
+	public void sendMail(String subject, String message, String... toAddresses) {
+		if (toAddresses == null || toAddresses.length == 0) {
+			logger.debug(MessageFormat.format("Dropping message {0} because there are no recipients", subject));
+			return;
+		}
+		try {
+			Message mail = mailExecutor.createMessage(toAddresses);
+			if (mail != null) {
+				mail.setSubject(subject);
+
+				MimeBodyPart messagePart = new MimeBodyPart();
+				messagePart.setText(message, "utf-8");
+				messagePart.setHeader("Content-Type", "text/plain; charset=\"utf-8\"");
+				messagePart.setHeader("Content-Transfer-Encoding", "quoted-printable");
+
+				MimeMultipart multiPart = new MimeMultipart();
+				multiPart.addBodyPart(messagePart);
+				mail.setContent(multiPart);
+
+				mailExecutor.queue(mail);
+			}
+		} catch (MessagingException e) {
+			logger.error("Messaging error", e);
+		}
+	}
+
+	/**
+	 * Notify users by email of something.
+	 *
+	 * @param subject
+	 * @param message
+	 * @param toAddresses
+	 */
+	@Override
+	public void sendHtmlMail(String subject, String message, Collection<String> toAddresses) {
+		this.sendHtmlMail(subject, message, toAddresses.toArray(new String[0]));
+	}
+
+	/**
+	 * Notify users by email of something.
+	 *
+	 * @param subject
+	 * @param message
+	 * @param toAddresses
+	 */
+	@Override
+	public void sendHtmlMail(String subject, String message, String... toAddresses) {
+		if (toAddresses == null || toAddresses.length == 0) {
+			logger.debug(MessageFormat.format("Dropping message {0} because there are no recipients", subject));
+			return;
+		}
+		try {
+			Message mail = mailExecutor.createMessage(toAddresses);
+			if (mail != null) {
+				mail.setSubject(subject);
+
+				MimeBodyPart messagePart = new MimeBodyPart();
+				messagePart.setText(message, "utf-8");
+				messagePart.setHeader("Content-Type", "text/html; charset=\"utf-8\"");
+				messagePart.setHeader("Content-Transfer-Encoding", "quoted-printable");
+
+				MimeMultipart multiPart = new MimeMultipart();
+				multiPart.addBodyPart(messagePart);
+				mail.setContent(multiPart);
+
+				mailExecutor.queue(mail);
+			}
+		} catch (MessagingException e) {
+			logger.error("Messaging error", e);
+		}
+	}
+
+}
