diff --git a/src/main/java/se/su/dsv/scipro/SciProApplication.java b/src/main/java/se/su/dsv/scipro/SciProApplication.java
index 2b3c943ee1..01a475ce26 100644
--- a/src/main/java/se/su/dsv/scipro/SciProApplication.java
+++ b/src/main/java/se/su/dsv/scipro/SciProApplication.java
@@ -32,6 +32,8 @@ import se.su.dsv.scipro.admin.pages.settings.AdminServerEnvironmentSettingsPage;
 import se.su.dsv.scipro.basepages.DemoPage;
 import se.su.dsv.scipro.basepages.errorpages.AccessDeniedPage;
 import se.su.dsv.scipro.basepages.errorpages.NotFoundPage;
+import se.su.dsv.scipro.conference.pages.ProjectConferencePage;
+import se.su.dsv.scipro.conference.pages.SupervisorConferencePage;
 import se.su.dsv.scipro.json.pages.JsonDeletePrivateMessagePage;
 import se.su.dsv.scipro.json.pages.JsonDeleteRecipientPage;
 import se.su.dsv.scipro.json.pages.JsonLoginPage;
@@ -50,6 +52,18 @@ import se.su.dsv.scipro.knol.resource.page.ResourcePage;
 import se.su.dsv.scipro.loginlogout.pages.LoginPage;
 import se.su.dsv.scipro.loginlogout.pages.LogoutPage;
 import se.su.dsv.scipro.message.pages.PrivateMessagesPage;
+import se.su.dsv.scipro.peer.pages.PeerRequestSubmissionPage;
+import se.su.dsv.scipro.peer.pages.PeerReviewTemplateCreationPage;
+import se.su.dsv.scipro.peer.pages.PeerReviewTemplatePage;
+import se.su.dsv.scipro.peer.pages.PeerReviewTemplatePreviewPage;
+import se.su.dsv.scipro.peer.pages.ProjectPeerPortalPage;
+import se.su.dsv.scipro.peer.pages.ProjectPeerReviewGuidePage;
+import se.su.dsv.scipro.peer.pages.ProjectPeerReviewPage;
+import se.su.dsv.scipro.peer.pages.ProjectPeerStatsPage;
+import se.su.dsv.scipro.peer.pages.SupervisorPeerPortalPage;
+import se.su.dsv.scipro.peer.pages.SupervisorPeerReviewGuidePage;
+import se.su.dsv.scipro.peer.pages.SupervisorPeerReviewPage;
+import se.su.dsv.scipro.peer.pages.SupervisorPeerStatsPage;
 import se.su.dsv.scipro.project.pages.FinalSeminarProjectListPage;
 import se.su.dsv.scipro.project.pages.NoActiveProjectPage;
 import se.su.dsv.scipro.project.pages.ProjectEventPage;
@@ -200,6 +214,7 @@ public class SciProApplication extends RepositoryApplication implements IThemabl
 		/*
 		 * Project pages
 		 */
+		mountBookmarkablePage("project/conference", ProjectConferencePage.class);
         mountBookmarkablePage("project/schedule/event", ProjectEventPage.class);
 		mountBookmarkablePage("project/schedule/generator", ProjectScheduleGeneratorPage.class);
 		mountBookmarkablePage("project/files", ProjectFilePage.class);
@@ -223,12 +238,13 @@ public class SciProApplication extends RepositoryApplication implements IThemabl
 		mountBookmarkablePage("supervisor/schedule/groupevent", SupervisorGroupEventPage.class);
 		mountBookmarkablePage("supervisor/project/details/schedule/generator", SupervisorScheduleGeneratorPage.class);
 		mountBookmarkablePage("supervisor/antiplagiarism", SupervisorAntiPlagiarismLinkPage.class);
+		mountBookmarkablePage("supervisor/conference", SupervisorConferencePage.class);
 		
 		
 		/*
 		 * Peer pages
 		 */
-		/* TODO Removed for deployment-test
+
 		//admin
 		mountBookmarkablePage("peer/review/template/preview", PeerReviewTemplatePreviewPage.class);
 		mountBookmarkablePage("peer/templates/create", PeerReviewTemplateCreationPage.class);
diff --git a/src/main/java/se/su/dsv/scipro/admin/pages/settings/AdminFinalSeminarSettingsPage.html b/src/main/java/se/su/dsv/scipro/admin/pages/settings/AdminFinalSeminarSettingsPage.html
index 746ea997f7..0481d54428 100644
--- a/src/main/java/se/su/dsv/scipro/admin/pages/settings/AdminFinalSeminarSettingsPage.html
+++ b/src/main/java/se/su/dsv/scipro/admin/pages/settings/AdminFinalSeminarSettingsPage.html
@@ -19,8 +19,20 @@
 			<td><input name="3" wicket:id="daysBeforeFinalSeminarCanRegisterAsOpponent" type="text" /></td>
 		</tr>
 		<tr>
-			<td><label for="4">File format of uploaded theses and opposition-reports must be PDF:</label></td>
-			<td><input name="4" type="checkbox" wicket:id="finalSeminarThesisMustBeAPDF" /></td>
+			<td><label for="4">Turnitin username (should be an instructor with quick submit activated):</label></td>
+			<td><input name="4" wicket:id="turnItInUsername" type="text" /></td>
+		</tr>
+		<tr>
+			<td><label for="5">Forname for Turnitin user:</label></td>
+			<td><input name="5" wicket:id="turnItInForname" type="text" /></td>
+		</tr>
+				<tr>
+			<td><label for="6">Surname for Turnitin user:</label></td>
+			<td><input name="6" wicket:id=turnItInSurname type="text" /></td>
+		</tr>
+		<tr>
+			<td><label for="7">File format of uploaded theses and opposition-reports must be PDF:</label></td>
+			<td><input name="7" type="checkbox" wicket:id="finalSeminarThesisMustBeAPDF" /></td>
 		</tr>
 	</table>
 
diff --git a/src/main/java/se/su/dsv/scipro/admin/pages/settings/AdminFinalSeminarSettingsPage.java b/src/main/java/se/su/dsv/scipro/admin/pages/settings/AdminFinalSeminarSettingsPage.java
index 3f052fd2c9..2013d2f89f 100644
--- a/src/main/java/se/su/dsv/scipro/admin/pages/settings/AdminFinalSeminarSettingsPage.java
+++ b/src/main/java/se/su/dsv/scipro/admin/pages/settings/AdminFinalSeminarSettingsPage.java
@@ -3,6 +3,7 @@ package se.su.dsv.scipro.admin.pages.settings;
 import org.apache.wicket.PageParameters;
 import org.apache.wicket.markup.html.form.CheckBox;
 import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.markup.html.form.PasswordTextField;
 import org.apache.wicket.markup.html.form.RequiredTextField;
 import org.apache.wicket.markup.html.form.TextField;
 import org.apache.wicket.model.CompoundPropertyModel;
@@ -28,16 +29,22 @@ public class AdminFinalSeminarSettingsPage extends AbstractAdminSettingsPage {
 
 	private class FinalSeminarSettingsForm extends Form<GeneralSystemSettings> {
 		private static final long serialVersionUID = 1L;
-
+		
 		public FinalSeminarSettingsForm(String id, IModel<GeneralSystemSettings> model) {
 			super(id, model );
 			TextField<Integer> activeParticipation = new RequiredTextField<Integer>("finalSeminarMaxActiveParticipants");
 			TextField<Integer> registerAsActive = new RequiredTextField<Integer>("daysBeforeFinalSeminarCanRegisterAsActiveParticipant");
 			TextField<Integer> registerAsOpponent = new RequiredTextField<Integer>("daysBeforeFinalSeminarCanRegisterAsOpponent");
+			TextField<String> turnitinUsername = new RequiredTextField<String>("turnItInUsername");
+			TextField<String> turnitinForname = new RequiredTextField<String>("turnItInForname");
+			TextField<String> turnitinSurname = new RequiredTextField<String>("turnItInSurname");
 			CheckBox pdfCheckBox = new CheckBox("finalSeminarThesisMustBeAPDF");
 			add(registerAsActive);
 			add(registerAsOpponent);
 			add(activeParticipation);
+			add(turnitinUsername);
+			add(turnitinForname);
+			add(turnitinSurname);
 			add(pdfCheckBox);
 		}
 
diff --git a/src/main/java/se/su/dsv/scipro/admin/pages/settings/AdminGeneralSettingsPage.html b/src/main/java/se/su/dsv/scipro/admin/pages/settings/AdminGeneralSettingsPage.html
index 85f613f152..47721c888b 100644
--- a/src/main/java/se/su/dsv/scipro/admin/pages/settings/AdminGeneralSettingsPage.html
+++ b/src/main/java/se/su/dsv/scipro/admin/pages/settings/AdminGeneralSettingsPage.html
@@ -2,8 +2,44 @@
 <html
 	xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd">
 <body>
-<wicket:extend>
-	<h1>General Settings</h1>
-</wicket:extend>
+	<wicket:extend>
+		<h5 class="peer-title">General Settings</h5>
+		<form wicket:id="finalSeminarSettingsForm">
+			<table>
+				<tr>
+					<td><label for="1">Sender name for e-mail
+							notifications:</label>
+					</td>
+					<td><input name="1" wicket:id="mailFromName" type="text" />
+					</td>
+				</tr>
+				<tr>
+					<td><label for="2">Sender address for e-mail
+							notifications:</label>
+					</td>
+					<td><input name="2" wicket:id="systemFromMail" type="text" />
+					</td>
+				</tr>
+				<tr>
+					<td><label for="3">SMTP server address:</label>
+					</td>
+					<td><input name="3" wicket:id="smtpServer" type="text" />
+					</td>
+				</tr>
+				<tr>
+					<td><label for="7">Enable e-mail notifications:</label>
+					</td>
+					<td><input name="7" type="checkbox" wicket:id="mailNotifications" />
+					</td>
+				</tr>
+			</table>
+
+			<button type="submit">
+				<img src="css/blueprint/plugins/buttons/icons/tick.png" alt="" />
+				Save changes
+			</button>
+
+		</form>
+	</wicket:extend>
 </body>
 </html>
\ No newline at end of file
diff --git a/src/main/java/se/su/dsv/scipro/admin/pages/settings/AdminGeneralSettingsPage.java b/src/main/java/se/su/dsv/scipro/admin/pages/settings/AdminGeneralSettingsPage.java
index 54b917abef..7fe92a4013 100644
--- a/src/main/java/se/su/dsv/scipro/admin/pages/settings/AdminGeneralSettingsPage.java
+++ b/src/main/java/se/su/dsv/scipro/admin/pages/settings/AdminGeneralSettingsPage.java
@@ -1,13 +1,50 @@
 package se.su.dsv.scipro.admin.pages.settings;
 
 import org.apache.wicket.PageParameters;
+import org.apache.wicket.markup.html.form.CheckBox;
+import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.markup.html.form.RequiredTextField;
+import org.apache.wicket.markup.html.form.TextField;
+import org.apache.wicket.model.CompoundPropertyModel;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.spring.injection.annot.SpringBean;
 
 import se.su.dsv.scipro.admin.pages.AbstractAdminSettingsPage;
+import se.su.dsv.scipro.data.dao.interfaces.GeneralSystemSettingsDao;
+import se.su.dsv.scipro.data.dataobjects.GeneralSystemSettings;
 
 public class AdminGeneralSettingsPage extends AbstractAdminSettingsPage {
 
+	@SpringBean
+	private GeneralSystemSettingsDao generalSystemSettingsDao;
+
 	public AdminGeneralSettingsPage(final PageParameters pp) {
 		super(pp);
+		
+		add(new AdminGeneralSettingsForm(
+				"finalSeminarSettingsForm", 
+				new CompoundPropertyModel<GeneralSystemSettings>(generalSystemSettingsDao.getGeneralSystemSettingsInstance())));
 	}
 
+	private class AdminGeneralSettingsForm extends Form<GeneralSystemSettings> {
+		private static final long serialVersionUID = 1L;
+		
+		public AdminGeneralSettingsForm(String id, IModel<GeneralSystemSettings> model) {
+			super(id, model );
+			TextField<String> mailFromName = new RequiredTextField<String>("mailFromName");
+			TextField<String> systemFromMail = new RequiredTextField<String>("systemFromMail");
+			TextField<String> smtpServer = new RequiredTextField<String>("smtpServer");
+			CheckBox mailNotifications = new CheckBox("mailNotifications");
+			add(mailFromName);
+			add(systemFromMail);
+			add(smtpServer);
+			add(mailNotifications);
+		}
+
+		@Override
+		protected void onSubmit() {
+			setModelObject( generalSystemSettingsDao.save(getModelObject()) );
+			info("General settings saved");
+		}
+	}
 }
diff --git a/src/main/java/se/su/dsv/scipro/admin/panels/AdminRolesPanel.java b/src/main/java/se/su/dsv/scipro/admin/panels/AdminRolesPanel.java
index d0c25b24c0..f644986eb8 100644
--- a/src/main/java/se/su/dsv/scipro/admin/panels/AdminRolesPanel.java
+++ b/src/main/java/se/su/dsv/scipro/admin/panels/AdminRolesPanel.java
@@ -112,7 +112,7 @@ public class AdminRolesPanel extends Panel {
 
 		searchField.add(userSearchTextBehaviour);
 		add(searchField);
-		loadUserDataView(new UserSearchDataProvider(null, null));
+		loadUserDataView(new UserSearchDataProvider(null, null, null));
 
 		container.add(dataView);
 		add(container);
@@ -123,18 +123,18 @@ public class AdminRolesPanel extends Panel {
 	public void checkRole() {
 		switch (selectedRole) {
 		case ALL:
-			loadUserDataView(new UserSearchDataProvider(userSearch, null));
+			loadUserDataView(new UserSearchDataProvider(userSearch, null, null));
 			break;
 		case EMPLOYEE:
 			loadUserDataView(new UserSearchDataProvider(userSearch,
-					Employee.class));
+					Employee.class, null));
 			break;
 		case SYSADMIN:
 			loadUserDataView(new UserSearchDataProvider(userSearch,
-					SysAdmin.class));
+					SysAdmin.class, null));
 			break;
 		case ADMIN:
-			loadUserDataView(new UserSearchDataProvider(userSearch, Admin.class));
+			loadUserDataView(new UserSearchDataProvider(userSearch, Admin.class, null));
 			break;
 		}
 	}
diff --git a/src/main/java/se/su/dsv/scipro/basepanels/UserSettingsPanel.html b/src/main/java/se/su/dsv/scipro/basepanels/UserSettingsPanel.html
index cf2b034a91..4acacee27b 100644
--- a/src/main/java/se/su/dsv/scipro/basepanels/UserSettingsPanel.html
+++ b/src/main/java/se/su/dsv/scipro/basepanels/UserSettingsPanel.html
@@ -1,19 +1,27 @@
 <!DOCTYPE html>
-<html xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd">
+<html
+	xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd">
 <body>
-<wicket:panel>
-	<form wicket:id="userSettingsForm">
-		<div class="span-10 last">
-		<div class="info-box rounded-box span-10 last">If you do not have any projects to choose from, contact your supervisor and ask him/her to register a thesis course for you in Daisy.</div>
-		</div>
-		<div class="span-10 last">
-		<label for="activeProject">Active project</label>
-		<select name="Active project" wicket:id="activeProject" id="activeProject"></select>
-		<div>
-		<input type="submit" wicket:id="applyButton" value="Apply">
-		</div>
-		</div>
-	</form>
-</wicket:panel>
+	<wicket:panel>
+		<form wicket:id="userSettingsForm">
+			<div class="span-10 last">
+				<div class="info-box rounded-box span-10 last">If you do not
+					have any projects to choose from, contact your supervisor and ask
+					him/her to register a thesis course for you in Daisy.</div>
+			</div>
+			<div class="span-10 last">
+				<label for="activeProject">Active project</label> <select
+					name="Active project" wicket:id="activeProject" id="activeProject"></select>
+				<div class="span-10 last">
+					<label>Mail notifications you want</label> 
+					<div wicket:id="notificationPriority"><input type="radio" />
+					</div>
+				</div>
+				
+				<button type="submit" ><img src="css/blueprint/plugins/buttons/icons/tick.png" alt=""/> Save changes</button>
+
+			</div>
+		</form>
+	</wicket:panel>
 </body>
 </html>
\ No newline at end of file
diff --git a/src/main/java/se/su/dsv/scipro/basepanels/UserSettingsPanel.java b/src/main/java/se/su/dsv/scipro/basepanels/UserSettingsPanel.java
index 511bc8a112..e92659db21 100644
--- a/src/main/java/se/su/dsv/scipro/basepanels/UserSettingsPanel.java
+++ b/src/main/java/se/su/dsv/scipro/basepanels/UserSettingsPanel.java
@@ -5,13 +5,14 @@ import java.util.List;
 
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
-import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.form.Button;
 import org.apache.wicket.markup.html.form.DropDownChoice;
 import org.apache.wicket.markup.html.form.Form;
 import org.apache.wicket.markup.html.form.IChoiceRenderer;
+import org.apache.wicket.markup.html.form.RadioChoice;
 import org.apache.wicket.markup.html.panel.Panel;
-import org.apache.wicket.model.Model;
+import org.apache.wicket.model.CompoundPropertyModel;
+import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.PropertyModel;
 import org.apache.wicket.spring.injection.annot.SpringBean;
 
@@ -20,6 +21,8 @@ import se.su.dsv.scipro.data.dao.interfaces.ProjectDao;
 import se.su.dsv.scipro.data.dao.interfaces.UserSettingsDao;
 import se.su.dsv.scipro.data.dataobjects.Project;
 import se.su.dsv.scipro.data.dataobjects.UserSettings;
+import se.su.dsv.scipro.data.enums.NotificationPriority;
+import edu.emory.mathcs.backport.java.util.Arrays;
 /**
  * 
  * @author Martin Peters - mpeters@dsv.su.se
@@ -36,16 +39,18 @@ public class UserSettingsPanel extends Panel {
 
 	public UserSettingsPanel(String id) {
 		super(id);
-
-		add(new UserSettingsForm("userSettingsForm"));
+		UserSettings userSettings = userSettingsDao.getUserSettings(SciProSession.get().getUser());
+		if(userSettings == null)
+			userSettings = new UserSettings(SciProSession.get().getUser());
+		add(new UserSettingsForm("userSettingsForm", new CompoundPropertyModel<UserSettings>(userSettings)));
 	}
 	
-	private class UserSettingsForm extends Form<Void> {
+	private class UserSettingsForm extends Form<UserSettings> {
 		private static final long serialVersionUID = 1L;
 		private Project activeProject;
 		
-		public UserSettingsForm(String id) {
-			super(id);
+		public UserSettingsForm(String id, IModel<UserSettings> model) {
+			super(id, model);
 			activeProject = SciProSession.get().getActiveProject();
 			
 			List<Project> userProjects = new ArrayList<Project>();
@@ -67,14 +72,22 @@ public class UserSettingsPanel extends Panel {
 			});
 			projectChoice.setNullValid(true);
 			add(projectChoice);
-			Button applyButton = new Button("applyButton"){
-				private static final long serialVersionUID = 1L;
-				@Override
-				public void onSubmit(){
-					setResponsePage(this.getPage().getClass(),this.getPage().getPageParameters());					
-				}
-			};
-			add(applyButton);
+			
+			NotificationPriority[] array = NotificationPriority.values();
+			
+			List<NotificationPriority> notificationPriorities = new ArrayList<NotificationPriority>(Arrays.asList(array));
+			
+			RadioChoice<NotificationPriority> radioChoice = new RadioChoice<NotificationPriority>("notificationPriority", notificationPriorities );
+			add(radioChoice);
+			
+			
+
+		}
+		
+		@Override
+		public void onSubmit(){
+			userSettingsDao.save(getModelObject());
+			setResponsePage(this.getPage().getClass(),this.getPage().getPageParameters());	
 		}
 	}//UserSettingsForm
 	
diff --git a/src/main/java/se/su/dsv/scipro/commentthread/panel/CommentThreadPanel.html b/src/main/java/se/su/dsv/scipro/commentthread/panel/CommentThreadPanel.html
deleted file mode 100644
index 8053f15ad1..0000000000
--- a/src/main/java/se/su/dsv/scipro/commentthread/panel/CommentThreadPanel.html
+++ /dev/null
@@ -1,68 +0,0 @@
-<!DOCTYPE html>
-<html xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd">
-<head>
-<meta http-equiv="Content-type" content="text/html;charset=UTF-8" />
-</head>
-<body>
-<wicket:panel>
-	<div wicket:id="container" class="prepend-top last">
-		<div class="comment last" wicket:id="comment">
-			<div class="comment-header last">
-				<div class="last">
-					<span wicket:id="from" class="comment-posted-by">Dan Kjellman</span>
-				</div>
-				<div class="last">
-					<span class="comment-posted-date">Posted: </span>
-					<span wicket:id="date" class="comment-posted-date"></span>
-					<a href="#" wicket:id="editComment">
-						<img class="icon-12" src="images/icons/edit_16x16.png" " alt="Edit" title="Edit" />
-						<span class="small"> Edit</span>
-					</a>
-					<a href="#" wicket:id="deleteComment">
-						<img class="icon-12" src="images/icons/delete_16x16.png" alt="Delete" title="Delete" />
-						<span class="small"> Delete</span>
-					</a>
-				</div>
-			</div>
-			<div class="comment-bottom-border last"></div>
-			<div class="comment-area last">
-				<p wicket:id="message">This is the comment</p>
-			</div>
-			
-		</div>
-		<div wicket:id="navigator" class="comment-pager last"></div>
-	</div>
-	<div class="last comment-form">
-		<form wicket:id="commentForm">
-			<div class="last">
-				<strong>Comment:</strong>
-			</div>
-			<div class="last">
-				<textarea wicket:id="textMessage" ></textarea>
-			</div>
-			<div class="last">
-				<button wicket:id="submitButton" class="button">Submit comment
-					<img src="images/icons/chat_16x16.png" alt=""/>
-				</button>
-			</div>
-		</form>
-	</div>	
-	<div wicket:id="dialog">
-		<div wicket:id="dialogContainer" class="comment-form">
-	       	<form wicket:id="editCommentForm">
-				<div>
-					<textarea  wicket:id="editTextMessage" ></textarea>
-				</div>
-				<div>
-					<button wicket:id="submitButton" class="button">Save
-						<img src="css/blueprint/plugins/buttons/icons/tick.png" alt=""/>
-					</button>
-				</div>
-			</form>
-		</div>
-    </div>
-	
-</wicket:panel>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/src/main/java/se/su/dsv/scipro/commentthread/panel/CommentThreadPanel.java b/src/main/java/se/su/dsv/scipro/commentthread/panel/CommentThreadPanel.java
deleted file mode 100644
index c4d69e9dc3..0000000000
--- a/src/main/java/se/su/dsv/scipro/commentthread/panel/CommentThreadPanel.java
+++ /dev/null
@@ -1,298 +0,0 @@
-/**
- * 
- */
-package se.su.dsv.scipro.commentthread.panel;
-
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
-import java.util.List;
-
-import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.ajax.markup.html.AjaxLink;
-import org.apache.wicket.ajax.markup.html.form.AjaxButton;
-import org.apache.wicket.markup.html.WebMarkupContainer;
-import org.apache.wicket.markup.html.basic.Label;
-import org.apache.wicket.markup.html.basic.MultiLineLabel;
-import org.apache.wicket.markup.html.form.Form;
-import org.apache.wicket.markup.html.form.TextArea;
-import org.apache.wicket.markup.html.list.ListItem;
-import org.apache.wicket.markup.html.list.PageableListView;
-import org.apache.wicket.markup.html.panel.Panel;
-import org.apache.wicket.model.IModel;
-import org.apache.wicket.model.Model;
-import org.apache.wicket.model.PropertyModel;
-import org.apache.wicket.spring.injection.annot.SpringBean;
-import org.odlabs.wiquery.ui.dialog.Dialog;
-
-import se.su.dsv.scipro.SciProSession;
-import se.su.dsv.scipro.data.DomainObjectDetachableModel;
-import se.su.dsv.scipro.data.dao.interfaces.CommentDao;
-import se.su.dsv.scipro.data.dao.interfaces.CommentThreadDao;
-import se.su.dsv.scipro.data.dataobjects.Comment;
-import se.su.dsv.scipro.data.dataobjects.CommentThread;
-import se.su.dsv.scipro.data.dataobjects.interfaces.Commentable;
-import se.su.dsv.scipro.message.panels.CustomPagingNavigator;
-import se.su.dsv.scipro.security.auth.roles.Roles;
-
-/**
- * @author Johan Aschan - aschan@dsv.su.se
- * 
- */
-public class CommentThreadPanel extends Panel {
-
-	private static final long serialVersionUID = 1L;
-	
-	@SpringBean
-	private CommentThreadDao commentThreadDao;
-	@SpringBean
-	private CommentDao commentDao;
-
-	private WebMarkupContainer webMarkupContainer;
-
-	private PageableListView<Comment> commentListView;
-	private CustomPagingNavigator customPagingNavigator;
-	private int numberOfComments;
-	private TextArea<String> textArea;
-	private WebMarkupContainer dialogContainer;
-	private Dialog dialog;
-	private final IModel<CommentThread> threadModel;
-	private final EditCommentForm editCommentForm;
-
-	public CommentThreadPanel(final String id, final Commentable keyObject, final int numberOfComments) {
-		super(id);
-
-		final String className = keyObject.getCommentKey();
-		final Long classId = keyObject.getId();		
-
-		this.numberOfComments = numberOfComments;
-
-		CommentThread commentThread = commentThreadDao.getCommentThread(keyObject);
-		if (commentThread == null) {
-			//TODO rewrite so thread is only created on demand, ie when someone's posted
-			CommentThread ct = new CommentThread(keyObject);
-			commentThread = commentThreadDao.save(ct);
-		}
-		
-		threadModel = new DomainObjectDetachableModel<CommentThread>(commentThreadDao, commentThread);
-
-		webMarkupContainer = new WebMarkupContainer("container");
-		webMarkupContainer.setOutputMarkupId(true);
-		generateCommentListView();
-		webMarkupContainer.add(commentListView);
-		add(webMarkupContainer);
-		webMarkupContainer.add(customPagingNavigator);
-		
-		Comment newComment = new Comment( SciProSession.get().getUser(), commentThread );		
-		add(new CommentForm("commentForm", new Model<Comment>(newComment)));
-		
-		dialogContainer = new WebMarkupContainer("dialogContainer");
-		dialog = new Dialog("dialog");
-		dialog.setModal(true);
-		dialog.setAutoOpen(false);
-		dialog.setWidth(470);
-		dialog.add(dialogContainer);
-		add(dialog);
-
-		dialogContainer.setOutputMarkupId(true);
-		editCommentForm = new EditCommentForm("editCommentForm", new DomainObjectDetachableModel<Comment>(commentDao, new Comment()) );
-		dialogContainer.add(editCommentForm);
-
-	}
-
-	private void generateCommentListView() {
-		threadModel.detach(); //Forces reinit of model object so collection is attached to session, ugly solution, don't copy..
-		List<Comment> commentList = threadModel.getObject().getCommentsList();
-		
-		commentListView = new PageableListView<Comment>("comment", commentList, numberOfComments) {
-
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			protected void populateItem(final ListItem<Comment> item) {
-				final Comment c = item.getModelObject();
-				DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm");
-				item.add(new Label("date", df.format(c.getDateCreated())));
-				item.add( c.getCreator().getDisplayComponent("from") );
-				item.add(new MultiLineLabel("message", new PropertyModel<String>(item.getDefaultModel(), "comment")).setEnabled(false));
-				item.add(new CommentDeleteLink("deleteComment", c));
-				item.add(new CommentEditLink("editComment", c));
-			};
-		};
-		
-		customPagingNavigator = new CustomPagingNavigator("navigator", commentListView) {
-
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public boolean isVisible() {
-				return commentListView.size() > 0;
-			}
-		};
-	}
-
-	public class CommentForm extends Form<Comment> {
-
-		private static final long serialVersionUID = 1L;
-
-		public CommentForm(final String id, final IModel<Comment> commentModel) {
-			super(id, commentModel);
-
-			textArea = new TextArea<String>("textMessage",new PropertyModel<String>(commentModel,"comment"));
-			textArea.setOutputMarkupId(true);
-			add(textArea);
-			AjaxButton ajaxButton = new AjaxButton("submitButton", new Model<String>("Submit Comment")) {
-
-				private static final long serialVersionUID = 1L;
-
-				@Override
-				protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
-
-					Comment comment = (Comment) form.getDefaultModelObject();
-					comment = commentDao.save(comment);
-					/*
-					 * Do not, on purpose set the forms defaultModelObject to the now persisted object,
-					 * we leave the original object so it can be re reused for any number of submits
-					 * 					 * 
-					 */
-					
-					webMarkupContainer.remove(commentListView);
-					webMarkupContainer.remove(customPagingNavigator);
-					textArea.setDefaultModelObject("");
-					generateCommentListView();
-					webMarkupContainer.add(commentListView);
-					webMarkupContainer.add(customPagingNavigator);
-					target.addComponent(textArea);
-					target.addComponent(webMarkupContainer);
-				}
-
-			};
-			ajaxButton.setOutputMarkupId(true);
-			add(ajaxButton);
-
-		}
-	}
-
-	private class CommentDeleteLink extends AjaxLink<Comment> {
-
-		private static final long serialVersionUID = 5900025667153930797L;
-		private Comment comment;
-
-		public CommentDeleteLink(String id, Comment comment) {
-			super(id);
-			this.comment = comment;
-
-		}
-
-		@Override
-		public boolean isVisible() {
-			SciProSession session = SciProSession.get();
-			if( session.authorizedForRole(Roles.ADMIN) )
-				return true;
-			if( comment.getCreator().equals( session.getUser() ) )
-				return true;
-			return false;
-		}
-
-		@Override
-		public void onClick(AjaxRequestTarget target) {
-			
-			comment = commentDao.reLoad(comment);
-			comment.getCommentThread().getComments().remove(comment);
-			commentDao.delete(comment); 
-
-			webMarkupContainer.remove(commentListView);
-			webMarkupContainer.remove(customPagingNavigator);
-			generateCommentListView();
-			webMarkupContainer.add(commentListView);
-			webMarkupContainer.add(customPagingNavigator);
-			target.addComponent(webMarkupContainer);
-		}
-
-	}
-
-	private class CommentEditLink extends AjaxLink<Comment> {
-
-		private static final long serialVersionUID = 5900025667153930797L;
-		private final Comment comment;
-
-		public CommentEditLink(final String id, final Comment comment) {
-			super(id);
-			this.comment = comment;
-		}
-
-		@Override
-		public boolean isVisible() {
-			SciProSession session = SciProSession.get();
-			if( session.authorizedForRole(Roles.ADMIN) )
-				return true;
-			if( comment.getCreator().equals( session.getUser() ) )
-				return true;
-				
-			return false;
-		}
-
-		@Override
-		public void onClick(AjaxRequestTarget target) {
-			editCommentForm.setDefaultModelObject( comment );
-			//editCommentForm.setTextAreaDefaultModelObject( comment.getComment());
-			/*
-			 * TODO Investigate bug that occurs when this panel gets hidden and re-shown
-			 * in resources-view, edit-text-area displays text from the wrong model-object.
-			 */
-			dialog.open(target);
-			target.addComponent(dialog);
-		}
-
-	}
-
-	private class EditCommentForm extends Form<Comment> {
-
-		private static final long serialVersionUID = 1L;
-		
-		private final TextArea<String> editTextArea;
-
-		public EditCommentForm(final String id, final IModel<Comment> commentModel) {
-			super(id,commentModel);
-		
-			editTextArea = new TextArea<String>("editTextMessage",new PropertyModel<String>(commentModel,"comment"));
-			editTextArea.setOutputMarkupId(true);
-			add(editTextArea);
-			dialog.setTitle("Edit Comment");
-			
-			AjaxButton ajaxButton = new AjaxButton("submitButton", new Model<String>("Save")) {
-				private static final long serialVersionUID = 1L;
-
-				@Override
-				protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
-					//DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-					//Date date = new Date();
-					//df.format(date)
-					//editComment.setComment(((CommentThreadModel) form.getModelObject()).getEditTextMessage() + "\n\nLast edited: " +df.format(date) + " by: " + user.getFirstName() + " " + user.getLastName()) ;
-					
-					/*
-					 * !!! We do not have to explicitly save object! It is currently being persisted by cascade!
-					 */
-
-					webMarkupContainer.remove(commentListView);
-					webMarkupContainer.remove(customPagingNavigator);
-					generateCommentListView();
-					webMarkupContainer.add(commentListView);
-					webMarkupContainer.add(customPagingNavigator);
-					dialog.close(target);
-					target.addComponent(webMarkupContainer);
-				}
-
-			};
-			ajaxButton.setOutputMarkupId(true);
-			add(ajaxButton);
-			
-		}
-		/*
-		 * Attempt to fix weird incorrect-updating of text-area content when panel is used in resources-view
-		 */
-		public void setTextAreaDefaultModelObject(String string){
-			editTextArea.setDefaultModelObject(string);
-		}
-	}
-
-}
diff --git a/src/main/java/se/su/dsv/scipro/commentthread/panels/CommentThreadPanel.java b/src/main/java/se/su/dsv/scipro/commentthread/panels/CommentThreadPanel.java
index c51c153dc0..49bc7d262f 100644
--- a/src/main/java/se/su/dsv/scipro/commentthread/panels/CommentThreadPanel.java
+++ b/src/main/java/se/su/dsv/scipro/commentthread/panels/CommentThreadPanel.java
@@ -6,6 +6,8 @@ package se.su.dsv.scipro.commentthread.panels;
 import java.text.DateFormat;
 import java.text.SimpleDateFormat;
 import java.util.List;
+import java.util.Properties;
+import java.util.Set;
 
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.markup.html.AjaxLink;
@@ -25,14 +27,20 @@ import org.apache.wicket.spring.injection.annot.SpringBean;
 import org.odlabs.wiquery.ui.dialog.Dialog;
 
 import se.su.dsv.scipro.SciProSession;
+import se.su.dsv.scipro.conference.model.SubscriberModel;
 import se.su.dsv.scipro.data.DomainObjectDetachableModel;
+import se.su.dsv.scipro.data.controllers.NotificationController;
+import se.su.dsv.scipro.data.controllers.NotificationMessage;
 import se.su.dsv.scipro.data.dao.interfaces.CommentDao;
 import se.su.dsv.scipro.data.dao.interfaces.CommentThreadDao;
 import se.su.dsv.scipro.data.dataobjects.Comment;
 import se.su.dsv.scipro.data.dataobjects.CommentThread;
+import se.su.dsv.scipro.data.dataobjects.User;
 import se.su.dsv.scipro.data.dataobjects.interfaces.Commentable;
+import se.su.dsv.scipro.data.enums.NotificationPriority;
 import se.su.dsv.scipro.message.panels.CustomPagingNavigator;
 import se.su.dsv.scipro.security.auth.roles.Roles;
+import se.su.dsv.scipro.util.PropsUtils;
 
 /**
  * @author Johan Aschan - aschan@dsv.su.se
@@ -41,11 +49,13 @@ import se.su.dsv.scipro.security.auth.roles.Roles;
 public class CommentThreadPanel extends Panel {
 
 	private static final long serialVersionUID = 1L;
-	
+
 	@SpringBean
 	private CommentThreadDao commentThreadDao;
 	@SpringBean
 	private CommentDao commentDao;
+	@SpringBean
+	private NotificationController notificationController;
 
 	private WebMarkupContainer webMarkupContainer;
 
@@ -57,23 +67,32 @@ public class CommentThreadPanel extends Panel {
 	private Dialog dialog;
 	private final IModel<CommentThread> threadModel;
 	private final EditCommentForm editCommentForm;
+	private final Set<SubscriberModel> subscriberModels;
+	private final String title;
+	private final Long classId;
 
-	public CommentThreadPanel(final String id, final Commentable keyObject, final int numberOfComments) {
+	public CommentThreadPanel(final String id, final Commentable keyObject,
+			final int numberOfComments, final Set<SubscriberModel> subscriberModels,
+			final String title) {
 		super(id);
 
 		final String className = keyObject.getCommentKey();
-		final Long classId = keyObject.getId();		
+		classId = keyObject.getId();
 
+		this.subscriberModels = subscriberModels;
 		this.numberOfComments = numberOfComments;
+		this.title = title;
 
 		CommentThread commentThread = commentThreadDao.getCommentThread(keyObject);
 		if (commentThread == null) {
-			//TODO rewrite so thread is only created on demand, ie when someone's posted
+			// TODO rewrite so thread is only created on demand, ie when
+			// someone's posted
 			CommentThread ct = new CommentThread(keyObject);
 			commentThread = commentThreadDao.save(ct);
 		}
-		
-		threadModel = new DomainObjectDetachableModel<CommentThread>(commentThreadDao, commentThread);
+
+		threadModel = new DomainObjectDetachableModel<CommentThread>(commentThreadDao,
+				commentThread);
 
 		webMarkupContainer = new WebMarkupContainer("container");
 		webMarkupContainer.setOutputMarkupId(true);
@@ -81,10 +100,10 @@ public class CommentThreadPanel extends Panel {
 		webMarkupContainer.add(commentListView);
 		add(webMarkupContainer);
 		webMarkupContainer.add(customPagingNavigator);
-		
-		Comment newComment = new Comment( SciProSession.get().getUser(), commentThread );		
+
+		Comment newComment = new Comment(SciProSession.get().getUser(), commentThread);
 		add(new CommentForm("commentForm", new Model<Comment>(newComment)));
-		
+
 		dialogContainer = new WebMarkupContainer("dialogContainer");
 		dialog = new Dialog("dialog");
 		dialog.setModal(true);
@@ -94,15 +113,23 @@ public class CommentThreadPanel extends Panel {
 		add(dialog);
 
 		dialogContainer.setOutputMarkupId(true);
-		editCommentForm = new EditCommentForm("editCommentForm", new DomainObjectDetachableModel<Comment>(commentDao, new Comment()) );
+		editCommentForm = new EditCommentForm("editCommentForm",
+				new DomainObjectDetachableModel<Comment>(commentDao, new Comment()));
 		dialogContainer.add(editCommentForm);
 
 	}
 
+	public CommentThreadPanel(final String id, final Commentable keyObject,
+			final int numberOfComments) {
+		this(id, keyObject, numberOfComments, null, "");
+	}
+
 	private void generateCommentListView() {
-		threadModel.detach(); //Forces reinit of model object so collection is attached to session, ugly solution, don't copy..
+		threadModel.detach(); // Forces reinit of model object so collection is
+								// attached to session, ugly solution, don't
+								// copy..
 		List<Comment> commentList = threadModel.getObject().getCommentsList();
-		
+
 		commentListView = new PageableListView<Comment>("comment", commentList, numberOfComments) {
 
 			private static final long serialVersionUID = 1L;
@@ -112,13 +139,14 @@ public class CommentThreadPanel extends Panel {
 				final Comment c = item.getModelObject();
 				DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm");
 				item.add(new Label("date", df.format(c.getDateCreated())));
-				item.add( c.getCreator().getDisplayComponent("from") );
-				item.add(new MultiLineLabel("message", new PropertyModel<String>(item.getDefaultModel(), "comment")).setEnabled(false));
+				item.add(c.getCreator().getDisplayComponent("from"));
+				item.add(new MultiLineLabel("message", new PropertyModel<String>(item
+						.getDefaultModel(), "comment")).setEnabled(false));
 				item.add(new CommentDeleteLink("deleteComment", c));
 				item.add(new CommentEditLink("editComment", c));
 			};
 		};
-		
+
 		customPagingNavigator = new CustomPagingNavigator("navigator", commentListView) {
 
 			private static final long serialVersionUID = 1L;
@@ -137,10 +165,12 @@ public class CommentThreadPanel extends Panel {
 		public CommentForm(final String id, final IModel<Comment> commentModel) {
 			super(id, commentModel);
 
-			textArea = new TextArea<String>("textMessage",new PropertyModel<String>(commentModel,"comment"));
+			textArea = new TextArea<String>("textMessage", new PropertyModel<String>(commentModel,
+					"comment"));
 			textArea.setOutputMarkupId(true);
 			add(textArea);
-			AjaxButton ajaxButton = new AjaxButton("submitButton", new Model<String>("Submit Comment")) {
+			AjaxButton ajaxButton = new AjaxButton("submitButton", new Model<String>(
+					"Submit Comment")) {
 
 				private static final long serialVersionUID = 1L;
 
@@ -149,12 +179,19 @@ public class CommentThreadPanel extends Panel {
 
 					Comment comment = (Comment) form.getDefaultModelObject();
 					comment = commentDao.save(comment);
+					System.out.println(subscriberModels);
+					if (subscriberModels != null) {
+						for (SubscriberModel sm : subscriberModels) {
+							createNotification(sm.getUser(), comment.getComment(),
+									sm.getNotificationPriority(), sm.getAbsolutePath());
+						}
+					}
 					/*
-					 * Do not, on purpose set the forms defaultModelObject to the now persisted object,
-					 * we leave the original object so it can be re reused for any number of submits
-					 * 					 * 
+					 * Do not, on purpose set the forms defaultModelObject to
+					 * the now persisted object, we leave the original object so
+					 * it can be re reused for any number of submits *
 					 */
-					
+
 					webMarkupContainer.remove(commentListView);
 					webMarkupContainer.remove(customPagingNavigator);
 					textArea.setDefaultModelObject("");
@@ -186,7 +223,7 @@ public class CommentThreadPanel extends Panel {
 		@Override
 		public boolean isVisible() {
 			SciProSession session = SciProSession.get();
-			if( session.authorizedForRole(Roles.ADMIN) )
+			if (session.authorizedForRole(Roles.ADMIN))
 				return true;
 
 			return false;
@@ -194,11 +231,10 @@ public class CommentThreadPanel extends Panel {
 
 		@Override
 		public void onClick(AjaxRequestTarget target) {
-			
+
 			comment = commentDao.reLoad(comment);
 			comment.getCommentThread().getComments().remove(comment);
-			commentDao.delete(comment); 
-
+			commentDao.delete(comment);
 			webMarkupContainer.remove(commentListView);
 			webMarkupContainer.remove(customPagingNavigator);
 			generateCommentListView();
@@ -222,19 +258,21 @@ public class CommentThreadPanel extends Panel {
 		@Override
 		public boolean isVisible() {
 			SciProSession session = SciProSession.get();
-			if( session.authorizedForRole(Roles.ADMIN) )
+			if (session.authorizedForRole(Roles.ADMIN))
 				return true;
-				
+
 			return false;
 		}
 
 		@Override
 		public void onClick(AjaxRequestTarget target) {
-			editCommentForm.setDefaultModelObject( comment );
-			//editCommentForm.setTextAreaDefaultModelObject( comment.getComment());
+			editCommentForm.setDefaultModelObject(comment);
+			// editCommentForm.setTextAreaDefaultModelObject(
+			// comment.getComment());
 			/*
-			 * TODO Investigate bug that occurs when this panel gets hidden and re-shown
-			 * in resources-view, edit-text-area displays text from the wrong model-object.
+			 * TODO Investigate bug that occurs when this panel gets hidden and
+			 * re-shown in resources-view, edit-text-area displays text from the
+			 * wrong model-object.
 			 */
 			dialog.open(target);
 			target.addComponent(dialog);
@@ -245,29 +283,35 @@ public class CommentThreadPanel extends Panel {
 	private class EditCommentForm extends Form<Comment> {
 
 		private static final long serialVersionUID = 1L;
-		
+
 		private final TextArea<String> editTextArea;
 
 		public EditCommentForm(final String id, final IModel<Comment> commentModel) {
-			super(id,commentModel);
-		
-			editTextArea = new TextArea<String>("editTextMessage",new PropertyModel<String>(commentModel,"comment"));
+			super(id, commentModel);
+
+			editTextArea = new TextArea<String>("editTextMessage", new PropertyModel<String>(
+					commentModel, "comment"));
 			editTextArea.setOutputMarkupId(true);
 			add(editTextArea);
 			dialog.setTitle("Edit Comment");
-			
+
 			AjaxButton ajaxButton = new AjaxButton("submitButton", new Model<String>("Save")) {
 				private static final long serialVersionUID = 1L;
 
 				@Override
 				protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
-					//DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-					//Date date = new Date();
-					//df.format(date)
-					//editComment.setComment(((CommentThreadModel) form.getModelObject()).getEditTextMessage() + "\n\nLast edited: " +df.format(date) + " by: " + user.getFirstName() + " " + user.getLastName()) ;
-					
+					// DateFormat df = new
+					// SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+					// Date date = new Date();
+					// df.format(date)
+					// editComment.setComment(((CommentThreadModel)
+					// form.getModelObject()).getEditTextMessage() +
+					// "\n\nLast edited: " +df.format(date) + " by: " +
+					// user.getFirstName() + " " + user.getLastName()) ;
+
 					/*
-					 * !!! We do not have to explicitly save object! It is currently being persisted by cascade!
+					 * !!! We do not have to explicitly save object! It is
+					 * currently being persisted by cascade!
 					 */
 
 					webMarkupContainer.remove(commentListView);
@@ -282,14 +326,41 @@ public class CommentThreadPanel extends Panel {
 			};
 			ajaxButton.setOutputMarkupId(true);
 			add(ajaxButton);
-			
+
 		}
+
 		/*
-		 * Attempt to fix weird incorrect-updating of text-area content when panel is used in resources-view
+		 * Attempt to fix weird incorrect-updating of text-area content when
+		 * panel is used in resources-view
 		 */
-		public void setTextAreaDefaultModelObject(String string){
+		public void setTextAreaDefaultModelObject(String string) {
 			editTextArea.setDefaultModelObject(string);
 		}
 	}
 
+	private void createNotification(final User user, final String message,
+			final NotificationPriority notificationPriority, final String absolutePath) {
+
+		Properties props = null;
+		try {
+			props = PropsUtils.load("notification.properties");
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		String mailSubject = props.getProperty("mailSubject");
+		String conferenceNotification = props.getProperty("conferenceNotificationComment");
+		String twoNewLines = props.getProperty("twoNewLines");
+
+		String webNotificationMessage = SciProSession.get().getUser() + conferenceNotification
+				+ title;
+
+		String mailMessage = webNotificationMessage + twoNewLines + message;
+
+		NotificationMessage notificationMessage = new NotificationMessage(webNotificationMessage,
+				mailSubject, mailMessage);
+		notificationController.processNotification(user, notificationMessage, absolutePath+"&"+classId
+				,
+				notificationPriority);
+	}
+
 }
diff --git a/src/main/java/se/su/dsv/scipro/conference/model/SubscriberModel.java b/src/main/java/se/su/dsv/scipro/conference/model/SubscriberModel.java
new file mode 100644
index 0000000000..87c3713f81
--- /dev/null
+++ b/src/main/java/se/su/dsv/scipro/conference/model/SubscriberModel.java
@@ -0,0 +1,73 @@
+/**
+ * 
+ */
+package se.su.dsv.scipro.conference.model;
+
+import org.apache.wicket.IClusterable;
+
+import se.su.dsv.scipro.data.dataobjects.User;
+import se.su.dsv.scipro.data.enums.NotificationPriority;
+
+/**
+ * @author Johan Aschan <aschan@dsv.su.se>
+ *
+ */
+public class SubscriberModel implements IClusterable{
+	
+
+	private static final long serialVersionUID = 1L;
+	private User user;
+	private String absolutePath;
+	private NotificationPriority notificationPriority;
+	
+
+	/**
+	 * @param user
+	 * @param absolutePath
+	 * @param notificationPriority
+	 */
+	public SubscriberModel(User user, String absolutePath, NotificationPriority notificationPriority) {
+		super();
+		this.user = user;
+		this.absolutePath = absolutePath;
+		this.notificationPriority = notificationPriority;
+	}
+	/**
+	 * @return the user
+	 */
+	public User getUser() {
+		return user;
+	}
+	/**
+	 * @param user the user to set
+	 */
+	public void setUser(User user) {
+		this.user = user;
+	}
+
+
+	/**
+	 * @return the absolutePath
+	 */
+	public String getAbsolutePath() {
+		return absolutePath;
+	}
+	/**
+	 * @param absolutePath the absolutePath to set
+	 */
+	public void setAbsolutePath(String absolutePath) {
+		this.absolutePath = absolutePath;
+	}
+	/**
+	 * @return the notificationPriority
+	 */
+	public NotificationPriority getNotificationPriority() {
+		return notificationPriority;
+	}
+	/**
+	 * @param notificationPriority the notificationPriority to set
+	 */
+	public void setNotificationPriority(NotificationPriority notificationPriority) {
+		this.notificationPriority = notificationPriority;
+	}
+}
diff --git a/src/main/java/se/su/dsv/scipro/conference/pages/ProjectConferencePage.html b/src/main/java/se/su/dsv/scipro/conference/pages/ProjectConferencePage.html
new file mode 100644
index 0000000000..2b5898ce86
--- /dev/null
+++ b/src/main/java/se/su/dsv/scipro/conference/pages/ProjectConferencePage.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<html xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd">
+<head>
+<meta http-equiv="Content-type" content="text/html;charset=UTF-8" />
+</head>
+<body>
+<wicket:extend>
+    <div wicket:id="conferencePanel"></div>
+</wicket:extend>
+</body>
+</html>
\ No newline at end of file
diff --git a/src/main/java/se/su/dsv/scipro/conference/pages/ProjectConferencePage.java b/src/main/java/se/su/dsv/scipro/conference/pages/ProjectConferencePage.java
new file mode 100644
index 0000000000..452700e4d1
--- /dev/null
+++ b/src/main/java/se/su/dsv/scipro/conference/pages/ProjectConferencePage.java
@@ -0,0 +1,172 @@
+/**
+ * 
+ */
+package se.su.dsv.scipro.conference.pages;
+
+import java.util.HashSet;
+import java.util.Set;
+import java.util.StringTokenizer;
+
+import org.apache.wicket.PageParameters;
+import org.apache.wicket.RequestCycle;
+import org.apache.wicket.RestartResponseException;
+import org.apache.wicket.markup.html.panel.EmptyPanel;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.LoadableDetachableModel;
+import org.apache.wicket.protocol.http.RequestUtils;
+import org.apache.wicket.spring.injection.annot.SpringBean;
+
+import se.su.dsv.scipro.SciProApplication;
+import se.su.dsv.scipro.SciProSession;
+import se.su.dsv.scipro.conference.model.SubscriberModel;
+import se.su.dsv.scipro.conference.panels.ConferencePanel;
+import se.su.dsv.scipro.data.dao.interfaces.BoardMessageDao;
+import se.su.dsv.scipro.data.dao.interfaces.MessageBoardDao;
+import se.su.dsv.scipro.data.dataobjects.BoardMessage;
+import se.su.dsv.scipro.data.dataobjects.MessageBoard;
+import se.su.dsv.scipro.data.dataobjects.Project;
+import se.su.dsv.scipro.data.dataobjects.ProjectFollower;
+import se.su.dsv.scipro.data.dataobjects.Student;
+import se.su.dsv.scipro.data.enums.NotificationPriority;
+import se.su.dsv.scipro.project.pages.ProjectPage;
+import se.su.dsv.scipro.security.auth.Authorization;
+import se.su.dsv.scipro.security.auth.roles.Roles;
+
+/**
+ * @author Johan Aschan <aschan@dsv.su.se>
+ * 
+ */
+// TODO for test
+@Authorization(authorizedRoles = { Roles.SYSADMIN })
+public class ProjectConferencePage extends ProjectPage {
+
+	@SpringBean
+	private MessageBoardDao messageBoardDao;
+	@SpringBean
+	private BoardMessageDao boardMessageDao;
+
+	private IModel<Project> projectModel;
+	private IModel<MessageBoard> messageBoardModel;
+	private MessageBoard messageBoard;
+	private IModel<BoardMessage> boardMessageModel;
+	private final static String PROJECTID = "pid";
+
+	public ProjectConferencePage(PageParameters pp) {
+		super(pp);
+		String projectId = pp.getString("pid");
+		String boardMessageId = null;
+		if (projectId != null) {
+			StringTokenizer stringTokenizer = new StringTokenizer(projectId, "&");
+			boolean first = true;
+			for (int i = 0; i < 2; i++) {
+				if (stringTokenizer.hasMoreTokens()) {
+					if (first) {
+						projectId = stringTokenizer.nextToken().trim();
+						first = false;
+					} else {
+						boardMessageId = stringTokenizer.nextToken().trim();
+					}
+				}
+			}
+		}
+		if (projectId == null && SciProSession.get().getActiveProject() != null) {
+			projectId = String.valueOf(SciProSession.get().getActiveProject().getId());
+		}
+		if (projectId != null) {
+			final Project project = projectDao.load(Long.valueOf(projectId));
+			if (project == null || !projectDao.isPartOf(SciProSession.get().getUser(), project)) {
+				failAndRedirect();
+			} else {
+				projectModel = new LoadableDetachableModel<Project>() {
+
+					private static final long serialVersionUID = 1L;
+
+					@Override
+					protected Project load() {
+						return projectDao.reLoad(project);
+					}
+				};
+
+				Set<SubscriberModel> subscriberModel = new HashSet<SubscriberModel>();
+				if (projectModel.getObject().getHeadSupervisor() != null) {
+					subscriberModel.add(new SubscriberModel(projectModel.getObject()
+							.getHeadSupervisor().getUser(),
+							SupervisorConferencePage
+									.getAbsoluteForSupervisorConferenceURL(projectModel.getObject()
+											.getId()), NotificationPriority.LOW));
+				}
+
+				for (ProjectFollower projectFollower : projectModel.getObject()
+						.getProjectFollowers()) {
+					subscriberModel.add(new SubscriberModel(
+							projectFollower.getFollower().getUser(), SupervisorConferencePage
+									.getAbsoluteForSupervisorConferenceURL(projectModel.getObject()
+											.getId()), NotificationPriority.LOW));
+
+				}
+
+				for (Student student : projectModel.getObject().getProjectParticipants()) {
+					// Prod-kod
+					if (!student.getUser().equals(SciProSession.get().getUser()))
+						subscriberModel
+								.add(new SubscriberModel(student.getUser(),
+										getAbsoluteForProjectConferenceURL(projectModel.getObject()
+												.getId()), NotificationPriority.LOW));
+					// Test-kod
+					// subscriberModel.add(new
+					// SubscriberModel(student.getUser(),
+					// getAbsoluteForProjectConferenceURL(projectModel.getObject().getId()),
+					// NotificationPriority.LOW));
+
+				}
+
+				messageBoard = messageBoardDao.getMessageBoard(projectModel.getObject());
+				if (messageBoard == null) {
+					messageBoard = new MessageBoard(projectModel.getObject());
+					messageBoard.setTitle(projectModel.getObject().getTitle());
+					messageBoard = messageBoardDao.save(messageBoard);
+				}
+				messageBoardModel = new LoadableDetachableModel<MessageBoard>() {
+					private static final long serialVersionUID = 1L;
+
+					@Override
+					protected MessageBoard load() {
+						return messageBoardDao.reLoad(messageBoard);
+					}
+				};
+				if (boardMessageId != null) {
+					final BoardMessage bm = boardMessageDao.load(Long.valueOf(boardMessageId));
+
+					if (bm != null && messageBoard.getBoardMessageSet().contains(bm)) {
+						boardMessageModel = new LoadableDetachableModel<BoardMessage>() {
+							private static final long serialVersionUID = 1L;
+
+							@Override
+							protected BoardMessage load() {
+								return boardMessageDao.reLoad(bm);
+							}
+						};
+					}
+				}
+				add(new ConferencePanel("conferencePanel", messageBoardModel, subscriberModel,
+						boardMessageModel));
+			}
+		} else {
+			add(new EmptyPanel("conferencePanel"));
+		}
+
+	}
+
+	private void failAndRedirect() {
+		throw new RestartResponseException(SciProApplication.get().getApplicationSettings()
+				.getAccessDeniedPage());
+	}
+
+	public static String getAbsoluteForProjectConferenceURL(Long id) {
+		PageParameters pageParameters = new PageParameters();
+		pageParameters.put(PROJECTID, id.toString());
+		return RequestUtils.toAbsolutePath(RequestCycle.get()
+				.urlFor(ProjectConferencePage.class, pageParameters).toString());
+	}
+
+}
diff --git a/src/main/java/se/su/dsv/scipro/conference/pages/SupervisorConferencePage.html b/src/main/java/se/su/dsv/scipro/conference/pages/SupervisorConferencePage.html
new file mode 100644
index 0000000000..2b5898ce86
--- /dev/null
+++ b/src/main/java/se/su/dsv/scipro/conference/pages/SupervisorConferencePage.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<html xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd">
+<head>
+<meta http-equiv="Content-type" content="text/html;charset=UTF-8" />
+</head>
+<body>
+<wicket:extend>
+    <div wicket:id="conferencePanel"></div>
+</wicket:extend>
+</body>
+</html>
\ No newline at end of file
diff --git a/src/main/java/se/su/dsv/scipro/conference/pages/SupervisorConferencePage.java b/src/main/java/se/su/dsv/scipro/conference/pages/SupervisorConferencePage.java
new file mode 100644
index 0000000000..2c5d8c5a0a
--- /dev/null
+++ b/src/main/java/se/su/dsv/scipro/conference/pages/SupervisorConferencePage.java
@@ -0,0 +1,166 @@
+/**
+ * 
+ */
+package se.su.dsv.scipro.conference.pages;
+
+import java.util.HashSet;
+import java.util.Set;
+import java.util.StringTokenizer;
+
+import org.apache.wicket.PageParameters;
+import org.apache.wicket.RequestCycle;
+import org.apache.wicket.RestartResponseException;
+import org.apache.wicket.markup.html.panel.EmptyPanel;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.LoadableDetachableModel;
+import org.apache.wicket.protocol.http.RequestUtils;
+import org.apache.wicket.spring.injection.annot.SpringBean;
+
+import se.su.dsv.scipro.SciProApplication;
+import se.su.dsv.scipro.SciProSession;
+import se.su.dsv.scipro.conference.model.SubscriberModel;
+import se.su.dsv.scipro.conference.panels.ConferencePanel;
+import se.su.dsv.scipro.data.dao.interfaces.BoardMessageDao;
+import se.su.dsv.scipro.data.dao.interfaces.MessageBoardDao;
+import se.su.dsv.scipro.data.dao.interfaces.ProjectDao;
+import se.su.dsv.scipro.data.dataobjects.BoardMessage;
+import se.su.dsv.scipro.data.dataobjects.MessageBoard;
+import se.su.dsv.scipro.data.dataobjects.Project;
+import se.su.dsv.scipro.data.dataobjects.ProjectFollower;
+import se.su.dsv.scipro.data.dataobjects.Student;
+import se.su.dsv.scipro.data.dataobjects.User;
+import se.su.dsv.scipro.data.enums.NotificationPriority;
+import se.su.dsv.scipro.security.auth.Authorization;
+import se.su.dsv.scipro.security.auth.roles.Roles;
+import se.su.dsv.scipro.supervisor.pages.AbstractSupervisorPage;
+
+/**
+ * @author Johan Aschan <aschan@dsv.su.se>
+ * 
+ */
+@Authorization(authorizedRoles = { Roles.SYSADMIN })
+public class SupervisorConferencePage extends AbstractSupervisorPage {
+
+	@SpringBean
+	private MessageBoardDao messageBoardDao;
+	@SpringBean
+	protected ProjectDao projectDao;
+	@SpringBean
+	protected BoardMessageDao boardMessageDao;
+
+	private IModel<BoardMessage> boardMessageModel;
+	private IModel<Project> projectModel;
+	private IModel<MessageBoard> messageBoardModel;
+	private MessageBoard messageBoard;
+	private final static String PROJECTID = "pid";
+
+	public SupervisorConferencePage(PageParameters pp) {
+		super(pp);
+		String projectId = pp.getString("pid");
+		String boardMessageId = null;
+		if (projectId != null) {
+			StringTokenizer stringTokenizer = new StringTokenizer(projectId, "&");
+			boolean first = true;
+			for (int i = 0; i < 2; i++) {
+				if (stringTokenizer.hasMoreTokens()) {
+					if (first) {
+						projectId = stringTokenizer.nextToken().trim();
+						first = false;
+					} else {
+						boardMessageId = stringTokenizer.nextToken().trim();
+					}
+				}
+			}
+		}
+		if (projectId == null) {
+			add(new EmptyPanel("conferencePanel"));
+		} else {
+
+			final Project project = projectDao.load(Long.valueOf(projectId));
+			if (project == null || !projectDao.isPartOf(SciProSession.get().getUser(), project)) {
+				failAndRedirect();
+			} else {
+				projectModel = new LoadableDetachableModel<Project>() {
+
+					private static final long serialVersionUID = 1L;
+
+					@Override
+					protected Project load() {
+						return projectDao.reLoad(project);
+					}
+				};
+
+				Set<SubscriberModel> subscriberModel = new HashSet<SubscriberModel>();
+				User user = projectModel.getObject().getHeadSupervisor().getUser();
+				if (!user.equals(SciProSession.get().getUser())) {
+					subscriberModel
+							.add(new SubscriberModel(user,
+									getAbsoluteForSupervisorConferenceURL(projectModel.getObject()
+											.getId()), NotificationPriority.LOW));
+				}
+
+				for (ProjectFollower projectFollower : projectModel.getObject()
+						.getProjectFollowers()) {
+					if (!user.equals(SciProSession.get().getUser())) {
+						subscriberModel.add(new SubscriberModel(projectFollower.getFollower()
+								.getUser(), getAbsoluteForSupervisorConferenceURL(projectModel
+								.getObject().getId()), NotificationPriority.LOW));
+					}
+
+				}
+
+				for (Student student : projectModel.getObject().getProjectParticipants()) {
+					subscriberModel.add(new SubscriberModel(student.getUser(),
+							ProjectConferencePage.getAbsoluteForProjectConferenceURL(projectModel
+									.getObject().getId()), NotificationPriority.LOW));
+
+				}
+
+				messageBoard = messageBoardDao.getMessageBoard(projectModel.getObject());
+				if (messageBoard == null) {
+					messageBoard = new MessageBoard(projectModel.getObject());
+					messageBoard.setTitle(projectModel.getObject().getTitle());
+					messageBoard = messageBoardDao.save(messageBoard);
+				}
+				messageBoardModel = new LoadableDetachableModel<MessageBoard>() {
+					private static final long serialVersionUID = 1L;
+
+					@Override
+					protected MessageBoard load() {
+						return messageBoardDao.reLoad(messageBoard);
+					}
+				};
+				if (boardMessageId != null) {
+					final BoardMessage bm = boardMessageDao.load(Long.valueOf(boardMessageId));
+
+					if (bm != null && messageBoard.getBoardMessageSet().contains(bm)) {
+						boardMessageModel = new LoadableDetachableModel<BoardMessage>() {
+							private static final long serialVersionUID = 1L;
+
+							@Override
+							protected BoardMessage load() {
+								return boardMessageDao.reLoad(bm);
+							}
+						};
+					}
+				}
+				add(new ConferencePanel("conferencePanel", messageBoardModel, subscriberModel,
+						boardMessageModel));
+			}
+		}
+
+	}
+
+	private void failAndRedirect() {
+		throw new RestartResponseException(SciProApplication.get().getApplicationSettings()
+				.getAccessDeniedPage());
+	}
+
+	public static String getAbsoluteForSupervisorConferenceURL(Long id) {
+		PageParameters pageParameters = new PageParameters();
+		pageParameters.add(PROJECTID, id.toString());
+		return RequestUtils.toAbsolutePath(RequestCycle.get()
+				.urlFor(SupervisorConferencePage.class, pageParameters).toString());
+	}
+
+}
diff --git a/src/main/java/se/su/dsv/scipro/project/panels/ProjectWallPanel.html b/src/main/java/se/su/dsv/scipro/conference/panels/ConferencePanel.html
similarity index 100%
rename from src/main/java/se/su/dsv/scipro/project/panels/ProjectWallPanel.html
rename to src/main/java/se/su/dsv/scipro/conference/panels/ConferencePanel.html
diff --git a/src/main/java/se/su/dsv/scipro/conference/panels/ConferencePanel.java b/src/main/java/se/su/dsv/scipro/conference/panels/ConferencePanel.java
new file mode 100644
index 0000000000..1013d3f969
--- /dev/null
+++ b/src/main/java/se/su/dsv/scipro/conference/panels/ConferencePanel.java
@@ -0,0 +1,284 @@
+/**
+ * 
+ */
+package se.su.dsv.scipro.conference.panels;
+
+import java.text.SimpleDateFormat;
+import java.util.Properties;
+import java.util.Set;
+
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.markup.html.AjaxLink;
+import org.apache.wicket.ajax.markup.html.form.AjaxButton;
+import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.markup.html.form.TextArea;
+import org.apache.wicket.markup.html.navigation.paging.PagingNavigator;
+import org.apache.wicket.markup.html.panel.Panel;
+import org.apache.wicket.markup.repeater.Item;
+import org.apache.wicket.markup.repeater.data.DataView;
+import org.apache.wicket.markup.repeater.data.IDataProvider;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.Model;
+import org.apache.wicket.model.PropertyModel;
+import org.apache.wicket.spring.injection.annot.SpringBean;
+
+import se.su.dsv.scipro.SciProSession;
+import se.su.dsv.scipro.commentthread.panels.CommentThreadPanel;
+import se.su.dsv.scipro.conference.model.SubscriberModel;
+import se.su.dsv.scipro.data.controllers.NotificationController;
+import se.su.dsv.scipro.data.controllers.NotificationMessage;
+import se.su.dsv.scipro.data.dao.interfaces.BoardMessageDao;
+import se.su.dsv.scipro.data.dao.interfaces.CommentThreadDao;
+import se.su.dsv.scipro.data.dataobjects.BoardMessage;
+import se.su.dsv.scipro.data.dataobjects.MessageBoard;
+import se.su.dsv.scipro.data.dataobjects.User;
+import se.su.dsv.scipro.data.enums.NotificationPriority;
+import se.su.dsv.scipro.dataproviders.BoardMessageDataProvider;
+import se.su.dsv.scipro.security.auth.roles.Roles;
+import se.su.dsv.scipro.util.PropsUtils;
+
+/**
+ * @author Johan Aschan - aschan@dsv.su.se
+ * 
+ */
+public class ConferencePanel extends Panel {
+
+	private static final long serialVersionUID = 1L;
+	@SpringBean
+	private BoardMessageDao boardMessageDao;
+	@SpringBean
+	private CommentThreadDao commentThreadDao;
+
+	@SpringBean
+	private NotificationController notificationController;
+
+	private DataView<BoardMessage> dataView;
+	private WebMarkupContainer webMarkupContainer;
+	private IModel<MessageBoard> messageBoardModel;
+	private IModel<BoardMessage> boardMessageModel;
+	private Set<SubscriberModel> subscriberModels;
+
+	public ConferencePanel(String id, IModel<MessageBoard> messageBoardModel,
+			Set<SubscriberModel> subscriberModels, IModel<BoardMessage> boardMessageModel) {
+		super(id);
+		this.boardMessageModel = boardMessageModel;
+		this.messageBoardModel = messageBoardModel;
+		this.subscriberModels = subscriberModels;
+		initPanel();
+	}
+
+	public ConferencePanel(String id, IModel<MessageBoard> messageBoardModel,
+			Set<SubscriberModel> subscriberModels) {
+		this(id, messageBoardModel, subscriberModels, null);
+	}
+
+	private void initPanel() {
+		add(new SendWallMessageForm("sendForm"));
+		webMarkupContainer = new WebMarkupContainer("container");
+		loadUserDataView(new BoardMessageDataProvider(messageBoardModel));
+		webMarkupContainer.add(dataView);
+		webMarkupContainer.setOutputMarkupId(true);
+		webMarkupContainer.add(new PagingNavigator("pagingNavigator", dataView));
+		add(webMarkupContainer);
+	}
+
+	public void loadUserDataView(IDataProvider<BoardMessage> boardMessageDataProvider) {
+
+		dataView = new DataView<BoardMessage>("boardMessageDataView", boardMessageDataProvider, 10) {
+
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			protected void populateItem(Item<BoardMessage> item) {
+				final BoardMessage bm = item.getModelObject();
+				item.add(new Label("messageLabel", bm.getMessage()));
+				item.add(new Label("messageUser", bm.getFromUser().getFirstName() + " "
+						+ bm.getFromUser().getLastName()));
+				SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
+
+				item.add(new Label("messageDate", simpleDateFormat.format(bm.getDateCreated())));
+				item.add(new AjaxLink<Void>("delete") {
+
+					private static final long serialVersionUID = 1L;
+
+					@Override
+					public void onClick(AjaxRequestTarget target) {
+
+						BoardMessage boardMessageTemp = boardMessageDao.reLoad(bm);
+						boardMessageDao.delete(boardMessageTemp);
+						webMarkupContainer.removeAll();
+						loadUserDataView(new BoardMessageDataProvider(messageBoardModel));
+						webMarkupContainer.add(dataView);
+						webMarkupContainer.add(new PagingNavigator("pagingNavigator", dataView));
+						target.addComponent(webMarkupContainer);
+					}
+
+					@Override
+					public boolean isVisible() {
+						SciProSession session = SciProSession.get();
+						if (session.authorizedForRole(Roles.ADMIN))
+							return true;
+						return false;
+					}
+				});
+				int commentSize = commentThreadDao.getCommentThreadSize(bm);
+				String comments = " Comments";
+				if (commentSize == 1) {
+					comments = " Comment";
+				}
+				final Label comment = new Label("commentNumber", commentSize + comments);
+
+				comment.setOutputMarkupId(true);
+				final WebMarkupContainer webMarkupContainer = new WebMarkupContainer(
+						"commentContainer");
+				webMarkupContainer.setOutputMarkupPlaceholderTag(true);
+				item.add(webMarkupContainer);
+
+				CommentThreadPanel ctp = new CommentThreadPanel("commentThread", bm, 5,
+						subscriberModels, messageBoardModel.getObject().getTitle());
+				ctp.setOutputMarkupPlaceholderTag(true);
+				webMarkupContainer.add(ctp);
+				
+				if (boardMessageModel != null && boardMessageModel.getObject().equals(bm)) {
+					comment.setDefaultModelObject("Hide comments");
+					webMarkupContainer.setVisible(true);
+					item.add(new AjaxLink<String>("showComments",
+							new Model<String>("Hide Comments")) {
+
+						private static final long serialVersionUID = 1L;
+						private boolean clicked = true;
+
+						@Override
+						public void onClick(AjaxRequestTarget target) {
+							clicked = !clicked;
+							if (clicked) {
+								comment.setDefaultModelObject("Hide comments");
+							} else {
+
+								int commentSize = commentThreadDao.getCommentThreadSize(bm);
+
+								String comments = " Comments";
+								if (commentSize == 1) {
+									comments = " Comment";
+								}
+								comment.setDefaultModelObject(commentSize + comments);
+							}
+							webMarkupContainer.removeAll();
+							webMarkupContainer.add(new CommentThreadPanel("commentThread",
+									boardMessageDao.reLoad(bm), 5, subscriberModels,
+									messageBoardModel.getObject().getTitle()));
+							webMarkupContainer.setVisible(clicked);
+							target.addComponent(webMarkupContainer);
+							target.addComponent(comment);
+						}
+
+					}.add(comment));
+				} else {
+					webMarkupContainer.setVisible(false);
+					item.add(new AjaxLink<String>("showComments",
+							new Model<String>("Show Comments")) {
+
+						private static final long serialVersionUID = 1L;
+						private boolean clicked = false;
+
+						@Override
+						public void onClick(AjaxRequestTarget target) {
+							clicked = !clicked;
+							if (clicked) {
+								comment.setDefaultModelObject("Hide comments");
+							} else {
+
+								int commentSize = commentThreadDao.getCommentThreadSize(bm);
+
+								String comments = " Comments";
+								if (commentSize == 1) {
+									comments = " Comment";
+								}
+								comment.setDefaultModelObject(commentSize + comments);
+							}
+							webMarkupContainer.removeAll();
+							webMarkupContainer.add(new CommentThreadPanel("commentThread",
+									boardMessageDao.reLoad(bm), 5, subscriberModels,
+									messageBoardModel.getObject().getTitle()));
+							webMarkupContainer.setVisible(clicked);
+							target.addComponent(webMarkupContainer);
+							target.addComponent(comment);
+						}
+
+					}.add(comment));
+				}
+			}
+		};
+
+	}
+
+	private class SendWallMessageForm extends Form<String> {
+
+		private static final long serialVersionUID = 1L;
+		private String message;
+
+		public SendWallMessageForm(String id) {
+			super(id);
+			final TextArea<String> messageTextArea = new TextArea<String>("textArea",
+					new PropertyModel<String>(this, "message"));
+			messageTextArea.setOutputMarkupId(true);
+			add(messageTextArea);
+			AjaxButton button = new AjaxButton("ajaxButton") {
+
+				private static final long serialVersionUID = 1L;
+
+				@Override
+				protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
+
+					BoardMessage bm = new BoardMessage();
+					bm.setMessage(message);
+					bm.setMessageBoard(messageBoardModel.getObject());
+					bm.setFromUser(SciProSession.get().getUser());
+					bm = boardMessageDao.save(bm);
+
+					for (SubscriberModel subscriberModel : subscriberModels) {
+						createNotification(subscriberModel.getUser(), message,
+								subscriberModel.getNotificationPriority(),
+								subscriberModel.getAbsolutePath());
+					}
+					messageTextArea.setDefaultModelObject("");
+					webMarkupContainer.removeAll();
+					loadUserDataView(new BoardMessageDataProvider(messageBoardModel));
+					webMarkupContainer.add(dataView);
+					webMarkupContainer.add(new PagingNavigator("pagingNavigator", dataView));
+					target.addComponent(webMarkupContainer);
+					target.addComponent(messageTextArea);
+				}
+			};
+
+			add(button);
+
+		}
+	}
+
+	private void createNotification(final User user, final String message,
+			final NotificationPriority notificationPriority, final String absolutePath) {
+
+		Properties props = null;
+		try {
+			props = PropsUtils.load("notification.properties");
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		String mailSubject = props.getProperty("mailSubject");
+		String conferenceNotification = props.getProperty("conferenceNotification");
+		String twoNewLines = props.getProperty("twoNewLines");
+
+		String webNotificationMessage = SciProSession.get().getUser() + conferenceNotification
+				+ messageBoardModel.getObject().getTitle();
+
+		String mailMessage = webNotificationMessage + twoNewLines + message;
+
+		NotificationMessage notificationMessage = new NotificationMessage(webNotificationMessage,
+				mailSubject, mailMessage);
+		notificationController.processNotification(user, notificationMessage, absolutePath,
+				notificationPriority);
+	}
+}
diff --git a/src/main/java/se/su/dsv/scipro/data/controllers/NotificationController.java b/src/main/java/se/su/dsv/scipro/data/controllers/NotificationController.java
index 5540675535..ba1bf5019a 100644
--- a/src/main/java/se/su/dsv/scipro/data/controllers/NotificationController.java
+++ b/src/main/java/se/su/dsv/scipro/data/controllers/NotificationController.java
@@ -1,21 +1,14 @@
 package se.su.dsv.scipro.data.controllers;
 
 import se.su.dsv.scipro.data.dataobjects.User;
-import se.su.dsv.scipro.data.enums.NotificationEventType;
-import se.su.dsv.scipro.security.auth.roles.Roles;
+import se.su.dsv.scipro.data.enums.NotificationPriority;
 
 /**
  * 
  * @author Martin Peters - mpeters@dsv.su.se
- *
+ * 
  */
 public interface NotificationController {
-	
-	public void processSystemNotification(
-									User usertoNotify,
-									Roles userRole,
-									String subject,
-									String messageBody,
-									NotificationEventType notificationEvent);
 
+	public void processNotification(User usertoNotify, NotificationMessage notificationMessage, String absoluteUrl, NotificationPriority notificationPriority);
 }
diff --git a/src/main/java/se/su/dsv/scipro/data/controllers/NotificationMessage.java b/src/main/java/se/su/dsv/scipro/data/controllers/NotificationMessage.java
new file mode 100644
index 0000000000..10fc7ac6ea
--- /dev/null
+++ b/src/main/java/se/su/dsv/scipro/data/controllers/NotificationMessage.java
@@ -0,0 +1,74 @@
+/**
+ * 
+ */
+package se.su.dsv.scipro.data.controllers;
+
+/**
+ * @author Johan Aschan <aschan@dsv.su.se>
+ * 
+ */
+public class NotificationMessage {
+
+	private String webNotificationMessage = "";
+	private String mailSubject = "";
+	private String mailMessage = "";
+
+	/**
+	 * @param webNotificationMessage
+	 * @param mailSubject
+	 * @param mailMessage
+	 */
+	public NotificationMessage(String webNotificationMessage, String mailSubject, String mailMessage) {
+		super();
+		this.webNotificationMessage = webNotificationMessage;
+		this.mailSubject = mailSubject;
+		this.mailMessage = mailMessage;
+	}
+
+
+	/**
+	 * @return the webNotificationMessage
+	 */
+	public String getWebNotificationMessage() {
+		return webNotificationMessage;
+	}
+
+	/**
+	 * @param webNotificationMessage
+	 *            the webNotificationMessage to set
+	 */
+	public void setWebNotificationMessage(String webNotificationMessage) {
+		this.webNotificationMessage = webNotificationMessage;
+	}
+
+	/**
+	 * @return the mailSubject
+	 */
+	public String getMailSubject() {
+		return mailSubject;
+	}
+
+	/**
+	 * @param mailSubject
+	 *            the mailSubject to set
+	 */
+	public void setMailSubject(String mailSubject) {
+		this.mailSubject = mailSubject;
+	}
+
+	/**
+	 * @return the mailMessage
+	 */
+	public String getMailMessage() {
+		return mailMessage;
+	}
+
+	/**
+	 * @param mailMessage
+	 *            the mailMessage to set
+	 */
+	public void setMailMessage(String mailMessage) {
+		this.mailMessage = mailMessage;
+	}
+
+}
diff --git a/src/main/java/se/su/dsv/scipro/data/controllers/impl/NotificationControllerImpl.java b/src/main/java/se/su/dsv/scipro/data/controllers/impl/NotificationControllerImpl.java
index 0bb129528e..3159af89f5 100644
--- a/src/main/java/se/su/dsv/scipro/data/controllers/impl/NotificationControllerImpl.java
+++ b/src/main/java/se/su/dsv/scipro/data/controllers/impl/NotificationControllerImpl.java
@@ -6,75 +6,136 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 
 import se.su.dsv.scipro.data.controllers.NotificationController;
+import se.su.dsv.scipro.data.controllers.NotificationMessage;
+import se.su.dsv.scipro.data.dao.interfaces.GeneralSystemSettingsDao;
 import se.su.dsv.scipro.data.dao.interfaces.MailEventDao;
+import se.su.dsv.scipro.data.dao.interfaces.UserSettingsDao;
+import se.su.dsv.scipro.data.dao.interfaces.WebNotificationDao;
+import se.su.dsv.scipro.data.dataobjects.GeneralSystemSettings;
 import se.su.dsv.scipro.data.dataobjects.MailEvent;
 import se.su.dsv.scipro.data.dataobjects.User;
-import se.su.dsv.scipro.data.enums.NotificationEventType;
-import se.su.dsv.scipro.security.auth.roles.Roles;
+import se.su.dsv.scipro.data.dataobjects.UserSettings;
+import se.su.dsv.scipro.data.dataobjects.WebNotification;
+import se.su.dsv.scipro.data.enums.NotificationPriority;
 import se.su.dsv.scipro.util.PropsUtils;
+
 /**
- * TODO Think this through and do it properly, this is a rush-job implemented for peer-review
+ * TODO Think this through and do it properly, this is a rush-job implemented
+ * for peer-review
+ * 
  * @author Martin Peters - mpeters@dsv.su.se
- *
+ * 
  */
 @Controller
 public class NotificationControllerImpl implements NotificationController {
-	
+
 	private static final long serialVersionUID = 1L;
-	
-	final protected String systemFromName;
-	final protected String systemFromEmail;
-	final protected boolean sendMailEnabled;
-	
-	public NotificationControllerImpl() {
-		String systemFromName = null;
-		String systemFromEmail = null;
-		boolean sendMailEnabled = false;
-		try {
-			Properties props = PropsUtils.load("email.properties");
-			systemFromName = props.getProperty("systemFromName");
-			systemFromEmail = props.getProperty("systemFromEmail");
-			sendMailEnabled = Boolean.parseBoolean(props.getProperty("sendMailEnabled"));
-		} catch (Exception e) {
-			systemFromName = "SciPro - Autogenerated message";
-			systemFromEmail = "no-reply@thesis.dsv.su.se";
-			e.printStackTrace();
-		} finally {
-			this.systemFromName = systemFromName;
-			this.systemFromEmail = systemFromEmail;
-			this.sendMailEnabled = sendMailEnabled;
-		}
-		
-	}
-	
+
+	@Autowired
+	private WebNotificationDao notificationDao;
+
+	@Autowired
+	private UserSettingsDao userSettingsDao;
+
+	@Autowired
+	private GeneralSystemSettingsDao generalSystemSettingsDao;
+
 	@Autowired
 	protected MailEventDao mailEventDao;
-	
-	/**
-	 * Re-implement to it takes users settings into account
-	 * @param user
-	 * @param notificationEvent
-	 * @return
-	 */
-	protected boolean notifyViaMail(User user, Roles userRole, NotificationEventType notificationEvent ) {
-		return sendMailEnabled;
-	}
 
 	@Override
-	public void processSystemNotification(
-									User usertoNotify,
-									Roles userRole,
-									String subject,
-									String messageBody,
-									NotificationEventType notificationEvent) {
-		/*
-		 * atm bogus-check if the user want to have this kind of notice for this kind of role
-		 */
-		if( notifyViaMail(usertoNotify, userRole, notificationEvent) ){
-			MailEvent me = new MailEvent(subject, messageBody, usertoNotify, systemFromName, systemFromEmail, notificationEvent);
-			me = mailEventDao.save(me);
+	public void processNotification(User usertoNotify, NotificationMessage notificationMessage,
+			String absoluteUrl, NotificationPriority notificationPriorityForEvent) {
+		GeneralSystemSettings generalSystemSettings = generalSystemSettingsDao
+				.getGeneralSystemSettingsInstance();
+		String systemFromName = generalSystemSettings.getMailFromName();
+		String systemFromEmail = generalSystemSettings.getSystemFromMail();
+		boolean sendMailEnabled = generalSystemSettings.isMailNotifications();
+		// Mailnotifications
+		if (sendMailEnabled) {
+			UserSettings userSettings = userSettingsDao.getUserSettings(usertoNotify);
+			if (userSettings == null) {
+				userSettings = new UserSettings();
+				userSettings.setUser(usertoNotify);
+				userSettings = userSettingsDao.save(userSettings);
+			}
+			NotificationPriority notificationPriorityForUser = userSettings
+					.getNotificationPriority();
+
+			if (notificationPriorityForUser == null) {
+				notificationPriorityForUser = NotificationPriority.MEDIUM;
+				userSettings.setNotificationPriority(notificationPriorityForUser);
+				userSettings = userSettingsDao.save(userSettings);
+			}
+
+			String mailMessage = generateMail(usertoNotify.getFirstName(),
+					notificationMessage.getMailMessage(), absoluteUrl);
+			switch (notificationPriorityForUser) {
+			case HIGH:
+				if (notificationPriorityForEvent.equals(NotificationPriority.HIGH)) {
+					MailEvent me = new MailEvent(notificationMessage.getMailSubject(), mailMessage,
+							usertoNotify, systemFromName, systemFromEmail);
+					me = mailEventDao.save(me);
+				}
+				break;
+			case MEDIUM:
+				if (notificationPriorityForEvent.equals(NotificationPriority.HIGH)
+						|| notificationPriorityForEvent.equals(NotificationPriority.MEDIUM)) {
+					MailEvent me = new MailEvent(notificationMessage.getMailSubject(), mailMessage,
+							usertoNotify, systemFromName, systemFromEmail);
+					me = mailEventDao.save(me);
+				}
+				break;
+			case LOW:
+				if (notificationPriorityForEvent.equals(NotificationPriority.HIGH)
+						|| notificationPriorityForEvent.equals(NotificationPriority.MEDIUM)
+						|| notificationPriorityForEvent.equals(NotificationPriority.LOW)) {
+					MailEvent me = new MailEvent(notificationMessage.getMailSubject(), mailMessage,
+							usertoNotify, systemFromName, systemFromEmail);
+					me = mailEventDao.save(me);
+				}
+				break;
+			}
 		}
-		
+
+		// Webnotifications
+		WebNotification notification = new WebNotification();
+		notification.setUser(usertoNotify);
+		notification.setInfoText(notificationMessage.getWebNotificationMessage());
+		notification.setUrl(absoluteUrl);
+		notificationDao.save(notification);
 	}
 
+	private String generateMail(String userFirstName, String addMessage, String absoluteUrl) {
+		String message = "";
+
+		Properties props = null;
+
+		try {
+			props = PropsUtils.load("notification.properties");
+			String twoNewLines = props.getProperty("twoNewLines");
+			String hello = props.getProperty("hello");
+			String autogenerated = props.getProperty("autogenerated");
+			String twoNewLinesWithComma = props.getProperty("twoNewLinesWithComma");
+			String linkText = props.getProperty("linkText");
+
+			message += hello;
+			message += userFirstName;
+			message += twoNewLinesWithComma;
+
+			message += addMessage;
+
+			message += twoNewLines;
+			message += linkText;
+			message += absoluteUrl;
+			message += twoNewLines;
+			message += autogenerated;
+
+		} catch (Exception e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+
+		return message;
+	}
 }
diff --git a/src/main/java/se/su/dsv/scipro/data/dao/interfaces/BoardMessageDao.java b/src/main/java/se/su/dsv/scipro/data/dao/interfaces/BoardMessageDao.java
index e5dbd5fb28..3603f8a918 100644
--- a/src/main/java/se/su/dsv/scipro/data/dao/interfaces/BoardMessageDao.java
+++ b/src/main/java/se/su/dsv/scipro/data/dao/interfaces/BoardMessageDao.java
@@ -2,10 +2,9 @@ package se.su.dsv.scipro.data.dao.interfaces;
 
 import java.util.List;
 
-import org.springframework.stereotype.Repository;
-
 import se.su.dsv.scipro.data.dataobjects.BoardMessage;
 import se.su.dsv.scipro.data.dataobjects.MessageBoard;
+import se.su.dsv.scipro.data.dataobjects.User;
 
 /**
  * @author Johan Aschan - aschan@dsv.su.se
@@ -16,4 +15,6 @@ public interface BoardMessageDao extends Dao<BoardMessage>{
 	
 	public List<BoardMessage> getBoardMessageList(final MessageBoard mb, final int first,
 			final int count);
+	public int getBoardMessageListCount(final MessageBoard mb);
+	
 }
diff --git a/src/main/java/se/su/dsv/scipro/data/dao/interfaces/MessageBoardDao.java b/src/main/java/se/su/dsv/scipro/data/dao/interfaces/MessageBoardDao.java
index e7f048792f..2d18e06550 100644
--- a/src/main/java/se/su/dsv/scipro/data/dao/interfaces/MessageBoardDao.java
+++ b/src/main/java/se/su/dsv/scipro/data/dao/interfaces/MessageBoardDao.java
@@ -3,12 +3,9 @@
  */
 package se.su.dsv.scipro.data.dao.interfaces;
 
-import java.util.List;
-
-import org.springframework.stereotype.Repository;
-
-import se.su.dsv.scipro.data.dataobjects.BoardMessage;
 import se.su.dsv.scipro.data.dataobjects.MessageBoard;
+import se.su.dsv.scipro.data.dataobjects.User;
+import se.su.dsv.scipro.data.dataobjects.interfaces.Commentable;
 
 /**
  * @author Johan Aschan - aschan@dsv.su.se
@@ -18,5 +15,6 @@ import se.su.dsv.scipro.data.dataobjects.MessageBoard;
 
 public interface MessageBoardDao extends Dao<MessageBoard>{
 
+	public MessageBoard getMessageBoard(Commentable commentableDomainObject);
 
 }
diff --git a/src/main/java/se/su/dsv/scipro/data/dao/interfaces/MessageDao.java b/src/main/java/se/su/dsv/scipro/data/dao/interfaces/MessageDao.java
deleted file mode 100644
index 00c5192700..0000000000
--- a/src/main/java/se/su/dsv/scipro/data/dao/interfaces/MessageDao.java
+++ /dev/null
@@ -1,18 +0,0 @@
-/**
- * 
- */
-package se.su.dsv.scipro.data.dao.interfaces;
-
-import org.springframework.stereotype.Repository;
-
-import se.su.dsv.scipro.data.dataobjects.Message;
-
-/**
- * @author Johan Aschan - aschan@dsv.su.se
- *
- */
-
-
-public interface MessageDao extends Dao<Message>{
-
-}
diff --git a/src/main/java/se/su/dsv/scipro/data/dao/interfaces/SupervisorBoardMessageDao.java b/src/main/java/se/su/dsv/scipro/data/dao/interfaces/SupervisorBoardMessageDao.java
deleted file mode 100644
index 41861450ba..0000000000
--- a/src/main/java/se/su/dsv/scipro/data/dao/interfaces/SupervisorBoardMessageDao.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/**
- * 
- */
-package se.su.dsv.scipro.data.dao.interfaces;
-
-import org.springframework.stereotype.Repository;
-
-import se.su.dsv.scipro.data.dataobjects.BoardMessage;
-import se.su.dsv.scipro.data.dataobjects.SupervisorBoardMessage;
-
-/**
- * @author Johan Aschan - aschan@dsv.su.se
- *
- */
-
-
-public interface SupervisorBoardMessageDao extends Dao<SupervisorBoardMessage>{
-
-}
diff --git a/src/main/java/se/su/dsv/scipro/data/dao/interfaces/SupervisorMessageBoardDao.java b/src/main/java/se/su/dsv/scipro/data/dao/interfaces/SupervisorMessageBoardDao.java
deleted file mode 100644
index e8712379fe..0000000000
--- a/src/main/java/se/su/dsv/scipro/data/dao/interfaces/SupervisorMessageBoardDao.java
+++ /dev/null
@@ -1,18 +0,0 @@
-/**
- * 
- */
-package se.su.dsv.scipro.data.dao.interfaces;
-
-import org.springframework.stereotype.Repository;
-
-import se.su.dsv.scipro.data.dataobjects.SupervisorMessageBoard;
-
-/**
- * @author Johan Aschan - aschan@dsv.su.se
- *
- */
-
-
-public interface SupervisorMessageBoardDao extends Dao<SupervisorMessageBoard>{
-
-}
diff --git a/src/main/java/se/su/dsv/scipro/data/dao/interfaces/UserDao.java b/src/main/java/se/su/dsv/scipro/data/dao/interfaces/UserDao.java
index b8b3798bc9..b1bcaa0db3 100644
--- a/src/main/java/se/su/dsv/scipro/data/dao/interfaces/UserDao.java
+++ b/src/main/java/se/su/dsv/scipro/data/dao/interfaces/UserDao.java
@@ -2,8 +2,12 @@ package se.su.dsv.scipro.data.dao.interfaces;
 
 import java.util.List;
 
+import se.su.dsv.scipro.data.dataobjects.MessageBoard;
+import se.su.dsv.scipro.data.dataobjects.Project;
 import se.su.dsv.scipro.data.dataobjects.Role;
 import se.su.dsv.scipro.data.dataobjects.User;
+import se.su.dsv.scipro.data.enums.ProjectStatus;
+import se.su.dsv.scipro.data.enums.ProjectTeamMemberRoles;
 
 public interface UserDao extends LazyDeleteDao<User> {
 	
@@ -20,11 +24,13 @@ public interface UserDao extends LazyDeleteDao<User> {
 	List<User> findUserQuery(String searchQuery, boolean students, boolean supervisors, boolean sysadmins, int limit);
 	
 	List<User> findUserQuery(String searchQuery, int first,
-			int count, Class<? extends Role>  role);
+			int count, Class<? extends Role>  role, final List<User> notIncludeUser);
 	
-	int findUserQueryCount(String searchQuery, Class<? extends Role>  role);
+	int findUserQueryCount(final String searchQuery, final Class<? extends Role> roleClass,
+			final List<User> notIncludeList);
 	int findUserQueryCount(String searchQuery);
 	List<User> findUserQuery(String searchQuery, int first,
 			int count);
 	
+	
 }
diff --git a/src/main/java/se/su/dsv/scipro/data/dao/interfaces/WebNotificationDao.java b/src/main/java/se/su/dsv/scipro/data/dao/interfaces/WebNotificationDao.java
new file mode 100644
index 0000000000..dc34568041
--- /dev/null
+++ b/src/main/java/se/su/dsv/scipro/data/dao/interfaces/WebNotificationDao.java
@@ -0,0 +1,25 @@
+/**
+ * 
+ */
+package se.su.dsv.scipro.data.dao.interfaces;
+
+
+
+import java.util.List;
+
+import se.su.dsv.scipro.data.dataobjects.WebNotification;
+import se.su.dsv.scipro.data.dataobjects.User;
+
+/**
+ * @author Johan Aschan - aschan@dsv.su.se
+ *
+ */
+
+
+public interface WebNotificationDao extends Dao<WebNotification>{
+	
+	List<WebNotification> getWebNotifications(final User user);
+	List<WebNotification> getWebNotifications(final User user,final int first,final int count);
+	int getCountOfWebNotifications(final User user);
+
+}
diff --git a/src/main/java/se/su/dsv/scipro/data/dao/jpa/BoardMessageDaoJPAImp.java b/src/main/java/se/su/dsv/scipro/data/dao/jpa/BoardMessageDaoJPAImp.java
index 763e069c1b..fbf94f58ae 100644
--- a/src/main/java/se/su/dsv/scipro/data/dao/jpa/BoardMessageDaoJPAImp.java
+++ b/src/main/java/se/su/dsv/scipro/data/dao/jpa/BoardMessageDaoJPAImp.java
@@ -19,6 +19,7 @@ import org.springframework.transaction.annotation.Transactional;
 import se.su.dsv.scipro.data.dao.interfaces.BoardMessageDao;
 import se.su.dsv.scipro.data.dataobjects.BoardMessage;
 import se.su.dsv.scipro.data.dataobjects.MessageBoard;
+import se.su.dsv.scipro.data.dataobjects.User;
 
 /**
  * @author Johan Aschan - aschan@dsv.su.se
@@ -43,8 +44,9 @@ public class BoardMessageDaoJPAImp extends AbstractDaoJPAImp<BoardMessage>
 				TypedQuery<BoardMessage> query = em
 						.createQuery(
 								"select bm FROM  BoardMessage bm, MessageBoard mb " +
-								"WHERE bm member of mb.boardMessageSet ORDER BY bm.dateCreated DESC", BoardMessage.class);
+								"WHERE bm member of mb.boardMessageSet AND mb = :mb ORDER BY bm.dateCreated DESC", BoardMessage.class);
 				query.setHint(QueryHints.HINT_CACHEABLE, "true");
+				query.setParameter("mb", mb);
 				query.setFirstResult(first);
 				query.setMaxResults(count);
 				try {
@@ -56,5 +58,25 @@ public class BoardMessageDaoJPAImp extends AbstractDaoJPAImp<BoardMessage>
 		});
 	}
 	
+	@Override
+	@Transactional(readOnly = true)
+	public int getBoardMessageListCount(final MessageBoard mb) {
+		return getJpaTemplate().execute(new JpaCallback<Integer>() {
+			@Override
+			public Integer doInJpa(EntityManager em)
+					throws PersistenceException {
+				TypedQuery<Long> query = em
+						.createQuery(
+								"SELECT COUNT (bm) FROM  BoardMessage bm, MessageBoard mb " +
+								"WHERE bm member of mb.boardMessageSet AND mb = :mb", Long.class);
+				query.setHint(QueryHints.HINT_CACHEABLE, "true");
+				query.setParameter("mb", mb);
+				return query.getSingleResult().intValue();
+			
+			}
+		});
+	}
+	
+
 
 }
diff --git a/src/main/java/se/su/dsv/scipro/data/dao/jpa/CommentThreadDaoJPAImp.java b/src/main/java/se/su/dsv/scipro/data/dao/jpa/CommentThreadDaoJPAImp.java
index 3313ac8f97..84603322e4 100644
--- a/src/main/java/se/su/dsv/scipro/data/dao/jpa/CommentThreadDaoJPAImp.java
+++ b/src/main/java/se/su/dsv/scipro/data/dao/jpa/CommentThreadDaoJPAImp.java
@@ -3,8 +3,6 @@
  */
 package se.su.dsv.scipro.data.dao.jpa;
 
-import java.util.Date;
-
 import javax.persistence.EntityManager;
 import javax.persistence.NoResultException;
 import javax.persistence.PersistenceException;
diff --git a/src/main/java/se/su/dsv/scipro/data/dao/jpa/EventDaoJPAImp.java b/src/main/java/se/su/dsv/scipro/data/dao/jpa/EventDaoJPAImp.java
index dfb95ea232..45d70c26a4 100644
--- a/src/main/java/se/su/dsv/scipro/data/dao/jpa/EventDaoJPAImp.java
+++ b/src/main/java/se/su/dsv/scipro/data/dao/jpa/EventDaoJPAImp.java
@@ -7,7 +7,6 @@ import java.util.List;
 
 import javax.annotation.PostConstruct;
 import javax.persistence.EntityManager;
-import javax.persistence.NoResultException;
 import javax.persistence.PersistenceException;
 import javax.persistence.TypedQuery;
 
@@ -64,7 +63,6 @@ public class EventDaoJPAImp extends LazyDeleteAbstractDaoJPAImp<Event> implement
 					events.addAll(d.getEventsByUserAndProject(u, p, fromDate, toDate, limit));
 				}
 				Collections.sort(events);
-				System.out.println(events);
 				return events;
 			}
 			
diff --git a/src/main/java/se/su/dsv/scipro/data/dao/jpa/MessageBoardDaoJPAImp.java b/src/main/java/se/su/dsv/scipro/data/dao/jpa/MessageBoardDaoJPAImp.java
index 0db80506fe..649deda415 100644
--- a/src/main/java/se/su/dsv/scipro/data/dao/jpa/MessageBoardDaoJPAImp.java
+++ b/src/main/java/se/su/dsv/scipro/data/dao/jpa/MessageBoardDaoJPAImp.java
@@ -3,9 +3,6 @@
  */
 package se.su.dsv.scipro.data.dao.jpa;
 
-import java.util.ArrayList;
-import java.util.List;
-
 import javax.persistence.EntityManager;
 import javax.persistence.NoResultException;
 import javax.persistence.PersistenceException;
@@ -17,23 +14,45 @@ import org.springframework.stereotype.Repository;
 import org.springframework.transaction.annotation.Transactional;
 
 import se.su.dsv.scipro.data.dao.interfaces.MessageBoardDao;
-import se.su.dsv.scipro.data.dataobjects.BoardMessage;
 import se.su.dsv.scipro.data.dataobjects.MessageBoard;
-import se.su.dsv.scipro.data.dataobjects.Role;
 import se.su.dsv.scipro.data.dataobjects.User;
+import se.su.dsv.scipro.data.dataobjects.interfaces.Commentable;
 
 /**
  * @author Johan Aschan - aschan@dsv.su.se
- *
+ * 
  */
 
 @Repository("messageBoardDao")
-public class MessageBoardDaoJPAImp  extends AbstractDaoJPAImp<MessageBoard>
-		implements MessageBoardDao {
+public class MessageBoardDaoJPAImp extends AbstractDaoJPAImp<MessageBoard> implements
+		MessageBoardDao {
 
 	public MessageBoardDaoJPAImp() {
 		super(MessageBoard.class);
 	}
-	
+
+	@Override
+	@Transactional(readOnly = true)
+	public MessageBoard getMessageBoard(final Commentable commentableDomainObject) {
+		return getJpaTemplate().execute(new JpaCallback<MessageBoard>() {
+			public MessageBoard doInJpa(EntityManager em) throws PersistenceException {
+				final String q = "select t "
+						+ "from MessageBoard t "
+						+ "where t.commentableKey = :commentableKey and t.commentableId = :commentableId ";
+
+				TypedQuery<MessageBoard> query = em.createQuery(q, MessageBoard.class);
+				query.setParameter("commentableKey", commentableDomainObject.getCommentKey());
+				query.setParameter("commentableId", commentableDomainObject.getId());
+
+				query.setHint(QueryHints.HINT_CACHEABLE, "true");
+				try {
+					return query.getSingleResult();
+				} catch (NoResultException e) {
+					return null;
+				}
+
+			}
+		});
+	}
 
 }
diff --git a/src/main/java/se/su/dsv/scipro/data/dao/jpa/MessageDaoJPAImp.java b/src/main/java/se/su/dsv/scipro/data/dao/jpa/MessageDaoJPAImp.java
deleted file mode 100644
index 0c83a5ceba..0000000000
--- a/src/main/java/se/su/dsv/scipro/data/dao/jpa/MessageDaoJPAImp.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package se.su.dsv.scipro.data.dao.jpa;
-
-import org.springframework.stereotype.Repository;
-
-import se.su.dsv.scipro.data.dao.interfaces.MessageDao;
-import se.su.dsv.scipro.data.dataobjects.Message;
-
-/**
- * @author Johan Aschan - aschan@dsv.su.se
- *
- */
-
-@Repository("messageDao")
-public class MessageDaoJPAImp  extends AbstractDaoJPAImp<Message>
-		implements MessageDao {
-
-	public MessageDaoJPAImp() {
-		super(Message.class);
-	}
-}
-
diff --git a/src/main/java/se/su/dsv/scipro/data/dao/jpa/PrivateMessageDaoJPAImp.java b/src/main/java/se/su/dsv/scipro/data/dao/jpa/PrivateMessageDaoJPAImp.java
index aa3e99376b..a97e890ec3 100644
--- a/src/main/java/se/su/dsv/scipro/data/dao/jpa/PrivateMessageDaoJPAImp.java
+++ b/src/main/java/se/su/dsv/scipro/data/dao/jpa/PrivateMessageDaoJPAImp.java
@@ -14,7 +14,6 @@ import org.springframework.transaction.annotation.Transactional;
 
 import se.su.dsv.scipro.data.dao.interfaces.PrivateMessageDao;
 import se.su.dsv.scipro.data.dataobjects.PrivateMessage;
-import se.su.dsv.scipro.data.dataobjects.Recipient;
 import se.su.dsv.scipro.data.dataobjects.User;
 
 /**
diff --git a/src/main/java/se/su/dsv/scipro/data/dao/jpa/ProjectPartnerDaoJPAImp.java b/src/main/java/se/su/dsv/scipro/data/dao/jpa/ProjectPartnerDaoJPAImp.java
index 1fa53cbcce..8ccf9c4e78 100644
--- a/src/main/java/se/su/dsv/scipro/data/dao/jpa/ProjectPartnerDaoJPAImp.java
+++ b/src/main/java/se/su/dsv/scipro/data/dao/jpa/ProjectPartnerDaoJPAImp.java
@@ -16,7 +16,6 @@ import org.springframework.stereotype.Repository;
 import org.springframework.transaction.annotation.Transactional;
 
 import se.su.dsv.scipro.data.dao.interfaces.ProjectPartnerDao;
-import se.su.dsv.scipro.data.dataobjects.FinalSeminar;
 import se.su.dsv.scipro.data.dataobjects.ProjectClass;
 import se.su.dsv.scipro.data.dataobjects.ProjectPartner;
 
@@ -26,7 +25,7 @@ import se.su.dsv.scipro.data.dataobjects.ProjectPartner;
  * 
  */
 
-@Repository("ProjectPartnerDao")
+@Repository("projectPartnerDao")
 public class ProjectPartnerDaoJPAImp extends AbstractDaoJPAImp<ProjectPartner>
 		implements ProjectPartnerDao {
 
@@ -90,7 +89,6 @@ public class ProjectPartnerDaoJPAImp extends AbstractDaoJPAImp<ProjectPartner>
 		if(days > 0){
 				q+= " and e.dateCreated > :cutOffDate";
 		}
-				q+= " order by e.dateCreated desc";
 
 		TypedQuery<Long> query = em.createQuery(q,
 				Long.class);
diff --git a/src/main/java/se/su/dsv/scipro/data/dao/jpa/SupervisorBoardMessageDaoJPAImp.java b/src/main/java/se/su/dsv/scipro/data/dao/jpa/SupervisorBoardMessageDaoJPAImp.java
deleted file mode 100644
index a042aac96b..0000000000
--- a/src/main/java/se/su/dsv/scipro/data/dao/jpa/SupervisorBoardMessageDaoJPAImp.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/**
- * 
- */
-package se.su.dsv.scipro.data.dao.jpa;
-
-import org.springframework.stereotype.Repository;
-
-import se.su.dsv.scipro.data.dao.interfaces.SupervisorBoardMessageDao;
-import se.su.dsv.scipro.data.dataobjects.SupervisorBoardMessage;
-
-/**
- * @author Johan Aschan - aschan@dsv.su.se
- *
- */
-
-@Repository("supervisorBoardMessageDao")
-public class SupervisorBoardMessageDaoJPAImp extends AbstractDaoJPAImp<SupervisorBoardMessage>
-		implements SupervisorBoardMessageDao {
-
-	public SupervisorBoardMessageDaoJPAImp() {
-		super(SupervisorBoardMessage.class);
-	}
-
-}
diff --git a/src/main/java/se/su/dsv/scipro/data/dao/jpa/SupervisorMessageBoardDaoJPAImp.java b/src/main/java/se/su/dsv/scipro/data/dao/jpa/SupervisorMessageBoardDaoJPAImp.java
deleted file mode 100644
index 774d771934..0000000000
--- a/src/main/java/se/su/dsv/scipro/data/dao/jpa/SupervisorMessageBoardDaoJPAImp.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/**
- * 
- */
-package se.su.dsv.scipro.data.dao.jpa;
-
-import org.springframework.stereotype.Repository;
-
-import se.su.dsv.scipro.data.dao.interfaces.SupervisorMessageBoardDao;
-import se.su.dsv.scipro.data.dataobjects.SupervisorMessageBoard;
-
-/**
- * @author Johan Aschan - aschan@dsv.su.se
- *
- */
-
-@Repository("supervisorMessageBoardDao")
-public class SupervisorMessageBoardDaoJPAImp extends AbstractDaoJPAImp<SupervisorMessageBoard>
-		implements SupervisorMessageBoardDao {
-
-	public SupervisorMessageBoardDaoJPAImp() {
-		super(SupervisorMessageBoard.class);
-	}
-
-}
-
diff --git a/src/main/java/se/su/dsv/scipro/data/dao/jpa/UserDaoJPAImp.java b/src/main/java/se/su/dsv/scipro/data/dao/jpa/UserDaoJPAImp.java
index 98419e3a4f..8f41ea56c5 100644
--- a/src/main/java/se/su/dsv/scipro/data/dao/jpa/UserDaoJPAImp.java
+++ b/src/main/java/se/su/dsv/scipro/data/dao/jpa/UserDaoJPAImp.java
@@ -14,6 +14,7 @@ import org.springframework.stereotype.Repository;
 import org.springframework.transaction.annotation.Transactional;
 
 import se.su.dsv.scipro.data.dao.interfaces.UserDao;
+import se.su.dsv.scipro.data.dataobjects.MessageBoard;
 import se.su.dsv.scipro.data.dataobjects.Role;
 import se.su.dsv.scipro.data.dataobjects.User;
 
@@ -23,8 +24,7 @@ import se.su.dsv.scipro.data.dataobjects.User;
  * 
  */
 @Repository("userDao")
-public class UserDaoJPAImp extends LazyDeleteAbstractDaoJPAImp<User> implements
-UserDao {
+public class UserDaoJPAImp extends LazyDeleteAbstractDaoJPAImp<User> implements UserDao {
 
 	public UserDaoJPAImp() {
 		super(User.class);
@@ -34,10 +34,8 @@ UserDao {
 	public User getUserByIdentifier(final Long identifier) {
 		return getJpaTemplate().execute(new JpaCallback<User>() {
 			public User doInJpa(EntityManager em) throws PersistenceException {
-				TypedQuery<User> query = em
-				.createQuery(
-						"select u FROM User u WHERE u.identifier = :identifier",
-						User.class);
+				TypedQuery<User> query = em.createQuery(
+						"select u FROM User u WHERE u.identifier = :identifier", User.class);
 				query.setParameter("identifier", identifier);
 				try {
 					return query.getSingleResult();
@@ -53,8 +51,7 @@ UserDao {
 		return getJpaTemplate().execute(new JpaCallback<User>() {
 			public User doInJpa(EntityManager em) throws PersistenceException {
 				TypedQuery<User> query = em.createQuery(
-						"select u FROM User u WHERE u.emailAddress = :email",
-						User.class);
+						"select u FROM User u WHERE u.emailAddress = :email", User.class);
 				query.setParameter("email", emailAddress);
 				try {
 					return query.getSingleResult();
@@ -67,16 +64,18 @@ UserDao {
 
 	@Transactional
 	@Deprecated
-	public User getUserByUsername(final String username){
-		return this.getUserByUsername(username, "DSV.SU.SE");		
+	public User getUserByUsername(final String username) {
+		return this.getUserByUsername(username, "DSV.SU.SE");
 	}
 
-	@Transactional( readOnly=true )
-	public User getUserByUsername(final String username, final String realm){
-		return getJpaTemplate().execute(new JpaCallback<User>() {
+	@Transactional(readOnly = true)
+	public User getUserByUsername(final String username, final String realm) {
+		return getJpaTemplate().execute(new JpaCallback<User>() {
 			public User doInJpa(EntityManager em) throws PersistenceException {
-				TypedQuery<User> query = em.createQuery(
-						"SELECT u FROM User u, Username un WHERE un.username = :username AND un.realm = :realm AND un.user = u AND u.deleted = false", User.class);
+				TypedQuery<User> query = em
+						.createQuery(
+								"SELECT u FROM User u, Username un WHERE un.username = :username AND un.realm = :realm AND un.user = u AND u.deleted = false",
+								User.class);
 				query.setParameter("username", username);
 				query.setParameter("realm", realm);
 				query.setHint(QueryHints.HINT_CACHEABLE, "true");
@@ -89,29 +88,20 @@ UserDao {
 		});
 	}
 
-
 	@Override
 	@Transactional(readOnly = true)
 	public List<User> findUserQuery(final String searchQuery, final int limit) {
 		return getJpaTemplate().execute(new JpaCallback<List<User>>() {
 			@Override
-			public List<User> doInJpa(EntityManager em)
-			throws PersistenceException {
-				TypedQuery<User> query = em
-				.createQuery(
+			public List<User> doInJpa(EntityManager em) throws PersistenceException {
+				TypedQuery<User> query = em.createQuery(
 						"select distinct u FROM  User u, Username un WHERE (lower(un.username) LIKE '"
-						+ searchQuery
-						+ "%' OR "
-						+ "lower(u.firstName) LIKE '"
-						+ searchQuery
-						+ "%' OR lower(u.firstName || ' ' || u.lastName) LIKE '"
-						+ searchQuery
-						+ "%' OR lower(u.lastName) LIKE '"
-						+ searchQuery
-						+ "%' OR lower(u.emailAddress) LIKE '"
-						+ searchQuery + "%') AND "
-						+ "un.user = u ORDER BY u.lastName ASC",
-						User.class);
+								+ searchQuery + "%' OR " + "lower(u.firstName) LIKE '"
+								+ searchQuery
+								+ "%' OR lower(u.firstName || ' ' || u.lastName) LIKE '"
+								+ searchQuery + "%' OR lower(u.lastName) LIKE '" + searchQuery
+								+ "%' OR lower(u.emailAddress) LIKE '" + searchQuery + "%') AND "
+								+ "un.user = u ORDER BY u.lastName ASC", User.class);
 				query.setMaxResults(limit);
 				query.setHint(QueryHints.HINT_CACHEABLE, "true");
 				try {
@@ -125,28 +115,20 @@ UserDao {
 
 	@Override
 	@Transactional(readOnly = true)
-	public List<User> findUserQuery(final String searchQuery, final int first,
-			final int count) {
+	public List<User> findUserQuery(final String searchQuery, final int first, final int count) {
 		return getJpaTemplate().execute(new JpaCallback<List<User>>() {
 			@Override
-			public List<User> doInJpa(EntityManager em)
-			throws PersistenceException {
-				TypedQuery<User> query = em
-				.createQuery(
+			public List<User> doInJpa(EntityManager em) throws PersistenceException {
+				TypedQuery<User> query = em.createQuery(
 						"select distinct u FROM  User u, Username un WHERE (lower(un.username) LIKE '"
-						+ searchQuery
-						+ "%' OR "
-						+ "lower(u.firstName) LIKE '"
-						+ searchQuery
-						+ "%' OR lower(u.firstName || ' ' || u.lastName) LIKE '"
-						+ searchQuery
-						+ "%' OR lower(u.lastName) LIKE '"
-						+ searchQuery
-						+ "%' OR lower(u.emailAddress) LIKE '"
-						+ searchQuery + "%') AND "
-						+ "un.user = u +" +
+								+ searchQuery + "%' OR " + "lower(u.firstName) LIKE '"
+								+ searchQuery
+								+ "%' OR lower(u.firstName || ' ' || u.lastName) LIKE '"
+								+ searchQuery + "%' OR lower(u.lastName) LIKE '" + searchQuery
+								+ "%' OR lower(u.emailAddress) LIKE '" + searchQuery + "%') AND "
+								+ "un.user = u " +
 
-						"ORDER BY u.lastName ASC", User.class);
+								"ORDER BY u.lastName ASC", User.class);
 				query.setHint(QueryHints.HINT_CACHEABLE, "true");
 				query.setFirstResult(first);
 				query.setMaxResults(count);
@@ -161,12 +143,11 @@ UserDao {
 
 	@Override
 	@Transactional(readOnly = true)
-	public List<User> findUserQuery(final String searchQuery, final int first,
-			final int count, final Class<? extends Role> roleClass) {
+	public List<User> findUserQuery(final String searchQuery, final int first, final int count,
+			final Class<? extends Role> roleClass, final List<User> notIncludeList) {
 		return getJpaTemplate().execute(new JpaCallback<List<User>>() {
 			@Override
-			public List<User> doInJpa(EntityManager em)
-			throws PersistenceException {
+			public List<User> doInJpa(EntityManager em) throws PersistenceException {
 
 				String queryString = "SELECT DISTINCT un.user FROM Username un ";
 				if (roleClass != null) {
@@ -175,27 +156,28 @@ UserDao {
 				if (searchQuery == null || searchQuery.equals("")) {
 					queryString += "WHERE 1 = 1 ";
 				} else {
-					queryString += "WHERE (lower(un.username) LIKE '"
-						+ searchQuery
-						+ "%' OR "
-						+ "lower(un.user.firstName) LIKE '"
-						+ searchQuery
-						+ "%' OR lower(un.user.firstName || ' ' || un.user.lastName) LIKE '"
-						+ searchQuery
-						+ "%' OR lower(un.user.lastName) LIKE '"
-						+ searchQuery
-						+ "%' OR lower(un.user.emailAddress) LIKE '"
-						+ searchQuery + "%') ";
+					queryString += "WHERE (lower(un.username) LIKE '" + searchQuery + "%' OR "
+							+ "lower(un.user.firstName) LIKE '" + searchQuery
+							+ "%' OR lower(un.user.firstName || ' ' || un.user.lastName) LIKE '"
+							+ searchQuery + "%' OR lower(un.user.lastName) LIKE '" + searchQuery
+							+ "%' OR lower(un.user.emailAddress) LIKE '" + searchQuery + "%') ";
 				}
 				if (roleClass != null) {
 					queryString += "AND un.user = rc.user  AND rc.deleted = false";
 				}
+				if (notIncludeList != null) {
+					queryString += " AND un.user NOT IN (:notIncludeList)";
+				}
 				queryString += " ORDER BY un.user.lastName ASC";
-				TypedQuery<User> query = em
-				.createQuery(queryString, User.class);
+
+				TypedQuery<User> query = em.createQuery(queryString, User.class);
+				if (notIncludeList != null) {
+					query.setParameter("notIncludeList", notIncludeList);
+				}
 				query.setHint(QueryHints.HINT_CACHEABLE, "true");
 				query.setFirstResult(first);
 				query.setMaxResults(count);
+
 				try {
 					return query.getResultList();
 				} catch (NoResultException e) {
@@ -208,12 +190,12 @@ UserDao {
 
 	@Override
 	@Transactional(readOnly = true)
-	public int findUserQueryCount(final String searchQuery,final Class<? extends Role> roleClass) {
+	public int findUserQueryCount(final String searchQuery, final Class<? extends Role> roleClass,
+			final List<User> notIncludeList) {
 		return getJpaTemplate().execute(new JpaCallback<Integer>() {
 
 			@Override
-			public Integer doInJpa(EntityManager em)
-			throws PersistenceException {
+			public Integer doInJpa(EntityManager em) throws PersistenceException {
 				String queryString = "SELECT COUNT (DISTINCT un.user) FROM Username un ";
 				if (roleClass != null) {
 					queryString += ", " + roleClass.getName() + " rc ";
@@ -221,26 +203,25 @@ UserDao {
 				if (searchQuery == null || searchQuery.equals("")) {
 					queryString += "WHERE 1 = 1  ";
 				} else {
-					queryString += "WHERE "
-						+ "(lower(un.username) LIKE '"
-						+ searchQuery
-						+ "%' OR "
-						+ "lower(un.user.firstName) LIKE '"
-						+ searchQuery
-						+ "%' OR lower(un.user.firstName || ' ' || un.user.lastName) LIKE '"
-						+ searchQuery
-						+ "%' OR lower(un.user.lastName) LIKE '"
-						+ searchQuery
-						+ "%' OR lower(un.user.emailAddress) LIKE '"
-						+ searchQuery + "%') ";
+					queryString += "WHERE " + "(lower(un.username) LIKE '" + searchQuery + "%' OR "
+							+ "lower(un.user.firstName) LIKE '" + searchQuery
+							+ "%' OR lower(un.user.firstName || ' ' || un.user.lastName) LIKE '"
+							+ searchQuery + "%' OR lower(un.user.lastName) LIKE '" + searchQuery
+							+ "%' OR lower(un.user.emailAddress) LIKE '" + searchQuery + "%')  ";
 				}
 
 				if (roleClass != null) {
-					queryString += "AND un.user = rc.user  AND rc.deleted = false";
+					queryString += " AND un.user = rc.user  AND rc.deleted = false";
 				}
-				TypedQuery<Long> query = em
-				.createQuery(queryString, Long.class);
 
+				if (notIncludeList != null) {
+					queryString += " AND un.user NOT IN (:notIncludeList)";
+				}
+
+				TypedQuery<Long> query = em.createQuery(queryString, Long.class);
+				if (notIncludeList != null) {
+					query.setParameter("notIncludeList", notIncludeList);
+				}
 				return (query.getSingleResult()).intValue();
 			}
 		});
@@ -248,18 +229,16 @@ UserDao {
 
 	@Override
 	@Transactional(readOnly = true)
-	public List<User> findUserQuery(final String searchQuery,
-			final boolean students, final boolean supervisors,
-			final boolean sysadmins, final int limit) {
+	public List<User> findUserQuery(final String searchQuery, final boolean students,
+			final boolean supervisors, final boolean sysadmins, final int limit) {
 		return getJpaTemplate().execute(new JpaCallback<List<User>>() {
-			public List<User> doInJpa(EntityManager em)
-			throws PersistenceException {
+			public List<User> doInJpa(EntityManager em) throws PersistenceException {
 
 				String selectClause = "select distinct u ";
 				String fromClause = "from User u ";// , Username un ";
 
 				String conditions = "where (lower(u.firstName) LIKE lower(:q) "
-					+ "OR lower(u.lastName) LIKE lower(:q)) ";
+						+ "OR lower(u.lastName) LIKE lower(:q)) ";
 				// "OR (lower(un.username) LIKE lower(:q) " +
 				// "and un.user = u)) ";
 
@@ -292,8 +271,7 @@ UserDao {
 
 				String orderClause = "order by u.lastName asc";
 
-				String q = selectClause + fromClause + joinClause + conditions
-				+ orderClause;
+				String q = selectClause + fromClause + joinClause + conditions + orderClause;
 				TypedQuery<User> query = em.createQuery(q, User.class);
 				query.setParameter("q", searchQuery.trim() + "%");
 
@@ -317,31 +295,21 @@ UserDao {
 		});
 	}
 
-
 	@Override
 	@Transactional(readOnly = true)
 	public int findUserQueryCount(final String searchQuery) {
 		return getJpaTemplate().execute(new JpaCallback<Integer>() {
 
 			@Override
-			public Integer doInJpa(EntityManager em)
-			throws PersistenceException {
-				TypedQuery<Long> query = em
-				.createQuery(
+			public Integer doInJpa(EntityManager em) throws PersistenceException {
+				TypedQuery<Long> query = em.createQuery(
 						"SELECT COUNT (DISTINCT u)  FROM  User u, Username un WHERE (lower(un.username) LIKE '"
-						+ searchQuery
-						+ "%' OR "
-						+ "lower(u.firstName) LIKE '"
-						+ searchQuery
-						+ "%' OR lower(u.firstName || ' ' || u.lastName) LIKE '"
-						+ searchQuery
-						+ "%' OR lower(u.lastName) LIKE '"
-						+ searchQuery
-						+ "%' OR lower(u.emailAddress) LIKE '"
-						+ searchQuery
-						+ "%') AND "
-						+ "un.user = u ORDER BY u.lastName ASC",
-						Long.class);
+								+ searchQuery + "%' OR " + "lower(u.firstName) LIKE '"
+								+ searchQuery
+								+ "%' OR lower(u.firstName || ' ' || u.lastName) LIKE '"
+								+ searchQuery + "%' OR lower(u.lastName) LIKE '" + searchQuery
+								+ "%' OR lower(u.emailAddress) LIKE '" + searchQuery + "%') AND "
+								+ "un.user = u ORDER BY u.lastName ASC", Long.class);
 
 				return (query.getSingleResult()).intValue();
 			}
diff --git a/src/main/java/se/su/dsv/scipro/data/dao/jpa/WebNotificationDaoJPAImp.java b/src/main/java/se/su/dsv/scipro/data/dao/jpa/WebNotificationDaoJPAImp.java
new file mode 100644
index 0000000000..061c8caeb2
--- /dev/null
+++ b/src/main/java/se/su/dsv/scipro/data/dao/jpa/WebNotificationDaoJPAImp.java
@@ -0,0 +1,105 @@
+/**
+ * 
+ */
+package se.su.dsv.scipro.data.dao.jpa;
+
+
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.persistence.EntityManager;
+import javax.persistence.NoResultException;
+import javax.persistence.PersistenceException;
+import javax.persistence.TypedQuery;
+
+import org.hibernate.ejb.QueryHints;
+import org.springframework.orm.jpa.JpaCallback;
+import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
+
+import se.su.dsv.scipro.data.dao.interfaces.WebNotificationDao;
+import se.su.dsv.scipro.data.dataobjects.WebNotification;
+import se.su.dsv.scipro.data.dataobjects.User;
+
+/**
+ * @author Johan Aschan - aschan@dsv.su.se
+ *
+ */
+
+@Repository("notificationDao")
+public class WebNotificationDaoJPAImp extends AbstractDaoJPAImp<WebNotification>
+		implements WebNotificationDao {
+
+	public WebNotificationDaoJPAImp() {
+		super(WebNotification.class);
+	}
+	
+	@Transactional(readOnly = true)
+	@Override
+	public List<WebNotification> getWebNotifications(final User user){
+		return getJpaTemplate().execute(new JpaCallback<List<WebNotification>>() {
+			@Override
+			public List<WebNotification> doInJpa(EntityManager em)
+					throws PersistenceException {
+				String q = "SELECT n FROM WebNotification n "
+						+ "where n.user = :user AND n.readByUser = false ORDER BY n.dateCreated DESC";
+
+				TypedQuery<WebNotification> query = em.createQuery(q,
+						WebNotification.class);
+				query.setParameter("user", user);
+				query.setHint(QueryHints.HINT_CACHEABLE, "true");
+				try {
+					return query.getResultList();
+				} catch (NoResultException e) {
+					return new ArrayList<WebNotification>();
+				}
+			}
+		});
+	}
+	
+	@Transactional(readOnly = true)
+	@Override
+	public List<WebNotification> getWebNotifications(final User user,final int first, final int count){
+		return getJpaTemplate().execute(new JpaCallback<List<WebNotification>>() {
+			@Override
+			public List<WebNotification> doInJpa(EntityManager em)
+					throws PersistenceException {
+				String q = "SELECT n FROM WebNotification n "
+						+ "where n.user = :user AND n.readByUser = false ORDER BY n.dateCreated DESC";
+
+				TypedQuery<WebNotification> query = em.createQuery(q,
+						WebNotification.class);
+				query.setParameter("user", user);
+				query.setHint(QueryHints.HINT_CACHEABLE, "true");
+				query.setFirstResult(first);
+				query.setMaxResults(count);
+				try {
+					return query.getResultList();
+				} catch (NoResultException e) {
+					return new ArrayList<WebNotification>();
+				}
+			}
+		});
+	}
+	
+	@Transactional(readOnly = true)
+	@Override
+	public int getCountOfWebNotifications(final User user){
+		return getJpaTemplate().execute(new JpaCallback<Integer>() {
+			@Override
+			public Integer doInJpa(EntityManager em)
+					throws PersistenceException {
+				String q = "SELECT COUNT (n) FROM WebNotification n "
+						+ "where n.user = :user AND n.readByUser = false  ";
+
+				TypedQuery<Long> query = em.createQuery(q,
+						Long.class);
+				query.setParameter("user", user);
+				query.setHint(QueryHints.HINT_CACHEABLE, "true");
+
+				return query.getSingleResult().intValue();
+			}
+		});
+	}
+}
\ No newline at end of file
diff --git a/src/main/java/se/su/dsv/scipro/data/dataobjects/Board.java b/src/main/java/se/su/dsv/scipro/data/dataobjects/Board.java
deleted file mode 100644
index 7025f9efad..0000000000
--- a/src/main/java/se/su/dsv/scipro/data/dataobjects/Board.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/**
- * 
- */
-package se.su.dsv.scipro.data.dataobjects;
-
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.MappedSuperclass;
-import javax.persistence.OneToOne;
-
-/**
- * @author Johan Aschan - aschan@dsv.su.se
- *
- */
-
-@MappedSuperclass
-public abstract class Board extends DomainObject{
-
-	@Id
-	@GeneratedValue
-	private Long id;
-	
-	private String title;
-	
-	@OneToOne
-	private Project project;
-	
-	public Long getId() {
-		return id;
-	}
-	
-
-	public String getTitle() {
-		return title;
-	}
-
-
-
-
-	public void setTitle(String title) {
-		this.title = title;
-	}
-
-
-
-
-	public Project getProject() {
-		return project;
-	}
-
-
-
-
-	public void setProject(Project project) {
-		this.project = project;
-	}
-
-
-
-
-	@Override
-	public int hashCode() {
-		final int prime = 31;
-		int result = 1;
-		result = prime * result + ((id == null) ? 0 : id.hashCode());
-		return result;
-	}
-
-
-
-	@Override
-	public boolean equals(Object obj) {
-		if (this == obj)
-			return true;
-		if (obj == null)
-			return false;
-		if (getClass() != obj.getClass())
-			return false;
-		Board other = (Board) obj;
-		if (id == null) {
-			if (other.id != null)
-				return false;
-		} else if (!id.equals(other.id))
-			return false;
-		return true;
-	}
-
-}
diff --git a/src/main/java/se/su/dsv/scipro/data/dataobjects/BoardMessage.java b/src/main/java/se/su/dsv/scipro/data/dataobjects/BoardMessage.java
index ca516822b5..6dbf3d0161 100644
--- a/src/main/java/se/su/dsv/scipro/data/dataobjects/BoardMessage.java
+++ b/src/main/java/se/su/dsv/scipro/data/dataobjects/BoardMessage.java
@@ -7,9 +7,14 @@ import java.util.ArrayList;
 import java.util.List;
 
 import javax.persistence.Cacheable;
+import javax.persistence.CascadeType;
 import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Lob;
 import javax.persistence.ManyToOne;
 import javax.persistence.OneToMany;
+import javax.persistence.OneToOne;
 import javax.persistence.Table;
 
 import org.hibernate.annotations.Cache;
@@ -26,13 +31,30 @@ import se.su.dsv.scipro.data.dataobjects.interfaces.Commentable;
 @Table(name="board_message")
 @Cacheable(true)
 @Cache(usage= CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
-public class BoardMessage extends Message implements Commentable {
+public class BoardMessage extends DomainObject implements Commentable, Comparable<BoardMessage> {
 	
+	private static final long serialVersionUID = 1L;
+	
+	@Id
+	@GeneratedValue
+	private Long id;
+	
+	@Lob
+	private String message;
+	
+	@ManyToOne(optional=false)
+	private User fromUser;
+
 	@OneToMany
 	private List<BoardMessage> replyMessageList = new ArrayList<BoardMessage>(0);
 	
 	@ManyToOne(optional=false)
 	private MessageBoard messageBoard;
+	
+	@Override
+	public Long getId() {
+		return id;
+	}
 
 	public List<BoardMessage> getReplyMessageList() {
 		return replyMessageList;
@@ -42,7 +64,6 @@ public class BoardMessage extends Message implements Commentable {
 		this.replyMessageList = replyMessageList;
 	}
 	
-	
 
 	/**
 	 * @return the messageBoard
@@ -62,5 +83,69 @@ public class BoardMessage extends Message implements Commentable {
 	public String getCommentKey() {
 		return BoardMessage.class.getCanonicalName().toString();
 	}
+	
+
+	
+
+	public String getMessage() {
+		return message;
+	}
+
+	public void setMessage(String message) {
+		this.message = message;
+	}
+
+	public User getFromUser() {
+		return fromUser;
+	}
+
+	public void setFromUser(User fromUser) {
+		this.fromUser = fromUser;
+	}
+
+
+	@Override
+	public int hashCode() {
+		final int prime = 31;
+		int result = 1;
+		result = prime * result + ((id == null) ? 0 : id.hashCode());
+		return result;
+	}
+
+	@Override
+	public boolean equals(Object obj) {
+		if (this == obj)
+			return true;
+		if (obj == null)
+			return false;
+		if (getClass() != obj.getClass())
+			return false;
+		BoardMessage other = (BoardMessage) obj;
+		if (id == null) {
+			if (other.id != null)
+				return false;
+		} else if (!id.equals(other.id))
+			return false;
+		return true;
+	}	
+	
+	@Override
+	public int compareTo(BoardMessage o) {
+		if( this == o )
+			return 0;
+		
+		if(this.getDateCreated() != null && o.getDateCreated() != null){
+			//Reversed from what you might expect, because normally we want to display newest comment first in listviews
+			return o.getDateCreated().compareTo(this.getDateCreated());
+		}
+		if(this.getId() != null && o.getId() != null)
+			return this.getId().compareTo(o.getId());
+		if(this.message != null && o.message != null)
+			return message.compareTo(o.message);
+		//By now we have to conclude the two objects are basically two objects full of nulls 
+		return 0;
+	}
+	
+	
 
 }
diff --git a/src/main/java/se/su/dsv/scipro/data/dataobjects/CommentThread.java b/src/main/java/se/su/dsv/scipro/data/dataobjects/CommentThread.java
index dbd49960e5..055b1f4679 100644
--- a/src/main/java/se/su/dsv/scipro/data/dataobjects/CommentThread.java
+++ b/src/main/java/se/su/dsv/scipro/data/dataobjects/CommentThread.java
@@ -40,7 +40,7 @@ import se.su.dsv.scipro.data.dataobjects.interfaces.Commentable;
 public class CommentThread extends DomainObject{
 	
 	private static final long serialVersionUID = 1L;
-
+	
 	@Id
 	@GeneratedValue
 	private Long id;
diff --git a/src/main/java/se/su/dsv/scipro/data/dataobjects/FinalSeminar.java b/src/main/java/se/su/dsv/scipro/data/dataobjects/FinalSeminar.java
index f1ddce16d3..a9add19e1d 100644
--- a/src/main/java/se/su/dsv/scipro/data/dataobjects/FinalSeminar.java
+++ b/src/main/java/se/su/dsv/scipro/data/dataobjects/FinalSeminar.java
@@ -24,79 +24,82 @@ import javax.persistence.Table;
 import org.hibernate.annotations.Cache;
 import org.hibernate.annotations.CacheConcurrencyStrategy;
 
+import se.su.dsv.scipro.data.dataobjects.interfaces.Commentable;
 import se.su.dsv.scipro.data.enums.FinalSeminarLanguages;
 
 /**
- * @author Johan Aschan -  aschan@dsv.su.se
- *
+ * @author Johan Aschan - aschan@dsv.su.se
+ * 
  */
 
 @Entity
-@Table(name="final_seminar")
+@Table(name = "final_seminar")
 @Cacheable(true)
-@Cache(usage= CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
-public class FinalSeminar extends DomainObject{
-	
+@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
+public class FinalSeminar extends DomainObject implements Commentable {
+
 	private static final long serialVersionUID = 1L;
 
 	@Id
 	@GeneratedValue
 	private Long id;
-	
+
 	@Override
 	public Long getId() {
 		return id;
 	}
-	
-	@ManyToOne(optional=false)
+
+	@ManyToOne(optional = false)
 	private Project project;
-	
-	@Basic(optional=false)
+
+	@Basic(optional = false)
 	private Date startDate;
-	
-	@Basic(optional=false)
+
+	@Basic(optional = false)
 	private Date endDate;
-	
-	@Basic(optional=false)
+
+	@Basic(optional = false)
 	private String room;
-	
-	@OneToMany(mappedBy="finalSeminar")
+
+	@OneToMany(mappedBy = "finalSeminar")
 	private List<FinalSeminarActiveParticipation> activeParticipations = new ArrayList<FinalSeminarActiveParticipation>();
-	
-	@OneToMany(mappedBy="finalSeminar")
+
+	@OneToMany(mappedBy = "finalSeminar")
 	private List<FinalSeminarOpposition> oppositions = new ArrayList<FinalSeminarOpposition>();
-	
+
 	/*
-	 * Cascading delete, set document to nul will delete the filedescription
-	 * but not the actual file. Use FinarSeminarUploadController.deleteSeminarReport
+	 * Cascading delete, set document to nul will delete the filedescription but
+	 * not the actual file. Use FinarSeminarUploadController.deleteSeminarReport
 	 * to delete the document
 	 */
 	@OneToOne(optional = true, orphanRemoval = true, cascade = CascadeType.ALL)
 	private FileDescription document;
-	
+
 	private Date documentUploadDate;
-	
+
 	private String turnitinId;
-	
-	@Basic(optional=false)
+
+	@Basic(optional = false)
 	private boolean checkedForPlagirism = false;
-	
+
 	@ManyToOne(optional = true)
 	private User documentUploader;
-	
+
 	@Basic(optional = false)
 	@Enumerated(EnumType.STRING)
 	private FinalSeminarLanguages presentationLanguage = FinalSeminarLanguages.ENGLISH;
-	
+
 	@Basic(optional = false)
 	@Enumerated(EnumType.STRING)
 	private FinalSeminarLanguages reportLanguage = FinalSeminarLanguages.ENGLISH;
+
 	/*
-	 * Make sure that the uploader and uload date will be reset when document is null
+	 * Make sure that the uploader and uload date will be reset when document is
+	 * null
 	 */
 	@PreUpdate
-	public void checkReport(){
-		if(document == null){
+	public void checkReport() {
+		if (document == null) {
 			setDocumentUploader(null);
 			setDocumentUploadDate(null);
 		}
@@ -105,13 +108,11 @@ public class FinalSeminar extends DomainObject{
 	public Project getProject() {
 		return project;
 	}
-	
+
 	public void setProject(Project project) {
 		this.project = project;
 	}
-	
-	
-	
+
 	public Date getEndDate() {
 		return endDate;
 	}
@@ -123,19 +124,19 @@ public class FinalSeminar extends DomainObject{
 	public Date getStartDate() {
 		return startDate;
 	}
-	
+
 	public void setStartDate(Date date) {
 		this.startDate = date;
 	}
-	
+
 	public String getRoom() {
 		return room;
 	}
-	
+
 	public void setRoom(String room) {
 		this.room = room;
 	}
-	
+
 	public void setActiveParticipations(List<FinalSeminarActiveParticipation> activeParticipations) {
 		this.activeParticipations = activeParticipations;
 	}
@@ -155,23 +156,23 @@ public class FinalSeminar extends DomainObject{
 	public void setDocument(FileDescription document) {
 		this.document = document;
 	}
-	
+
 	public FileDescription getDocument() {
 		return document;
 	}
-	
+
 	public void setDocumentUploadDate(Date documentUploadDate) {
 		this.documentUploadDate = documentUploadDate;
 	}
-	
+
 	public Date getDocumentUploadDate() {
 		return documentUploadDate;
 	}
-	
+
 	public void setDocumentUploader(User documentUploader) {
 		this.documentUploader = documentUploader;
 	}
-	
+
 	public User getDocumentUploader() {
 		return documentUploader;
 	}
@@ -211,11 +212,23 @@ public class FinalSeminar extends DomainObject{
 	}
 
 	/**
-	 * @param checkedForPlagirism the checkedForPlagirism to set
+	 * @param checkedForPlagirism
+	 *            the checkedForPlagirism to set
 	 */
 	public void setCheckedForPlagirism(boolean checkedForPlagirism) {
 		this.checkedForPlagirism = checkedForPlagirism;
 	}
-	
-	
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see
+	 * se.su.dsv.scipro.data.dataobjects.interfaces.Commentable#getCommentKey()
+	 */
+	@Override
+	final public String getCommentKey() {
+		return FinalSeminar.class.getCanonicalName().toString();
+
+	}
+
 }
\ No newline at end of file
diff --git a/src/main/java/se/su/dsv/scipro/data/dataobjects/GeneralSystemSettings.java b/src/main/java/se/su/dsv/scipro/data/dataobjects/GeneralSystemSettings.java
index 496f3c5d79..6b2fba2e07 100644
--- a/src/main/java/se/su/dsv/scipro/data/dataobjects/GeneralSystemSettings.java
+++ b/src/main/java/se/su/dsv/scipro/data/dataobjects/GeneralSystemSettings.java
@@ -39,6 +39,15 @@ public class GeneralSystemSettings extends DomainObject{
 	@Basic(optional=false)
 	private int daysBeforeFinalSeminarCanRegisterAsOpponent = 3;
 	
+	@Basic(optional=false)
+	private String turnItInUsername = "joha-asc";	
+	
+	@Basic(optional=false)
+	private String turnItInForname = "Johan";	
+	
+	@Basic(optional=false)
+	private String turnItInSurname = "Aschan";
+	
 	@Basic(optional=true)
 	private int projectPartnerDaysToLive;	
 
@@ -52,6 +61,17 @@ public class GeneralSystemSettings extends DomainObject{
 	private boolean peerDisplayNumberOfReviewsPerformed = true;
 	
 	@Basic(optional=false)
+	private boolean mailNotifications = true;
+	
+	@Basic(optional=false)
+	private String mailFromName = "SciPro";
+	
+	@Basic(optional=false)
+	private String systemFromMail = "no-reply@thesis.dsv.su.se";
+	
+	@Basic(optional=false)
+	private String smtpServer = "mail.dsv.su.se";
+
 	private boolean peerDisplayLatestReviews = true;
 	
 	@Basic(optional=false)
@@ -59,6 +79,7 @@ public class GeneralSystemSettings extends DomainObject{
 	
 	@Basic(optional=false)
 	private boolean publicReviewsActivated = true;
+
 	
 	public GeneralSystemSettings(){
 	}
@@ -125,6 +146,91 @@ public class GeneralSystemSettings extends DomainObject{
 	public boolean isPeerDisplayNumberOfReviewsPerformed() {
 		return peerDisplayNumberOfReviewsPerformed;
 	}
+	/**
+	 * @return the turnItInUsername
+	 */
+	public String getTurnItInUsername() {
+		return turnItInUsername;
+	}
+	/**
+	 * @param turnItInUsername the turnItInUsername to set
+	 */
+	public void setTurnItInUsername(String turnItInUsername) {
+		this.turnItInUsername = turnItInUsername;
+	}
+	/**
+	 * @return the turnItInForname
+	 */
+	public String getTurnItInForname() {
+		return turnItInForname;
+	}
+	/**
+	 * @param turnItInForname the turnItInForname to set
+	 */
+	public void setTurnItInForname(String turnItInForname) {
+		this.turnItInForname = turnItInForname;
+	}
+	/**
+	 * @return the turnItInSurname
+	 */
+	public String getTurnItInSurname() {
+		return turnItInSurname;
+	}
+	/**
+	 * @param turnItInSurname the turnItInSurname to set
+	 */
+	public void setTurnItInSurname(String turnItInSurname) {
+		this.turnItInSurname = turnItInSurname;
+	}
+	/**
+	 * @return the mailNotifications
+	 */
+	public boolean isMailNotifications() {
+		return mailNotifications;
+	}
+	/**
+	 * @param mailNotifications the mailNotifications to set
+	 */
+	public void setMailNotifications(boolean mailNotifications) {
+		this.mailNotifications = mailNotifications;
+	}
+	/**
+	 * @return the mailFromName
+	 */
+	public String getMailFromName() {
+		return mailFromName;
+	}
+	/**
+	 * @param mailFromName the mailFromName to set
+	 */
+	public void setMailFromName(String mailFromName) {
+		this.mailFromName = mailFromName;
+	}
+	/**
+	 * @return the systemFromMail
+	 */
+	public String getSystemFromMail() {
+		return systemFromMail;
+	}
+	/**
+	 * @param systemFromMail the systemFromMail to set
+	 */
+	public void setSystemFromMail(String systemFromMail) {
+		this.systemFromMail = systemFromMail;
+	}
+	/**
+	 * @return the smtpServer
+	 */
+	public String getSmtpServer() {
+		return smtpServer;
+	}
+	/**
+	 * @param smtpServer the smtpServer to set
+	 */
+	public void setSmtpServer(String smtpServer) {
+		this.smtpServer = smtpServer;
+	}
+
 	public void setPeerDisplayLatestReviews(boolean peerDisplayLatestReviews) {
 		this.peerDisplayLatestReviews = peerDisplayLatestReviews;
 	}
@@ -144,5 +250,4 @@ public class GeneralSystemSettings extends DomainObject{
 		this.publicReviewsActivated = publicReviewsActivated;
 	}
 
-
 }
diff --git a/src/main/java/se/su/dsv/scipro/data/dataobjects/MailEvent.java b/src/main/java/se/su/dsv/scipro/data/dataobjects/MailEvent.java
index d7236eabfd..b70fb0e94d 100644
--- a/src/main/java/se/su/dsv/scipro/data/dataobjects/MailEvent.java
+++ b/src/main/java/se/su/dsv/scipro/data/dataobjects/MailEvent.java
@@ -33,11 +33,7 @@ public class MailEvent extends DomainObject {
 
 	@Id
 	@GeneratedValue
-	private Long id;
-	
-	@Basic(optional=true)
-	@Enumerated(EnumType.STRING)
-	private NotificationEventType notificationEventType;	
+	private Long id;	
 	
 	@JoinTable(name="mail_event_recipients")
 	@ManyToMany(fetch=FetchType.EAGER)
@@ -73,9 +69,8 @@ public class MailEvent extends DomainObject {
 					final String messageBody,
 					final User recipient,
 					final String fromName,
-					final String fromEmail,
-					final NotificationEventType notificationEventType){
-		this(subject,messageBody,recipient,fromName,fromEmail,null,notificationEventType);
+					final String fromEmail){
+		this(subject,messageBody,recipient,fromName,fromEmail,null);
 	}
 	
 	public MailEvent(
@@ -83,9 +78,8 @@ public class MailEvent extends DomainObject {
 					final String messageBody,
 					final Collection<User> recipients,
 					final String fromName,
-					final String fromEmail,
-					final NotificationEventType notificationEventType){
-		this(subject,messageBody,recipients,fromName,fromEmail,null,notificationEventType);
+					final String fromEmail){
+		this(subject,messageBody,recipients,fromName,fromEmail,null);
 	}
 	
 	public MailEvent(
@@ -94,16 +88,14 @@ public class MailEvent extends DomainObject {
 					final User recipient,
 					final String fromName,
 					final String fromEmail,
-					final Collection<User> replyTo,
-					final NotificationEventType notificationEventType){
+					final Collection<User> replyTo){
 		this.subject = subject;
 		this.messageBody = messageBody;
 		this.recipients.add(recipient);
 		this.fromName = fromName;
 		this.fromEmail = fromEmail;
 		if( replyTo != null )
-			this.replyTo.addAll(replyTo);
-		this.setNotificationEventType(notificationEventType);	
+			this.replyTo.addAll(replyTo);	
 	}
 	
 	public MailEvent(			
@@ -112,8 +104,7 @@ public class MailEvent extends DomainObject {
 					final Collection<User> recipients,
 					final String fromName,
 					final String fromEmail,
-					final Collection<User> replyTo,
-					final NotificationEventType notificationEventType
+					final Collection<User> replyTo
 					){
 		this.subject = subject;
 		this.messageBody = messageBody;
@@ -121,8 +112,7 @@ public class MailEvent extends DomainObject {
 		this.fromName = fromName;
 		this.fromEmail = fromEmail;
 		if( replyTo != null )
-			this.replyTo.addAll(replyTo);
-		this.setNotificationEventType(notificationEventType);		
+			this.replyTo.addAll(replyTo);		
 		
 	}
 
@@ -130,15 +120,6 @@ public class MailEvent extends DomainObject {
 		return id;
 	}
 
-
-	public void setNotificationEventType(NotificationEventType notificationEventType) {
-		this.notificationEventType = notificationEventType;
-	}
-
-	public NotificationEventType getNotificationEventType() {
-		return notificationEventType;
-	}
-
 	public Set<User> getRecipients() {
 		return recipients;
 	}
diff --git a/src/main/java/se/su/dsv/scipro/data/dataobjects/Message.java b/src/main/java/se/su/dsv/scipro/data/dataobjects/Message.java
deleted file mode 100644
index ca62f7fb65..0000000000
--- a/src/main/java/se/su/dsv/scipro/data/dataobjects/Message.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/**
- * 
- */
-package se.su.dsv.scipro.data.dataobjects;
-
-import java.util.List;
-
-import javax.persistence.Cacheable;
-import javax.persistence.DiscriminatorColumn;
-import javax.persistence.DiscriminatorType;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.Inheritance;
-import javax.persistence.InheritanceType;
-import javax.persistence.Lob;
-import javax.persistence.ManyToMany;
-import javax.persistence.ManyToOne;
-import javax.persistence.MappedSuperclass;
-import javax.persistence.OneToMany;
-import javax.persistence.Table;
-import javax.persistence.UniqueConstraint;
-
-import org.hibernate.annotations.Cache;
-import org.hibernate.annotations.CacheConcurrencyStrategy;
-
-/**
- * @author Johan Aschan - aschan@dsv.su.se
- *
- */
-@MappedSuperclass
-public abstract class Message extends DomainObject implements Comparable<Message> {
-
-	@Id
-	@GeneratedValue(strategy = GenerationType.TABLE)
-	private Long id;
-	
-	@Lob
-	private String message;
-	
-	
-	
-	@ManyToOne(optional=false)
-	private User fromUser;
-	
-	public Long getId() {
-		return id;
-	}
-
-	public String getMessage() {
-		return message;
-	}
-
-	public void setMessage(String message) {
-		this.message = message;
-	}
-
-	public User getFromUser() {
-		return fromUser;
-	}
-
-	public void setFromUser(User fromUser) {
-		this.fromUser = fromUser;
-	}
-
-
-	@Override
-	public int hashCode() {
-		final int prime = 31;
-		int result = 1;
-		result = prime * result + ((id == null) ? 0 : id.hashCode());
-		return result;
-	}
-
-	@Override
-	public boolean equals(Object obj) {
-		if (this == obj)
-			return true;
-		if (obj == null)
-			return false;
-		if (getClass() != obj.getClass())
-			return false;
-		Message other = (Message) obj;
-		if (id == null) {
-			if (other.id != null)
-				return false;
-		} else if (!id.equals(other.id))
-			return false;
-		return true;
-	}	
-	
-	@Override
-	public int compareTo(Message o) {
-		if( this == o )
-			return 0;
-		
-		if(this.getDateCreated() != null && o.getDateCreated() != null){
-			//Reversed from what you might expect, because normally we want to display newest comment first in listviews
-			return o.getDateCreated().compareTo(this.getDateCreated());
-		}
-		if(this.getId() != null && o.getId() != null)
-			return this.getId().compareTo(o.getId());
-		if(this.message != null && o.message != null)
-			return message.compareTo(o.message);
-		//By now we have to conclude the two objects are basically two objects full of nulls 
-		return 0;
-	}
-}
diff --git a/src/main/java/se/su/dsv/scipro/data/dataobjects/MessageBoard.java b/src/main/java/se/su/dsv/scipro/data/dataobjects/MessageBoard.java
index f55309a2a2..ec7ab1259f 100644
--- a/src/main/java/se/su/dsv/scipro/data/dataobjects/MessageBoard.java
+++ b/src/main/java/se/su/dsv/scipro/data/dataobjects/MessageBoard.java
@@ -8,10 +8,16 @@ import java.util.List;
 import java.util.SortedSet;
 import java.util.TreeSet;
 
+import javax.persistence.Basic;
 import javax.persistence.Cacheable;
 import javax.persistence.CascadeType;
+import javax.persistence.Column;
 import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
 import javax.persistence.OneToMany;
+import javax.persistence.PrePersist;
+import javax.persistence.PreUpdate;
 import javax.persistence.Table;
 
 import org.hibernate.annotations.Cache;
@@ -19,6 +25,8 @@ import org.hibernate.annotations.CacheConcurrencyStrategy;
 import org.hibernate.annotations.Sort;
 import org.hibernate.annotations.SortType;
 
+import se.su.dsv.scipro.data.dataobjects.interfaces.Commentable;
+
 /**
  * @author Johan Aschan - aschan@dsv.su.se
  *
@@ -28,7 +36,40 @@ import org.hibernate.annotations.SortType;
 @Table(name="message_board")
 @Cacheable(true)
 @Cache(usage= CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
-public class MessageBoard extends Board {
+public class MessageBoard extends DomainObject{
+	
+	private static final long serialVersionUID = 1L;
+	
+	@Id
+	@GeneratedValue
+	private Long id;
+	
+	@Override
+	public Long getId() {
+		return id;
+	}
+	
+	@Basic(optional=false)
+	public String title;
+	
+	@Basic(optional=false)
+	@Column(length=255)
+	private String commentableKey;
+	@Basic(optional=false)
+	private Long commentableId;
+	
+	public MessageBoard() { }
+	public MessageBoard(Commentable commentable){
+		this.setCommentableKey(commentable.getCommentKey());
+		this.setCommentableId(commentable.getId());
+	}
+	
+	@PreUpdate
+	@PrePersist
+	public void validate(){
+		if(getCommentableKey().length() > 255)
+			throw new IllegalArgumentException("CommentThread-commentableKey may not be longer than 255 characters");
+	}
 	
 
 	
@@ -36,7 +77,7 @@ public class MessageBoard extends Board {
 	@OneToMany(mappedBy="messageBoard", orphanRemoval=true, cascade=CascadeType.ALL, targetEntity=BoardMessage.class)
 	private SortedSet<BoardMessage> boardMessageSet = new TreeSet<BoardMessage>();
 
-	
+
 	public List<BoardMessage> getBoardMessageList() {
 		return new ArrayList<BoardMessage>(boardMessageSet);
 	}
@@ -49,5 +90,46 @@ public class MessageBoard extends Board {
 	public void setBoardMessageSet( SortedSet<BoardMessage> boardMessageList) {
 		this.boardMessageSet = boardMessageList;
 	}
+	/**
+	 * @return the commentableKey
+	 */
+	public String getCommentableKey() {
+		return commentableKey;
+	}
+	/**
+	 * @param commentableKey the commentableKey to set
+	 */
+	public void setCommentableKey(String commentableKey) {
+		this.commentableKey = commentableKey;
+	}
+	/**
+	 * @return the commentableId
+	 */
+	public Long getCommentableId() {
+		return commentableId;
+	}
+	/**
+	 * @param commentableId the commentableId to set
+	 */
+	public void setCommentableId(Long commentableId) {
+		this.commentableId = commentableId;
+	}
+	
+	
+	/**
+	 * @return the title
+	 */
+	public String getTitle() {
+		return title;
+	}
+	/**
+	 * @param title the title to set
+	 */
+	public void setTitle(String title) {
+		this.title = title;
+	}
+	/* (non-Javadoc)
+	 * @see se.su.dsv.scipro.data.dataobjects.interfaces.Commentable#getCommentKey()
+	 */
 	
 }
diff --git a/src/main/java/se/su/dsv/scipro/data/dataobjects/PrivateMessage.java b/src/main/java/se/su/dsv/scipro/data/dataobjects/PrivateMessage.java
index 90d33b6b9d..436de04478 100644
--- a/src/main/java/se/su/dsv/scipro/data/dataobjects/PrivateMessage.java
+++ b/src/main/java/se/su/dsv/scipro/data/dataobjects/PrivateMessage.java
@@ -29,7 +29,9 @@ import org.hibernate.annotations.CacheConcurrencyStrategy;
 @Cache(usage= CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
 public class PrivateMessage extends LazyDeletableDomainObject{
 	
-	
+
+	private static final long serialVersionUID = 1L;
+
 	@Id
 	@GeneratedValue
 	private Long id;
diff --git a/src/main/java/se/su/dsv/scipro/data/dataobjects/Project.java b/src/main/java/se/su/dsv/scipro/data/dataobjects/Project.java
index 04457a5783..455ff5a680 100644
--- a/src/main/java/se/su/dsv/scipro/data/dataobjects/Project.java
+++ b/src/main/java/se/su/dsv/scipro/data/dataobjects/Project.java
@@ -73,12 +73,7 @@ public class Project extends DomainObject implements Comparable<Project>, Iconiz
 	
 	@Enumerated(EnumType.STRING)
 	private StateOfMind stateOfMind = StateOfMind.NEUTRAL;
-	
-	@OneToOne(mappedBy="project")
-	private MessageBoard messageBoard;
-	
-	@OneToOne(mappedBy="project")
-	private SupervisorMessageBoard supervisorMessageBoard;
+
 	
 	@ManyToOne(optional=false)
 	private ProjectClass projectClass;
@@ -173,10 +168,6 @@ public class Project extends DomainObject implements Comparable<Project>, Iconiz
 		return title;
 	}
 
-	public MessageBoard getMessageBoard() {
-		return messageBoard;
-	}
-
 	/**
 	 * @param projectClass the projectClass to set
 	 */
@@ -192,9 +183,6 @@ public class Project extends DomainObject implements Comparable<Project>, Iconiz
 		this.stateOfMind = stateOfMind;
 	}
 
-	public SupervisorMessageBoard getSupervisorMessageBoard() {
-		return supervisorMessageBoard;
-	}
 
 	/**
 	 * @return the projectClass
diff --git a/src/main/java/se/su/dsv/scipro/data/dataobjects/Recipient.java b/src/main/java/se/su/dsv/scipro/data/dataobjects/Recipient.java
index 77ca9c7d61..2ee36b4bce 100644
--- a/src/main/java/se/su/dsv/scipro/data/dataobjects/Recipient.java
+++ b/src/main/java/se/su/dsv/scipro/data/dataobjects/Recipient.java
@@ -10,7 +10,6 @@ import javax.persistence.Entity;
 import javax.persistence.GeneratedValue;
 import javax.persistence.Id;
 import javax.persistence.ManyToOne;
-import javax.persistence.OneToOne;
 import javax.persistence.Table;
 
 import org.hibernate.annotations.Cache;
@@ -26,6 +25,8 @@ import org.hibernate.annotations.CacheConcurrencyStrategy;
 @Cache(usage= CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
 public class Recipient extends LazyDeletableDomainObject {
 
+	private static final long serialVersionUID = 1L;
+
 	@Id
 	@GeneratedValue
 	private Long id;
diff --git a/src/main/java/se/su/dsv/scipro/data/dataobjects/SupervisorBoardMessage.java b/src/main/java/se/su/dsv/scipro/data/dataobjects/SupervisorBoardMessage.java
deleted file mode 100644
index 85d271e924..0000000000
--- a/src/main/java/se/su/dsv/scipro/data/dataobjects/SupervisorBoardMessage.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/**
- * 
- */
-package se.su.dsv.scipro.data.dataobjects;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.persistence.Cacheable;
-import javax.persistence.Entity;
-import javax.persistence.ManyToOne;
-import javax.persistence.OneToMany;
-import javax.persistence.Table;
-
-import org.hibernate.annotations.Cache;
-import org.hibernate.annotations.CacheConcurrencyStrategy;
-
-/**
- * @author Johan Aschan - aschan@dsv.su.se
- *
- */
-
-@Entity
-@Table(name="supervisor_board_message")
-@Cacheable(true)
-@Cache(usage= CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
-public class SupervisorBoardMessage extends Message{
-
-	@ManyToOne(optional=false)
-	private SupervisorMessageBoard supervisorMessageBoard;
-	
-	@OneToMany
-	private List<SupervisorBoardMessage> replyMessageList = new ArrayList<SupervisorBoardMessage>();
-
-	public SupervisorMessageBoard getSupervisorMessageBoard() {
-		return supervisorMessageBoard;
-	}
-
-	public void setSupervisorMessageBoard(
-			SupervisorMessageBoard supervisorMessageBoard) {
-		this.supervisorMessageBoard = supervisorMessageBoard;
-	}
-
-	public List<SupervisorBoardMessage> getReplyMessageList() {
-		return replyMessageList;
-	}
-
-	public void setReplyMessageList(List<SupervisorBoardMessage> replyMessageList) {
-		this.replyMessageList = replyMessageList;
-	}
-}
diff --git a/src/main/java/se/su/dsv/scipro/data/dataobjects/SupervisorMessageBoard.java b/src/main/java/se/su/dsv/scipro/data/dataobjects/SupervisorMessageBoard.java
deleted file mode 100644
index 5c666cb460..0000000000
--- a/src/main/java/se/su/dsv/scipro/data/dataobjects/SupervisorMessageBoard.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/**
- * 
- */
-package se.su.dsv.scipro.data.dataobjects;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.persistence.Cacheable;
-import javax.persistence.Entity;
-import javax.persistence.OneToMany;
-import javax.persistence.OneToOne;
-import javax.persistence.Table;
-
-import org.hibernate.annotations.Cache;
-import org.hibernate.annotations.CacheConcurrencyStrategy;
-
-/**
- * @author Johan Aschan - aschan@dsv.su.se
- * 
- */
-
-@Entity
-@Table(name = "supervisor_message_board")
-@Cacheable(true)
-@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
-public class SupervisorMessageBoard extends Board {
-	@OneToMany
-	private List<SupervisorBoardMessage> supervisorBoardMessageList = new ArrayList<SupervisorBoardMessage>(1);
-
-	public List<SupervisorBoardMessage> getSupervisorBoardMessageList() {
-		return supervisorBoardMessageList;
-	}
-
-	public void setSupervisorBoardMessageList(
-			List<SupervisorBoardMessage> supervisorBoardMessageList) {
-		this.supervisorBoardMessageList = supervisorBoardMessageList;
-	}
-
-	
-	
-}
diff --git a/src/main/java/se/su/dsv/scipro/data/dataobjects/UserSettings.java b/src/main/java/se/su/dsv/scipro/data/dataobjects/UserSettings.java
index 06f928be3b..0d4235ab36 100644
--- a/src/main/java/se/su/dsv/scipro/data/dataobjects/UserSettings.java
+++ b/src/main/java/se/su/dsv/scipro/data/dataobjects/UserSettings.java
@@ -2,6 +2,8 @@ package se.su.dsv.scipro.data.dataobjects;
 
 import javax.persistence.Cacheable;
 import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
 import javax.persistence.GeneratedValue;
 import javax.persistence.Id;
 import javax.persistence.Lob;
@@ -11,6 +13,8 @@ import javax.persistence.Table;
 
 import org.hibernate.annotations.Cache;
 import org.hibernate.annotations.CacheConcurrencyStrategy;
+
+import se.su.dsv.scipro.data.enums.NotificationPriority;
 /**
  * 
  * @author Martin Peters - mpeters@dsv.su.se
@@ -38,6 +42,9 @@ public class UserSettings extends DomainObject {
 	private String iPhoneId;
 	private boolean available = false;
 	
+	@Enumerated(EnumType.STRING)
+	private NotificationPriority notificationPriority = NotificationPriority.MEDIUM;
+	
 	@Lob
 	private String statusMessage = "";
 	
@@ -104,4 +111,19 @@ public class UserSettings extends DomainObject {
 		this.activeProject = activeProject;
 	}
 
+	/**
+	 * @return the notificationPriority
+	 */
+	public NotificationPriority getNotificationPriority() {
+		return notificationPriority;
+	}
+
+	/**
+	 * @param notificationPriority the notificationPriority to set
+	 */
+	public void setNotificationPriority(NotificationPriority notificationPriority) {
+		this.notificationPriority = notificationPriority;
+	}
+	
+	
 }
diff --git a/src/main/java/se/su/dsv/scipro/data/dataobjects/WebNotification.java b/src/main/java/se/su/dsv/scipro/data/dataobjects/WebNotification.java
new file mode 100644
index 0000000000..fcc8ca7cef
--- /dev/null
+++ b/src/main/java/se/su/dsv/scipro/data/dataobjects/WebNotification.java
@@ -0,0 +1,116 @@
+/**
+ * 
+ */
+package se.su.dsv.scipro.data.dataobjects;
+
+import javax.persistence.Cacheable;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Lob;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+
+import org.hibernate.annotations.Cache;
+import org.hibernate.annotations.CacheConcurrencyStrategy;
+
+/**
+ * @author Johan Aschan - aschan@dsv.su.se
+ *
+ */
+
+
+@Entity
+@Table(name="web_notification")
+@Cacheable(true)
+@Cache(usage= CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
+public class WebNotification extends DomainObject{
+	
+	private static final long serialVersionUID = 1L;
+	@Id
+	@GeneratedValue
+	private Long id;
+	
+	@Lob
+	private String infoText;
+	
+	@Lob
+	private String url;
+	
+	@ManyToOne(optional=false)
+	private User user;
+	
+	private boolean readByUser = false;
+	
+	@Override
+	public Long getId() {
+		return id;
+	}
+
+
+	/**
+	 * @return the infoText
+	 */
+	public String getInfoText() {
+		return infoText;
+	}
+
+
+	/**
+	 * @param infoText the infoText to set
+	 */
+	public void setInfoText(String infoText) {
+		this.infoText = infoText;
+	}
+
+	/**
+	 * @return the user
+	 */
+	public User getUser() {
+		return user;
+	}
+
+
+	/**
+	 * @param user the user to set
+	 */
+	public void setUser(User user) {
+		this.user = user;
+	}
+
+
+	
+
+	/**
+	 * @return the readByUser
+	 */
+	public boolean isReadByUser() {
+		return readByUser;
+	}
+
+
+	/**
+	 * @param readByUser the readByUser to set
+	 */
+	public void setReadByUser(boolean readByUser) {
+		this.readByUser = readByUser;
+	}
+
+
+	/**
+	 * @return the url
+	 */
+	public String getUrl() {
+		return url;
+	}
+
+
+	/**
+	 * @param url the url to set
+	 */
+	public void setUrl(String url) {
+		this.url = url;
+	}
+
+
+}
diff --git a/src/main/java/se/su/dsv/scipro/data/enums/NotificationEventType.java b/src/main/java/se/su/dsv/scipro/data/enums/NotificationEventType.java
index a4364cb3e5..99bd2a14a3 100644
--- a/src/main/java/se/su/dsv/scipro/data/enums/NotificationEventType.java
+++ b/src/main/java/se/su/dsv/scipro/data/enums/NotificationEventType.java
@@ -6,6 +6,4 @@ public enum NotificationEventType {
 	PEER_REVIEW_ACCEPTED,
 	PEER_REVIEW_RATED,
 	PEER_REVIEW_GRADED,
-	
-
 }
diff --git a/src/main/java/se/su/dsv/scipro/data/enums/NotificationPriority.java b/src/main/java/se/su/dsv/scipro/data/enums/NotificationPriority.java
new file mode 100644
index 0000000000..b61bbd3e08
--- /dev/null
+++ b/src/main/java/se/su/dsv/scipro/data/enums/NotificationPriority.java
@@ -0,0 +1,23 @@
+/**
+ * 
+ */
+package se.su.dsv.scipro.data.enums;
+
+/**
+ * @author Johan Aschan <aschan@dsv.su.se>
+ *
+ */
+public enum NotificationPriority {
+	HIGH("High"), MEDIUM("Medium"), LOW("Low");
+	
+	private String toString;
+	
+	NotificationPriority(String toString){
+		this.toString = toString;
+	}
+	
+	@Override
+	public String toString() {
+		return toString;
+	}
+}
diff --git a/src/main/java/se/su/dsv/scipro/dataproviders/BoardMessageDataProvider.java b/src/main/java/se/su/dsv/scipro/dataproviders/BoardMessageDataProvider.java
index 2df52a926b..0fd72b7587 100644
--- a/src/main/java/se/su/dsv/scipro/dataproviders/BoardMessageDataProvider.java
+++ b/src/main/java/se/su/dsv/scipro/dataproviders/BoardMessageDataProvider.java
@@ -9,39 +9,37 @@ import org.apache.wicket.spring.injection.annot.SpringBean;
 
 import se.su.dsv.scipro.data.DomainObjectDetachableModel;
 import se.su.dsv.scipro.data.dao.interfaces.BoardMessageDao;
-import se.su.dsv.scipro.data.dao.interfaces.ProjectDao;
 import se.su.dsv.scipro.data.dataobjects.BoardMessage;
 import se.su.dsv.scipro.data.dataobjects.MessageBoard;
-import se.su.dsv.scipro.data.dataobjects.Project;
 
 public class BoardMessageDataProvider implements IDataProvider<BoardMessage> {
 
 	private static final long serialVersionUID = 1L;
-	
+
 	@SpringBean
 	private BoardMessageDao boardMessageDao;
-	
-	private MessageBoard messageBoard;
-	
 
-	public BoardMessageDataProvider(MessageBoard messageBoard) {
+	private IModel<MessageBoard> messageBoard;
+
+	public BoardMessageDataProvider(IModel<MessageBoard> messageBoard) {
 		InjectorHolder.getInjector().inject(this);
 		this.messageBoard = messageBoard;
 	}
 
 	@Override
 	public void detach() {
-		//Ignore
+		// Ignore
 	}
 
 	@Override
 	public Iterator<? extends BoardMessage> iterator(int first, int count) {
-		return boardMessageDao.getBoardMessageList(messageBoard, first, count).iterator();
+		return boardMessageDao.getBoardMessageList(messageBoard.getObject(), first, count)
+				.iterator();
 	}
 
 	@Override
 	public int size() {
-		return messageBoard.getBoardMessageList().size();
+		return boardMessageDao.getBoardMessageListCount(messageBoard.getObject());
 	}
 
 	@Override
diff --git a/src/main/java/se/su/dsv/scipro/dataproviders/UserSearchDataProvider.java b/src/main/java/se/su/dsv/scipro/dataproviders/UserSearchDataProvider.java
index a5d148a278..9d682e9188 100644
--- a/src/main/java/se/su/dsv/scipro/dataproviders/UserSearchDataProvider.java
+++ b/src/main/java/se/su/dsv/scipro/dataproviders/UserSearchDataProvider.java
@@ -4,6 +4,7 @@
 package se.su.dsv.scipro.dataproviders;
 
 import java.util.Iterator;
+import java.util.List;
 
 import org.apache.wicket.injection.web.InjectorHolder;
 import org.apache.wicket.markup.repeater.data.IDataProvider;
@@ -11,9 +12,7 @@ import org.apache.wicket.model.IModel;
 import org.apache.wicket.spring.injection.annot.SpringBean;
 
 import se.su.dsv.scipro.data.DomainObjectDetachableModel;
-import se.su.dsv.scipro.data.dao.interfaces.FinalSeminarDao;
 import se.su.dsv.scipro.data.dao.interfaces.UserDao;
-import se.su.dsv.scipro.data.dataobjects.FinalSeminar;
 import se.su.dsv.scipro.data.dataobjects.Role;
 import se.su.dsv.scipro.data.dataobjects.User;
 
@@ -23,6 +22,11 @@ import se.su.dsv.scipro.data.dataobjects.User;
  */
 public class UserSearchDataProvider implements IDataProvider<User> {
 
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 1L;
+
 	/* (non-Javadoc)
 	 * @see org.apache.wicket.model.IDetachable#detach()
 	 */
@@ -32,6 +36,7 @@ public class UserSearchDataProvider implements IDataProvider<User> {
 	
 	private String userQuery;
 	private Class<? extends Role> role;
+	private List<User> userList;
 	
 	@Override
 	public void detach() {
@@ -44,10 +49,11 @@ public class UserSearchDataProvider implements IDataProvider<User> {
 	/**
 	 * @param finalSeminarDao
 	 */
-	public UserSearchDataProvider(String userQuery, final Class<? extends Role>  role) {
+	public UserSearchDataProvider(String userQuery, final Class<? extends Role>  role, List<User> headSupervisor) {
 		InjectorHolder.getInjector().inject(this);
 		this.userQuery = userQuery;
 		this.role = role;
+		this.userList = headSupervisor;
 	}
 
 
@@ -58,7 +64,7 @@ public class UserSearchDataProvider implements IDataProvider<User> {
 	@Override
 	public Iterator<? extends User> iterator(int first, int count) {
 
-			return userDao.findUserQuery(userQuery, first, count, role).iterator();
+			return userDao.findUserQuery(userQuery, first, count, role, userList).iterator();
 
 	}
 
@@ -68,7 +74,7 @@ public class UserSearchDataProvider implements IDataProvider<User> {
 	@Override
 	public int size() {
 
-			return userDao.findUserQueryCount(userQuery, role);
+			return userDao.findUserQueryCount(userQuery, role, userList);
 	}
 
 	/* (non-Javadoc)
diff --git a/src/main/java/se/su/dsv/scipro/dataproviders/WebNotificationDataProvider.java b/src/main/java/se/su/dsv/scipro/dataproviders/WebNotificationDataProvider.java
new file mode 100644
index 0000000000..8afcd7fec8
--- /dev/null
+++ b/src/main/java/se/su/dsv/scipro/dataproviders/WebNotificationDataProvider.java
@@ -0,0 +1,69 @@
+/**
+ * 
+ */
+package se.su.dsv.scipro.dataproviders;
+
+import java.util.Iterator;
+
+import org.apache.wicket.injection.web.InjectorHolder;
+import org.apache.wicket.markup.repeater.data.IDataProvider;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.spring.injection.annot.SpringBean;
+
+import se.su.dsv.scipro.data.DomainObjectDetachableModel;
+import se.su.dsv.scipro.data.dao.interfaces.WebNotificationDao;
+import se.su.dsv.scipro.data.dataobjects.User;
+import se.su.dsv.scipro.data.dataobjects.WebNotification;
+
+/**
+ * @author Johan Aschan - aschan@dsv.su.se
+ *
+ */
+public class WebNotificationDataProvider implements IDataProvider<WebNotification> {
+
+
+	private static final long serialVersionUID = 1L;
+
+	@SpringBean
+	private WebNotificationDao webNotificationDao;
+	
+	private User user;
+	
+	@Override
+	public void detach() {
+		// TODO Auto-generated method stub
+		
+	}
+	
+	public WebNotificationDataProvider(User user) {
+		InjectorHolder.getInjector().inject(this);
+		this.user = user;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.apache.wicket.markup.repeater.data.IDataProvider#iterator(int, int)
+	 */
+	@Override
+	public Iterator<? extends WebNotification> iterator(int first, int count) {
+		return webNotificationDao.getWebNotifications(user, first, count).iterator();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.apache.wicket.markup.repeater.data.IDataProvider#size()
+	 */
+	@Override
+	public int size() {
+		// TODO Auto-generated method stub
+		return webNotificationDao.getCountOfWebNotifications(user);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.apache.wicket.markup.repeater.data.IDataProvider#model(java.lang.Object)
+	 */
+	@Override
+	public IModel<WebNotification> model(WebNotification object) {
+		// TODO Auto-generated method stub
+		return new DomainObjectDetachableModel<WebNotification>(webNotificationDao, object);
+	}
+
+}
diff --git a/src/main/java/se/su/dsv/scipro/json/JsonResponseHandler.java b/src/main/java/se/su/dsv/scipro/json/JsonResponseHandler.java
index 68b2add206..cfddb955c7 100644
--- a/src/main/java/se/su/dsv/scipro/json/JsonResponseHandler.java
+++ b/src/main/java/se/su/dsv/scipro/json/JsonResponseHandler.java
@@ -9,9 +9,7 @@ import org.apache.log4j.Level;
 import org.apache.log4j.Logger;
 import org.apache.wicket.spring.injection.annot.SpringBean;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.orm.jpa.JpaTransactionManager;
 import org.springframework.stereotype.Component;
-import org.springframework.transaction.TransactionException;
 import org.springframework.transaction.TransactionStatus;
 
 import se.su.dsv.scipro.ApplicationSettings;
diff --git a/src/main/java/se/su/dsv/scipro/json/JsonUserFullResponseHandler.java b/src/main/java/se/su/dsv/scipro/json/JsonUserFullResponseHandler.java
index 77adb53a5c..de80a99b99 100644
--- a/src/main/java/se/su/dsv/scipro/json/JsonUserFullResponseHandler.java
+++ b/src/main/java/se/su/dsv/scipro/json/JsonUserFullResponseHandler.java
@@ -1,11 +1,8 @@
 package se.su.dsv.scipro.json;
 
 import java.lang.reflect.Type;
-import java.util.HashSet;
-import java.util.Set;
 
 import org.apache.log4j.Level;
-import org.springframework.stereotype.Component;
 
 import se.su.dsv.scipro.data.dataobjects.User;
 import se.su.dsv.scipro.data.dataobjects.Username;
diff --git a/src/main/java/se/su/dsv/scipro/json/pages/JsonDeletePrivateMessagePage.java b/src/main/java/se/su/dsv/scipro/json/pages/JsonDeletePrivateMessagePage.java
index 26bd574b2d..e085e41a4c 100644
--- a/src/main/java/se/su/dsv/scipro/json/pages/JsonDeletePrivateMessagePage.java
+++ b/src/main/java/se/su/dsv/scipro/json/pages/JsonDeletePrivateMessagePage.java
@@ -9,18 +9,15 @@ import org.apache.wicket.RequestCycle;
 import org.apache.wicket.markup.html.WebPage;
 import org.apache.wicket.spring.injection.annot.SpringBean;
 
-import se.su.dsv.scipro.SciProSession;
 import se.su.dsv.scipro.data.dao.interfaces.PrivateMessageDao;
 import se.su.dsv.scipro.data.dao.interfaces.ProjectDao;
 import se.su.dsv.scipro.data.dao.interfaces.RecipientDao;
 import se.su.dsv.scipro.data.dao.interfaces.UserDao;
 import se.su.dsv.scipro.data.dao.interfaces.UserSettingsDao;
 import se.su.dsv.scipro.data.dataobjects.PrivateMessage;
-import se.su.dsv.scipro.data.dataobjects.Recipient;
 import se.su.dsv.scipro.data.dataobjects.User;
 import se.su.dsv.scipro.data.dataobjects.UserSettings;
 import se.su.dsv.scipro.jsonobjects.JsonDeletePrivateMessage;
-import se.su.dsv.scipro.jsonobjects.JsonRecipient;
 
 import com.google.gson.Gson;
 import com.google.gson.JsonObject;
diff --git a/src/main/java/se/su/dsv/scipro/json/pages/JsonMessagePage.java b/src/main/java/se/su/dsv/scipro/json/pages/JsonMessagePage.java
index ff70b9481f..59d6e03ed1 100644
--- a/src/main/java/se/su/dsv/scipro/json/pages/JsonMessagePage.java
+++ b/src/main/java/se/su/dsv/scipro/json/pages/JsonMessagePage.java
@@ -10,19 +10,13 @@ import org.apache.wicket.RequestCycle;
 import org.apache.wicket.markup.html.WebPage;
 import org.apache.wicket.spring.injection.annot.SpringBean;
 
-import se.su.dsv.scipro.ApplicationSettings;
 import se.su.dsv.scipro.data.dao.interfaces.ProjectDao;
 import se.su.dsv.scipro.data.dao.interfaces.RecipientDao;
 import se.su.dsv.scipro.data.dao.interfaces.UserDao;
 import se.su.dsv.scipro.data.dao.interfaces.UserSettingsDao;
-import se.su.dsv.scipro.data.dataobjects.Project;
-import se.su.dsv.scipro.data.dataobjects.ProjectFollower;
 import se.su.dsv.scipro.data.dataobjects.Recipient;
-import se.su.dsv.scipro.data.dataobjects.Student;
 import se.su.dsv.scipro.data.dataobjects.User;
 import se.su.dsv.scipro.data.dataobjects.UserSettings;
-import se.su.dsv.scipro.data.enums.ProjectStatus;
-import se.su.dsv.scipro.data.enums.ProjectTeamMemberRoles;
 
 import com.google.gson.Gson;
 import com.google.gson.JsonArray;
diff --git a/src/main/java/se/su/dsv/scipro/json/pages/JsonMessagePageCountUnread.java b/src/main/java/se/su/dsv/scipro/json/pages/JsonMessagePageCountUnread.java
index 1b2c566c76..7f043b1a35 100644
--- a/src/main/java/se/su/dsv/scipro/json/pages/JsonMessagePageCountUnread.java
+++ b/src/main/java/se/su/dsv/scipro/json/pages/JsonMessagePageCountUnread.java
@@ -3,10 +3,6 @@
  */
 package se.su.dsv.scipro.json.pages;
 
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
-import java.util.List;
-
 import org.apache.wicket.IRequestTarget;
 import org.apache.wicket.PageParameters;
 import org.apache.wicket.RequestCycle;
@@ -17,12 +13,10 @@ import se.su.dsv.scipro.data.dao.interfaces.ProjectDao;
 import se.su.dsv.scipro.data.dao.interfaces.RecipientDao;
 import se.su.dsv.scipro.data.dao.interfaces.UserDao;
 import se.su.dsv.scipro.data.dao.interfaces.UserSettingsDao;
-import se.su.dsv.scipro.data.dataobjects.Recipient;
 import se.su.dsv.scipro.data.dataobjects.User;
 import se.su.dsv.scipro.data.dataobjects.UserSettings;
 
 import com.google.gson.Gson;
-import com.google.gson.JsonArray;
 import com.google.gson.JsonObject;
 
 /**
diff --git a/src/main/java/se/su/dsv/scipro/json/pages/JsonProjectForSupervisorPage.java b/src/main/java/se/su/dsv/scipro/json/pages/JsonProjectForSupervisorPage.java
index cfe43e9cb6..b570bbc21a 100644
--- a/src/main/java/se/su/dsv/scipro/json/pages/JsonProjectForSupervisorPage.java
+++ b/src/main/java/se/su/dsv/scipro/json/pages/JsonProjectForSupervisorPage.java
@@ -2,21 +2,14 @@ package se.su.dsv.scipro.json.pages;
 
 import java.text.DateFormat;
 import java.text.SimpleDateFormat;
-import java.util.Date;
 import java.util.List;
 
-import javax.swing.text.DateFormatter;
-
 import org.apache.wicket.IRequestTarget;
 import org.apache.wicket.PageParameters;
 import org.apache.wicket.RequestCycle;
-import org.apache.wicket.datetime.PatternDateConverter;
-import org.apache.wicket.datetime.markup.html.basic.DateLabel;
 import org.apache.wicket.markup.html.WebPage;
-import org.apache.wicket.model.Model;
 import org.apache.wicket.spring.injection.annot.SpringBean;
 
-import se.su.dsv.scipro.ApplicationSettings;
 import se.su.dsv.scipro.data.dao.interfaces.FinalSeminarDao;
 import se.su.dsv.scipro.data.dao.interfaces.ProjectDao;
 import se.su.dsv.scipro.data.dao.interfaces.ProjectEventDao;
diff --git a/src/main/java/se/su/dsv/scipro/json/pages/JsonSentMessagePage.java b/src/main/java/se/su/dsv/scipro/json/pages/JsonSentMessagePage.java
index 05d74420d0..e2ad178045 100644
--- a/src/main/java/se/su/dsv/scipro/json/pages/JsonSentMessagePage.java
+++ b/src/main/java/se/su/dsv/scipro/json/pages/JsonSentMessagePage.java
@@ -10,21 +10,15 @@ import org.apache.wicket.RequestCycle;
 import org.apache.wicket.markup.html.WebPage;
 import org.apache.wicket.spring.injection.annot.SpringBean;
 
-import se.su.dsv.scipro.ApplicationSettings;
 import se.su.dsv.scipro.data.dao.interfaces.PrivateMessageDao;
 import se.su.dsv.scipro.data.dao.interfaces.ProjectDao;
 import se.su.dsv.scipro.data.dao.interfaces.RecipientDao;
 import se.su.dsv.scipro.data.dao.interfaces.UserDao;
 import se.su.dsv.scipro.data.dao.interfaces.UserSettingsDao;
 import se.su.dsv.scipro.data.dataobjects.PrivateMessage;
-import se.su.dsv.scipro.data.dataobjects.Project;
-import se.su.dsv.scipro.data.dataobjects.ProjectFollower;
 import se.su.dsv.scipro.data.dataobjects.Recipient;
-import se.su.dsv.scipro.data.dataobjects.Student;
 import se.su.dsv.scipro.data.dataobjects.User;
 import se.su.dsv.scipro.data.dataobjects.UserSettings;
-import se.su.dsv.scipro.data.enums.ProjectStatus;
-import se.su.dsv.scipro.data.enums.ProjectTeamMemberRoles;
 
 import com.google.gson.Gson;
 import com.google.gson.JsonArray;
diff --git a/src/main/java/se/su/dsv/scipro/json/pages/JsonSetReadPage.java b/src/main/java/se/su/dsv/scipro/json/pages/JsonSetReadPage.java
index dd785864b8..c9784d0c82 100644
--- a/src/main/java/se/su/dsv/scipro/json/pages/JsonSetReadPage.java
+++ b/src/main/java/se/su/dsv/scipro/json/pages/JsonSetReadPage.java
@@ -3,16 +3,7 @@
  */
 package se.su.dsv.scipro.json.pages;
 
-import java.io.UnsupportedEncodingException;
-import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
 import java.util.Date;
-import java.util.List;
-
-import javax.security.auth.login.FailedLoginException;
-import javax.security.auth.login.LoginException;
 
 import org.apache.wicket.IRequestTarget;
 import org.apache.wicket.PageParameters;
@@ -27,13 +18,9 @@ import se.su.dsv.scipro.data.dao.interfaces.UserSettingsDao;
 import se.su.dsv.scipro.data.dataobjects.Recipient;
 import se.su.dsv.scipro.data.dataobjects.User;
 import se.su.dsv.scipro.data.dataobjects.UserSettings;
-import se.su.dsv.scipro.jsonobjects.JsonLogin;
 import se.su.dsv.scipro.jsonobjects.JsonRecipient;
-import se.su.dsv.scipro.security.auth.Authenticator;
-import biz.source_code.base64Coder.Base64Coder;
 
 import com.google.gson.Gson;
-import com.google.gson.JsonArray;
 import com.google.gson.JsonObject;
 
 /**
diff --git a/src/main/java/se/su/dsv/scipro/json/pages/JsonSetStatusPage.java b/src/main/java/se/su/dsv/scipro/json/pages/JsonSetStatusPage.java
index 5666fb2def..e9b427787a 100644
--- a/src/main/java/se/su/dsv/scipro/json/pages/JsonSetStatusPage.java
+++ b/src/main/java/se/su/dsv/scipro/json/pages/JsonSetStatusPage.java
@@ -3,10 +3,6 @@
  */
 package se.su.dsv.scipro.json.pages;
 
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
-import java.util.List;
-
 import org.apache.wicket.IRequestTarget;
 import org.apache.wicket.PageParameters;
 import org.apache.wicket.RequestCycle;
@@ -17,14 +13,11 @@ import se.su.dsv.scipro.data.dao.interfaces.ProjectDao;
 import se.su.dsv.scipro.data.dao.interfaces.RecipientDao;
 import se.su.dsv.scipro.data.dao.interfaces.UserDao;
 import se.su.dsv.scipro.data.dao.interfaces.UserSettingsDao;
-import se.su.dsv.scipro.data.dataobjects.Recipient;
 import se.su.dsv.scipro.data.dataobjects.User;
 import se.su.dsv.scipro.data.dataobjects.UserSettings;
-import se.su.dsv.scipro.jsonobjects.JsonRecipient;
 import se.su.dsv.scipro.jsonobjects.JsonStatus;
 
 import com.google.gson.Gson;
-import com.google.gson.JsonArray;
 import com.google.gson.JsonObject;
 
 /**
diff --git a/src/main/java/se/su/dsv/scipro/json/pages/JsonStatusPage.java b/src/main/java/se/su/dsv/scipro/json/pages/JsonStatusPage.java
index 857b50c4bb..e90bfafbed 100644
--- a/src/main/java/se/su/dsv/scipro/json/pages/JsonStatusPage.java
+++ b/src/main/java/se/su/dsv/scipro/json/pages/JsonStatusPage.java
@@ -3,10 +3,6 @@
  */
 package se.su.dsv.scipro.json.pages;
 
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
-import java.util.List;
-
 import org.apache.wicket.IRequestTarget;
 import org.apache.wicket.PageParameters;
 import org.apache.wicket.RequestCycle;
@@ -17,12 +13,10 @@ import se.su.dsv.scipro.data.dao.interfaces.ProjectDao;
 import se.su.dsv.scipro.data.dao.interfaces.RecipientDao;
 import se.su.dsv.scipro.data.dao.interfaces.UserDao;
 import se.su.dsv.scipro.data.dao.interfaces.UserSettingsDao;
-import se.su.dsv.scipro.data.dataobjects.Recipient;
 import se.su.dsv.scipro.data.dataobjects.User;
 import se.su.dsv.scipro.data.dataobjects.UserSettings;
 
 import com.google.gson.Gson;
-import com.google.gson.JsonArray;
 import com.google.gson.JsonObject;
 
 /**
diff --git a/src/main/java/se/su/dsv/scipro/knol/resource/panels/FileResourcePanel.java b/src/main/java/se/su/dsv/scipro/knol/resource/panels/FileResourcePanel.java
index 545dfc75e8..f97c12e6fa 100644
--- a/src/main/java/se/su/dsv/scipro/knol/resource/panels/FileResourcePanel.java
+++ b/src/main/java/se/su/dsv/scipro/knol/resource/panels/FileResourcePanel.java
@@ -6,31 +6,23 @@ import java.util.List;
 
 import org.apache.wicket.extensions.ajax.markup.html.form.upload.UploadProgressBar;
 import org.apache.wicket.markup.html.WebMarkupContainer;
-import org.apache.wicket.markup.html.WebResource;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.form.Form;
 import org.apache.wicket.markup.html.form.upload.FileUpload;
 import org.apache.wicket.markup.html.form.upload.FileUploadField;
-import org.apache.wicket.markup.html.link.BookmarkablePageLink;
-import org.apache.wicket.markup.html.link.Link;
-import org.apache.wicket.markup.html.link.ResourceLink;
 import org.apache.wicket.markup.html.panel.FeedbackPanel;
 import org.apache.wicket.markup.html.panel.Panel;
 import org.apache.wicket.markup.repeater.RepeatingView;
-import org.apache.wicket.request.target.resource.ResourceStreamRequestTarget;
 import org.apache.wicket.spring.injection.annot.SpringBean;
 import org.apache.wicket.util.lang.Bytes;
-import org.apache.wicket.util.resource.IResourceStream;
 
 import se.su.dsv.scipro.data.dao.interfaces.UserDao;
 import se.su.dsv.scipro.data.dataobjects.FileDescription;
 import se.su.dsv.scipro.data.dataobjects.Resource;
-import se.su.dsv.scipro.data.dataobjects.User;
 import se.su.dsv.scipro.repository.FileRepository;
 import se.su.dsv.scipro.repository.SortOrder;
 import se.su.dsv.scipro.repository.components.FileDownloadLink;
 import se.su.dsv.scipro.repository.components.FileOpenLink;
-import se.su.dsv.scipro.repository.pages.RepositoryDownloadPage;
 
 public class FileResourcePanel extends Panel{
 
diff --git a/src/main/java/se/su/dsv/scipro/knol/resource/panels/ResourceBookmarkableCategoryPanel.java b/src/main/java/se/su/dsv/scipro/knol/resource/panels/ResourceBookmarkableCategoryPanel.java
index 1ada1f7811..9b01b7c9fc 100644
--- a/src/main/java/se/su/dsv/scipro/knol/resource/panels/ResourceBookmarkableCategoryPanel.java
+++ b/src/main/java/se/su/dsv/scipro/knol/resource/panels/ResourceBookmarkableCategoryPanel.java
@@ -33,18 +33,21 @@ import se.su.dsv.scipro.knol.resource.page.ResourcePage;
  */
 public class ResourceBookmarkableCategoryPanel extends Panel {
 
+	private static final long serialVersionUID = 1L;
+
 	@SpringBean
 	private ResourceDao resourceDao;
 
 	@SpringBean
 	private CategoryDao categoryDao;
 
-	private Resource resource;
 
 	public ResourceBookmarkableCategoryPanel(String id, PageParameters pp) {
 		super(id);
 		add(new AjaxLink<Tag>("showAll") {
 
+			private static final long serialVersionUID = 1L;
+
 			@Override
 			public void onClick(AjaxRequestTarget target) {
 
diff --git a/src/main/java/se/su/dsv/scipro/knol/resource/panels/ResourceBookmarkablePanel.java b/src/main/java/se/su/dsv/scipro/knol/resource/panels/ResourceBookmarkablePanel.java
index 5a2a9dbf76..e3717f09b9 100644
--- a/src/main/java/se/su/dsv/scipro/knol/resource/panels/ResourceBookmarkablePanel.java
+++ b/src/main/java/se/su/dsv/scipro/knol/resource/panels/ResourceBookmarkablePanel.java
@@ -3,60 +3,18 @@
  */
 package se.su.dsv.scipro.knol.resource.panels;
 
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
 import java.util.ArrayList;
-import java.util.Date;
-import java.util.HashSet;
 import java.util.List;
-import java.util.StringTokenizer;
 
-import org.apache.wicket.IClusterable;
 import org.apache.wicket.PageParameters;
 import org.apache.wicket.RestartResponseException;
-import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.ajax.markup.html.AjaxLink;
-import org.apache.wicket.ajax.markup.html.form.AjaxButton;
-import org.apache.wicket.behavior.AttributeAppender;
-import org.apache.wicket.markup.html.WebMarkupContainer;
-import org.apache.wicket.markup.html.basic.Label;
-import org.apache.wicket.markup.html.form.Form;
-import org.apache.wicket.markup.html.form.ListMultipleChoice;
-import org.apache.wicket.markup.html.form.TextArea;
-import org.apache.wicket.markup.html.form.TextField;
-import org.apache.wicket.markup.html.link.ExternalLink;
-import org.apache.wicket.markup.html.list.ListItem;
-import org.apache.wicket.markup.html.list.ListView;
 import org.apache.wicket.markup.html.panel.Panel;
-import org.apache.wicket.model.CompoundPropertyModel;
-import org.apache.wicket.model.Model;
 import org.apache.wicket.spring.injection.annot.SpringBean;
-import org.odlabs.wiquery.ui.dialog.Dialog;
 
 import se.su.dsv.scipro.SciProApplication;
-import se.su.dsv.scipro.SciProSession;
-import se.su.dsv.scipro.commentthread.panels.CommentThreadPanel;
-import se.su.dsv.scipro.components.FormFeedbackPanel;
-import se.su.dsv.scipro.data.dao.interfaces.CommentThreadDao;
-import se.su.dsv.scipro.data.dao.interfaces.RatableDao;
-import se.su.dsv.scipro.data.dao.interfaces.RatingDao;
 import se.su.dsv.scipro.data.dao.interfaces.ResourceDao;
-import se.su.dsv.scipro.data.dao.interfaces.TagDao;
-import se.su.dsv.scipro.data.dao.interfaces.UserDao;
-import se.su.dsv.scipro.data.dataobjects.Rating;
-import se.su.dsv.scipro.data.dataobjects.Recipient;
 import se.su.dsv.scipro.data.dataobjects.Resource;
-import se.su.dsv.scipro.data.dataobjects.Tag;
-import se.su.dsv.scipro.data.dataobjects.User;
-import se.su.dsv.scipro.data.enums.RatingValue;
 import se.su.dsv.scipro.data.enums.ResourceType;
-import se.su.dsv.scipro.knol.resource.model.ResourceModel;
-import se.su.dsv.scipro.knol.resource.page.BookmarkableResourcePage;
-import se.su.dsv.scipro.knol.resource.page.HtmlWebMarkupContainer;
-import se.su.dsv.scipro.knol.resource.page.ResourcePage;
-import se.su.dsv.scipro.knol.resource.page.StaticImage;
-import se.su.dsv.scipro.security.auth.MetaDataActionStrategy;
-import se.su.dsv.scipro.security.auth.roles.Roles;
 
 /**
  * @author Johan Aschan - aschan@dsv.su.se
@@ -64,6 +22,7 @@ import se.su.dsv.scipro.security.auth.roles.Roles;
  */
 public class ResourceBookmarkablePanel extends Panel {
 
+	private static final long serialVersionUID = 1L;
 
 
 	@SpringBean
diff --git a/src/main/java/se/su/dsv/scipro/knol/resource/panels/ResourceBookmarkableTagPanel.java b/src/main/java/se/su/dsv/scipro/knol/resource/panels/ResourceBookmarkableTagPanel.java
index 96d6f35ff8..8e22e4f518 100644
--- a/src/main/java/se/su/dsv/scipro/knol/resource/panels/ResourceBookmarkableTagPanel.java
+++ b/src/main/java/se/su/dsv/scipro/knol/resource/panels/ResourceBookmarkableTagPanel.java
@@ -31,18 +31,21 @@ import se.su.dsv.scipro.knol.resource.page.ResourcePage;
  */
 public class ResourceBookmarkableTagPanel extends Panel {
 
+	private static final long serialVersionUID = 1L;
+
 	@SpringBean
 	private ResourceDao resourceDao;
 
 	@SpringBean
 	private TagDao tagDao;
 
-	private Resource resource;
 
 	public ResourceBookmarkableTagPanel(String id, PageParameters pp) {
 		super(id);
 		add(new AjaxLink<Tag>("showAll") {
 
+			private static final long serialVersionUID = 1L;
+
 			@Override
 			public void onClick(AjaxRequestTarget target) {
 
diff --git a/src/main/java/se/su/dsv/scipro/knol/resource/panels/ResourceListPanel.java b/src/main/java/se/su/dsv/scipro/knol/resource/panels/ResourceListPanel.java
index 0ad4f94b1f..500b316144 100644
--- a/src/main/java/se/su/dsv/scipro/knol/resource/panels/ResourceListPanel.java
+++ b/src/main/java/se/su/dsv/scipro/knol/resource/panels/ResourceListPanel.java
@@ -74,6 +74,8 @@ import se.su.dsv.scipro.security.auth.roles.Roles;
  */
 public class ResourceListPanel extends Panel {
 
+	private static final long serialVersionUID = 1L;
+
 	@SpringBean
 	private RatingDao ratingDao;
 
@@ -113,7 +115,6 @@ public class ResourceListPanel extends Panel {
 	private TextArea<String> infoEmbed;
 	private EditLinkResourceForm editLinkResourceForm;
 	private EditEmbedResourceForm editEmbedResourceForm;
-	private List<Resource> linkList;
 	private TextArea<String> embedTextArea;
 	private List<Resource> resourcesList;
 	private ResourceType resourceType;
@@ -130,6 +131,9 @@ public class ResourceListPanel extends Panel {
 		listContainer.setOutputMarkupId(true);
 		listContainer.add(pagingNavigator = new CustomPagingNavigator(
 				"navigator", linkListView) {
+
+					private static final long serialVersionUID = 1L;
+
 			@Override
 			public boolean isVisible() {
 				return linkListView.size() > 0;
@@ -180,6 +184,9 @@ public class ResourceListPanel extends Panel {
 		linkListView = new PageableListView<Resource>("link-item",
 				resourceList, 20) {
 
+
+					private static final long serialVersionUID = 1L;
+
 			@Override
 			protected void populateItem(final ListItem<Resource> item) {
 				final Resource resource = resourceDao.reLoad(item
@@ -193,6 +200,11 @@ public class ResourceListPanel extends Panel {
 				if (resource.getHeading() == null) {
 					item.add(new ExternalLink("link", resource.getLink(),
 							resource.getLink()) {
+						/**
+								 * 
+								 */
+								private static final long serialVersionUID = 1L;
+
 						@Override
 						public boolean isVisible() {
 							return resource.getEmbedCode() == null;
@@ -201,6 +213,11 @@ public class ResourceListPanel extends Panel {
 				} else {
 					item.add(new ExternalLink("link", resource.getLink(),
 							resource.getHeading()) {
+						/**
+								 * 
+								 */
+								private static final long serialVersionUID = 1L;
+
 						@Override
 						public boolean isVisible() {
 							return resource.getEmbedCode() == null;
@@ -208,6 +225,11 @@ public class ResourceListPanel extends Panel {
 					});
 				}
 				item.add(new Label("heading", resource.getHeading()) {
+					/**
+					 * 
+					 */
+					private static final long serialVersionUID = 1L;
+
 					@Override
 					public boolean isVisible() {
 						return resource.getEmbedCode() != null;
@@ -215,6 +237,11 @@ public class ResourceListPanel extends Panel {
 				});
 				item.add(new ExternalLink("linkAddress", resource.getLink(),
 						resource.getLink()) {
+					/**
+							 * 
+							 */
+							private static final long serialVersionUID = 1L;
+
 					@Override
 					public boolean isVisible() {
 						return resource.getEmbedCode() == null;
@@ -257,6 +284,11 @@ public class ResourceListPanel extends Panel {
 
 				item.add(new ListView<Category>("category-item", resource.getCategoryList()) {
 
+					/**
+					 * 
+					 */
+					private static final long serialVersionUID = 1L;
+
 					@Override
 					protected void populateItem(final ListItem<Category> item) {
 						final Category category = item.getModelObject();
@@ -271,6 +303,11 @@ public class ResourceListPanel extends Panel {
 				});
 				item.add(new ListView<Tag>("tag-item", resource.getTagList()) {
 
+					/**
+					 * 
+					 */
+					private static final long serialVersionUID = 1L;
+
 					@Override
 					protected void populateItem(final ListItem<Tag> item) {
 						final Tag tag = item.getModelObject();
@@ -307,6 +344,10 @@ public class ResourceListPanel extends Panel {
 				item.add(new AjaxLink<String>("showComments",
 						new Model<String>("Show Comments")) {
 
+					/**
+							 * 
+							 */
+							private static final long serialVersionUID = 1L;
 					private boolean clicked = false;
 
 					@Override
@@ -337,6 +378,10 @@ public class ResourceListPanel extends Panel {
 				}.add(comment));
 				item.add(new AjaxLink<Void>("deleteResource") {
 
+					/**
+					 * 
+					 */
+					private static final long serialVersionUID = 1L;
 					@Override
 					public void onClick(AjaxRequestTarget target) {
 						Resource link2 = resourceDao.reLoad(resource);
@@ -388,6 +433,11 @@ public class ResourceListPanel extends Panel {
 
 				item.add(new AjaxLink<Recipient>("editResource") {
 
+					/**
+					 * 
+					 */
+					private static final long serialVersionUID = 1L;
+
 					@Override
 					public void onClick(AjaxRequestTarget target) {
 						editResource = resourceDao.reLoad(resource);
@@ -433,6 +483,11 @@ public class ResourceListPanel extends Panel {
 				});
 				item.add(new HtmlWebMarkupContainer("embedCode", resource
 						.getEmbedCode()) {
+					/**
+							 * 
+							 */
+							private static final long serialVersionUID = 1L;
+
 					@Override
 					public boolean isVisible() {
 						return resource.getEmbedCode() != null;
@@ -452,6 +507,10 @@ public class ResourceListPanel extends Panel {
 
 	private class AddRateButton implements IClusterable {
 
+		/**
+		 * 
+		 */
+		private static final long serialVersionUID = 1L;
 		private AjaxLink<String> ajaxLinkUp, ajaxLinkDown;
 
 		public AddRateButton(ListItem<Resource> item) {
@@ -527,6 +586,11 @@ public class ResourceListPanel extends Panel {
 			pointLabel.setOutputMarkupId(true);
 			ajaxLinkUp = new AjaxLink<String>("upLink", new Model<String>("Up")) {
 
+				/**
+				 * 
+				 */
+				private static final long serialVersionUID = 1L;
+
 				@Override
 				public void onClick(AjaxRequestTarget target) {
 					Resource resourc = resourceDao.reLoad(resource);
@@ -583,6 +647,11 @@ public class ResourceListPanel extends Panel {
 			ajaxLinkDown = new AjaxLink<String>("downLink", new Model<String>(
 					"Down")) {
 
+				/**
+						 * 
+						 */
+						private static final long serialVersionUID = 1L;
+
 				@Override
 				public void onClick(AjaxRequestTarget target) {
 					Resource resourc = resourceDao.reLoad(resource);
@@ -652,10 +721,13 @@ public class ResourceListPanel extends Panel {
 
 	private class EditLinkResourceForm extends Form<ResourceModel> {
 
+		/**
+		 * 
+		 */
+		private static final long serialVersionUID = 1L;
 		private ListView<Tag> tagListView;
 		private List<Tag> tagList;
 		private WebMarkupContainer tagListContainer;
-		private Collection<Category> selectedCategoryCollection = new ArrayList<Category>();
 
 		public EditLinkResourceForm(String name) {
 			super(name, new CompoundPropertyModel<ResourceModel>(
@@ -689,6 +761,11 @@ public class ResourceListPanel extends Panel {
 			
 			IChoiceRenderer<Category> choiceRenderer = new IChoiceRenderer<Category>() {
 
+				/**
+				 * 
+				 */
+				private static final long serialVersionUID = 1L;
+
 				// Implement dispay here
 				public Object getDisplayValue(Category category) {
 					return category.getCategoryName();
@@ -715,6 +792,11 @@ public class ResourceListPanel extends Panel {
 			add(new AjaxButton("submitButton", new Model<String>(
 					"Save Resource")) {
 
+				/**
+						 * 
+						 */
+						private static final long serialVersionUID = 1L;
+
 				@Override
 				protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
 					editResource = resourceDao.reLoad(editResource);
@@ -776,7 +858,7 @@ public class ResourceListPanel extends Panel {
 
 				@Override
 				protected void onError(final AjaxRequestTarget target,
-						final Form form) {
+						final Form<?> form) {
 					target.addComponent(feedbackContainer);
 				}
 			});
@@ -794,6 +876,11 @@ public class ResourceListPanel extends Panel {
 
 			tagListView = new ListView<Tag>("tag-item", tagList) {
 
+				/**
+				 * 
+				 */
+				private static final long serialVersionUID = 1L;
+
 				@Override
 				protected void populateItem(final ListItem<Tag> item) {
 					final Tag tag = item.getModelObject();
@@ -808,6 +895,10 @@ public class ResourceListPanel extends Panel {
 					tagContainer
 							.add(deleteLink = new AjaxLink<Void>("deleteTag") {
 
+								/**
+								 * 
+								 */
+								private static final long serialVersionUID = 1L;
 								@Override
 								public void onClick(AjaxRequestTarget target) {
 									tagList.remove(tag);
@@ -842,10 +933,13 @@ public class ResourceListPanel extends Panel {
 
 	private class EditEmbedResourceForm extends Form<ResourceModel> {
 
+		/**
+		 * 
+		 */
+		private static final long serialVersionUID = 1L;
 		private ListView<Tag> tagListView;
 		private List<Tag> tagList;
 		private WebMarkupContainer tagListContainer;
-		private Collection<Category> selectedCategoryCollection = new ArrayList<Category>();
 
 		public EditEmbedResourceForm(String name) {
 			super(name, new CompoundPropertyModel<ResourceModel>(
@@ -872,6 +966,11 @@ public class ResourceListPanel extends Panel {
 			
 			IChoiceRenderer<Category> choiceRenderer = new IChoiceRenderer<Category>() {
 
+				/**
+				 * 
+				 */
+				private static final long serialVersionUID = 1L;
+
 				// Implement dispay here
 				public Object getDisplayValue(Category category) {
 					return category.getCategoryName();
@@ -901,6 +1000,11 @@ public class ResourceListPanel extends Panel {
 			add(new AjaxButton("submitButton", new Model<String>(
 					"Save Resource")) {
 
+				/**
+						 * 
+						 */
+						private static final long serialVersionUID = 1L;
+
 				@Override
 				protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
 					editResource = resourceDao.reLoad(editResource);
@@ -963,7 +1067,7 @@ public class ResourceListPanel extends Panel {
 
 				@Override
 				protected void onError(final AjaxRequestTarget target,
-						final Form form) {
+						final Form<?> form) {
 					target.addComponent(feedbackContainer);
 				}
 			});
@@ -981,6 +1085,11 @@ public class ResourceListPanel extends Panel {
 
 			tagListView = new ListView<Tag>("tag-embed-item", tagList) {
 
+				/**
+				 * 
+				 */
+				private static final long serialVersionUID = 1L;
+
 				@Override
 				protected void populateItem(final ListItem<Tag> item) {
 					final Tag tag = item.getModelObject();
@@ -990,6 +1099,10 @@ public class ResourceListPanel extends Panel {
 					tagContainer.add(new Label("tagEmbed", tag.getTag()));
 					tagContainer.add(new AjaxLink<Void>("deleteTagEmbed") {
 
+						/**
+						 * 
+						 */
+						private static final long serialVersionUID = 1L;
 						@Override
 						public void onClick(AjaxRequestTarget target) {
 							tagList.remove(tag);
diff --git a/src/main/java/se/su/dsv/scipro/knol/resource/panels/ResourcesPanel.java b/src/main/java/se/su/dsv/scipro/knol/resource/panels/ResourcesPanel.java
index ad19a38807..02a0fbeb6d 100644
--- a/src/main/java/se/su/dsv/scipro/knol/resource/panels/ResourcesPanel.java
+++ b/src/main/java/se/su/dsv/scipro/knol/resource/panels/ResourcesPanel.java
@@ -51,6 +51,8 @@ import se.su.dsv.scipro.security.auth.roles.Roles;
  */
 public class ResourcesPanel extends Panel {
 
+	private static final long serialVersionUID = 1L;
+
 	@SpringBean
 	private TagDao tagDao;
 
@@ -107,6 +109,8 @@ public class ResourcesPanel extends Panel {
 		// editCategoriesDialog.setHeight(340);
 		editCategoriesDialog.setCloseEvent(new JsScopeUiEvent() {
 
+			private static final long serialVersionUID = 1L;
+
 			@Override
 			protected void execute(JsScopeContext scopeContext) {
 				scopeContext.append("window.location.reload()");
@@ -128,6 +132,8 @@ public class ResourcesPanel extends Panel {
 		// addCategoriesDialog.setHeight(340);
 		addCategoriesDialog.setCloseEvent(new JsScopeUiEvent() {
 
+			private static final long serialVersionUID = 1L;
+
 			@Override
 			protected void execute(JsScopeContext scopeContext) {
 				scopeContext.append("window.location.reload()");
@@ -142,6 +148,9 @@ public class ResourcesPanel extends Panel {
 		add(new AjaxLink<String>("addLinkResource", new Model<String>(
 				"Add Link Resource")) {
 
+
+					private static final long serialVersionUID = 1L;
+
 			@Override
 			public void onClick(AjaxRequestTarget target) {
 				target.addComponent(linkDialog);
@@ -152,6 +161,9 @@ public class ResourcesPanel extends Panel {
 		add(new AjaxLink<String>("addEmbedResource", new Model<String>(
 				"Add Link Resource")) {
 
+
+					private static final long serialVersionUID = 1L;
+
 			@Override
 			public void onClick(AjaxRequestTarget target) {
 				target.addComponent(embedDialog);
@@ -166,6 +178,8 @@ public class ResourcesPanel extends Panel {
 		AjaxLink<String> editCategories, addCategories;
 		add(editCategories = new AjaxLink<String>("adminCategories") {
 
+			private static final long serialVersionUID = 1L;
+
 			@Override
 			public void onClick(AjaxRequestTarget target) {
 				target.addComponent(editCategoriesDialog);
@@ -176,6 +190,8 @@ public class ResourcesPanel extends Panel {
 
 		add(addCategories = new AjaxLink<String>("addCategories") {
 
+			private static final long serialVersionUID = 1L;
+
 			@Override
 			public void onClick(AjaxRequestTarget target) {
 				target.addComponent(addCategoriesDialog);
@@ -187,6 +203,9 @@ public class ResourcesPanel extends Panel {
 	}
 
 	private class AddLinkResourceForm extends Form<ResourceModel> {
+
+		private static final long serialVersionUID = 1L;
+
 		public AddLinkResourceForm(String name) {
 			super(name, new CompoundPropertyModel<ResourceModel>(
 					new ResourceModel()));
@@ -215,6 +234,8 @@ public class ResourcesPanel extends Panel {
 
 			IChoiceRenderer<Category> choiceRenderer = new IChoiceRenderer<Category>() {
 
+				private static final long serialVersionUID = 1L;
+
 				// Implement dispay here
 				public Object getDisplayValue(Category category) {
 					return category.getCategoryName();
@@ -244,6 +265,9 @@ public class ResourcesPanel extends Panel {
 			add(new AjaxButton("submitButton", new Model<String>(
 					"Save Resource")) {
 
+
+						private static final long serialVersionUID = 1L;
+
 				@Override
 				protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
 					Resource link = new Resource();
@@ -293,7 +317,7 @@ public class ResourcesPanel extends Panel {
 
 				@Override
 				protected void onError(final AjaxRequestTarget target,
-						final Form form) {
+						final Form<?> form) {
 					target.addComponent(feedbackContainer);
 				}
 			});
@@ -302,12 +326,16 @@ public class ResourcesPanel extends Panel {
 	}
 
 	private class AddEmbedResourceForm extends Form<ResourceModel> {
+
+		private static final long serialVersionUID = 1L;
+
 		public AddEmbedResourceForm(String name) {
 			super(name, new CompoundPropertyModel<ResourceModel>(
 					new ResourceModel()));
 			final WebMarkupContainer feedbackContainer = new WebMarkupContainer(
 					"feedbackContainer");
 			feedbackContainer.setOutputMarkupId(true);
+
 			WebMarkupContainer feedbackPanel = new FormFeedbackPanel<ResourceModel>(
 					"feedbackPanel", this);
 			feedbackContainer.add(feedbackPanel);
@@ -327,6 +355,8 @@ public class ResourcesPanel extends Panel {
 
 			IChoiceRenderer<Category> choiceRenderer = new IChoiceRenderer<Category>() {
 
+				private static final long serialVersionUID = 1L;
+
 				// Implement dispay here
 				public Object getDisplayValue(Category category) {
 					return category.getCategoryName();
@@ -354,6 +384,9 @@ public class ResourcesPanel extends Panel {
 			add(new AjaxButton("submitButton", new Model<String>(
 					"Save Resource")) {
 
+
+						private static final long serialVersionUID = 1L;
+
 				@Override
 				protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
 					Resource link;
@@ -408,7 +441,7 @@ public class ResourcesPanel extends Panel {
 
 				@Override
 				protected void onError(final AjaxRequestTarget target,
-						final Form form) {
+						final Form<?> form) {
 					target.addComponent(feedbackContainer);
 				}
 			});
@@ -419,8 +452,8 @@ public class ResourcesPanel extends Panel {
 
 	private class EditCategoriesForm extends Form<CategoryModel> {
 
+		private static final long serialVersionUID = 1L;
 		private Category category;
-		private List<Category> categoryList;
 
 		public EditCategoriesForm(String name) {
 			super(name, new CompoundPropertyModel<CategoryModel>(
@@ -439,6 +472,8 @@ public class ResourcesPanel extends Panel {
 			add(categoryName);
 			IChoiceRenderer<Category> choiceRenderer = new IChoiceRenderer<Category>() {
 
+				private static final long serialVersionUID = 1L;
+
 				// Implement dispay here
 				public Object getDisplayValue(Category category) {
 					return category.getCategoryName();
@@ -454,6 +489,9 @@ public class ResourcesPanel extends Panel {
 			final ListChoice<Category> categorySelectList = new ListChoice<Category>(
 					"selectedCategory", new ListModel<Category>(
 							categoryDao.findAll()), choiceRenderer) {
+
+								private static final long serialVersionUID = 1L;
+
 				@Override
 				protected CharSequence getDefaultChoice(Object selected) {
 					return "";
@@ -482,6 +520,9 @@ public class ResourcesPanel extends Panel {
 			add(new AjaxButton("deleteCategory", new Model<String>(
 					"Delete Category")) {
 
+
+						private static final long serialVersionUID = 1L;
+
 				@Override
 				protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
 					if (category != null) {
@@ -530,7 +571,7 @@ public class ResourcesPanel extends Panel {
 
 				@Override
 				protected void onError(final AjaxRequestTarget target,
-						final Form form) {
+						final Form<?> form) {
 					target.addComponent(feedbackContainer);
 				}
 			});
@@ -539,6 +580,9 @@ public class ResourcesPanel extends Panel {
 
 			add(new AjaxButton("editButton", new Model<String>("Save Edit")) {
 
+
+				private static final long serialVersionUID = 1L;
+
 				@Override
 				protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
 					if (category == null) {
@@ -565,7 +609,7 @@ public class ResourcesPanel extends Panel {
 
 				@Override
 				protected void onError(final AjaxRequestTarget target,
-						final Form form) {
+						final Form<?> form) {
 					target.addComponent(feedbackContainer);
 				}
 
@@ -573,6 +617,8 @@ public class ResourcesPanel extends Panel {
 
 			add(new AjaxButton("closeButton", new Model<String>("Close")) {
 
+				private static final long serialVersionUID = 1L;
+
 				@Override
 				protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
 					editCategoriesDialog.close(target);
@@ -581,7 +627,7 @@ public class ResourcesPanel extends Panel {
 
 				@Override
 				protected void onError(final AjaxRequestTarget target,
-						final Form form) {
+						final Form<?> form) {
 					target.addComponent(feedbackContainer);
 				}
 			});
@@ -591,7 +637,7 @@ public class ResourcesPanel extends Panel {
 
 	private class AddCategoriesForm extends Form<CategoryModel> {
 
-		private Category category;
+		private static final long serialVersionUID = 1L;
 
 		public AddCategoriesForm(String name) {
 			super(name, new CompoundPropertyModel<CategoryModel>(
@@ -610,6 +656,8 @@ public class ResourcesPanel extends Panel {
 			add(categoryName);
 			IChoiceRenderer<Category> choiceRenderer = new IChoiceRenderer<Category>() {
 
+				private static final long serialVersionUID = 1L;
+
 				// Implement dispay here
 				public Object getDisplayValue(Category category) {
 					return category.getCategoryName();
@@ -625,6 +673,9 @@ public class ResourcesPanel extends Panel {
 			final ListChoice<Category> categorySelectList = new ListChoice<Category>(
 					"selectedCategory", new ListModel<Category>(
 							categoryDao.findAll()), choiceRenderer) {
+
+								private static final long serialVersionUID = 1L;
+
 				@Override
 				protected CharSequence getDefaultChoice(Object selected) {
 					return "";
@@ -638,6 +689,9 @@ public class ResourcesPanel extends Panel {
 
 			add(new AjaxButton("addButton", new Model<String>("Add Category")) {
 
+
+				private static final long serialVersionUID = 1L;
+
 				@Override
 				protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
 					CategoryModel categoryModel = (CategoryModel) form
@@ -667,13 +721,15 @@ public class ResourcesPanel extends Panel {
 
 				@Override
 				protected void onError(final AjaxRequestTarget target,
-						final Form form) {
+						final Form<?> form) {
 					target.addComponent(feedbackContainer);
 				}
 			});
 
 			add(new AjaxButton("closeButton", new Model<String>("Close")) {
 
+				private static final long serialVersionUID = 1L;
+
 				@Override
 				protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
 					addCategoriesDialog.close(target);
@@ -682,7 +738,7 @@ public class ResourcesPanel extends Panel {
 
 				@Override
 				protected void onError(final AjaxRequestTarget target,
-						final Form form) {
+						final Form<?> form) {
 					target.addComponent(feedbackContainer);
 				}
 			});
diff --git a/src/main/java/se/su/dsv/scipro/message/models/PrivateMessageModel.java b/src/main/java/se/su/dsv/scipro/message/models/PrivateMessageModel.java
index 9a46706159..0276bbfce9 100644
--- a/src/main/java/se/su/dsv/scipro/message/models/PrivateMessageModel.java
+++ b/src/main/java/se/su/dsv/scipro/message/models/PrivateMessageModel.java
@@ -2,19 +2,37 @@ package se.su.dsv.scipro.message.models;
 
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Map;
+import java.util.Properties;
 
 import org.apache.wicket.IClusterable;
+import org.apache.wicket.PageParameters;
+import org.apache.wicket.Request;
+import org.apache.wicket.RequestCycle;
 import org.apache.wicket.injection.web.InjectorHolder;
+import org.apache.wicket.protocol.http.RequestUtils;
 import org.apache.wicket.spring.injection.annot.SpringBean;
 
 import se.su.dsv.scipro.SciProSession;
+import se.su.dsv.scipro.conference.pages.SupervisorConferencePage;
+import se.su.dsv.scipro.data.controllers.NotificationController;
+import se.su.dsv.scipro.data.controllers.NotificationMessage;
+import se.su.dsv.scipro.data.dao.interfaces.WebNotificationDao;
 import se.su.dsv.scipro.data.dao.interfaces.PrivateMessageDao;
 import se.su.dsv.scipro.data.dao.interfaces.RecipientDao;
 import se.su.dsv.scipro.data.dao.interfaces.UserDao;
+import se.su.dsv.scipro.data.dataobjects.WebNotification;
 import se.su.dsv.scipro.data.dataobjects.PrivateMessage;
 import se.su.dsv.scipro.data.dataobjects.Recipient;
 import se.su.dsv.scipro.data.dataobjects.User;
+import se.su.dsv.scipro.data.enums.NotificationEventType;
+import se.su.dsv.scipro.data.enums.NotificationPriority;
+import se.su.dsv.scipro.message.pages.PrivateMessagesPage;
+import se.su.dsv.scipro.security.auth.roles.Roles;
+import se.su.dsv.scipro.util.PropsUtils;
 
 public class PrivateMessageModel implements IClusterable {
 
@@ -26,6 +44,8 @@ public class PrivateMessageModel implements IClusterable {
     private PrivateMessageDao privateMessageDao;
     @SpringBean
     private RecipientDao recipientDao;
+    @SpringBean
+    private NotificationController notificationController;
 
     private String subject;
     private String textMessage;
@@ -34,6 +54,8 @@ public class PrivateMessageModel implements IClusterable {
     private List<User> userFinder = new ArrayList<User>();
     private Collection<User> selectedUserList;
     
+    private final static String relativePath = "inbox/";
+    
     public PrivateMessageModel() {
         InjectorHolder.getInjector().inject(this);
     }
@@ -53,6 +75,38 @@ public class PrivateMessageModel implements IClusterable {
                 rec.setPrivateMessage(pm);
                 rec = recipientDao.save(rec);
             }
+			for(User user: users){
+				createNotification(user, subject +"\n\n" + textMessage);
+			}
         }
     }
+    
+	private void createNotification(final User user,final String message){
+		Properties props = null;
+		try {
+			props = PropsUtils.load("notification.properties");
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		String mailSubject = props.getProperty("mailSubject");
+		String privateMessageNotification = props.getProperty("privateMessageNotification");
+		String twoNewLines = props.getProperty("twoNewLines");
+
+		
+		String webNotificationMessage = SciProSession.get()
+		.getUser()
+		+ privateMessageNotification;
+		
+		String mailMessage = webNotificationMessage + twoNewLines + message;
+		
+		NotificationMessage notificationMessage = new NotificationMessage(webNotificationMessage, mailSubject, mailMessage);
+		notificationController.processNotification(user, notificationMessage,
+				getAbsoluteForPrivateMessageURL(), NotificationPriority.MEDIUM);
+		
+	}
+	
+	private String getAbsoluteForPrivateMessageURL() {
+		PageParameters pageParameters = new PageParameters();
+		return RequestUtils.toAbsolutePath(RequestCycle.get().urlFor(PrivateMessagesPage.class, pageParameters).toString());
+	}
 }
\ No newline at end of file
diff --git a/src/main/java/se/su/dsv/scipro/opponent/models/OpponentModel.java b/src/main/java/se/su/dsv/scipro/opponent/models/OpponentModel.java
index 86d40d41d9..e1051421e0 100644
--- a/src/main/java/se/su/dsv/scipro/opponent/models/OpponentModel.java
+++ b/src/main/java/se/su/dsv/scipro/opponent/models/OpponentModel.java
@@ -5,15 +5,12 @@ package se.su.dsv.scipro.opponent.models;
 
 import java.util.ArrayList;
 import java.util.Date;
-import java.util.HashMap;
 import java.util.List;
-import java.util.Map;
 
 import org.apache.wicket.IClusterable;
 
 import se.su.dsv.scipro.data.dataobjects.FinalSeminarActiveParticipation;
 import se.su.dsv.scipro.data.dataobjects.Project;
-import se.su.dsv.scipro.data.dataobjects.User;
 import se.su.dsv.scipro.data.enums.FinalSeminarLanguages;
 
 /**
@@ -22,6 +19,7 @@ import se.su.dsv.scipro.data.enums.FinalSeminarLanguages;
  */
 public class OpponentModel implements IClusterable {
 	
+	private static final long serialVersionUID = 1L;
 	private Project selectedProject;
 	private Date date;
 	private String startHour = "10";
@@ -33,7 +31,6 @@ public class OpponentModel implements IClusterable {
 	private List<FinalSeminarActiveParticipation> activeParticipations = new ArrayList<FinalSeminarActiveParticipation>();
 	private List<FinalSeminarActiveParticipation> opponentList = new ArrayList<FinalSeminarActiveParticipation>();
 	private String project;
-	private String contactsTextArea;
 	
 	private FinalSeminarLanguages presentationLanguage;
 	private FinalSeminarLanguages reportLanguage;
@@ -118,6 +115,20 @@ public class OpponentModel implements IClusterable {
 	public FinalSeminarLanguages getReportLanguage() {
 		return reportLanguage;
 	}
+
+	/**
+	 * @return the project
+	 */
+	public String getProject() {
+		return project;
+	}
+
+	/**
+	 * @param project the project to set
+	 */
+	public void setProject(String project) {
+		this.project = project;
+	}
 	
 	
 
diff --git a/src/main/java/se/su/dsv/scipro/opponent/panels/AvailableFinalSeminarHelpPanel.java b/src/main/java/se/su/dsv/scipro/opponent/panels/AvailableFinalSeminarHelpPanel.java
index 2e5a669cbd..54e72f2776 100644
--- a/src/main/java/se/su/dsv/scipro/opponent/panels/AvailableFinalSeminarHelpPanel.java
+++ b/src/main/java/se/su/dsv/scipro/opponent/panels/AvailableFinalSeminarHelpPanel.java
@@ -28,8 +28,10 @@ public class AvailableFinalSeminarHelpPanel extends Panel {
 		int maxActiveParticpants = 0;
 		GeneralSystemSettings settings = generalSystemSettingsDao.getGeneralSystemSettingsInstance();
 
+
 		registerAsActiveParticpant = settings.getDaysBeforeFinalSeminarCanRegisterAsActiveParticipant();
 		registerAsOpponent = settings.getDaysBeforeFinalSeminarCanRegisterAsOpponent();
+
 		maxActiveParticpants = settings.getFinalSeminarMaxActiveParticipants();
 
 		ProjectClassSettings bachelorSettings = projectClassDao.getProjectClass(ProjectClass.BACHELOR).getProjectClassSettings();
diff --git a/src/main/java/se/su/dsv/scipro/opponent/panels/ChangeViewPanel.java b/src/main/java/se/su/dsv/scipro/opponent/panels/ChangeViewPanel.java
index adedda6f3f..cf791d6f49 100644
--- a/src/main/java/se/su/dsv/scipro/opponent/panels/ChangeViewPanel.java
+++ b/src/main/java/se/su/dsv/scipro/opponent/panels/ChangeViewPanel.java
@@ -8,12 +8,10 @@ import java.util.List;
 
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.form.AjaxFormChoiceComponentUpdatingBehavior;
-import org.apache.wicket.ajax.markup.html.form.AjaxButton;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.form.Form;
 import org.apache.wicket.markup.html.form.RadioChoice;
 import org.apache.wicket.markup.html.panel.Panel;
-import org.apache.wicket.model.Model;
 import org.apache.wicket.model.PropertyModel;
 
 import se.su.dsv.scipro.dataproviders.FinalSeminarAfterNowDataProvider;
@@ -25,6 +23,7 @@ import se.su.dsv.scipro.dataproviders.FinalSeminarBeforeNowDataProvider;
  */
 public class ChangeViewPanel extends Panel{
 
+	private static final long serialVersionUID = 1L;
 	private WebMarkupContainer container;
 	private boolean admin;
 	
diff --git a/src/main/java/se/su/dsv/scipro/opponent/panels/EditFinalSeminarFormPanel.html b/src/main/java/se/su/dsv/scipro/opponent/panels/EditFinalSeminarFormPanel.html
new file mode 100644
index 0000000000..b0e1a73889
--- /dev/null
+++ b/src/main/java/se/su/dsv/scipro/opponent/panels/EditFinalSeminarFormPanel.html
@@ -0,0 +1,73 @@
+<!DOCTYPE html>
+<html
+	xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd">
+<body>
+	<wicket:panel>
+		<form wicket:id="editSeminarForm">
+			<div wicket:id="feedbackPanel"></div>
+			<div class="span-6 last">
+				<strong>Project:</strong>
+			</div>
+			<div class="span-6 last">
+				<input type="text" class="text" wicket:id="project" />
+			</div>
+			<div class="span-6 last">
+				<strong>Room (must be booked in Daisy):</strong>
+			</div>
+			<div class="span-6 last">
+				<input type="text" class="text" wicket:id="room" />
+			</div>
+			<div class="span-6 last">
+				<strong>Date:</strong>
+			</div>
+			<div class="span-6 last">
+				<input type="text" class="text" wicket:id="date" />
+			</div>
+			<div class="span-6 last">
+				<strong>Starting Time:</strong>
+			</div>
+			<div class="span-8 last">
+				Hour: <select wicket:id="startHour"></select> Minute: <select
+					wicket:id="startMinute"></select>
+			</div>
+			<div class="span-6 last">
+				<strong>Ending Time:</strong>
+			</div>
+			<div class="span-8 last">
+				Hour: <select wicket:id="endHour"></select> Minute: <select
+					wicket:id="endMinute"></select>
+			</div>
+
+			<div class="span-8 last">
+				<strong>Presentation Language: </strong>
+			</div>
+			<div class="span-8 last">
+				<select wicket:id="presentationLanguage"></select>
+			</div>
+			<div class="span-8 last">
+				<strong>Thesis/Report Language: </strong>
+			</div>
+			<div class="span-8 last">
+				<select wicket:id="reportLanguage"></select>
+			</div>
+
+			<div class="span-6 last">
+				<strong>Opponents (optional):</strong>
+			</div>
+			<div class="span-6 last" id="opponents">
+				<div wicket:id="opponentList"></div>
+			</div>
+			<div class="span-6 last">
+				<strong>Active Participants (Optional):</strong>
+			</div>
+			<div class="span-6 last" id="opponents">
+				<div wicket:id="activeParticipations"></div>
+			</div>
+			<div class="span-6 last">
+				<input type="submit" wicket:id="submitButton" />
+			</div>
+		</form>
+
+	</wicket:panel>
+</body>
+</html>
\ No newline at end of file
diff --git a/src/main/java/se/su/dsv/scipro/opponent/panels/EditFinalSeminarFormPanel.java b/src/main/java/se/su/dsv/scipro/opponent/panels/EditFinalSeminarFormPanel.java
new file mode 100644
index 0000000000..bb83c178f1
--- /dev/null
+++ b/src/main/java/se/su/dsv/scipro/opponent/panels/EditFinalSeminarFormPanel.java
@@ -0,0 +1,406 @@
+/**
+ * 
+ */
+package se.su.dsv.scipro.opponent.panels;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.Iterator;
+import java.util.List;
+
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.markup.html.form.AjaxButton;
+import org.apache.wicket.datetime.DateConverter;
+import org.apache.wicket.markup.html.form.DropDownChoice;
+import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.markup.html.form.TextField;
+import org.apache.wicket.markup.html.panel.FeedbackPanel;
+import org.apache.wicket.markup.html.panel.Panel;
+import org.apache.wicket.model.CompoundPropertyModel;
+import org.apache.wicket.model.Model;
+import org.apache.wicket.spring.injection.annot.SpringBean;
+import org.apache.wicket.util.convert.IConverter;
+import org.joda.time.format.DateTimeFormat;
+import org.joda.time.format.DateTimeFormatter;
+import org.odlabs.wiquery.ui.datepicker.DatePicker;
+
+import se.su.dsv.scipro.components.autocomplete.AutoCompletionChoicesProvider;
+import se.su.dsv.scipro.components.autocomplete.MultiObjectAutoCompleteObjectConverter;
+import se.su.dsv.scipro.components.autocomplete.MultiObjectAutoCompleteRenderer;
+import se.su.dsv.scipro.components.autocomplete.UserProjectMultiObjectAutoCompleteBuilder;
+import se.su.dsv.scipro.components.autocomplete.UserProjectMultiObjectAutoCompleteField;
+import se.su.dsv.scipro.data.controllers.FinalSeminarUploadController;
+import se.su.dsv.scipro.data.dao.interfaces.FinalSeminarActiveParticipationDao;
+import se.su.dsv.scipro.data.dao.interfaces.FinalSeminarDao;
+import se.su.dsv.scipro.data.dao.interfaces.FinalSeminarOppositionDao;
+import se.su.dsv.scipro.data.dao.interfaces.RoleDao;
+import se.su.dsv.scipro.data.dao.interfaces.UserDao;
+import se.su.dsv.scipro.data.dataobjects.FinalSeminar;
+import se.su.dsv.scipro.data.dataobjects.FinalSeminarActiveParticipation;
+import se.su.dsv.scipro.data.dataobjects.FinalSeminarOpposition;
+import se.su.dsv.scipro.data.dataobjects.Project;
+import se.su.dsv.scipro.data.dataobjects.Student;
+import se.su.dsv.scipro.data.dataobjects.User;
+import se.su.dsv.scipro.data.enums.FinalSeminarLanguages;
+import se.su.dsv.scipro.opponent.models.OpponentModel;
+import se.su.dsv.scipro.supervisor.pages.SupervisorProjectsFinalSeminarPage;
+
+/**
+ * @author Johan Aschan <aschan@dsv.su.se>
+ * 
+ */
+public class EditFinalSeminarFormPanel extends Panel {
+
+	private static final long serialVersionUID = 1L;
+	@SpringBean
+	private FinalSeminarUploadController seminarUploadController;
+
+	@SpringBean
+	private FinalSeminarDao finalSeminarDao;
+
+	@SpringBean
+	private FinalSeminarOppositionDao finalSeminarOppositionDao;
+	@SpringBean
+	private UserDao userDao;
+
+	@SpringBean
+	private RoleDao roleDao;
+
+	@SpringBean
+	private FinalSeminarActiveParticipationDao finalSeminarActiveParticipationDao;
+
+	private FeedbackPanel feedbackPanel;
+	private FinalSeminar editSeminar;
+	private DatePicker<Date> startDateField;
+	private DropDownChoice<String> startHour, startMinute, endHour, endMinute;
+	private UserProjectMultiObjectAutoCompleteField<FinalSeminarActiveParticipation, Long> opponents,
+			activeListerners;
+	private TextField<String> room;
+	private TextField<String> projectLabel;
+	private DropDownChoice<FinalSeminarLanguages> presentationLanguage;
+	private DropDownChoice<FinalSeminarLanguages> reportLanguage;
+
+	
+	
+	
+
+	public EditFinalSeminarFormPanel(final String id, final FinalSeminar seminar) {
+		super(id);
+		
+		add(new EditSeminarForm("editSeminarForm"));
+		
+		FinalSeminar seminar2 = finalSeminarDao.reLoad(seminar);
+		editSeminar = seminar2;
+		startDateField.setDefaultModelObject(seminar2.getStartDate());
+		Calendar calendar = Calendar.getInstance();
+		calendar.setTime(seminar2.getStartDate());
+		int hourInt = calendar.get(Calendar.HOUR_OF_DAY);
+		String hourString = "";
+		if (hourInt < 10) {
+			hourString = "0" + String.valueOf(hourInt);
+		} else {
+			hourString = String.valueOf(hourInt);
+		}
+		startHour.setDefaultModelObject(hourString);
+
+		int minuteInt = calendar.get(Calendar.MINUTE);
+		String minuteString = "";
+		if (minuteInt < 10) {
+			minuteString = "0" + String.valueOf(minuteInt);
+		} else {
+			minuteString = String.valueOf(minuteInt);
+		}
+
+		startMinute.setDefaultModelObject(minuteString);
+
+		calendar.setTime(seminar2.getEndDate());
+		hourInt = calendar.get(Calendar.HOUR_OF_DAY);
+		hourString = "";
+		if (hourInt < 10) {
+			hourString = "0" + String.valueOf(hourInt);
+		} else {
+			hourString = String.valueOf(hourInt);
+		}
+		endHour.setDefaultModelObject(hourString);
+
+		minuteInt = calendar.get(Calendar.MINUTE);
+		minuteString = "";
+		if (minuteInt < 10) {
+			minuteString = "0" + String.valueOf(minuteInt);
+		} else {
+			minuteString = String.valueOf(minuteInt);
+		}
+
+		endMinute.setDefaultModelObject(minuteString);
+
+		room.setDefaultModelObject(seminar2.getRoom());
+		List<FinalSeminarActiveParticipation> userList = new ArrayList<FinalSeminarActiveParticipation>();
+		for (FinalSeminarOpposition f : seminar2.getOppositions()) {
+			FinalSeminarActiveParticipation al = new FinalSeminarActiveParticipation();
+			al.setUser(f.getOpponent().getUser());
+			al.setProject(f.getProject());
+			userList.add(al);
+		}
+		presentationLanguage.setDefaultModelObject(seminar.getPresentationLanguage());
+		reportLanguage.setDefaultModelObject(seminar.getReportLanguage());
+		opponents.setSelectedObjects(userList);
+
+		activeListerners.setSelectedObjects(seminar2.getActiveParticipations());
+		projectLabel.setDefaultModelObject(seminar.getProject().getTitle());
+	}
+
+	private class EditSeminarForm extends Form<OpponentModel> {
+
+		private static final long serialVersionUID = -5268957422910135323L;
+
+		public EditSeminarForm(String name) {
+			super(name, new CompoundPropertyModel<OpponentModel>(new OpponentModel()));
+			add(feedbackPanel = new FeedbackPanel("feedbackPanel"));
+			feedbackPanel.setOutputMarkupId(true);
+			
+
+			add(projectLabel = new TextField<String>("project"));
+			projectLabel.setEnabled(false);
+
+			startDateField = new DatePicker<Date>("date") {
+
+				private static final long serialVersionUID = 1L;
+
+				@Override
+				public final IConverter getConverter(Class<?> type) {
+					return new DateConverter(true) {
+						private static final long serialVersionUID = 1L;
+
+						@Override
+						public String getDatePattern() {
+							return "yy-dd-mm";
+						}
+
+						@Override
+						protected DateTimeFormatter getFormat() {
+							return DateTimeFormat.forPattern("YYYY-MM-dd");
+						}
+					};
+				}
+			};
+			startDateField.setDateFormat("yy-mm-dd");
+			startDateField.setRequired(true);
+
+			add(room = new TextField<String>("room"));
+			add(startDateField);
+
+			String[] hours = new String[] { "00", "01", "02", "03", "04", "05", "06", "07", "08",
+					"09", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21",
+					"22", "23" };
+			String[] minutes = new String[] { "00", "05", "10", "15", "20", "25", "30", "35", "40",
+					"45", "50", "55" };
+
+			startHour = new DropDownChoice<String>("startHour", Arrays.asList(hours));
+			add(startHour);
+			startHour.setRequired(false);
+			startMinute = new DropDownChoice<String>("startMinute", Arrays.asList(minutes));
+			add(startMinute);
+
+			endHour = new DropDownChoice<String>("endHour", Arrays.asList(hours));
+			add(endHour);
+			endHour.setRequired(false);
+			endMinute = new DropDownChoice<String>("endMinute", Arrays.asList(minutes));
+			add(endMinute);
+
+			List<FinalSeminarLanguages> languageOptions = new ArrayList<FinalSeminarLanguages>(
+					Arrays.asList(FinalSeminarLanguages.values()));
+
+			presentationLanguage = new DropDownChoice<FinalSeminarLanguages>(
+					"presentationLanguage", languageOptions);
+			add(presentationLanguage);
+			presentationLanguage.setRequired(true);
+
+			reportLanguage = new DropDownChoice<FinalSeminarLanguages>("reportLanguage",
+					languageOptions);
+
+			add(reportLanguage);
+			reportLanguage.setRequired(true);
+
+			room.setRequired(true);
+
+			AutoCompletionChoicesProvider<FinalSeminarActiveParticipation> choiceProvider = new AutoCompletionChoicesProvider<FinalSeminarActiveParticipation>() {
+
+				private static final long serialVersionUID = 1L;
+
+				@Override
+				public Iterator<FinalSeminarActiveParticipation> getChoices(String input) {
+					// TODO Auto-generated method stub
+					List<FinalSeminarActiveParticipation> active = new ArrayList<FinalSeminarActiveParticipation>();
+					for (User user : userDao.findUserQuery(input, 10)) {
+						FinalSeminarActiveParticipation ac = new FinalSeminarActiveParticipation();
+						ac.setUser(user);
+						active.add(ac);
+					}
+					return active.iterator();
+				}
+			};
+
+			UserProjectMultiObjectAutoCompleteBuilder<FinalSeminarActiveParticipation, Long> moac = new UserProjectMultiObjectAutoCompleteBuilder<FinalSeminarActiveParticipation, Long>(
+					choiceProvider);
+			moac.idType(Long.class);
+			moac.autoCompleteRenderer(new MultiObjectAutoCompleteRenderer<FinalSeminarActiveParticipation>() {
+
+				private static final long serialVersionUID = 1L;
+
+				@Override
+				public String getTextValue(FinalSeminarActiveParticipation al) {
+					User u = al.getUser();
+					return u.getFirstName() + " " + u.getLastName() + " <" + u.getEmailAddress()
+							+ ">";
+				}
+
+				protected String getIdValue(FinalSeminarActiveParticipation al) {
+					User u = al.getUser();
+					return u.getId().toString();
+				}
+			});
+
+			moac.objectConverter(new MultiObjectAutoCompleteObjectConverter<Long, FinalSeminarActiveParticipation>() {
+
+				private static final long serialVersionUID = 1L;
+
+				@Override
+				public FinalSeminarActiveParticipation convertToObject(Long id) {
+					FinalSeminarActiveParticipation ac = new FinalSeminarActiveParticipation();
+					ac.setUser(userDao.load(id));
+					return ac;
+				}
+			});
+
+			opponents = moac.build("opponentList", null, getModelObject());
+			activeListerners = moac.build("activeParticipations", null, getModelObject());
+			add(opponents);
+			add(activeListerners);
+
+			add(new AjaxButton("submitButton", new Model<String>("Save")) {
+
+				private static final long serialVersionUID = 1L;
+
+				@Override
+				protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
+					editSeminar = finalSeminarDao.reLoad(editSeminar);
+					OpponentModel opponentModel = (OpponentModel) form.getDefaultModelObject();
+					boolean notSameProject = true;
+					boolean error = false;
+					Project project = editSeminar.getProject();
+					for (Student student : project.getProjectParticipants()) {
+						if (!notSameProject)
+							break;
+						for (FinalSeminarActiveParticipation al : opponentModel.getOpponentList()) {
+							if (student.getUser().equals(al.getUser()) && !al.isPreDeleted()) {
+								notSameProject = false;
+								break;
+							}
+						}
+						for (FinalSeminarActiveParticipation al : opponentModel
+								.getActiveParticipations()) {
+							if (student.getUser().equals(al.getUser()) && !al.isPreDeleted()) {
+								notSameProject = false;
+								break;
+							}
+						}
+					}
+					for (FinalSeminarActiveParticipation al : opponentModel.getOpponentList()) {
+						if (al.getProject() == null && !al.isPreDeleted()) {
+							error = true;
+							break;
+						}
+					}
+					if (!error) {
+						for (FinalSeminarActiveParticipation al : opponentModel
+								.getActiveParticipations()) {
+							if (al.getProject() == null && !al.isPreDeleted()) {
+								error = true;
+								break;
+							}
+						}
+					}
+
+					if (notSameProject && !error) {
+
+						Date date = opponentModel.getDate();
+						Calendar cal = Calendar.getInstance();
+						cal.setTime(date);
+						cal.set(Calendar.HOUR_OF_DAY, Integer.valueOf(opponentModel.getStartHour()));
+						cal.set(Calendar.MINUTE, Integer.valueOf(opponentModel.getStartMinute()));
+
+						editSeminar.setStartDate(cal.getTime());
+
+						cal.set(Calendar.HOUR_OF_DAY, Integer.valueOf(opponentModel.getEndHour()));
+						cal.set(Calendar.MINUTE, Integer.valueOf(opponentModel.getEndMinute()));
+						editSeminar.setEndDate(cal.getTime());
+
+						editSeminar.setProject(project);
+						editSeminar.setRoom(opponentModel.getRoom());
+
+						editSeminar
+								.setPresentationLanguage(opponentModel.getPresentationLanguage());
+						editSeminar.setReportLanguage(opponentModel.getReportLanguage());
+
+						editSeminar = finalSeminarDao.save(editSeminar);
+
+						for (FinalSeminarActiveParticipation al : opponentModel.getOpponentList()) {
+
+							if (!al.isPreDeleted()) {
+								FinalSeminarOpposition opposition1 = new FinalSeminarOpposition();
+								opposition1.setOpponent(roleDao.makeStudent(al.getUser()));
+								opposition1.setProject(al.getProject());
+								opposition1.setFinalSeminar(editSeminar);
+								opposition1 = finalSeminarOppositionDao.save(opposition1);
+							} else if (al.isPreDeleted()) {
+								List<FinalSeminarOpposition> finalSeminar = finalSeminarOppositionDao
+										.findOppositionsByUserAndProject(al.getUser(),
+												al.getProject(), editSeminar);
+								for (FinalSeminarOpposition fso : finalSeminar) {
+									seminarUploadController.deleteOpponentFiles(fso);
+									finalSeminarOppositionDao.delete(fso);
+								}
+							}
+
+						}
+
+						for (FinalSeminarActiveParticipation al : opponentModel
+								.getActiveParticipations()) {
+							editSeminar = finalSeminarDao.reLoad(editSeminar);
+							List<FinalSeminarActiveParticipation> allList = editSeminar
+									.getActiveParticipations();
+							if (!allList.contains(al) && !al.isPreDeleted()) {
+								al.setFinalSeminar(editSeminar);
+								finalSeminarActiveParticipationDao.save(al);
+
+							} else if (al.isPreDeleted() && allList.contains(al)) {
+								finalSeminarActiveParticipationDao
+										.delete(finalSeminarActiveParticipationDao.reLoad(al));
+							}
+
+						}
+
+						setResponsePage(SupervisorProjectsFinalSeminarPage.class);
+					} else if (!notSameProject && error) {
+						error("Opponent/Active participant is an author in the final seminar");
+						error("Must select a Project for the Opponent/Active participant");
+					} else if (notSameProject && error) {
+						error("Must select a Project for the Opponent/Active participant");
+					} else {
+						error("Opponent/Active participant is an author in the final seminar");
+					}
+				}
+
+				@Override
+				protected void onError(final AjaxRequestTarget target, final Form<?> form) {
+					target.addComponent(feedbackPanel);
+				}
+			});
+
+		}
+	}
+	
+
+}
diff --git a/src/main/java/se/su/dsv/scipro/opponent/panels/FinalSeminarDetailsPanel.java b/src/main/java/se/su/dsv/scipro/opponent/panels/FinalSeminarDetailsPanel.java
index adf66b70f5..172fa064a5 100644
--- a/src/main/java/se/su/dsv/scipro/opponent/panels/FinalSeminarDetailsPanel.java
+++ b/src/main/java/se/su/dsv/scipro/opponent/panels/FinalSeminarDetailsPanel.java
@@ -1,15 +1,10 @@
 package se.su.dsv.scipro.opponent.panels;
 
 import java.util.ArrayList;
-import java.util.Date;
 import java.util.List;
 
-import org.apache.wicket.datetime.PatternDateConverter;
-import org.apache.wicket.datetime.markup.html.basic.DateLabel;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.basic.Label;
-import org.apache.wicket.markup.html.form.Form;
-import org.apache.wicket.markup.html.form.SubmitLink;
 import org.apache.wicket.markup.html.list.ListItem;
 import org.apache.wicket.markup.html.list.ListView;
 import org.apache.wicket.markup.html.panel.EmptyPanel;
@@ -26,7 +21,6 @@ import se.su.dsv.scipro.data.dataobjects.ProjectFollower;
 import se.su.dsv.scipro.data.dataobjects.Student;
 import se.su.dsv.scipro.data.dataobjects.User;
 import se.su.dsv.scipro.data.enums.ProjectTeamMemberRoles;
-import se.su.dsv.scipro.project.pages.ProjectStartPage;
 import se.su.dsv.scipro.repository.components.FileDownloadLink;
 import se.su.dsv.scipro.repository.components.FileOpenLink;
 
@@ -37,23 +31,25 @@ public class FinalSeminarDetailsPanel extends Panel {
 	@SpringBean
 	private FinalSeminarDao finalSeminarDao;
 
-	public FinalSeminarDetailsPanel(final String id,
-			final FinalSeminar seminar2, final boolean details) {
+	public FinalSeminarDetailsPanel(final String id, final FinalSeminar seminar2,
+			final boolean details) {
 		super(id);
 
 		final FinalSeminar seminar = finalSeminarDao.reLoad(seminar2);
 		final Project project = seminar.getProject();
-		WebMarkupContainer titleContainer = new WebMarkupContainer(
-				"titleContainer") {
+		WebMarkupContainer titleContainer = new WebMarkupContainer("titleContainer") {
+
+			private static final long serialVersionUID = 1L;
+
 			@Override
 			public boolean isVisible() {
-				// TODO Auto-generated method stub
 				return details;
 			}
 
 		};
-		titleContainer.add(new Label("projectTitle", seminar.getProject()
-				.getTitle()) {
+		titleContainer.add(new Label("projectTitle", seminar.getProject().getTitle()) {
+
+			private static final long serialVersionUID = 1L;
 		});
 		titleContainer.add(new Label("room", seminar.getRoom()));
 		add(titleContainer);
@@ -63,15 +59,13 @@ public class FinalSeminarDetailsPanel extends Panel {
 
 			@Override
 			protected void populateItem(ListItem<Student> item) {
-				item.add(item.getModelObject().getUser()
-						.getDisplayComponent("author", true));
+				item.add(item.getModelObject().getUser().getDisplayComponent("author", true));
 				add(item);
 			}
 		});
 
 		if (project.getHeadSupervisor() != null) {
-			add(project.getHeadSupervisor().getUser()
-					.getDisplayComponent("headSupervisor", true));
+			add(project.getHeadSupervisor().getUser().getDisplayComponent("headSupervisor", true));
 		} else {
 			add(new EmptyPanel("headSupervisor"));
 		}
@@ -92,8 +86,7 @@ public class FinalSeminarDetailsPanel extends Panel {
 
 			@Override
 			protected void populateItem(ListItem<User> item) {
-				item.add(item.getModelObject().getDisplayComponent(
-						"coSupervisor", true));
+				item.add(item.getModelObject().getDisplayComponent("coSupervisor", true));
 				add(item);
 			}
 		});
@@ -103,24 +96,23 @@ public class FinalSeminarDetailsPanel extends Panel {
 
 			@Override
 			protected void populateItem(ListItem<User> item) {
-				item.add(item.getModelObject().getDisplayComponent("reviewer",
-						true));
+				item.add(item.getModelObject().getDisplayComponent("reviewer", true));
 				add(item);
 			}
 		});
-		WebMarkupContainer detailsContainer = new WebMarkupContainer(
-				"detailsContainer") {
+		WebMarkupContainer detailsContainer = new WebMarkupContainer("detailsContainer") {
+
+			private static final long serialVersionUID = 1L;
 
 			@Override
 			public boolean isVisible() {
-				// TODO Auto-generated method stub
 				return details;
 			}
 
 		};
 
-		detailsContainer.add(new ListView<FinalSeminarOpposition>("opponentsList",
-				seminar.getOppositions()) {
+		detailsContainer.add(new ListView<FinalSeminarOpposition>("opponentsList", seminar
+				.getOppositions()) {
 			private static final long serialVersionUID = 1L;
 
 			@Override
@@ -136,8 +128,7 @@ public class FinalSeminarDetailsPanel extends Panel {
 			private static final long serialVersionUID = 1L;
 
 			@Override
-			protected void populateItem(
-					ListItem<FinalSeminarActiveParticipation> item) {
+			protected void populateItem(ListItem<FinalSeminarActiveParticipation> item) {
 				item.add(item.getModelObject().getUser()
 						.getDisplayComponent("activeParticipant", true));
 				add(item);
@@ -145,24 +136,20 @@ public class FinalSeminarDetailsPanel extends Panel {
 
 		});
 
-		detailsContainer.add(new Label("seminarLanguage", seminar
-				.getPresentationLanguage().toString()));
-		detailsContainer.add(new Label("thesisLanguage", seminar
-				.getReportLanguage().toString()));
-		detailsContainer.add(new Label("seminarReportTitle",
-				new Model<String>() {
-					private static final long serialVersionUID = 1L;
+		detailsContainer.add(new Label("seminarLanguage", seminar.getPresentationLanguage()
+				.toString()));
+		detailsContainer.add(new Label("thesisLanguage", seminar.getReportLanguage().toString()));
+		detailsContainer.add(new Label("seminarReportTitle", new Model<String>() {
+			private static final long serialVersionUID = 1L;
 
-					@Override
-					public String getObject() {
-						return seminar.getDocument() == null ? "No thesis/report uploaded"
-								: seminar.getDocument().getName();
-					}
-				}));
-		final PatternDateConverter pdc = new PatternDateConverter(
-				"yyyy-MM-dd HH:mm", false);
-		final WebMarkupContainer uploadInfoContainer = new WebMarkupContainer(
-				"uploadInfoContainer") {
+			@Override
+			public String getObject() {
+				return seminar.getDocument() == null ? "No thesis/report uploaded" : seminar
+						.getDocument().getName();
+			}
+		}));
+
+		final WebMarkupContainer uploadInfoContainer = new WebMarkupContainer("uploadInfoContainer") {
 			private static final long serialVersionUID = 1L;
 
 			@Override
@@ -171,10 +158,8 @@ public class FinalSeminarDetailsPanel extends Panel {
 			}
 		};
 
-		uploadInfoContainer.add(new FileDownloadLink("download", seminar
-				.getDocument()));
-		uploadInfoContainer
-				.add(new FileOpenLink("open", seminar.getDocument()));
+		uploadInfoContainer.add(new FileDownloadLink("download", seminar.getDocument()));
+		uploadInfoContainer.add(new FileOpenLink("open", seminar.getDocument()));
 
 		detailsContainer.add(uploadInfoContainer);
 		add(detailsContainer);
diff --git a/src/main/java/se/su/dsv/scipro/opponent/panels/OpponentListViewPanel.html b/src/main/java/se/su/dsv/scipro/opponent/panels/OpponentListViewPanel.html
index cc7a43e3b8..e1b8c0eed1 100644
--- a/src/main/java/se/su/dsv/scipro/opponent/panels/OpponentListViewPanel.html
+++ b/src/main/java/se/su/dsv/scipro/opponent/panels/OpponentListViewPanel.html
@@ -1,114 +1,80 @@
 <!DOCTYPE html>
-<html xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd">
+<html
+	xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd">
 <body>
-<wicket:panel>
+	<wicket:panel>
 
-<div class="span-22 prepend-top last">
-    <table class="rounded-table seminar-table even-rows">
-    	<tr>
-    	    <th>Date</th>
-    	    <th>Level</th>
-    		<th>Title</th>
-    		<th>Author(s)</th>
-    		<th>Head Supervisor</th>
-    		<th>Reviewer</th>
-    		<th title="Opponents" class="shortened-table-header">Opp.</th>
-    		<th title="Active Participants" class="shortened-table-header">A.P.</th>
-    		<th title="Total Attendees" class="shortened-table-header">Tot.A.</th>
-    		<th></th>
-    		<th></th>
-    		<th></th>
-    	</tr>
-    	<tr wicket:id="seminar-item">
-    		<td><span wicket:id="date" class="span-2"></span></td>
-    		<td><span wicket:id="projectClass"></span></td>
-    		<td><span wicket:id="title"></span></td>
-    		<td><span wicket:id="authors"></span></td>
-    		<td><span wicket:id="headSupervisor"></span></td>
-    		<td><span wicket:id="reviewer"></span></td>
-    		<td><span wicket:id="opponents"></span></td>
-    		<td><span wicket:id="activeParticipants"></span></td>
-    		<td><span wicket:id="totalAttendees"></span></td>
-    		<td><form wicket:id="contactsForm"><input type="submit" wicket:id="contacts" /></form></td>
-    		<td><form wicket:id="editForm"><input type="submit" wicket:id="edit" /></form></td>
-    		<td><a href="#" wicket:id="delete"><img src="images/icons/delete_16x16.png" alt="Delete" title="Delete"/></a></td>
-    	</tr>
-        <tr>
-            <td colspan="12"></td>
-        </tr>
-    </table>
-    <div wicket:id="pagingNavigator"></div>
-    	
-    	<div wicket:id="dialog">
-    		<div wicket:id="dialogContainer">
-       		<form wicket:id="editSeminarForm">
-    			<div  wicket:id="feedbackPanel"></div>
-    			<div class ="span-6 last">
-    				<strong>Project:</strong>
-    			</div>
-    			<div class ="span-6 last">
-    				<input type="text" class="text" wicket:id="project" />
-      			</div>
-      			<div class ="span-6 last">
-    				<strong>Room (must be booked in Daisy):</strong>
-    			</div>
-    			<div class ="span-6 last">
-    				<input type="text" class="text" wicket:id="room" />
-    			</div>
-				<div class ="span-6 last">
-					<strong>Date:</strong>
-				</div>
-				<div class ="span-6 last">
-					<input type="text" class="text" wicket:id="date" />
-				</div>
-				<div class ="span-6 last">
-					<strong>Starting Time:</strong>
-				</div>
-				<div class ="span-8 last">Hour: <select wicket:id="startHour"></select> Minute: <select wicket:id="startMinute"></select>
-	  			</div>
-	  			<div class ="span-6 last">
-					<strong>Ending Time:</strong>
-				</div>
-				<div class ="span-8 last">Hour: <select wicket:id="endHour"></select> Minute: <select wicket:id="endMinute"></select>
-	  			</div>
-	  			<div class ="span-8 last">
-  					<strong>Presentation Language: </strong>				
-				</div>
-				<div class ="span-8 last">
-					<select wicket:id="presentationLanguage"></select>
-				</div>			
-				<div class ="span-8 last">
-  					<strong>Thesis/Report Language: </strong>				
-				</div>
-				<div class ="span-8 last">
-					<select wicket:id="reportLanguage"></select>
-				</div>
-    			<div class ="span-6 last">
-    				<strong>Opponents (optional):</strong>
-    			</div>
-    			<div class ="span-6 last" id="opponents">
-    				<div wicket:id="opponentList"></div>
-    			</div>
-    			<div class ="span-6 last">
-    				<strong>Active Participants (Optional):</strong>
-    			</div>
-    			<div class ="span-6 last" id="opponents">
-    				<div wicket:id="activeParticipations"></div>
-    			</div>
-    			<div class ="span-6 last"><input type="submit" wicket:id="submitButton"  /> </div>
-    		</form>
-    	</div>
-    </div>
-</div>
-<div wicket:id="contactsDialog">
-		<div wicket:id="contactsDialogContainer">
-   		<form wicket:id="contactsSeminarForm">
+		<div class="span-22 prepend-top last">
+			<table class="rounded-table seminar-table even-rows">
+				<tr>
+					<th>Date</th>
+					<th>Level</th>
+					<th>Title</th>
+					<th>Author(s)</th>
+					<th>Head Supervisor</th>
+					<th>Reviewer</th>
+					<th title="Opponents" class="shortened-table-header">Opp.</th>
+					<th title="Active Participants" class="shortened-table-header">A.P.</th>
+					<th title="Total Attendees" class="shortened-table-header">Tot.A.</th>
+					<th></th>
+					<th></th>
+					<th></th>
+				</tr>
+				<tr wicket:id="seminar-item">
+					<td><span wicket:id="date" class="span-2"></span>
+					</td>
+					<td><span wicket:id="projectClass"></span>
+					</td>
+					<td><span wicket:id="title"></span>
+					</td>
+					<td><span wicket:id="authors"></span>
+					</td>
+					<td><span wicket:id="headSupervisor"></span>
+					</td>
+					<td><span wicket:id="reviewer"></span>
+					</td>
+					<td><span wicket:id="opponents"></span>
+					</td>
+					<td><span wicket:id="activeParticipants"></span>
+					</td>
+					<td><span wicket:id="totalAttendees"></span>
+					</td>
+					<td><form wicket:id="contactsForm">
+							<input type="submit" wicket:id="contacts" />
+						</form>
+					</td>
+					<td><form wicket:id="editForm">
+							<input type="submit" wicket:id="edit" />
+						</form>
+					</td>
+					<td><a href="#" wicket:id="delete"><img
+							src="images/icons/delete_16x16.png" alt="Delete" title="Delete" />
+					</a>
+					</td>
+				</tr>
+				<tr>
+					<td colspan="12"></td>
+				</tr>
+			</table>
+			<div wicket:id="pagingNavigator"></div>
 
-				<div  wicket:id="finalSeminarAttendees" ></div>
+			<div wicket:id="dialog">
+				<div wicket:id="dialogContainer">
+					<form wicket:id="editSeminarForm">
+						<div wicket:id="editSeminarDetails"></div>
+					</form>
+				</div>
+			</div>
+		</div>
+		<div wicket:id="contactsDialog">
+			<div wicket:id="contactsDialogContainer">
+				<form wicket:id="contactsSeminarForm">
 
-		</form>
-	</div>
-</div>
-</wicket:panel>
+					<div wicket:id="finalSeminarAttendees"></div>
+
+				</form>
+			</div>
+		</div>
+	</wicket:panel>
 </body>
 </html>
\ No newline at end of file
diff --git a/src/main/java/se/su/dsv/scipro/opponent/panels/OpponentListViewPanel.java b/src/main/java/se/su/dsv/scipro/opponent/panels/OpponentListViewPanel.java
index 02f5c05781..0fd5668934 100644
--- a/src/main/java/se/su/dsv/scipro/opponent/panels/OpponentListViewPanel.java
+++ b/src/main/java/se/su/dsv/scipro/opponent/panels/OpponentListViewPanel.java
@@ -5,26 +5,15 @@ package se.su.dsv.scipro.opponent.panels;
 
 import java.text.DateFormat;
 import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.Iterator;
-import java.util.List;
 
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.IAjaxCallDecorator;
 import org.apache.wicket.ajax.calldecorator.AjaxCallDecorator;
 import org.apache.wicket.ajax.markup.html.AjaxLink;
 import org.apache.wicket.ajax.markup.html.form.AjaxButton;
-import org.apache.wicket.datetime.DateConverter;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.basic.Label;
-import org.apache.wicket.markup.html.basic.MultiLineLabel;
-import org.apache.wicket.markup.html.form.DropDownChoice;
 import org.apache.wicket.markup.html.form.Form;
-import org.apache.wicket.markup.html.form.ListChoice;
-import org.apache.wicket.markup.html.form.TextField;
 import org.apache.wicket.markup.html.navigation.paging.PagingNavigator;
 import org.apache.wicket.markup.html.panel.EmptyPanel;
 import org.apache.wicket.markup.html.panel.FeedbackPanel;
@@ -35,33 +24,19 @@ import org.apache.wicket.markup.repeater.data.IDataProvider;
 import org.apache.wicket.model.CompoundPropertyModel;
 import org.apache.wicket.model.Model;
 import org.apache.wicket.spring.injection.annot.SpringBean;
-import org.apache.wicket.util.convert.IConverter;
-import org.joda.time.format.DateTimeFormat;
-import org.joda.time.format.DateTimeFormatter;
-import org.odlabs.wiquery.ui.datepicker.DatePicker;
 import org.odlabs.wiquery.ui.dialog.Dialog;
 
 import se.su.dsv.scipro.admin.pages.AdminFinalSeminarPage;
-import se.su.dsv.scipro.components.autocomplete.AutoCompletionChoicesProvider;
-import se.su.dsv.scipro.components.autocomplete.MultiObjectAutoCompleteObjectConverter;
-import se.su.dsv.scipro.components.autocomplete.MultiObjectAutoCompleteRenderer;
-import se.su.dsv.scipro.components.autocomplete.UserProjectMultiObjectAutoCompleteBuilder;
-import se.su.dsv.scipro.components.autocomplete.UserProjectMultiObjectAutoCompleteField;
 import se.su.dsv.scipro.data.controllers.FinalSeminarUploadController;
 import se.su.dsv.scipro.data.dao.interfaces.FinalSeminarActiveParticipationDao;
 import se.su.dsv.scipro.data.dao.interfaces.FinalSeminarDao;
 import se.su.dsv.scipro.data.dao.interfaces.FinalSeminarOppositionDao;
-import se.su.dsv.scipro.data.dao.interfaces.ProjectDao;
-import se.su.dsv.scipro.data.dao.interfaces.RoleDao;
-import se.su.dsv.scipro.data.dao.interfaces.UserDao;
 import se.su.dsv.scipro.data.dataobjects.FinalSeminar;
 import se.su.dsv.scipro.data.dataobjects.FinalSeminarActiveParticipation;
 import se.su.dsv.scipro.data.dataobjects.FinalSeminarOpposition;
-import se.su.dsv.scipro.data.dataobjects.Project;
 import se.su.dsv.scipro.data.dataobjects.ProjectFollower;
 import se.su.dsv.scipro.data.dataobjects.Student;
 import se.su.dsv.scipro.data.dataobjects.User;
-import se.su.dsv.scipro.data.enums.FinalSeminarLanguages;
 import se.su.dsv.scipro.data.enums.ProjectTeamMemberRoles;
 import se.su.dsv.scipro.opponent.models.OpponentModel;
 
@@ -79,15 +54,6 @@ public class OpponentListViewPanel extends Panel {
 	@SpringBean
 	private FinalSeminarDao finalSeminarDao;
 
-	@SpringBean
-	private UserDao userDao;
-
-	@SpringBean
-	private ProjectDao projectDao;
-
-	@SpringBean
-	private RoleDao roleDao;
-
 	@SpringBean
 	private FinalSeminarActiveParticipationDao finalSeminarActiveParticipationDao;
 
@@ -101,27 +67,14 @@ public class OpponentListViewPanel extends Panel {
 	private FeedbackPanel feedbackPanel;
 	private WebMarkupContainer editSeminarDialogContainer, contactsDialogContainer;
 	private Dialog editSeminarDialog, contactsSeminarDialog;
-	private FinalSeminar editSeminar;
-	private ListChoice<Project> projectSelectList;
-	private DatePicker<Date> startDateField;
-	private DatePicker<Date> endDateField;
-	private DropDownChoice<String> startHour, startMinute, endHour, endMinute;
-	private UserProjectMultiObjectAutoCompleteField<FinalSeminarActiveParticipation, Long> moacf,
-			activeListerners;
-	private TextField<String> room;
-	private TextField<String> projectLabel;
-	private MultiLineLabel contactsTextArea;
-	private IDataProvider<FinalSeminar> seminarList;
+	private EditSeminarForm editSeminarForm;
 	private ContactsSeminarForm contactsSeminarForm;
-	private DropDownChoice<FinalSeminarLanguages> presentationLanguage, reportLanguage;
-	private boolean adminView, past;
+	private boolean adminView;
 
 	public OpponentListViewPanel(String id, IDataProvider<FinalSeminar> seminarList,
 			boolean adminView, boolean past) {
 		super(id);
-		this.seminarList = seminarList;
 		this.adminView = adminView;
-		this.past = past;
 		loadListView(seminarList);
 		editSeminarDialogContainer = new WebMarkupContainer("dialogContainer");
 		editSeminarDialog = new Dialog("dialog");
@@ -131,7 +84,8 @@ public class OpponentListViewPanel extends Panel {
 		editSeminarDialog.add(editSeminarDialogContainer);
 		add(editSeminarDialog);
 		editSeminarDialogContainer.setOutputMarkupId(true);
-		editSeminarDialogContainer.add(new EditSeminarForm("editSeminarForm"));
+		editSeminarDialogContainer.add(editSeminarForm = new EditSeminarForm("editSeminarForm"));
+		editSeminarForm.setOutputMarkupId(true);
 
 		contactsDialogContainer = new WebMarkupContainer("contactsDialogContainer");
 		contactsSeminarDialog = new Dialog("contactsDialog");
@@ -220,9 +174,10 @@ public class OpponentListViewPanel extends Panel {
 				item.add(new Label("totalAttendees", String.valueOf(totalAttendees)));
 				item.add(new EditForm("editForm", seminar) {
 
+					private static final long serialVersionUID = 1L;
+
 					@Override
 					public boolean isVisible() {
-						// TODO Auto-generated method stub
 						return adminView;
 					}
 
@@ -254,7 +209,6 @@ public class OpponentListViewPanel extends Panel {
 
 					@Override
 					public boolean isVisible() {
-						// TODO Auto-generated method stub
 						return adminView;
 					}
 
@@ -285,6 +239,21 @@ public class OpponentListViewPanel extends Panel {
 		};
 	}
 
+
+	private class EditSeminarForm extends Form<OpponentModel> {
+
+		/**
+         * 
+         */
+		private static final long serialVersionUID = -5004827722926732419L;
+
+		public EditSeminarForm(String name) {
+			super(name, new CompoundPropertyModel<OpponentModel>(new OpponentModel()));
+			editSeminarDialog.setTitle("Edit Seminar");
+			add(new EmptyPanel("editSeminarDetails"));
+		}
+	}
+
 	private class EditForm extends Form<Void> {
 
 		/**
@@ -302,64 +271,9 @@ public class OpponentListViewPanel extends Panel {
 				@Override
 				protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
 					FinalSeminar seminar2 = finalSeminarDao.reLoad(seminar);
-					editSeminar = seminar2;
-					startDateField.setDefaultModelObject(seminar2.getStartDate());
-					Calendar calendar = Calendar.getInstance();
-					calendar.setTime(seminar2.getStartDate());
-					int hourInt = calendar.get(Calendar.HOUR_OF_DAY);
-					String hourString = "";
-					if (hourInt < 10) {
-						hourString = "0" + String.valueOf(hourInt);
-					} else {
-						hourString = String.valueOf(hourInt);
-					}
-					startHour.setDefaultModelObject(hourString);
-
-					int minuteInt = calendar.get(Calendar.MINUTE);
-					String minuteString = "";
-					if (minuteInt < 10) {
-						minuteString = "0" + String.valueOf(minuteInt);
-					} else {
-						minuteString = String.valueOf(minuteInt);
-					}
-
-					startMinute.setDefaultModelObject(minuteString);
-
-					calendar.setTime(seminar2.getEndDate());
-					hourInt = calendar.get(Calendar.HOUR_OF_DAY);
-					hourString = "";
-					if (hourInt < 10) {
-						hourString = "0" + String.valueOf(hourInt);
-					} else {
-						hourString = String.valueOf(hourInt);
-					}
-					endHour.setDefaultModelObject(hourString);
-
-					minuteInt = calendar.get(Calendar.MINUTE);
-					minuteString = "";
-					if (minuteInt < 10) {
-						minuteString = "0" + String.valueOf(minuteInt);
-					} else {
-						minuteString = String.valueOf(minuteInt);
-					}
-
-					endMinute.setDefaultModelObject(minuteString);
-
-					room.setDefaultModelObject(seminar2.getRoom());
-					List<FinalSeminarActiveParticipation> userList = new ArrayList<FinalSeminarActiveParticipation>();
-					for (FinalSeminarOpposition f : seminar2.getOppositions()) {
-						FinalSeminarActiveParticipation al = new FinalSeminarActiveParticipation();
-						al.setUser(f.getOpponent().getUser());
-						al.setProject(f.getProject());
-						userList.add(al);
-					}
-					presentationLanguage.setDefaultModelObject(seminar.getPresentationLanguage());
-					reportLanguage.setDefaultModelObject(seminar.getReportLanguage());
-					moacf.setSelectedObjects(userList);
-
-					activeListerners.setSelectedObjects(seminar2.getActiveParticipations());
-					projectLabel.setDefaultModelObject(seminar.getProject().getTitle());
-					target.addComponent(editSeminarDialog);
+					editSeminarForm.removeAll();
+					editSeminarForm.add(new EditFinalSeminarFormPanel("editSeminarDetails", seminar2));
+					target.addComponent(editSeminarForm);
 					editSeminarDialog.open(target);
 				}
 
@@ -373,264 +287,6 @@ public class OpponentListViewPanel extends Panel {
 		}
 	}
 
-	private class EditSeminarForm extends Form<OpponentModel> {
-
-		private static final long serialVersionUID = -5268957422910135323L;
-
-		public EditSeminarForm(String name) {
-			super(name, new CompoundPropertyModel<OpponentModel>(new OpponentModel()));
-			// final WebMarkupContainer feedbackContainer = new
-			// WebMarkupContainer(
-			// "feedbackContainer");
-			// feedbackContainer.setOutputMarkupId(true);
-			// WebMarkupContainer feedbackPanel = new
-			// FormFeedbackPanel<OpponentModel>(
-			// "feedbackPanel", this);
-			// feedbackContainer.add(feedbackPanel);
-			// add(feedbackContainer);
-
-			List<FinalSeminarLanguages> languageOptions = new ArrayList<FinalSeminarLanguages>(
-					Arrays.asList(FinalSeminarLanguages.values()));
-			presentationLanguage = new DropDownChoice<FinalSeminarLanguages>(
-					"presentationLanguage", languageOptions);
-			add(presentationLanguage);
-			presentationLanguage.setRequired(true);
-
-			reportLanguage = new DropDownChoice<FinalSeminarLanguages>("reportLanguage",
-					languageOptions);
-			add(reportLanguage);
-			reportLanguage.setRequired(true);
-
-			add(feedbackPanel = new FeedbackPanel("feedbackPanel"));
-			feedbackPanel.setOutputMarkupId(true);
-			editSeminarDialog.setTitle("Edit final seminar");
-
-			add(projectLabel = new TextField<String>("project"));
-			projectLabel.setEnabled(false);
-
-			startDateField = new DatePicker<Date>("date") {
-
-				private static final long serialVersionUID = 1L;
-
-				@Override
-				public final IConverter getConverter(Class<?> type) {
-					return new DateConverter(true) {
-						private static final long serialVersionUID = 1L;
-
-						@Override
-						public String getDatePattern() {
-							return "yy-dd-mm";
-						}
-
-						@Override
-						protected DateTimeFormatter getFormat() {
-							return DateTimeFormat.forPattern("YYYY-MM-dd");
-						}
-					};
-				}
-			};
-			startDateField.setDateFormat("yy-mm-dd");
-			startDateField.setRequired(true);
-			// startDateField.setShowOn(ShowOnEnum.BOTH);
-			// startDateField.setButtonText("<div class=\"ui-icon ui-icon-calendar\"></div>");
-			add(room = new TextField<String>("room"));
-			add(startDateField);
-
-			startHour = new DropDownChoice<String>("startHour", Arrays.asList(new String[] { "00",
-					"01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13",
-					"14", "15", "16", "17", "18", "19", "20", "21", "22", "23" }));
-			add(startHour);
-			startHour.setRequired(false);
-			startMinute = new DropDownChoice<String>("startMinute", Arrays.asList(new String[] {
-					"00", "05", "10", "15", "20", "25", "30", "35", "40", "45", "50", "55" }));
-			add(startMinute);
-
-			endHour = new DropDownChoice<String>("endHour", Arrays.asList(new String[] { "00",
-					"01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13",
-					"14", "15", "16", "17", "18", "19", "20", "21", "22", "23" }));
-			add(endHour);
-			endHour.setRequired(false);
-			endMinute = new DropDownChoice<String>("endMinute", Arrays.asList(new String[] { "00",
-					"05", "10", "15", "20", "25", "30", "35", "40", "45", "50", "55" }));
-			add(endMinute);
-
-			room.setRequired(true);
-
-			AutoCompletionChoicesProvider<FinalSeminarActiveParticipation> choiceProvider = new AutoCompletionChoicesProvider<FinalSeminarActiveParticipation>() {
-
-				@Override
-				public Iterator<FinalSeminarActiveParticipation> getChoices(String input) {
-					// TODO Auto-generated method stub
-					List<FinalSeminarActiveParticipation> active = new ArrayList<FinalSeminarActiveParticipation>();
-					for (User user : userDao.findUserQuery(input, 10)) {
-						FinalSeminarActiveParticipation ac = new FinalSeminarActiveParticipation();
-						ac.setUser(user);
-						active.add(ac);
-					}
-					return active.iterator();
-				}
-			};
-
-			UserProjectMultiObjectAutoCompleteBuilder<FinalSeminarActiveParticipation, Long> moac = new UserProjectMultiObjectAutoCompleteBuilder<FinalSeminarActiveParticipation, Long>(
-					choiceProvider);
-			moac.idType(Long.class);
-			moac.autoCompleteRenderer(new MultiObjectAutoCompleteRenderer<FinalSeminarActiveParticipation>() {
-				public String getTextValue(FinalSeminarActiveParticipation al) {
-					User u = al.getUser();
-					return u.getFirstName() + " " + u.getLastName() + " <" + u.getEmailAddress()
-							+ ">";
-				}
-
-				protected String getIdValue(FinalSeminarActiveParticipation al) {
-					User u = al.getUser();
-					return u.getId().toString();
-				}
-			});
-
-			moac.objectConverter(new MultiObjectAutoCompleteObjectConverter<Long, FinalSeminarActiveParticipation>() {
-
-				@Override
-				public FinalSeminarActiveParticipation convertToObject(Long id) {
-					FinalSeminarActiveParticipation ac = new FinalSeminarActiveParticipation();
-					ac.setUser(userDao.load(id));
-					return ac;
-				}
-			});
-
-			moacf = moac.build("opponentList", null, getModelObject());
-			activeListerners = moac.build("activeParticipations", null, getModelObject());
-			add(moacf);
-			add(activeListerners);
-
-			add(new AjaxButton("submitButton", new Model<String>("Save")) {
-
-				@Override
-				protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
-					editSeminar = finalSeminarDao.reLoad(editSeminar);
-					OpponentModel opponentModel = (OpponentModel) form.getDefaultModelObject();
-					boolean notSameProject = true;
-					boolean error = false;
-					Project project = editSeminar.getProject();
-					for (Student student : project.getProjectParticipants()) {
-						if (!notSameProject)
-							break;
-						for (FinalSeminarActiveParticipation al : opponentModel.getOpponentList()) {
-							if (student.getUser().equals(al.getUser()) && !al.isPreDeleted()) {
-								notSameProject = false;
-								break;
-							}
-						}
-						for (FinalSeminarActiveParticipation al : opponentModel
-								.getActiveParticipations()) {
-							if (student.getUser().equals(al.getUser()) && !al.isPreDeleted()) {
-								notSameProject = false;
-								break;
-							}
-						}
-					}
-					for (FinalSeminarActiveParticipation al : opponentModel.getOpponentList()) {
-						if (al.getProject() == null && !al.isPreDeleted()) {
-							error = true;
-							break;
-						}
-					}
-					if (!error) {
-						for (FinalSeminarActiveParticipation al : opponentModel
-								.getActiveParticipations()) {
-							if (al.getProject() == null && !al.isPreDeleted()) {
-								error = true;
-								break;
-							}
-						}
-					}
-					if (notSameProject && !error) {
-
-						Date date = opponentModel.getDate();
-						Calendar cal = Calendar.getInstance();
-						cal.setTime(date);
-						cal.set(Calendar.HOUR_OF_DAY, Integer.valueOf(opponentModel.getStartHour()));
-						cal.set(Calendar.MINUTE, Integer.valueOf(opponentModel.getStartMinute()));
-
-						editSeminar.setStartDate(cal.getTime());
-
-						cal.set(Calendar.HOUR_OF_DAY, Integer.valueOf(opponentModel.getEndHour()));
-						cal.set(Calendar.MINUTE, Integer.valueOf(opponentModel.getEndMinute()));
-						editSeminar
-								.setPresentationLanguage(opponentModel.getPresentationLanguage());
-						editSeminar.setReportLanguage(opponentModel.getReportLanguage());
-						editSeminar.setEndDate(cal.getTime());
-
-						editSeminar.setProject(project);
-						editSeminar.setRoom(opponentModel.getRoom());
-
-						editSeminar = finalSeminarDao.save(editSeminar);
-
-						for (FinalSeminarActiveParticipation al : opponentModel.getOpponentList()) {
-							FinalSeminarOpposition opposition1 = new FinalSeminarOpposition();
-
-							boolean go = true;
-
-							for (FinalSeminarOpposition fso : editSeminar.getOppositions()) {
-								if (fso.getOpponent().getUser().equals(al.getUser())
-										&& fso.getProject().equals(editSeminar.getProject())) {
-									go = false;
-								} else if(fso.getOpponent().getUser().equals(al.getUser())){
-									opposition1 = finalSeminarOppositionDao.reLoad(fso);
-								}
-							}
-							if (!al.isPreDeleted() && go) {
-
-								opposition1.setOpponent(roleDao.makeStudent(al.getUser()));
-								opposition1.setProject(al.getProject());
-								opposition1.setFinalSeminar(editSeminar);
-								opposition1 = finalSeminarOppositionDao.save(opposition1);
-							} else if (al.isPreDeleted()) {
-								List<FinalSeminarOpposition> finalSeminar = finalSeminarOppositionDao
-										.findOppositionsByUserAndProject(al.getUser(),
-												al.getProject(), editSeminar);
-								for (FinalSeminarOpposition fso : finalSeminar) {
-									seminarUploadController.deleteOpponentFiles(fso);
-									finalSeminarOppositionDao.delete(fso);
-								}
-							}
-
-						}
-
-						for (FinalSeminarActiveParticipation al : opponentModel
-								.getActiveParticipations()) {
-							editSeminar = finalSeminarDao.reLoad(editSeminar);
-							List<FinalSeminarActiveParticipation> allList = editSeminar
-									.getActiveParticipations();
-							if (!allList.contains(al) && !al.isPreDeleted()) {
-								al.setFinalSeminar(editSeminar);
-								finalSeminarActiveParticipationDao.save(al);
-							} else if (al.isPreDeleted() && allList.contains(al)) {
-								finalSeminarActiveParticipationDao
-										.delete(finalSeminarActiveParticipationDao.reLoad(al));
-							}
-
-						}
-
-						setResponsePage(AdminFinalSeminarPage.class);
-					} else if (!notSameProject && error) {
-						error("Opponent/Active participant is an author in the final seminar");
-						error("Must select a Project for the Opponent/Active participant");
-					} else if (notSameProject && error) {
-						error("Must select a Project for the Opponent/Active participant");
-					} else {
-						error("Opponent/Active participant is an author in the final seminar");
-					}
-				}
-
-				@Override
-				protected void onError(final AjaxRequestTarget target, final Form form) {
-					target.addComponent(feedbackPanel);
-				}
-			});
-
-		}
-	}
-
 	private class ContactsSeminarForm extends Form<OpponentModel> {
 
 		/**
diff --git a/src/main/java/se/su/dsv/scipro/opponent/panels/OpponentPanel.java b/src/main/java/se/su/dsv/scipro/opponent/panels/OpponentPanel.java
index fef4634e17..c2a3b5d437 100644
--- a/src/main/java/se/su/dsv/scipro/opponent/panels/OpponentPanel.java
+++ b/src/main/java/se/su/dsv/scipro/opponent/panels/OpponentPanel.java
@@ -6,7 +6,6 @@ package se.su.dsv.scipro.opponent.panels;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Calendar;
-import java.util.Collection;
 import java.util.Date;
 import java.util.Iterator;
 import java.util.List;
@@ -128,56 +127,18 @@ public class OpponentPanel extends Panel {
 					"feedbackContainer");
 			project = projectDao.reLoad(project);
 			feedbackContainer.setOutputMarkupId(true);
-			WebMarkupContainer feedbackPanel = new FormFeedbackPanel<OpponentModel>(
-					"feedbackPanel", this);
+			
+			//ComponentFeedbackPanel fungerade inte 
+			WebMarkupContainer feedbackPanel = new FormFeedbackPanel<OpponentModel>("feedbackPanel", this);
 			feedbackContainer.add(feedbackPanel);
 			add(feedbackContainer);
-			List<User> userList = new ArrayList<User>();
+
 			addSeminarDialog.setTitle("Create Seminar");
 			TextField<String> projectLabel;
 			add(projectLabel = new TextField<String>("project"));
 			projectLabel.setEnabled(false);
 			projectLabel.setDefaultModelObject(project.getTitle(30));
-			// IChoiceRenderer<Project> choiceRenderer = new
-			// IChoiceRenderer<Project>() {
-			//
-			// // Implement dispay here
-			// public Object getDisplayValue(Project project) {
-			// return project.getTitle();
-			// }
-			//
-			// @Override
-			// public String getIdValue(Project project, int arg1) {
-			// return project.getId().toString();
-			// }
-			//
-			// };
-			// List<Project> projectList =
-			// projectDao.getProjectsByHeadSupervisor(
-			// SciProSession.get().getUser(), ProjectStatus.ACTIVE);
-			//
-			// for (Seminar s : seminarDao.getSeminarForSupervisor(SciProSession
-			// .get().getUser())) {
-			// if (projectList.contains(s.getProject())) {
-			// projectList.remove(s.getProject());
-			// }
-			// }
-			//
-			// // The offical one
-			// final ListChoice<Project> projectSelectList = new
-			// ListChoice<Project>(
-			// "selectedProject", new ListModel<Project>(projectList),
-			// choiceRenderer) {
-			// @Override
-			// protected CharSequence getDefaultChoice(Object selected) {
-			// return "";
-			// }
-			//
-			// };
-			//
-			// projectSelectList.setRequired(true);
-			// projectSelectList.setOutputMarkupId(true);
-			// add(projectSelectList);
+			
 			DatePicker<Date> startDateField = new DatePicker<Date>("date") {
 
 				private static final long serialVersionUID = 1L;
@@ -201,38 +162,36 @@ public class OpponentPanel extends Panel {
 			};
 			startDateField.setDateFormat("yy-mm-dd");
 			startDateField.setRequired(true);
-			// startDateField.setShowOn(ShowOnEnum.BOTH);
-			// startDateField.setButtonText("<div class=\"ui-icon ui-icon-calendar\"></div>");
+
 			final TextField<String> room;
 			add(room = new TextField<String>("room"));
 			room.setRequired(true);
 			add(startDateField);
+			
+			String[] hourArray = new String[] { "00", "01", "02", "03", "04",
+					"05", "06", "07", "08", "09", "10", "11", "12",
+					"13", "14", "15", "16", "17", "18", "19", "20",
+					"21", "22", "23" };
+			
+			String[] minuteArray = new String[] { "00", "05", "10",
+					"15", "20", "25", "30", "35", "40", "45", "50",
+			"55" };
 
 			DropDownChoice<String> hour = new DropDownChoice<String>("startHour",
-					Arrays.asList(new String[] { "00", "01", "02", "03", "04",
-							"05", "06", "07", "08", "09", "10", "11", "12",
-							"13", "14", "15", "16", "17", "18", "19", "20",
-							"21", "22", "23" }));
+					Arrays.asList(hourArray));
 			add(hour);
 			hour.setRequired(false);
 			DropDownChoice<String> minute = new DropDownChoice<String>(
-					"startMinute", Arrays.asList(new String[] { "00", "05", "10",
-							"15", "20", "25", "30", "35", "40", "45", "50",
-							"55" }));
+					"startMinute", Arrays.asList(minuteArray));
 			add(minute);
 			minute.setRequired(false);
 			
 			DropDownChoice<String> endHour = new DropDownChoice<String>("endHour",
-					Arrays.asList(new String[] { "00", "01", "02", "03", "04",
-							"05", "06", "07", "08", "09", "10", "11", "12",
-							"13", "14", "15", "16", "17", "18", "19", "20",
-							"21", "22", "23" }));
+					Arrays.asList(hourArray));
 			add(endHour);
 			endHour.setRequired(false);
 			DropDownChoice<String> endMinute = new DropDownChoice<String>(
-					"endMinute", Arrays.asList(new String[] { "00", "05", "10",
-							"15", "20", "25", "30", "35", "40", "45", "50",
-							"55" }));
+					"endMinute", Arrays.asList(minuteArray));
 			add(endMinute);
 			endMinute.setRequired(false);
 			
@@ -406,7 +365,7 @@ public class OpponentPanel extends Panel {
 
 				@Override
 				protected void onError(final AjaxRequestTarget target,
-						final Form form) {
+						final Form<?> form) {
 					target.addComponent(feedbackContainer);
 				}
 			});
diff --git a/src/main/java/se/su/dsv/scipro/opponent/panels/OpponentStudentViewListPanel.java b/src/main/java/se/su/dsv/scipro/opponent/panels/OpponentStudentViewListPanel.java
index 139215641b..dfcaaa57d4 100644
--- a/src/main/java/se/su/dsv/scipro/opponent/panels/OpponentStudentViewListPanel.java
+++ b/src/main/java/se/su/dsv/scipro/opponent/panels/OpponentStudentViewListPanel.java
@@ -6,16 +6,13 @@ package se.su.dsv.scipro.opponent.panels;
 import java.text.DateFormat;
 import java.text.SimpleDateFormat;
 import java.util.Date;
-import java.util.List;
 
-import org.apache.commons.logging.impl.AvalonLogger;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.IAjaxCallDecorator;
 import org.apache.wicket.ajax.calldecorator.AjaxCallDecorator;
 import org.apache.wicket.ajax.markup.html.form.AjaxButton;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.basic.Label;
-import org.apache.wicket.markup.html.basic.MultiLineLabel;
 import org.apache.wicket.markup.html.form.Form;
 import org.apache.wicket.markup.html.navigation.paging.PagingNavigator;
 import org.apache.wicket.markup.html.panel.EmptyPanel;
@@ -26,7 +23,6 @@ import org.apache.wicket.markup.repeater.data.DataView;
 import org.apache.wicket.markup.repeater.data.IDataProvider;
 import org.apache.wicket.model.CompoundPropertyModel;
 import org.apache.wicket.model.Model;
-import org.apache.wicket.protocol.http.request.WebRequestCodingStrategy.Settings;
 import org.apache.wicket.spring.injection.annot.SpringBean;
 import org.joda.time.DateTime;
 import org.odlabs.wiquery.ui.dialog.Dialog;
@@ -36,20 +32,14 @@ import se.su.dsv.scipro.data.dao.interfaces.FinalSeminarActiveParticipationDao;
 import se.su.dsv.scipro.data.dao.interfaces.FinalSeminarDao;
 import se.su.dsv.scipro.data.dao.interfaces.FinalSeminarOppositionDao;
 import se.su.dsv.scipro.data.dao.interfaces.GeneralSystemSettingsDao;
-import se.su.dsv.scipro.data.dao.interfaces.ProjectClassDao;
-import se.su.dsv.scipro.data.dao.interfaces.ProjectClassSettingsDao;
-import se.su.dsv.scipro.data.dao.interfaces.ProjectDao;
 import se.su.dsv.scipro.data.dao.interfaces.RoleDao;
 import se.su.dsv.scipro.data.dataobjects.FinalSeminar;
 import se.su.dsv.scipro.data.dataobjects.FinalSeminarActiveParticipation;
 import se.su.dsv.scipro.data.dataobjects.FinalSeminarOpposition;
 import se.su.dsv.scipro.data.dataobjects.GeneralSystemSettings;
 import se.su.dsv.scipro.data.dataobjects.Project;
-import se.su.dsv.scipro.data.dataobjects.ProjectClassSettings;
 import se.su.dsv.scipro.data.dataobjects.Student;
 import se.su.dsv.scipro.data.dataobjects.User;
-import se.su.dsv.scipro.data.enums.ProjectStatus;
-import se.su.dsv.scipro.icons.HelpIconDialog;
 import se.su.dsv.scipro.opponent.models.OpponentModel;
 import se.su.dsv.scipro.project.pages.ProjectOppositionPage;
 
@@ -64,35 +54,23 @@ public abstract class OpponentStudentViewListPanel extends Panel {
 	@SpringBean
 	private FinalSeminarDao finalSeminarDao;
 
-	@SpringBean
-	private ProjectDao projectDao;
-
 	@SpringBean
 	private FinalSeminarActiveParticipationDao finalSeminarActiveParticipationDao;
 
 	@SpringBean
 	private FinalSeminarOppositionDao finalSeminarOppositionDao;
 
-	@SpringBean
-	private ProjectClassDao projectClassDao;
-
 	@SpringBean
 	private GeneralSystemSettingsDao generalSystemSettingsDao;
 
-	@SpringBean
-	private ProjectClassSettingsDao projectClassSettingsDao;
-
 	@SpringBean
 	private RoleDao roleDao;
 
-	private WebMarkupContainer editSeminarDialogContainer,
-			contactsDialogContainer;
-	private Dialog editSeminarDialog, contactsSeminarDialog;
+	private WebMarkupContainer contactsDialogContainer;
+	private Dialog contactsSeminarDialog;
 
 	private DataView<FinalSeminar> linkListView;
-	private FeedbackPanel feedbackPanel, feedbackPanel2;
-	private IDataProvider<FinalSeminar> seminarList;
-	private int visibles;
+	private FeedbackPanel feedbackPanel;
 	private ContactsSeminarForm contactsSeminarForm;
 
 	protected abstract FeedbackPanel getFeedbackPanel();
@@ -100,7 +78,6 @@ public abstract class OpponentStudentViewListPanel extends Panel {
 	public OpponentStudentViewListPanel(String id,
 			IDataProvider<FinalSeminar> seminarList) {
 		super(id);
-		this.seminarList = seminarList;
 		loadListView(seminarList);
 		feedbackPanel = getFeedbackPanel();
 		feedbackPanel.setOutputMarkupId(true);
diff --git a/src/main/java/se/su/dsv/scipro/opponent/panels/ProjectActiveParticipationsPanel.java b/src/main/java/se/su/dsv/scipro/opponent/panels/ProjectActiveParticipationsPanel.java
index af25599724..7babfc5d8a 100644
--- a/src/main/java/se/su/dsv/scipro/opponent/panels/ProjectActiveParticipationsPanel.java
+++ b/src/main/java/se/su/dsv/scipro/opponent/panels/ProjectActiveParticipationsPanel.java
@@ -9,7 +9,6 @@ import org.apache.wicket.datetime.markup.html.basic.DateLabel;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.list.ListItem;
 import org.apache.wicket.markup.html.list.ListView;
-import org.apache.wicket.markup.html.panel.EmptyPanel;
 import org.apache.wicket.markup.html.panel.Panel;
 import org.apache.wicket.model.Model;
 import org.apache.wicket.spring.injection.annot.SpringBean;
diff --git a/src/main/java/se/su/dsv/scipro/opponent/panels/ProjectFinalSeminarPanel.html b/src/main/java/se/su/dsv/scipro/opponent/panels/ProjectFinalSeminarPanel.html
index 897bd6cdbd..4dd0fc048a 100644
--- a/src/main/java/se/su/dsv/scipro/opponent/panels/ProjectFinalSeminarPanel.html
+++ b/src/main/java/se/su/dsv/scipro/opponent/panels/ProjectFinalSeminarPanel.html
@@ -24,12 +24,6 @@
 				<span wicket:id="feedbackPanel"></span>
 
 				<div wicket:id="uploadInfoContainer" class="span-10 last">
-					<strong><span wicket:id="checkPlagarism"></span> </strong> <span
-						wicket:id="plagiarismLabel"></span>
-					<div>
-						<a href="#" target="_blank" wicket:id="turnItInLink">Go to
-							Turnitin</a>
-					</div>
 					<table>
 						<tr>
 							<td wicket:id="uploader"></td>
@@ -47,6 +41,12 @@
 							</td>
 						</tr>
 					</table>
+					<strong><span wicket:id="checkPlagarism"></span> </strong> <span
+						wicket:id="plagiarismLabel"></span>
+					<div>
+						<a href="#" target="_blank" wicket:id="turnItInLink">Go to
+							Turnitin</a>
+					</div>
 				</div>
 				<div wicket:id="uploadClosedContainer">
 					<img wicket:id="uploadClosedIcon" /><i> <span
@@ -134,68 +134,7 @@
 		<div wicket:id="dialog">
 			<div wicket:id="dialogContainer">
 				<form wicket:id="editSeminarForm">
-					<div wicket:id="feedbackPanel"></div>
-					<div class="span-6 last">
-						<strong>Project:</strong>
-					</div>
-					<div class="span-6 last">
-						<input type="text" class="text" wicket:id="project" />
-					</div>
-					<div class="span-6 last">
-						<strong>Room (must be booked in Daisy):</strong>
-					</div>
-					<div class="span-6 last">
-						<input type="text" class="text" wicket:id="room" />
-					</div>
-					<div class="span-6 last">
-						<strong>Date:</strong>
-					</div>
-					<div class="span-6 last">
-						<input type="text" class="text" wicket:id="date" />
-					</div>
-					<div class="span-6 last">
-						<strong>Starting Time:</strong>
-					</div>
-					<div class="span-8 last">
-						Hour: <select wicket:id="startHour"></select> Minute: <select
-							wicket:id="startMinute"></select>
-					</div>
-					<div class="span-6 last">
-						<strong>Ending Time:</strong>
-					</div>
-					<div class="span-8 last">
-						Hour: <select wicket:id="endHour"></select> Minute: <select
-							wicket:id="endMinute"></select>
-					</div>
-
-					<div class="span-8 last">
-						<strong>Presentation Language: </strong>
-					</div>
-					<div class="span-8 last">
-						<select wicket:id="presentationLanguage"></select>
-					</div>
-					<div class="span-8 last">
-						<strong>Thesis/Report Language: </strong>
-					</div>
-					<div class="span-8 last">
-						<select wicket:id="reportLanguage"></select>
-					</div>
-
-					<div class="span-6 last">
-						<strong>Opponents (optional):</strong>
-					</div>
-					<div class="span-6 last" id="opponents">
-						<div wicket:id="opponentList"></div>
-					</div>
-					<div class="span-6 last">
-						<strong>Active Participants (Optional):</strong>
-					</div>
-					<div class="span-6 last" id="opponents">
-						<div wicket:id="activeParticipations"></div>
-					</div>
-					<div class="span-6 last">
-						<input type="submit" wicket:id="submitButton" />
-					</div>
+					<div wicket:id="editSeminarDetails"></div>
 				</form>
 			</div>
 		</div>
diff --git a/src/main/java/se/su/dsv/scipro/opponent/panels/ProjectFinalSeminarPanel.java b/src/main/java/se/su/dsv/scipro/opponent/panels/ProjectFinalSeminarPanel.java
index 887d4318ee..da03218eb8 100644
--- a/src/main/java/se/su/dsv/scipro/opponent/panels/ProjectFinalSeminarPanel.java
+++ b/src/main/java/se/su/dsv/scipro/opponent/panels/ProjectFinalSeminarPanel.java
@@ -1,26 +1,19 @@
 package se.su.dsv.scipro.opponent.panels;
 
 import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Calendar;
 import java.util.Date;
-import java.util.Iterator;
 import java.util.List;
 
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.markup.html.AjaxLink;
 import org.apache.wicket.ajax.markup.html.form.AjaxButton;
-import org.apache.wicket.datetime.DateConverter;
 import org.apache.wicket.datetime.PatternDateConverter;
 import org.apache.wicket.datetime.markup.html.basic.DateLabel;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.basic.Label;
-import org.apache.wicket.markup.html.basic.MultiLineLabel;
 import org.apache.wicket.markup.html.form.Button;
-import org.apache.wicket.markup.html.form.DropDownChoice;
 import org.apache.wicket.markup.html.form.Form;
 import org.apache.wicket.markup.html.form.SubmitLink;
-import org.apache.wicket.markup.html.form.TextField;
 import org.apache.wicket.markup.html.form.upload.FileUpload;
 import org.apache.wicket.markup.html.form.upload.FileUploadField;
 import org.apache.wicket.markup.html.link.Link;
@@ -34,42 +27,24 @@ import org.apache.wicket.model.CompoundPropertyModel;
 import org.apache.wicket.model.Model;
 import org.apache.wicket.model.PropertyModel;
 import org.apache.wicket.spring.injection.annot.SpringBean;
-import org.apache.wicket.util.convert.IConverter;
 import org.joda.time.DateTime;
-import org.joda.time.format.DateTimeFormat;
-import org.joda.time.format.DateTimeFormatter;
-import org.odlabs.wiquery.ui.datepicker.DatePicker;
 import org.odlabs.wiquery.ui.dialog.Dialog;
 
 import se.su.dsv.scipro.SciProSession;
-import se.su.dsv.scipro.components.autocomplete.AutoCompletionChoicesProvider;
-import se.su.dsv.scipro.components.autocomplete.MultiObjectAutoCompleteObjectConverter;
-import se.su.dsv.scipro.components.autocomplete.MultiObjectAutoCompleteRenderer;
-import se.su.dsv.scipro.components.autocomplete.UserProjectMultiObjectAutoCompleteBuilder;
-import se.su.dsv.scipro.components.autocomplete.UserProjectMultiObjectAutoCompleteField;
 import se.su.dsv.scipro.data.controllers.FinalSeminarUploadController;
-import se.su.dsv.scipro.data.dao.interfaces.CheckPlagiarismEventDao;
-import se.su.dsv.scipro.data.dao.interfaces.FinalSeminarActiveParticipationDao;
 import se.su.dsv.scipro.data.dao.interfaces.FinalSeminarDao;
-import se.su.dsv.scipro.data.dao.interfaces.FinalSeminarOppositionDao;
 import se.su.dsv.scipro.data.dao.interfaces.GeneralSystemSettingsDao;
-import se.su.dsv.scipro.data.dao.interfaces.RoleDao;
-import se.su.dsv.scipro.data.dao.interfaces.UserDao;
 import se.su.dsv.scipro.data.dataobjects.FileDescription;
 import se.su.dsv.scipro.data.dataobjects.FinalSeminar;
 import se.su.dsv.scipro.data.dataobjects.FinalSeminarActiveParticipation;
 import se.su.dsv.scipro.data.dataobjects.FinalSeminarOpposition;
-import se.su.dsv.scipro.data.dataobjects.Project;
-import se.su.dsv.scipro.data.dataobjects.Student;
 import se.su.dsv.scipro.data.dataobjects.User;
-import se.su.dsv.scipro.data.enums.FinalSeminarLanguages;
 import se.su.dsv.scipro.icons.ImageIcon;
 import se.su.dsv.scipro.opponent.models.OpponentModel;
 import se.su.dsv.scipro.opponent.pages.TurnitinPopupPage;
 import se.su.dsv.scipro.project.pages.ProjectStartPage;
 import se.su.dsv.scipro.repository.components.FileDownloadLink;
 import se.su.dsv.scipro.repository.components.FileOpenLink;
-import se.su.dsv.scipro.supervisor.pages.SupervisorProjectsFinalSeminarPage;
 import se.su.dsv.scipro.util.TurnitinComponent;
 
 public class ProjectFinalSeminarPanel extends Panel {
@@ -80,66 +55,51 @@ public class ProjectFinalSeminarPanel extends Panel {
 	@SpringBean
 	private FinalSeminarDao finalSeminarDao;
 
-	@SpringBean
-	private FinalSeminarOppositionDao finalSeminarOppositionDao;
-	@SpringBean
-	private UserDao userDao;
-
-	@SpringBean
-	private CheckPlagiarismEventDao checkPlagiarismEventDao;
-
 	@SpringBean
 	private GeneralSystemSettingsDao generalSystemSettingsDao;
 
-	@SpringBean
-	private RoleDao roleDao;
-
-	@SpringBean
-	private FinalSeminarActiveParticipationDao finalSeminarActiveParticipationDao;
-
 	private static final long serialVersionUID = 1L;
 
 	private Date finalSubmissionDate;
 
 	private FeedbackPanel feedbackPanel;
-	private WebMarkupContainer editSeminarDialogContainer, contactsDialogContainer;
-	private Dialog editSeminarDialog, contactsSeminarDialog;
-	private FinalSeminar editSeminar;
-	private DatePicker<Date> startDateField;
-	private DropDownChoice<String> startHour, startMinute, endHour, endMinute;
-	private UserProjectMultiObjectAutoCompleteField<FinalSeminarActiveParticipation, Long> moacf,
-			activeListerners;
-	private TextField<String> room;
-	private TextField<String> projectLabel;
-	private MultiLineLabel contactsTextArea;
-	private DropDownChoice<FinalSeminarLanguages> presentationLanguage;
-	private DropDownChoice<FinalSeminarLanguages> reportLanguage;
+	private WebMarkupContainer editSeminarDialogContainer;
+	private Dialog editSeminarDialog;
+	private EditSeminarForm editSeminarForm;
 
-	public ProjectFinalSeminarPanel(final String id,
-			final FinalSeminar seminar, final boolean isSupervisorView) {
+	public ProjectFinalSeminarPanel(final String id, final FinalSeminar seminar,
+			final boolean isSupervisorView) {
 		super(id);
 
 		setVersioned(false);
 
-		final PatternDateConverter pdc = new PatternDateConverter(
-				"yyyy-MM-dd HH:mm", false);
+		final PatternDateConverter pdc = new PatternDateConverter("yyyy-MM-dd HH:mm", false);
 		EditForm editForm;
 		add(editForm = new EditForm("editForm", seminar));
-
+		
+		editSeminarDialogContainer = new WebMarkupContainer("dialogContainer");
+		editSeminarDialog = new Dialog("dialog");
+		editSeminarDialog.setModal(true);
+		editSeminarDialog.setAutoOpen(false);
+		editSeminarDialog.setWidth(470);
+		editSeminarDialog.add(editSeminarDialogContainer);
+		add(editSeminarDialog);
+		editSeminarDialogContainer.setOutputMarkupId(true);
+		editSeminarDialogContainer.add(editSeminarForm = new EditSeminarForm("editSeminarForm"));
+		editSeminarForm.setOutputMarkupId(true);
 		add(new Label("seminarLocation", seminar.getRoom()));
-		add(new Label("projectClass", seminar.getProject().getProjectClass()
-				.getName()));
-		add(new Label("seminarLanguage", seminar.getPresentationLanguage()
-				.toString()));
+		add(new Label("projectClass", seminar.getProject().getProjectClass().getName()));
+		add(new Label("seminarLanguage", seminar.getPresentationLanguage().toString()));
 		add(new Label("thesisLanguage", seminar.getReportLanguage().toString()));
 
 		if (!isSupervisorView) {
 			editForm.setVisible(false);
 		}
-		
+
 		Label pdfLabel = new Label("mustBePdf", " (PDF required)");
 		pdfLabel.setOutputMarkupPlaceholderTag(true);
-		pdfLabel.setVisible(generalSystemSettingsDao.getGeneralSystemSettingsInstance().isFinalSeminarThesisMustBeAPDF() &&!isSupervisorView);
+		pdfLabel.setVisible(generalSystemSettingsDao.getGeneralSystemSettingsInstance()
+				.isFinalSeminarThesisMustBeAPDF() && !isSupervisorView);
 		add(pdfLabel);
 		int totalAttendees = 1;
 		totalAttendees += seminar.getActiveParticipations().size();
@@ -159,12 +119,9 @@ public class ProjectFinalSeminarPanel extends Panel {
 		attendeesDialog.add(attendeesDialogContainer);
 		add(attendeesDialog);
 
+		add(new FinalSeminarDetailsPanel("finalSeminarDetailsPanel", seminar, false));
 
-		add(new FinalSeminarDetailsPanel("finalSeminarDetailsPanel", seminar,
-				false));
-
-		final AjaxLink<Void> totalAttendeesLink = new AjaxLink<Void>(
-				"totalAttendeesLink") {
+		final AjaxLink<Void> totalAttendeesLink = new AjaxLink<Void>("totalAttendeesLink") {
 			private static final long serialVersionUID = 1L;
 
 			@Override
@@ -181,29 +138,17 @@ public class ProjectFinalSeminarPanel extends Panel {
 
 		add(new Label("totalAttendees", String.valueOf(totalAttendees)));
 
-		// add(totalAttendeesLink);
+		add(new DateLabel("seminarDate", new Model<Date>(seminar.getStartDate()), pdc));
 
-		add(new DateLabel("seminarDate",
-				new Model<Date>(seminar.getStartDate()), pdc));
-
-		add(new DateLabel("seminarEndDate", new Model<Date>(
-				seminar.getEndDate()), new PatternDateConverter("HH:mm", false)));
+		add(new DateLabel("seminarEndDate", new Model<Date>(seminar.getEndDate()),
+				new PatternDateConverter("HH:mm", false)));
 		/*
 		 * Deadline -7 days removed, deadline is now the start-date of the
 		 * seminar
 		 */
-		finalSubmissionDate = new DateTime(seminar.getStartDate()).minusDays(7)
-				.toDate();
+		finalSubmissionDate = new DateTime(seminar.getStartDate()).minusDays(7).toDate();
+
 
-		editSeminarDialogContainer = new WebMarkupContainer("dialogContainer");
-		editSeminarDialog = new Dialog("dialog");
-		editSeminarDialog.setModal(true);
-		editSeminarDialog.setAutoOpen(false);
-		editSeminarDialog.setWidth(470);
-		editSeminarDialog.add(editSeminarDialogContainer);
-		add(editSeminarDialog);
-		editSeminarDialogContainer.setOutputMarkupId(true);
-		editSeminarDialogContainer.add(new EditSeminarForm("editSeminarForm"));
 
 		add(new Label("seminarReportTitle", new Model<String>() {
 			private static final long serialVersionUID = 1L;
@@ -211,13 +156,11 @@ public class ProjectFinalSeminarPanel extends Panel {
 			@Override
 			public String getObject() {
 
-				return seminar.getDocument() == null ? "" : seminar
-						.getDocument().getName();
+				return seminar.getDocument() == null ? "" : seminar.getDocument().getName();
 			}
 		}));
 
-		final WebMarkupContainer uploadInfoContainer = new WebMarkupContainer(
-				"uploadInfoContainer") {
+		final WebMarkupContainer uploadInfoContainer = new WebMarkupContainer("uploadInfoContainer") {
 			private static final long serialVersionUID = 1L;
 
 			@Override
@@ -226,12 +169,11 @@ public class ProjectFinalSeminarPanel extends Panel {
 			}
 		};
 
-		uploadInfoContainer.add(new DateLabel("uploadDate", new Model<Date>(
-				seminar.getDocumentUploadDate()), pdc));
+		uploadInfoContainer.add(new DateLabel("uploadDate", new Model<Date>(seminar
+				.getDocumentUploadDate()), pdc));
 
 		if (seminar.getDocumentUploader() != null) {
-			uploadInfoContainer.add(seminar.getDocumentUploader()
-					.getDisplayComponent("uploader"));
+			uploadInfoContainer.add(seminar.getDocumentUploader().getDisplayComponent("uploader"));
 		} else {
 			uploadInfoContainer.add(new EmptyPanel("uploader"));
 		}
@@ -250,7 +192,7 @@ public class ProjectFinalSeminarPanel extends Panel {
 			public void onClick() {
 				TurnitinComponent turnitin = new TurnitinComponent();
 				String url = turnitin.returnReport(seminar.getTurnitinId());
-				if(url != null){
+				if (url != null) {
 					seminar.setCheckedForPlagirism(true);
 					finalSeminarDao.save(seminar);
 				}
@@ -266,10 +208,8 @@ public class ProjectFinalSeminarPanel extends Panel {
 			turnItLink.setVisible(isSupervisorView);
 		}
 
-		uploadInfoContainer.add(new FileDownloadLink("download", seminar
-				.getDocument()));
-		uploadInfoContainer
-				.add(new FileOpenLink("open", seminar.getDocument()));
+		uploadInfoContainer.add(new FileDownloadLink("download", seminar.getDocument()));
+		uploadInfoContainer.add(new FileOpenLink("open", seminar.getDocument()));
 		uploadInfoContainer.add(plagiarismLabel);
 		uploadInfoContainer.add(turnItLink);
 		uploadInfoContainer.add(checkPlagiarismLabel);
@@ -280,9 +220,8 @@ public class ProjectFinalSeminarPanel extends Panel {
 			@Override
 			public boolean isVisible() {
 
-				return !isSupervisorView
-						&& seminar.getActiveParticipations().isEmpty()
-						&& seminar.getOppositions().isEmpty();
+				return !isSupervisorView && seminar.getActiveParticipations().isEmpty()
+						&& seminar.getOppositions().isEmpty() && seminar.getTurnitinId() != null;
 			}
 
 			@Override
@@ -325,18 +264,13 @@ public class ProjectFinalSeminarPanel extends Panel {
 					private static final long serialVersionUID = 1L;
 
 					@Override
+					protected void populateItem(final ListItem<FileDescription> fileItem) {
+						fileItem.add(new Label("fileName", fileItem.getModelObject().getName()));
+						fileItem.add(new DateLabel("uploadDate", new Model<Date>(o
+								.getDateReported()), pdc));
 
-					protected void populateItem(
-							final ListItem<FileDescription> fileItem) {
-						fileItem.add(new Label("fileName", fileItem
-								.getModelObject().getName()));
-						fileItem.add(new DateLabel("uploadDate",
-								new Model<Date>(o.getDateReported()), pdc));
-
-						fileItem.add(new FileDownloadLink("download", fileItem
-								.getModel()));
-						fileItem.add(new FileOpenLink("open", fileItem
-								.getModel()));
+						fileItem.add(new FileDownloadLink("download", fileItem.getModel()));
+						fileItem.add(new FileOpenLink("open", fileItem.getModel()));
 
 					}
 				});
@@ -354,13 +288,12 @@ public class ProjectFinalSeminarPanel extends Panel {
 			}
 		});
 
-		add(new ListView<FinalSeminarActiveParticipation>(
-				"activeParticipantsList", seminar.getActiveParticipations()) {
+		add(new ListView<FinalSeminarActiveParticipation>("activeParticipantsList",
+				seminar.getActiveParticipations()) {
 			private static final long serialVersionUID = 1L;
 
 			@Override
-			protected void populateItem(
-					ListItem<FinalSeminarActiveParticipation> item) {
+			protected void populateItem(ListItem<FinalSeminarActiveParticipation> item) {
 				item.add(item.getModelObject().getUser()
 						.getDisplayComponent("activeParticipant", true));
 				add(item);
@@ -432,8 +365,7 @@ public class ProjectFinalSeminarPanel extends Panel {
 		 * TODO Fix so that feedback shows up correctly
 		 */
 
-		public SeminarDocumentUploadForm(final String id,
-				final FinalSeminar seminar) {
+		public SeminarDocumentUploadForm(final String id, final FinalSeminar seminar) {
 			super(id);
 			setMultiPart(true);
 
@@ -463,6 +395,20 @@ public class ProjectFinalSeminarPanel extends Panel {
 		}
 	}
 
+	private class EditSeminarForm extends Form<OpponentModel> {
+
+		/**
+         * 
+         */
+		private static final long serialVersionUID = -5004827722926732419L;
+
+		public EditSeminarForm(String name) {
+			super(name, new CompoundPropertyModel<OpponentModel>(new OpponentModel()));
+			editSeminarDialog.setTitle("Edit Seminar");
+			add(new EmptyPanel("editSeminarDetails"));
+		}
+	}
+
 	private class EditForm extends Form<Void> {
 
 		/**
@@ -480,69 +426,9 @@ public class ProjectFinalSeminarPanel extends Panel {
 				@Override
 				protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
 					FinalSeminar seminar2 = finalSeminarDao.reLoad(seminar);
-					editSeminar = seminar2;
-					startDateField.setDefaultModelObject(seminar2
-							.getStartDate());
-					Calendar calendar = Calendar.getInstance();
-					calendar.setTime(seminar2.getStartDate());
-					int hourInt = calendar.get(Calendar.HOUR_OF_DAY);
-					String hourString = "";
-					if (hourInt < 10) {
-						hourString = "0" + String.valueOf(hourInt);
-					} else {
-						hourString = String.valueOf(hourInt);
-					}
-					startHour.setDefaultModelObject(hourString);
-
-					int minuteInt = calendar.get(Calendar.MINUTE);
-					String minuteString = "";
-					if (minuteInt < 10) {
-						minuteString = "0" + String.valueOf(minuteInt);
-					} else {
-						minuteString = String.valueOf(minuteInt);
-					}
-
-					startMinute.setDefaultModelObject(minuteString);
-
-					calendar.setTime(seminar2.getEndDate());
-					hourInt = calendar.get(Calendar.HOUR_OF_DAY);
-					hourString = "";
-					if (hourInt < 10) {
-						hourString = "0" + String.valueOf(hourInt);
-					} else {
-						hourString = String.valueOf(hourInt);
-					}
-					endHour.setDefaultModelObject(hourString);
-
-					minuteInt = calendar.get(Calendar.MINUTE);
-					minuteString = "";
-					if (minuteInt < 10) {
-						minuteString = "0" + String.valueOf(minuteInt);
-					} else {
-						minuteString = String.valueOf(minuteInt);
-					}
-
-					endMinute.setDefaultModelObject(minuteString);
-					room.setDefaultModelObject(seminar2.getRoom());
-					List<FinalSeminarActiveParticipation> userList = new ArrayList<FinalSeminarActiveParticipation>();
-					for (FinalSeminarOpposition f : seminar2.getOppositions()) {
-						FinalSeminarActiveParticipation al = new FinalSeminarActiveParticipation();
-						al.setUser(f.getOpponent().getUser());
-						al.setProject(f.getProject());
-						userList.add(al);
-					}
-
-
-					presentationLanguage.setDefaultModelObject(seminar
-							.getPresentationLanguage());
-					reportLanguage.setDefaultModelObject(seminar
-							.getReportLanguage());
-
-					moacf.setSelectedObjects(userList);
-
-					activeListerners.setSelectedObjects(seminar2.getActiveParticipations());
-					projectLabel.setDefaultModelObject(seminar.getProject().getTitle());
-					target.addComponent(editSeminarDialog);
+					editSeminarForm.removeAll();
+					editSeminarForm.add(new EditFinalSeminarFormPanel("editSeminarDetails", seminar2));
+					target.addComponent(editSeminarForm);
 					editSeminarDialog.open(target);
 				}
 
@@ -556,267 +442,6 @@ public class ProjectFinalSeminarPanel extends Panel {
 		}
 	}
 
-	private class EditSeminarForm extends Form<OpponentModel> {
-
-		private static final long serialVersionUID = -5268957422910135323L;
-
-		public EditSeminarForm(String name) {
-			super(name, new CompoundPropertyModel<OpponentModel>(new OpponentModel()));
-			// final WebMarkupContainer feedbackContainer = new
-			// WebMarkupContainer(
-			// "feedbackContainer");
-			// feedbackContainer.setOutputMarkupId(true);
-			// WebMarkupContainer feedbackPanel = new
-			// FormFeedbackPanel<OpponentModel>(
-			// "feedbackPanel", this);
-			// feedbackContainer.add(feedbackPanel);
-			// add(feedbackContainer);
-			add(feedbackPanel = new FeedbackPanel("feedbackPanel"));
-			feedbackPanel.setOutputMarkupId(true);
-			editSeminarDialog.setTitle("Edit Seminar");
-
-			add(projectLabel = new TextField<String>("project"));
-			projectLabel.setEnabled(false);
-
-			startDateField = new DatePicker<Date>("date") {
-
-				private static final long serialVersionUID = 1L;
-
-				@Override
-				public final IConverter getConverter(Class<?> type) {
-					return new DateConverter(true) {
-						private static final long serialVersionUID = 1L;
-
-						@Override
-						public String getDatePattern() {
-							return "yy-dd-mm";
-						}
-
-						@Override
-						protected DateTimeFormatter getFormat() {
-							return DateTimeFormat.forPattern("YYYY-MM-dd");
-						}
-					};
-				}
-			};
-			startDateField.setDateFormat("yy-mm-dd");
-			startDateField.setRequired(true);
-			// startDateField.setShowOn(ShowOnEnum.BOTH);
-			// startDateField.setButtonText("<div class=\"ui-icon ui-icon-calendar\"></div>");
-			add(room = new TextField<String>("room"));
-			add(startDateField);
-
-			startHour = new DropDownChoice<String>("startHour", Arrays.asList(new String[] { "00",
-					"01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13",
-					"14", "15", "16", "17", "18", "19", "20", "21", "22", "23" }));
-			add(startHour);
-			startHour.setRequired(false);
-			startMinute = new DropDownChoice<String>("startMinute", Arrays.asList(new String[] {
-					"00", "05", "10", "15", "20", "25", "30", "35", "40", "45", "50", "55" }));
-			add(startMinute);
-
-			endHour = new DropDownChoice<String>("endHour", Arrays.asList(new String[] { "00",
-					"01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13",
-					"14", "15", "16", "17", "18", "19", "20", "21", "22", "23" }));
-			add(endHour);
-			endHour.setRequired(false);
-			endMinute = new DropDownChoice<String>("endMinute", Arrays.asList(new String[] { "00",
-					"05", "10", "15", "20", "25", "30", "35", "40", "45", "50", "55" }));
-			add(endMinute);
-
-			List<FinalSeminarLanguages> languageOptions = new ArrayList<FinalSeminarLanguages>(
-					Arrays.asList(FinalSeminarLanguages.values()));
-
-			presentationLanguage = new DropDownChoice<FinalSeminarLanguages>(
-					"presentationLanguage", languageOptions);
-			add(presentationLanguage);
-			presentationLanguage.setRequired(true);
-
-
-			reportLanguage = new DropDownChoice<FinalSeminarLanguages>(
-					"reportLanguage", languageOptions);
-
-			add(reportLanguage);
-			reportLanguage.setRequired(true);
-
-			room.setRequired(true);
-
-			AutoCompletionChoicesProvider<FinalSeminarActiveParticipation> choiceProvider = new AutoCompletionChoicesProvider<FinalSeminarActiveParticipation>() {
-
-				@Override
-				public Iterator<FinalSeminarActiveParticipation> getChoices(
-						String input) {
-					// TODO Auto-generated method stub
-					List<FinalSeminarActiveParticipation> active = new ArrayList<FinalSeminarActiveParticipation>();
-					for (User user : userDao.findUserQuery(input, 10)) {
-						FinalSeminarActiveParticipation ac = new FinalSeminarActiveParticipation();
-						ac.setUser(user);
-						active.add(ac);
-					}
-					return active.iterator();
-				}
-			};
-
-			UserProjectMultiObjectAutoCompleteBuilder<FinalSeminarActiveParticipation, Long> moac = new UserProjectMultiObjectAutoCompleteBuilder<FinalSeminarActiveParticipation, Long>(
-					choiceProvider);
-			moac.idType(Long.class);
-			moac.autoCompleteRenderer(new MultiObjectAutoCompleteRenderer<FinalSeminarActiveParticipation>() {
-				@Override
-				public String getTextValue(FinalSeminarActiveParticipation al) {
-					User u = al.getUser();
-					return u.getFirstName() + " " + u.getLastName() + " <" + u.getEmailAddress()
-							+ ">";
-				}
-
-				protected String getIdValue(FinalSeminarActiveParticipation al) {
-					User u = al.getUser();
-					return u.getId().toString();
-				}
-			});
-
-			moac.objectConverter(new MultiObjectAutoCompleteObjectConverter<Long, FinalSeminarActiveParticipation>() {
-
-				@Override
-				public FinalSeminarActiveParticipation convertToObject(Long id) {
-					FinalSeminarActiveParticipation ac = new FinalSeminarActiveParticipation();
-					ac.setUser(userDao.load(id));
-					return ac;
-				}
-			});
-
-			moacf = moac.build("opponentList", null, getModelObject());
-			activeListerners = moac.build("activeParticipations", null, getModelObject());
-			add(moacf);
-			add(activeListerners);
-
-			add(new AjaxButton("submitButton", new Model<String>("Save")) {
-
-				@Override
-				protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
-					editSeminar = finalSeminarDao.reLoad(editSeminar);
-					OpponentModel opponentModel = (OpponentModel) form.getDefaultModelObject();
-					boolean notSameProject = true;
-					boolean error = false;
-					Project project = editSeminar.getProject();
-					for (Student student : project.getProjectParticipants()) {
-						if (!notSameProject)
-							break;
-						for (FinalSeminarActiveParticipation al : opponentModel.getOpponentList()) {
-							if (student.getUser().equals(al.getUser()) && !al.isPreDeleted()) {
-								notSameProject = false;
-								break;
-							}
-						}
-						for (FinalSeminarActiveParticipation al : opponentModel
-								.getActiveParticipations()) {
-							if (student.getUser().equals(al.getUser()) && !al.isPreDeleted()) {
-								notSameProject = false;
-								break;
-							}
-						}
-					}
-					for (FinalSeminarActiveParticipation al : opponentModel
-							.getOpponentList()) {
-						if (al.getProject() == null && !al.isPreDeleted()) {
-							error = true;
-							break;
-						}
-					}
-					if (!error) {
-						for (FinalSeminarActiveParticipation al : opponentModel
-								.getActiveParticipations()) {
-							if (al.getProject() == null && !al.isPreDeleted()) {
-								error = true;
-								break;
-							}
-						}
-					}
-
-					if (notSameProject && !error) {
-
-						Date date = opponentModel.getDate();
-						Calendar cal = Calendar.getInstance();
-						cal.setTime(date);
-						cal.set(Calendar.HOUR_OF_DAY, Integer.valueOf(opponentModel.getStartHour()));
-						cal.set(Calendar.MINUTE, Integer.valueOf(opponentModel.getStartMinute()));
-
-						editSeminar.setStartDate(cal.getTime());
-
-						cal.set(Calendar.HOUR_OF_DAY, Integer.valueOf(opponentModel.getEndHour()));
-						cal.set(Calendar.MINUTE, Integer.valueOf(opponentModel.getEndMinute()));
-						editSeminar.setEndDate(cal.getTime());
-
-						editSeminar.setProject(project);
-						editSeminar.setRoom(opponentModel.getRoom());
-
-
-						editSeminar.setPresentationLanguage(opponentModel
-								.getPresentationLanguage());
-						editSeminar.setReportLanguage(opponentModel
-								.getReportLanguage());
-
-						editSeminar = finalSeminarDao.save(editSeminar);
-
-						for (FinalSeminarActiveParticipation al : opponentModel
-								.getOpponentList()) {
-
-							if (!al.isPreDeleted()) {
-								FinalSeminarOpposition opposition1 = new FinalSeminarOpposition();
-								opposition1.setOpponent(roleDao.makeStudent(al
-										.getUser()));
-								opposition1.setProject(al.getProject());
-								opposition1.setFinalSeminar(editSeminar);
-								opposition1 = finalSeminarOppositionDao
-										.save(opposition1);
-							} else if (al.isPreDeleted()) {
-								List<FinalSeminarOpposition> finalSeminar = finalSeminarOppositionDao
-										.findOppositionsByUserAndProject(
-												al.getUser(), al.getProject(),
-												editSeminar);
-								for (FinalSeminarOpposition fso : finalSeminar) {
-									seminarUploadController.deleteOpponentFiles(fso);
-									finalSeminarOppositionDao.delete(fso);
-								}
-							}
-
-						}
-
-						for (FinalSeminarActiveParticipation al : opponentModel
-								.getActiveParticipations()) {
-							editSeminar = finalSeminarDao.reLoad(editSeminar);
-							List<FinalSeminarActiveParticipation> allList = editSeminar
-									.getActiveParticipations();
-							if (!allList.contains(al) && !al.isPreDeleted()) {
-								al.setFinalSeminar(editSeminar);
-								finalSeminarActiveParticipationDao.save(al);
-
-							} else if (al.isPreDeleted()
-									&& allList.contains(al)) {
-								finalSeminarActiveParticipationDao
-										.delete(finalSeminarActiveParticipationDao
-												.reLoad(al));
-							}
-
-						}
-
-						setResponsePage(SupervisorProjectsFinalSeminarPage.class);
-					} else if (!notSameProject && error) {
-						error("Opponent/Active participant is an author in the final seminar");
-						error("Must select a Project for the Opponent/Active participant");
-					} else if (notSameProject && error) {
-						error("Must select a Project for the Opponent/Active participant");
-					} else {
-						error("Opponent/Active participant is an author in the final seminar");
-					}
-				}
-
-				@Override
-				protected void onError(final AjaxRequestTarget target, final Form form) {
-					target.addComponent(feedbackPanel);
-				}
-			});
-
-		}
-	}
+	
 
 }
diff --git a/src/main/java/se/su/dsv/scipro/opponent/panels/ProjectOppositionsPanel.java b/src/main/java/se/su/dsv/scipro/opponent/panels/ProjectOppositionsPanel.java
index ff89049097..bdfb4bd17d 100644
--- a/src/main/java/se/su/dsv/scipro/opponent/panels/ProjectOppositionsPanel.java
+++ b/src/main/java/se/su/dsv/scipro/opponent/panels/ProjectOppositionsPanel.java
@@ -30,7 +30,6 @@ import se.su.dsv.scipro.data.dataobjects.Project;
 import se.su.dsv.scipro.data.dataobjects.Student;
 import se.su.dsv.scipro.data.dataobjects.User;
 import se.su.dsv.scipro.project.pages.ProjectOppositionPage;
-import se.su.dsv.scipro.repository.FileRepository;
 import se.su.dsv.scipro.repository.components.FileDownloadLink;
 import se.su.dsv.scipro.repository.components.FileOpenLink;
 
@@ -41,9 +40,6 @@ public class ProjectOppositionsPanel extends Panel {
 	@SpringBean
 	private FinalSeminarOppositionDao finalSeminarOppositionDao;
 
-	@SpringBean
-	private FileRepository fileRepository;
-
 	@SpringBean
 	private FinalSeminarUploadController seminarUploadController;
 	
diff --git a/src/main/java/se/su/dsv/scipro/opponent/panels/StudentOppositionStatsPanel.java b/src/main/java/se/su/dsv/scipro/opponent/panels/StudentOppositionStatsPanel.java
index a3fb56954d..4b5cc75f00 100644
--- a/src/main/java/se/su/dsv/scipro/opponent/panels/StudentOppositionStatsPanel.java
+++ b/src/main/java/se/su/dsv/scipro/opponent/panels/StudentOppositionStatsPanel.java
@@ -24,7 +24,6 @@ import se.su.dsv.scipro.data.dao.interfaces.FinalSeminarActiveParticipationDao;
 import se.su.dsv.scipro.data.dao.interfaces.FinalSeminarOppositionDao;
 import se.su.dsv.scipro.data.dao.interfaces.ProjectDao;
 import se.su.dsv.scipro.data.dataobjects.Employee;
-import se.su.dsv.scipro.data.dataobjects.FinalSeminarOpposition;
 import se.su.dsv.scipro.data.dataobjects.Project;
 import se.su.dsv.scipro.data.dataobjects.Student;
 import se.su.dsv.scipro.data.dataobjects.User;
diff --git a/src/main/java/se/su/dsv/scipro/peer/data/dao/controllers/PeerPortalControllerImpl.java b/src/main/java/se/su/dsv/scipro/peer/data/dao/controllers/PeerPortalControllerImpl.java
index 181b0f1b05..717f91afc0 100644
--- a/src/main/java/se/su/dsv/scipro/peer/data/dao/controllers/PeerPortalControllerImpl.java
+++ b/src/main/java/se/su/dsv/scipro/peer/data/dao/controllers/PeerPortalControllerImpl.java
@@ -5,6 +5,7 @@ import java.util.Collections;
 import java.util.Comparator;
 import java.util.Date;
 import java.util.List;
+import java.util.Properties;
 
 import org.apache.log4j.Level;
 import org.apache.log4j.Logger;
@@ -17,7 +18,9 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.transaction.annotation.Transactional;
 
+import se.su.dsv.scipro.conference.pages.SupervisorConferencePage;
 import se.su.dsv.scipro.data.controllers.NotificationController;
+import se.su.dsv.scipro.data.controllers.NotificationMessage;
 import se.su.dsv.scipro.data.dao.interfaces.FileDescriptionDao;
 import se.su.dsv.scipro.data.dao.interfaces.ProjectDao;
 import se.su.dsv.scipro.data.dataobjects.FileDescription;
@@ -27,6 +30,7 @@ import se.su.dsv.scipro.data.dataobjects.ProjectClassSettings;
 import se.su.dsv.scipro.data.dataobjects.Student;
 import se.su.dsv.scipro.data.dataobjects.User;
 import se.su.dsv.scipro.data.enums.NotificationEventType;
+import se.su.dsv.scipro.data.enums.NotificationPriority;
 import se.su.dsv.scipro.exceptions.UpdatedSincePageLoadException;
 import se.su.dsv.scipro.peer.data.dao.interfaces.PeerRequestDao;
 import se.su.dsv.scipro.peer.data.dao.interfaces.PeerReviewDao;
@@ -34,309 +38,381 @@ import se.su.dsv.scipro.peer.data.dataobjects.PeerRequest;
 import se.su.dsv.scipro.peer.data.dataobjects.PeerReview;
 import se.su.dsv.scipro.peer.enums.RequestStatus;
 import se.su.dsv.scipro.peer.pages.ProjectPeerReviewPage;
+import se.su.dsv.scipro.peer.pages.ProjectPeerStatsPage;
 import se.su.dsv.scipro.peer.pages.SupervisorPeerReviewPage;
 import se.su.dsv.scipro.repository.FileRepository;
 import se.su.dsv.scipro.repository.util.FileStorageException;
 import se.su.dsv.scipro.security.auth.roles.Roles;
+import se.su.dsv.scipro.util.PropsUtils;
+
 /**
  * 
  * @author Martin Peters - mpeters@dsv.su.se
- *
+ * 
  */
 @Controller("peerPortalController")
 public class PeerPortalControllerImpl implements PeerPortalController {
 
 	private static final long serialVersionUID = 1L;
-	
+
 	public static final String PEER_FILE_PATH = "peer/";
 	public static final String PEER_REQUEST_PATH = PEER_FILE_PATH + "request/";
 	public static final String PEER_REVIEW_PATH = PEER_FILE_PATH + "review/";
-	
+
 	@Autowired
 	private PeerRequestDao peerRequestDao;
-	
+
 	@Autowired
 	private PeerReviewDao peerReviewDao;
-	
+
 	@Autowired
 	private FileRepository fileRepository;
-	
+
 	@Autowired
 	private FileDescriptionDao fileDescriptionDao;
-	
+
 	@Autowired
 	private ProjectDao projectDao;
-	
+
 	@Autowired
 	private NotificationController notificationController;
-	
+
 	/**
-	 * Gets a list of PeerRequests and if it is reviewable by the combination of Student + Project. All input parameters are optional
-	 * @param projectClass may be null.
-	 * @param project may be null.
-	 * @param student may be null.
+	 * Gets a list of PeerRequests and if it is reviewable by the combination of
+	 * Student + Project. All input parameters are optional
+	 * 
+	 * @param projectClass
+	 *            may be null.
+	 * @param project
+	 *            may be null.
+	 * @param student
+	 *            may be null.
 	 * @return
 	 */
 	@Override
 	@Transactional
-	public List<Tuple> getPeerRequests(final ProjectClass projectClass, final Project project, final Student student){
-		//TODO how to handle project with ProjectClass = UNKNOWN?
-		
-		List<PeerRequest> temp = peerRequestDao.getPeerRequests(RequestStatus.WAITING, projectClass );
+	public List<Tuple> getPeerRequests(final ProjectClass projectClass, final Project project,
+			final Student student) {
+		// TODO how to handle project with ProjectClass = UNKNOWN?
+
+		List<PeerRequest> temp = peerRequestDao
+				.getPeerRequests(RequestStatus.WAITING, projectClass);
 		List<Tuple> result = new ArrayList<Tuple>(temp.size());
-		
+
 		ProjectClassSettings settings = projectClass.getProjectClassSettings();
-		Date priorityDate = new DateTime().minusDays( settings.getNumDaysBeforePeerRequestPriority() ).toDate();
+		Date priorityDate = new DateTime()
+				.minusDays(settings.getNumDaysBeforePeerRequestPriority()).toDate();
 		boolean foundExpiredPriorityDate = false;
-		
-		for(PeerRequest peerRequest : temp){
+
+		for (PeerRequest peerRequest : temp) {
 			Student requestingStudent = peerRequest.getRequester();
 			Project requestingProject = peerRequest.getProject();
 			int given = peerReviewDao.countReviewsGiven(requestingStudent, requestingProject);
 			int received = peerReviewDao.countReviewsReceived(requestingStudent, requestingProject);
 
-			Pair<Boolean,NotReviewableReason> pair = this.isReviewableTo(peerRequest, student, project); //Checks basics reviewable rules
+			Pair<Boolean, NotReviewableReason> pair = this.isReviewableTo(peerRequest, student,
+					project); // Checks basics reviewable rules
 			NotReviewableReason notReviewableReason = pair.tail;
 			boolean isReviewable = pair.head;
-			if( isReviewable ){ //If it's reviewable at all do following:
+			if (isReviewable) { // If it's reviewable at all do following:
 				/*
-				 * Reviews come sorted, oldest first. If it's older than priorityDate, flag that we've found
-				 * one that's "expired".
+				 * Reviews come sorted, oldest first. If it's older than
+				 * priorityDate, flag that we've found one that's "expired".
 				 */
-				boolean reviewOlderThanPriorityDate = priorityDate.compareTo( peerRequest.getDateCreated() ) > 0;
-				if( reviewOlderThanPriorityDate ) {
+				boolean reviewOlderThanPriorityDate = priorityDate.compareTo(peerRequest
+						.getDateCreated()) > 0;
+				if (reviewOlderThanPriorityDate) {
 					foundExpiredPriorityDate = true;
 				}
-				if( foundExpiredPriorityDate ){
+				if (foundExpiredPriorityDate) {
 					/*
-					 * If we've found something expired, make only those also older than expiration-date
-					 * reviewable.
+					 * If we've found something expired, make only those also
+					 * older than expiration-date reviewable.
 					 */
 					isReviewable = reviewOlderThanPriorityDate;
 					notReviewableReason = NotReviewableReason.OTHERS_PAST_PRIORITY_AGE;
 				}
-				if( (given - received > 0) ) {
+				if ((given - received > 0)) {
 					/*
-					 * ..except those with good ratio, they are reviewable any time
+					 * ..except those with good ratio, they are reviewable any
+					 * time
 					 */
 					isReviewable = true;
 					notReviewableReason = null;
 				}
 			}
-			result.add(new Tuple(peerRequest, isReviewable , given, received, notReviewableReason));
+			result.add(new Tuple(peerRequest, isReviewable, given, received, notReviewableReason));
 		}
-		
+
 		Collections.sort(result, new Comparator<Tuple>() {
 			@Override
 			public int compare(Tuple t1, Tuple t2) {
-				if( t1.isReviewable == t2.isReviewable ) //If equal, present oldest first
-					return t1.peerRequest.getDateCreated().compareTo( t2.peerRequest.getDateCreated() );
-				if( t1.isReviewable ) //If unequal, present those that are reviewable first
+				if (t1.isReviewable == t2.isReviewable) // If equal, present
+														// oldest first
+					return t1.peerRequest.getDateCreated().compareTo(
+							t2.peerRequest.getDateCreated());
+				if (t1.isReviewable) // If unequal, present those that are
+										// reviewable first
 					return -1;
 				else
 					return 1;
-			}			
+			}
 		});
-				
+
 		return result;
 	}
 
 	/**
-	 * Checks for "basic reviewability". Does not take into account the more complex rule that looks at all other available requests
+	 * Checks for "basic reviewability". Does not take into account the more
+	 * complex rule that looks at all other available requests
 	 */
 	@Override
 	@Transactional
-	public Pair<Boolean,NotReviewableReason> isReviewableTo(final PeerRequest peerRequest, final Student student, final Project activeProject){
-		if( student == null || activeProject == null || peerRequest == null )
-			return new Pair<Boolean,NotReviewableReason>(false,NotReviewableReason.YOU_ARE_SUPERVISOR);
+	public Pair<Boolean, NotReviewableReason> isReviewableTo(final PeerRequest peerRequest,
+			final Student student, final Project activeProject) {
+		if (student == null || activeProject == null || peerRequest == null)
+			return new Pair<Boolean, NotReviewableReason>(false,
+					NotReviewableReason.YOU_ARE_SUPERVISOR);
 
 		final Project requestingProject = peerRequest.getProject();
 		final ProjectClass requestingProjectClass = requestingProject.getProjectClass();
 		final ProjectClass reviewingProjectClass = activeProject.getProjectClass();
 		/*
-		 * You may not review something in a different ProjectClass, current page design prevents this from
-		 * happening but it's a cheap safeguard. 
+		 * You may not review something in a different ProjectClass, current
+		 * page design prevents this from happening but it's a cheap safeguard.
 		 */
-		if( !requestingProjectClass.equals(reviewingProjectClass) ) 
-			return new Pair<Boolean,NotReviewableReason>(false,NotReviewableReason.DIFFERENT_PROJECTCLASS);
-		//You may not review something you're part of!
-		if( projectDao.isPartOf(student.getUser(), requestingProject ) ) 
-			return new Pair<Boolean,NotReviewableReason>(false,NotReviewableReason.PART_OF_PROJECT);
-		
+		if (!requestingProjectClass.equals(reviewingProjectClass))
+			return new Pair<Boolean, NotReviewableReason>(false,
+					NotReviewableReason.DIFFERENT_PROJECTCLASS);
+		// You may not review something you're part of!
+		if (projectDao.isPartOf(student.getUser(), requestingProject))
+			return new Pair<Boolean, NotReviewableReason>(false,
+					NotReviewableReason.PART_OF_PROJECT);
+
 		/*
-		 * This last section handles reviews performed previously by the student on the same
-		 * requesting project and makes sure you cannot accept reviews within a certain time frame
-		 * after having done one.
+		 * This last section handles reviews performed previously by the student
+		 * on the same requesting project and makes sure you cannot accept
+		 * reviews within a certain time frame after having done one.
 		 * 
-		 * Using getLastModified is potentially "risky" since this might get updated for reasons other
-		 * than one's that should prohibit re-reviewing, thus preventing reviews that should be allowed.
+		 * Using getLastModified is potentially "risky" since this might get
+		 * updated for reasons other than one's that should prohibit
+		 * re-reviewing, thus preventing reviews that should be allowed.
 		 */
 		ProjectClassSettings settings = requestingProjectClass.getProjectClassSettings();
 		int daysBetweenReviewsOnSameProject = settings.getNumDaysBetweenPeerReviewsOnSameProject();
 
 		DateTime earliestPermissibleDateSinceReview = new DateTime();
-		earliestPermissibleDateSinceReview = earliestPermissibleDateSinceReview.minusDays(daysBetweenReviewsOnSameProject);
-		
-		List<PeerReview> performedReviews = peerReviewDao.findPeerReviewsByStudentAndProject(student, activeProject);
-		for(PeerReview pr : performedReviews){
+		earliestPermissibleDateSinceReview = earliestPermissibleDateSinceReview
+				.minusDays(daysBetweenReviewsOnSameProject);
+
+		List<PeerReview> performedReviews = peerReviewDao.findPeerReviewsByStudentAndProject(
+				student, activeProject);
+		for (PeerReview pr : performedReviews) {
 			boolean sameProject = pr.getPeerRequest().getProject().equals(requestingProject);
-			if( sameProject ){
-				boolean reviewPerformedBeforeLimit = pr.getLastModified().compareTo( earliestPermissibleDateSinceReview.toDate() ) > 0;
-				if( reviewPerformedBeforeLimit ){
-					return new Pair<Boolean,NotReviewableReason>(false,NotReviewableReason.RECENTLY_REVIEWED);
+			if (sameProject) {
+				boolean reviewPerformedBeforeLimit = pr.getLastModified().compareTo(
+						earliestPermissibleDateSinceReview.toDate()) > 0;
+				if (reviewPerformedBeforeLimit) {
+					return new Pair<Boolean, NotReviewableReason>(false,
+							NotReviewableReason.RECENTLY_REVIEWED);
 				}
 			}
-		}		
-		
-		return new Pair<Boolean,NotReviewableReason>(true,null);
+		}
+
+		return new Pair<Boolean, NotReviewableReason>(true, null);
 	}
-	
+
 	@Override
 	@Transactional
-	public PeerReview acceptReview(PeerRequest request, Student student, Project project) throws Exception, UpdatedSincePageLoadException {
-		
+	public PeerReview acceptReview(PeerRequest request, Student student, Project project)
+			throws Exception, UpdatedSincePageLoadException {
+
 		request = peerRequestDao.reLoad(request);
-		
-		if(request.getStatus() != RequestStatus.WAITING){
+
+		if (request.getStatus() != RequestStatus.WAITING) {
 			throw new UpdatedSincePageLoadException("Peer request taken since page loaded");
 		}
-		
+
 		PeerReview review = new PeerReview();
-		
+
 		try {
-			//Save the review
+			// Save the review
 			review.setPeerRequest(request);
 			review.setProject(project);
 			review.setReviewer(student);
 			review = peerReviewDao.save(review);
-			
-			//Update request status
+
+			// Update request status
 			request.setStatus(RequestStatus.TAKEN);
 			request = peerRequestDao.save(request);
-			
-			//Notify the requester
+
+			// Notify the requester
 			notifyAcceptOfReview(request, student, project);
-			
+
 			return review;
-		} catch (Exception e){
-			Logger.getRootLogger().log(Level.ERROR, "Error while accepting peer request: " + e.getMessage());
-			if(review.getId() != null){
-				//Something must have gone wrong while updating request status
+		} catch (Exception e) {
+			Logger.getRootLogger().log(Level.ERROR,
+					"Error while accepting peer request: " + e.getMessage());
+			if (review.getId() != null) {
+				// Something must have gone wrong while updating request status
 				review = peerReviewDao.reLoad(review);
 				peerReviewDao.delete(review);
 			}
-			if(request.getStatus() != RequestStatus.WAITING){
-				//reset status
+			if (request.getStatus() != RequestStatus.WAITING) {
+				// reset status
 				request.setStatus(RequestStatus.WAITING);
 				peerRequestDao.save(request);
 			}
 			throw e;
 		}
 	}
-	
+
 	/**
 	 * TODO Rewrite using template engine of some sort
+	 * 
 	 * @param request
 	 * @param student
 	 * @param project
 	 */
-	protected void notifyAcceptOfReview(PeerRequest request, Student student, Project project){
-		try{
+	protected void notifyAcceptOfReview(PeerRequest request, Student student, Project project) {
+		try {
+			Properties props = null;
+
+			props = PropsUtils.load("notification.properties");
+
+			String mailSubject = props.getProperty("acceptPeerReviewSubject");
+			String requestAccepted = props.getProperty("requestAccepted");
+			String heShe = props.getProperty("heShe");
+			String complete = props.getProperty("complete");
+
 			User requestingUser = request.getRequester().getUser();
+
+			String messageBody = requestAccepted
+					+ student.getUser().toString()
+					+ heShe
+					+ project.getProjectClass().getProjectClassSettings()
+							.getNumDaysToSubmitPeerReview() + complete;
 			
-			String subject = "Your request for peer-review has been accepted";
-			
-			String messageBody = "Hello "+requestingUser.getFirstName()+",\n\n"+
-			"Your request was accepted by "+student.getUser().toString()+", he/she now has "+
-			project.getProjectClass().getProjectClassSettings().getNumDaysToSubmitPeerReview()+" days to complete a review."+
-			"\n\nThis is an auto-generated message from SciPro";
-			
-			notificationController.processSystemNotification(requestingUser, Roles.STUDENT, subject, messageBody, NotificationEventType.PEER_REVIEW_ACCEPTED);
-		}
-		catch( Exception e ){
+			String webNotificationMessage = requestAccepted + student.getUser().toString();
+
+			NotificationMessage notificationMessage = new NotificationMessage(webNotificationMessage,
+					mailSubject, messageBody);
+
+			PageParameters pp = new PageParameters();
+
+			String peerStatsUrl = RequestUtils.toAbsolutePath(RequestCycle.get()
+					.urlFor(ProjectPeerStatsPage.class, pp).toString());
+
+			notificationController.processNotification(requestingUser, notificationMessage,
+					peerStatsUrl, NotificationPriority.MEDIUM);
+		} catch (Exception e) {
 			e.printStackTrace();
 		}
 	}
+
 	/**
 	 * TODO Rewrite
+	 * 
 	 * @param review
 	 */
 	public void notifyCompletionOfReview(PeerReview review) {
-		try{
+		try {
+
+			Properties props = null;
+			props = PropsUtils.load("notification.properties");
+			String mailSubject = props.getProperty("completedReviewSubject");
+			String requestReviewed = props.getProperty("requestReviewed");
+			String supervisorMessageBody = props.getProperty("supervisorMessageBody");
+			String supervisorMessageBody2 = props.getProperty("supervisorMessageBody2");
+			String supervisorMessageBody3 = props.getProperty("supervisorMessageBody3");
+			String commaWithLinebreak = props.getProperty("commaWithLinebreak");
+			String inProject = props.getProperty("inProject");
+			String hasPerformed = props.getProperty("hasPerformed");
 			PeerRequest peerRequest = review.getPeerRequest();
 			User requestingUser = peerRequest.getRequester().getUser();
-			
-			String messageFooter = "\n\nThis is an auto-generated message from SciPro";
-			
+
 			PageParameters pp = new PageParameters();
 			pp.add(PeerReview.PP_PEER_REVIEW_ID, review.getId().toString());
-			String projectReviewUrl = RequestUtils.toAbsolutePath(
-					RequestCycle.get().urlFor(ProjectPeerReviewPage.class, pp).toString());
-			String supervisorReviewUrl = RequestUtils.toAbsolutePath(
-					RequestCycle.get().urlFor(SupervisorPeerReviewPage.class, pp).toString());
+
+			String reviewUrl = RequestUtils.toAbsolutePath(RequestCycle.get()
+					.urlFor(ProjectPeerReviewPage.class, pp).toString());
+			String supervisorReviewUrl = RequestUtils.toAbsolutePath(RequestCycle.get()
+					.urlFor(SupervisorPeerReviewPage.class, pp).toString());
+
+			//Message for student when his/her review request is completed.
+			String messageBody = requestReviewed;
+
+			NotificationMessage notificationMessage = new NotificationMessage(messageBody,
+					mailSubject, messageBody);
+
+			notificationController.processNotification(requestingUser, notificationMessage,
+					reviewUrl, NotificationPriority.MEDIUM);
 			
-			
-			String subject = "A peer review has been completed!";
-			
-			String messageBody = "Hello "+requestingUser.getFirstName()+",\n\n"+
-			"Your request has now been reviewed and is available here:\n"+			
-			projectReviewUrl+			
-			messageFooter;
-			
-			notificationController.processSystemNotification(requestingUser, Roles.STUDENT, subject, messageBody, NotificationEventType.PEER_REVIEW_RATED);
-			
-			messageBody = "Hello "+peerRequest.getProject().getHeadSupervisor().getUser().getFirstName()+",\n\n"+
-			"You're getting this message because you are supervisor of \""+peerRequest.getProject().getTitle()+"\"."+
-			"\nA peer review on this project has been completed and is available for you to read here:\n"+
-			supervisorReviewUrl+			
-			messageFooter;
+			//Message for supervisor of the project with a completed review.
+			messageBody = 
+				supervisorMessageBody
+					+ peerRequest.getProject().getTitle()
+					+ supervisorMessageBody2;
 			User requestSupervisor = peerRequest.getProject().getHeadSupervisor().getUser();
-			notificationController.processSystemNotification(requestSupervisor, Roles.EMPLOYEE, subject, messageBody, NotificationEventType.PEER_REVIEW_RATED);
+
+			NotificationMessage notificationMessageSupervisorOfProject = new NotificationMessage(messageBody,
+					mailSubject, messageBody);
 			
-			messageBody = "Hello "+review.getProject().getHeadSupervisor().getUser().getFirstName()+",\n\n"+
-			"You receive this message because you are supervisor of \""+review.getProject().getTitle()+"\".\n"+
-			review.getReviewer().getUser().toString()+" has performed a peer review on someone elses work which is available for you to read here:\n"+
-			supervisorReviewUrl+			
-			messageFooter;
+			notificationController.processNotification(requestSupervisor, 
+					notificationMessageSupervisorOfProject, supervisorReviewUrl, NotificationPriority.MEDIUM);
+
+			//Message for supervisor of the reviewer that have made a review for another project.
+			
+			String webNotificationMessage = review.getReviewer().getUser().toString() + inProject + review.getProject().getTitle() + hasPerformed;
+			
+			messageBody = supervisorMessageBody
+					+ review.getProject().getTitle()
+					+ commaWithLinebreak + review.getReviewer().getUser().toString()
+					+ supervisorMessageBody3;
+		
 			User reviewSupervisor = review.getProject().getHeadSupervisor().getUser();
-			notificationController.processSystemNotification(reviewSupervisor, Roles.EMPLOYEE, subject, messageBody, NotificationEventType.PEER_REVIEW_RATED);
+			NotificationMessage notificationMessageSupervisorOfReviewer = new NotificationMessage(webNotificationMessage,
+					mailSubject, messageBody);
 			
-		}
-		catch( Exception e ){
+			notificationController.processNotification(reviewSupervisor, notificationMessageSupervisorOfReviewer, supervisorReviewUrl, NotificationPriority.MEDIUM);
+
+		} catch (Exception e) {
 			e.printStackTrace();
 		}
 	}
+
 	/**
 	 * TODO Rewrite
+	 * 
 	 * @param review
 	 */
 	public void notifyOfReviewRating(PeerReview review) {
-		try{
+		try {
+			Properties props = null;
+			props = PropsUtils.load("notification.properties");
+			String mailSubject = props.getProperty("reviewRatedSubject");
+			String reviewRatedBody = props.getProperty("reviewRatedBody");
 			User reviewingUser = review.getReviewer().getUser();
-			
-			String messageFooter = "\n\nThis is an auto-generated message from SciPro";
-			
+
 			PageParameters pp = new PageParameters();
 			pp.add(PeerReview.PP_PEER_REVIEW_ID, review.getId().toString());
-			String projectReviewUrl = RequestUtils.toAbsolutePath(
-					RequestCycle.get().urlFor(ProjectPeerReviewPage.class, pp).toString());
+			String projectReviewUrl = RequestUtils.toAbsolutePath(RequestCycle.get()
+					.urlFor(ProjectPeerReviewPage.class, pp).toString());
+
+
+			String messageBody = reviewRatedBody;
 			
-			String subject = "You've received a rating for a review you've done!";
-			
-			String messageBody = "Hello "+reviewingUser.getFirstName()+",\n\n"+
-			"Your review has been rated." +
-			" If you want to see the rating or add a comment to the review, the review is available here:\n"+			
-			projectReviewUrl+			
-			messageFooter;
-			
-			notificationController.processSystemNotification(reviewingUser, Roles.STUDENT, subject, messageBody, NotificationEventType.PEER_REVIEW_GRADED);
-			
-		}
-		catch( Exception e ){
+			NotificationMessage notificationMessage = new NotificationMessage(messageBody,
+					mailSubject, messageBody);
+
+			notificationController.processNotification(reviewingUser,  notificationMessage,
+					projectReviewUrl, NotificationPriority.MEDIUM);
+
+		} catch (Exception e) {
 			e.printStackTrace();
 		}
 	}
-	
+
 	/**
 	 * Store file to a pre-populated PeerRequest
 	 * 
@@ -346,92 +422,100 @@ public class PeerPortalControllerImpl implements PeerPortalController {
 	 * @throws Exception
 	 */
 	@Transactional
-	public PeerRequest storePeerRequest(final FileUpload upload, PeerRequest request) 
-		throws Exception {
+	public PeerRequest storePeerRequest(final FileUpload upload, PeerRequest request)
+			throws Exception {
 		String path = null;
 		try {
 			request = peerRequestDao.save(request);
-			
-			if(request.getId() == null){
+
+			if (request.getId() == null) {
 				throw new NullPointerException("Peer request id is null after save");
 			}
-			
+
 			path = getAbsolutePeerRequestPath(request);
-			
+
 			fileRepository.storeFile(upload, path);
 			List<FileDescription> fdesc = fileRepository.searchFiles(path);
-			if(fdesc.size() == 0){
+			if (fdesc.size() == 0) {
 				throw new FileStorageException(path, null);
 			} else {
 				FileDescription fd = fileDescriptionDao.save(fdesc.get(0));
 				request.setFile(fd);
 				return peerRequestDao.save(request);
 			}
-		} catch (Exception e){
-			Logger.getRootLogger().log(Level.ERROR, "Error while storing Peer Request: " + e.getMessage());
-			if(request.getId() != null){
+		} catch (Exception e) {
+			Logger.getRootLogger().log(Level.ERROR,
+					"Error while storing Peer Request: " + e.getMessage());
+			if (request.getId() != null) {
 				peerRequestDao.delete(request);
 			}
-			if(path != null){
+			if (path != null) {
 				fileRepository.delete(path);
 			}
 			throw e;
 		}
 	}
-	
+
 	/**
-	 * Stores a file to the repository and populates the file-attribute on the PeerReview object.
-	 * Note: the file description is not persisted, saving the peer review object will cascade
-	 * to the file description.
+	 * Stores a file to the repository and populates the file-attribute on the
+	 * PeerReview object. Note: the file description is not persisted, saving
+	 * the peer review object will cascade to the file description.
 	 * 
-	 * @param upload the fileupload to store
-	 * @param review the review to store the fileupload to
+	 * @param upload
+	 *            the fileupload to store
+	 * @param review
+	 *            the review to store the fileupload to
 	 * @return true on success, false otherwise
 	 */
 	@Transactional
 	public boolean storePeerReviewFileUpload(final FileUpload upload, PeerReview review) {
-		
-		//Return true there is no file upload
-		if ( upload == null ){
+
+		// Return true there is no file upload
+		if (upload == null) {
 			return true;
 		}
-		
+
 		String path = null;
 		try {
 			path = getAbsolutePeerReviewPath(review);
 			fileRepository.storeFile(upload, path);
 			List<FileDescription> fdesc = fileRepository.searchFiles(path);
-			if(fdesc.size() == 0){
+			if (fdesc.size() == 0) {
 				throw new FileStorageException(path, null);
 			}
 			review.setFile(fdesc.get(0));
 			return true;
 		} catch (Exception e) {
-			Logger.getRootLogger().log(Level.ERROR, "Error while storing file for peer review: " + e.getMessage());
-			if(review.getFile() != null){
-				//Clean up the repository
+			Logger.getRootLogger().log(Level.ERROR,
+					"Error while storing file for peer review: " + e.getMessage());
+			if (review.getFile() != null) {
+				// Clean up the repository
 				fileRepository.delete(path);
-				//reset the file attribute
+				// reset the file attribute
 				review.setFile(null);
 			}
 			return false;
 		}
 	}
-	
+
 	@Transactional
-	private String getAbsolutePeerRequestPath(final PeerRequest request){
-		if(request.getId() == null){
-			throw new NullPointerException("Trying to get file repository path for PeerRequest with id null");
+	private String getAbsolutePeerRequestPath(final PeerRequest request) {
+		if (request.getId() == null) {
+			throw new NullPointerException(
+					"Trying to get file repository path for PeerRequest with id null");
 		}
-		return fileRepository.getProjectRootPath(request.getProject().getId()) + PEER_REQUEST_PATH + request.getId();
+		return fileRepository.getProjectRootPath(request.getProject().getId()) + PEER_REQUEST_PATH
+				+ request.getId();
 	}
-	
+
 	@Transactional
-	private String getAbsolutePeerReviewPath(final PeerReview review){
-		if(review.getId() == null){
-			throw new NullPointerException("Trying to get file repository path for PeerReview with id null");
+	private String getAbsolutePeerReviewPath(final PeerReview review) {
+		if (review.getId() == null) {
+			throw new NullPointerException(
+					"Trying to get file repository path for PeerReview with id null");
 		}
-		return fileRepository.getProjectRootPath(review.getProject().getId()) + PEER_REVIEW_PATH + review.getId();
+		return fileRepository.getProjectRootPath(review.getProject().getId()) + PEER_REVIEW_PATH
+				+ review.getId();
 	}
-	
+
 }
diff --git a/src/main/java/se/su/dsv/scipro/project/pages/ProjectPartnerPage.java b/src/main/java/se/su/dsv/scipro/project/pages/ProjectPartnerPage.java
index 1d41eee02b..2f738710b4 100644
--- a/src/main/java/se/su/dsv/scipro/project/pages/ProjectPartnerPage.java
+++ b/src/main/java/se/su/dsv/scipro/project/pages/ProjectPartnerPage.java
@@ -119,7 +119,6 @@ public class ProjectPartnerPage extends ProjectPage {
 			wmc.add(dataView);
 			wmc.setOutputMarkupId(true);
 			pagingNavigator = new PagingNavigator("navigator", dataView);
-			System.out.println(dataView.size());
 			wmc.add(pagingNavigator);
 			add(wmc);
 
diff --git a/src/main/java/se/su/dsv/scipro/project/pages/ProjectStartPage.html b/src/main/java/se/su/dsv/scipro/project/pages/ProjectStartPage.html
index 90ac285c34..51fdf83389 100644
--- a/src/main/java/se/su/dsv/scipro/project/pages/ProjectStartPage.html
+++ b/src/main/java/se/su/dsv/scipro/project/pages/ProjectStartPage.html
@@ -8,6 +8,10 @@
 		<div class="span-22 last">
 		<!-- Left column -->
 			<div class="span-11 colborder" wicket:id="leftColumn">
+				<div class="append-bottom">
+					<h5 class="peer-title">Notifications</h5>
+					<div wicket:id="notificationPanel"></div>
+				</div>
 				<div class="append-bottom">
 					<h5 class="peer-title">State of mind</h5>
 					<div wicket:id="stateOfMindPanel"></div>
@@ -23,9 +27,8 @@
 					<h5 class="peer-title">Peer reviews on project</h5>
 					<div wicket:id="peerRequests"></div>
 				</div>
-				<div class="append-bottom">
-					<h5 class="peer-title">Wall</h5>
-					<div wicket:id="projectWallPanel"></div>
+				<div class="span-10 last">
+					<div wicket:id="upcomingEventPanel"></div>
 				</div>
 			</div>
 			<!-- Right column -->
@@ -34,9 +37,6 @@
 					<h5 class="peer-title">Final seminar for this project</h5>
 					<div wicket:id="projectSeminarPanel"></div>
 				</div>
-				<div class="span-10 last">
-					<div wicket:id="upcomingEventPanel"></div>
-				</div>
 <!--				<div class="span-10 last">-->
 <!--					<h5 class="peer-title">Oppositions &amp; Active participations</h5>-->
 <!--					<div wicket:id="oppositionStatsPanel"></div>-->
diff --git a/src/main/java/se/su/dsv/scipro/project/pages/ProjectStartPage.java b/src/main/java/se/su/dsv/scipro/project/pages/ProjectStartPage.java
index 445e9b57c7..5b43713ca7 100644
--- a/src/main/java/se/su/dsv/scipro/project/pages/ProjectStartPage.java
+++ b/src/main/java/se/su/dsv/scipro/project/pages/ProjectStartPage.java
@@ -10,7 +10,7 @@ import se.su.dsv.scipro.data.dataobjects.Project;
 import se.su.dsv.scipro.opponent.panels.ProjectFinalSeminarContainerPanel;
 import se.su.dsv.scipro.peer.pages.ProjectPeerReviewPage;
 import se.su.dsv.scipro.peer.panels.StudentPeerInfoRequestsPanel;
-import se.su.dsv.scipro.project.panels.ProjectWallPanel;
+import se.su.dsv.scipro.project.panels.NotificationsPanel;
 import se.su.dsv.scipro.project.panels.StateOfMindPanel;
 import se.su.dsv.scipro.project.panels.UpcomingEventPanel;
 import se.su.dsv.scipro.schedule.panels.ProjectProgressPanel;
@@ -35,7 +35,7 @@ public class ProjectStartPage extends ProjectPage {
 		add(new FeedbackPanel("feedback"));
 		add(new ProjectFinalSeminarContainerPanel("projectSeminarPanel", activeProject));
 		//add(new StudentOppositionStatsPanel("oppositionStatsPanel", activeProject));
-		add(new UpcomingEventPanel("upcomingEventPanel", activeProject, 3));
+		leftColumn.add(new UpcomingEventPanel("upcomingEventPanel", activeProject, 3));
 		leftColumn.add(new StudentPeerInfoRequestsPanel("peerRequests", null, activeProject){
 			private static final long serialVersionUID = 1L;
 
@@ -47,9 +47,10 @@ public class ProjectStartPage extends ProjectPage {
 		ProjectProgressPanel progressPanel = new ProjectProgressPanel("progress", activeProject);
 		leftColumn.add(progressPanel.getHelpIcon("progressHelp"));
 		leftColumn.add(progressPanel);
-		//leftColumn.add(new UpcomingEventPanel("upcomingEventPanel", activeProject));
-		leftColumn.add(new ProjectWallPanel("projectWallPanel", activeProject));
-		
+
+
+		leftColumn.add(new NotificationsPanel("notificationPanel"));
+
 
 	}
 
diff --git a/src/main/java/se/su/dsv/scipro/project/panels/NotificationsPanel.html b/src/main/java/se/su/dsv/scipro/project/panels/NotificationsPanel.html
new file mode 100644
index 0000000000..8e2429c059
--- /dev/null
+++ b/src/main/java/se/su/dsv/scipro/project/panels/NotificationsPanel.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<html
+	xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd">
+<body>
+	<wicket:panel>
+		<div wicket:id="container">
+			<div class="margin">		
+				<h3><span  wicket:id="newNotifications"></span> new notifications</h3>
+				<a href="#" wicket:id="readAllNotification">Set all read</a>			
+			</div>
+			
+			<div wicket:id="notificationsListView" class="rounded-border-notification">
+				<div wicket:id="infoText"></div>
+				<a href="#" wicket:id="readNotification">Set read</a>
+				<a href="#" wicket:id="bookmarkLink">Go to</a>
+			</div>
+			<div wicket:id="paging"></div>
+		</div>
+	</wicket:panel>
+</body>
+</html>
\ No newline at end of file
diff --git a/src/main/java/se/su/dsv/scipro/project/panels/NotificationsPanel.java b/src/main/java/se/su/dsv/scipro/project/panels/NotificationsPanel.java
new file mode 100644
index 0000000000..bb01f46130
--- /dev/null
+++ b/src/main/java/se/su/dsv/scipro/project/panels/NotificationsPanel.java
@@ -0,0 +1,143 @@
+/**
+ * 
+ */
+package se.su.dsv.scipro.project.panels;
+
+import org.apache.wicket.RequestCycle;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.markup.html.AjaxLink;
+import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.link.Link;
+import org.apache.wicket.markup.html.navigation.paging.PagingNavigator;
+import org.apache.wicket.markup.html.panel.Panel;
+import org.apache.wicket.markup.repeater.Item;
+import org.apache.wicket.markup.repeater.data.DataView;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.LoadableDetachableModel;
+import org.apache.wicket.request.target.basic.RedirectRequestTarget;
+import org.apache.wicket.spring.injection.annot.SpringBean;
+
+import se.su.dsv.scipro.SciProSession;
+import se.su.dsv.scipro.data.dao.interfaces.WebNotificationDao;
+import se.su.dsv.scipro.data.dataobjects.WebNotification;
+import se.su.dsv.scipro.dataproviders.WebNotificationDataProvider;
+import se.su.dsv.scipro.security.auth.Authorization;
+import se.su.dsv.scipro.security.auth.roles.Roles;
+
+/**
+ * @author Johan Aschan <aschan@dsv.su.se>
+ * 
+ */
+@Authorization(authorizedRoles = { Roles.SYSADMIN })
+public class NotificationsPanel extends Panel {
+
+	private static final long serialVersionUID = 1L;
+
+	@SpringBean
+	private WebNotificationDao webNotificationDao;
+	
+	private int countOfNotifications = 0;
+
+	/**
+	 * @param id
+	 */
+	public NotificationsPanel(String id) {
+		super(id);
+
+		final IModel<Integer> numberOfNotificationsModel = new LoadableDetachableModel<Integer>() {
+
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			protected Integer load() {
+				return webNotificationDao.getCountOfWebNotifications(SciProSession.get().getUser());
+			}
+		};
+		
+		countOfNotifications = numberOfNotificationsModel.getObject();
+
+		Label newNotifications = new Label("newNotifications", numberOfNotificationsModel);
+
+		final WebMarkupContainer webMarkupContainer = new WebMarkupContainer("container");
+		webMarkupContainer.setOutputMarkupId(true);
+		add(webMarkupContainer);
+		webMarkupContainer.add(newNotifications);
+
+		WebNotificationDataProvider webNotificationDataProvider = new WebNotificationDataProvider(
+				SciProSession.get().getUser());
+		DataView<WebNotification> notifications = new DataView<WebNotification>(
+				"notificationsListView", webNotificationDataProvider, 5) {
+
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			protected void populateItem(final Item<WebNotification> item) {
+				item.add(new Label("infoText", item.getModel().getObject().getInfoText()));
+				item.add(new Link<Void>("bookmarkLink") {
+
+					private static final long serialVersionUID = 1L;
+
+					@Override
+					public void onClick() {
+
+						WebNotification notification = item.getModelObject();
+						notification.setReadByUser(true);
+						notification = webNotificationDao.save(notification);
+
+						RequestCycle.get().setRequestTarget(
+								new RedirectRequestTarget(notification.getUrl()));
+					}
+				});
+				item.add(new AjaxLink<Void>("readNotification") {
+
+					private static final long serialVersionUID = 1L;
+
+					@Override
+					public void onClick(AjaxRequestTarget target) {
+						WebNotification notification = item.getModelObject();
+						notification.setReadByUser(true);
+						webNotificationDao.save(notification);
+						target.addComponent(webMarkupContainer);
+						countOfNotifications = numberOfNotificationsModel.getObject();
+					}
+				});
+
+			}
+
+		};
+		webMarkupContainer.add(new AjaxLink<Void>("readAllNotification") {
+
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			public void onClick(AjaxRequestTarget target) {
+				for (WebNotification webnotification : webNotificationDao
+						.getWebNotifications(SciProSession.get().getUser())) {
+					webnotification.setReadByUser(true);
+					webNotificationDao.save(webnotification);
+				}
+				target.addComponent(webMarkupContainer);
+			}
+			
+			@Override
+			public boolean isVisible() {	
+				return countOfNotifications > 0;
+			};
+		}.setOutputMarkupPlaceholderTag(true));
+
+		PagingNavigator pagingNavigator = new PagingNavigator("paging", notifications){
+			
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			public boolean isVisible() {	
+				return countOfNotifications > 0;
+			};
+		};
+		pagingNavigator.setOutputMarkupPlaceholderTag(true);
+		webMarkupContainer.add(pagingNavigator);
+		webMarkupContainer.add(notifications);
+	}
+
+}
diff --git a/src/main/java/se/su/dsv/scipro/project/panels/ProjectTabMenuPanel.java b/src/main/java/se/su/dsv/scipro/project/panels/ProjectTabMenuPanel.java
index fd21d6111c..b351cbd3c9 100644
--- a/src/main/java/se/su/dsv/scipro/project/panels/ProjectTabMenuPanel.java
+++ b/src/main/java/se/su/dsv/scipro/project/panels/ProjectTabMenuPanel.java
@@ -7,6 +7,7 @@ import org.apache.wicket.Page;
 
 import se.su.dsv.scipro.SciProSession;
 import se.su.dsv.scipro.components.AbstractMenuPanel;
+import se.su.dsv.scipro.conference.pages.ProjectConferencePage;
 import se.su.dsv.scipro.data.dataobjects.Project;
 import se.su.dsv.scipro.peer.pages.ProjectPeerPortalPage;
 import se.su.dsv.scipro.project.pages.FinalSeminarProjectListPage;
@@ -45,6 +46,7 @@ public class ProjectTabMenuPanel extends AbstractMenuPanel {
 			itemList.add(new MenuItem("Opposition & Active participation", ProjectOppositionPage.class));
 			itemList.add(new MenuItem("Peer review", ProjectPeerPortalPage.class));
 			itemList.add(new MenuItem("All Final Seminars", FinalSeminarProjectListPage.class));
+			itemList.add(new MenuItem("Conference", ProjectConferencePage.class));
 		} else {
 			itemList.add(new MenuItem("No active project!", NoActiveProjectPage.class));
 			itemList.add(new MenuItem("Project Partner", ProjectPartnerPage.class));
diff --git a/src/main/java/se/su/dsv/scipro/project/panels/ProjectWallPanel.java b/src/main/java/se/su/dsv/scipro/project/panels/ProjectWallPanel.java
deleted file mode 100644
index bfa50d8b97..0000000000
--- a/src/main/java/se/su/dsv/scipro/project/panels/ProjectWallPanel.java
+++ /dev/null
@@ -1,216 +0,0 @@
-/**
- * 
- */
-package se.su.dsv.scipro.project.panels;
-
-import java.text.SimpleDateFormat;
-import java.util.List;
-import java.util.SortedSet;
-
-import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.ajax.markup.html.AjaxLink;
-import org.apache.wicket.ajax.markup.html.form.AjaxButton;
-import org.apache.wicket.markup.html.WebMarkupContainer;
-import org.apache.wicket.markup.html.basic.Label;
-import org.apache.wicket.markup.html.form.Form;
-import org.apache.wicket.markup.html.form.TextArea;
-import org.apache.wicket.markup.html.navigation.paging.PagingNavigator;
-import org.apache.wicket.markup.html.panel.Panel;
-import org.apache.wicket.markup.repeater.Item;
-import org.apache.wicket.markup.repeater.data.DataView;
-import org.apache.wicket.markup.repeater.data.IDataProvider;
-import org.apache.wicket.model.Model;
-import org.apache.wicket.model.PropertyModel;
-import org.apache.wicket.spring.injection.annot.SpringBean;
-
-import se.su.dsv.scipro.SciProSession;
-import se.su.dsv.scipro.commentthread.panels.CommentThreadPanel;
-import se.su.dsv.scipro.data.dao.interfaces.BoardMessageDao;
-import se.su.dsv.scipro.data.dao.interfaces.CommentThreadDao;
-import se.su.dsv.scipro.data.dao.interfaces.MessageBoardDao;
-import se.su.dsv.scipro.data.dao.interfaces.ProjectDao;
-import se.su.dsv.scipro.data.dataobjects.BoardMessage;
-import se.su.dsv.scipro.data.dataobjects.CommentThread;
-import se.su.dsv.scipro.data.dataobjects.MessageBoard;
-import se.su.dsv.scipro.data.dataobjects.Project;
-import se.su.dsv.scipro.dataproviders.BoardMessageDataProvider;
-import se.su.dsv.scipro.security.auth.roles.Roles;
-
-/**
- * @author Johan Aschan - aschan@dsv.su.se
- * 
- */
-public class ProjectWallPanel extends Panel {
-
-	@SpringBean
-	private BoardMessageDao boardMessageDao;
-	@SpringBean
-	private MessageBoardDao messageBoardDao;
-	@SpringBean
-	private CommentThreadDao commentThreadDao;
-
-	private MessageBoard messageBoard;
-	private DataView<BoardMessage> dataView;
-	private WebMarkupContainer webMarkupContainer;
-
-	public ProjectWallPanel(String id, Project project) {
-		super(id);
-		SendWallMessageForm sendWallMessageForm;
-		add(sendWallMessageForm = new SendWallMessageForm("sendForm"));
-		if (project != null) {
-			messageBoard = project.getMessageBoard();
-			if (messageBoard == null) {
-				messageBoard = new MessageBoard();
-				messageBoard.setProject(project);
-				messageBoard = messageBoardDao.save(messageBoard);
-			}
-		}
-		webMarkupContainer = new WebMarkupContainer("container");
-
-		loadUserDataView(new BoardMessageDataProvider(messageBoard));
-		webMarkupContainer.add(dataView);
-		webMarkupContainer.setOutputMarkupId(true);
-		webMarkupContainer
-				.add(new PagingNavigator("pagingNavigator", dataView));
-		
-		add(webMarkupContainer);
-		
-		if(project == null){
-			webMarkupContainer.setVisible(false);
-			sendWallMessageForm.setVisible(false);
-		}
-
-	}
-
-	public void loadUserDataView(
-			IDataProvider<BoardMessage> boardMessageDataProvider) {
-
-		dataView = new DataView<BoardMessage>("boardMessageDataView",
-				boardMessageDataProvider, 10) {
-
-			@Override
-			protected void populateItem(Item<BoardMessage> item) {
-				final BoardMessage bm = item.getModelObject();
-				item.add(new Label("messageLabel", bm.getMessage()));
-				item.add(new Label("messageUser", bm.getFromUser()
-						.getFirstName() + " " + bm.getFromUser().getLastName()));
-				SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
-				
-				item.add(new Label("messageDate", simpleDateFormat.format(bm.getDateCreated())));
-				item.add(new AjaxLink("delete") {
-
-					@Override
-					public void onClick(AjaxRequestTarget target) {
-						
-						BoardMessage boardMessageTemp = boardMessageDao.reLoad(bm);
-						boardMessageDao.delete(boardMessageTemp);
-						webMarkupContainer.removeAll();
-						loadUserDataView(new BoardMessageDataProvider(
-								messageBoardDao.reLoad(messageBoard)));
-						webMarkupContainer.add(dataView);
-						webMarkupContainer.add(new PagingNavigator(
-								"pagingNavigator", dataView));
-						target.addComponent(webMarkupContainer);
-					}
-
-					@Override
-					public boolean isVisible() {
-						SciProSession session = SciProSession.get();
-						if (session.authorizedForRole(Roles.ADMIN))
-							return true;
-						if (session.getUser().equals(bm.getFromUser()))
-							return true;
-						return false;
-					}
-				});
-				int commentSize = commentThreadDao.getCommentThreadSize(bm);
-				String comments = " Comments";
-				if (commentSize == 1) {
-					comments = " Comment";
-				}
-				final Label comment = new Label("commentNumber", commentSize
-						+ comments);
-
-				comment.setOutputMarkupId(true);
-				final WebMarkupContainer webMarkupContainer = new WebMarkupContainer(
-						"commentContainer");
-				webMarkupContainer.setOutputMarkupPlaceholderTag(true);
-				item.add(webMarkupContainer);
-
-				CommentThreadPanel ctp = new CommentThreadPanel(
-						"commentThread", bm, 5);
-				ctp.setOutputMarkupPlaceholderTag(true);
-				webMarkupContainer.add(ctp);
-
-				webMarkupContainer.setVisible(false);
-
-				item.add(new AjaxLink<String>("showComments",
-						new Model<String>("Show Comments")) {
-
-					private boolean clicked = false;
-
-					@Override
-					public void onClick(AjaxRequestTarget target) {
-						clicked = !clicked;
-						if (clicked) {
-							comment.setDefaultModelObject("Hide comments");
-						} else {
-
-							int commentSize = commentThreadDao
-									.getCommentThreadSize(bm);
-
-							String comments = " Comments";
-							if (commentSize == 1) {
-								comments = " Comment";
-							}
-							comment.setDefaultModelObject(commentSize
-									+ comments);
-						}
-						webMarkupContainer.removeAll();
-						webMarkupContainer.add(new CommentThreadPanel(
-								"commentThread", boardMessageDao.reLoad(bm), 5));
-						webMarkupContainer.setVisible(clicked);
-						target.addComponent(webMarkupContainer);
-						target.addComponent(comment);
-					}
-
-				}.add(comment));
-			}
-		};
-
-	}
-
-	private class SendWallMessageForm extends Form<String> {
-
-		private String message;
-
-		public SendWallMessageForm(String id) {
-			super(id);
-			final TextArea<String> messageTextArea = new TextArea<String>(
-					"textArea", new PropertyModel<String>(this, "message"));
-			add(messageTextArea);
-			AjaxButton button = new AjaxButton("ajaxButton") {
-
-				@Override
-				protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
-					BoardMessage bm = new BoardMessage();
-					bm.setMessage(message);
-					bm.setMessageBoard(messageBoardDao.reLoad(messageBoard));
-					bm.setFromUser(SciProSession.get().getUser());
-					bm = boardMessageDao.save(bm);
-					webMarkupContainer.removeAll();
-					loadUserDataView(new BoardMessageDataProvider(
-							messageBoardDao.reLoad(messageBoard)));
-					webMarkupContainer.add(dataView);
-					webMarkupContainer.add(new PagingNavigator(
-							"pagingNavigator", dataView));
-					target.addComponent(webMarkupContainer);
-				}
-			};
-
-			add(button);
-
-		}
-
-	}
-}
diff --git a/src/main/java/se/su/dsv/scipro/project/panels/StateOfMindPanel.java b/src/main/java/se/su/dsv/scipro/project/panels/StateOfMindPanel.java
index 6bf8c82a6e..1727e059e0 100644
--- a/src/main/java/se/su/dsv/scipro/project/panels/StateOfMindPanel.java
+++ b/src/main/java/se/su/dsv/scipro/project/panels/StateOfMindPanel.java
@@ -3,9 +3,6 @@
  */
 package se.su.dsv.scipro.project.panels;
 
-import java.lang.reflect.Array;
-import java.util.ArrayList;
-
 import org.apache.wicket.AttributeModifier;
 import org.apache.wicket.ajax.AbstractDefaultAjaxBehavior;
 import org.apache.wicket.ajax.AjaxRequestTarget;
@@ -26,15 +23,12 @@ import org.apache.wicket.spring.injection.annot.SpringBean;
 import org.odlabs.wiquery.ui.core.DefaultJsScopeUiEvent;
 import org.odlabs.wiquery.ui.slider.Slider;
 
-import edu.emory.mathcs.backport.java.util.Arrays;
-
 import se.su.dsv.scipro.SciProSession;
 import se.su.dsv.scipro.data.dao.interfaces.ProjectDao;
 import se.su.dsv.scipro.data.dataobjects.Project;
 import se.su.dsv.scipro.data.enums.StateOfMind;
 import se.su.dsv.scipro.knol.resource.page.StaticImage;
-
-import java.util.List;
+import edu.emory.mathcs.backport.java.util.Arrays;
 
 /**
  * @author Johan Aschan - aschan@dsv.su.se
diff --git a/src/main/java/se/su/dsv/scipro/repository/panels/AbstractFilePanel.java b/src/main/java/se/su/dsv/scipro/repository/panels/AbstractFilePanel.java
index 8da9987f44..038c32e308 100644
--- a/src/main/java/se/su/dsv/scipro/repository/panels/AbstractFilePanel.java
+++ b/src/main/java/se/su/dsv/scipro/repository/panels/AbstractFilePanel.java
@@ -23,30 +23,23 @@ import org.apache.wicket.markup.html.link.ResourceLink;
 import org.apache.wicket.markup.html.panel.FeedbackPanel;
 import org.apache.wicket.markup.html.panel.Panel;
 import org.apache.wicket.markup.repeater.RepeatingView;
-import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.Model;
 import org.apache.wicket.spring.injection.annot.SpringBean;
 import org.apache.wicket.util.lang.Bytes;
 import org.apache.wicket.util.resource.IResourceStream;
 import org.odlabs.wiquery.core.effects.EffectSpeed;
 
-import se.su.dsv.scipro.SciProSession;
 import se.su.dsv.scipro.data.dao.interfaces.FileDescriptionDao;
 import se.su.dsv.scipro.data.dao.interfaces.UserDao;
 import se.su.dsv.scipro.data.dataobjects.FileDescription;
 import se.su.dsv.scipro.data.dataobjects.User;
-import se.su.dsv.scipro.icons.ExpandContractActionIcon;
 import se.su.dsv.scipro.repository.FilePanelContainer;
 import se.su.dsv.scipro.repository.FileRepository;
 import se.su.dsv.scipro.repository.FolderDescription;
 import se.su.dsv.scipro.repository.SortOrder;
-import se.su.dsv.scipro.repository.components.FileDownloadLink;
-import se.su.dsv.scipro.repository.components.FileOpenLink;
 import se.su.dsv.scipro.repository.icons.FileIcon;
 import se.su.dsv.scipro.repository.pages.RepositoryDownloadPage;
 import se.su.dsv.scipro.repository.util.FileStorageException;
-import se.su.dsv.scipro.security.auth.MetaDataActionStrategy;
-import se.su.dsv.scipro.security.auth.roles.Roles;
 import se.su.dsv.scipro.util.JavascriptEventConfirmation;
 import se.su.dsv.scipro.util.WiQueryCoreEffectsHelper;
 
diff --git a/src/main/java/se/su/dsv/scipro/supervisor/pages/SupervisorProjectDetailsPage.html b/src/main/java/se/su/dsv/scipro/supervisor/pages/SupervisorProjectDetailsPage.html
index c3a9f90b1d..2469dff3f1 100644
--- a/src/main/java/se/su/dsv/scipro/supervisor/pages/SupervisorProjectDetailsPage.html
+++ b/src/main/java/se/su/dsv/scipro/supervisor/pages/SupervisorProjectDetailsPage.html
@@ -9,10 +9,6 @@
     		<h5 class="peer-title">Project progress</h5>
     		<div wicket:id="projectProgress"></div>
     	</div>
-    	<div class="span-10 last">
-    		<h5 class="peer-title">Wall</h5>
-    		<div wicket:id="projectWallPanel"></div>
-    	</div>
     </div>
     <!-- Right column -->
     <div class="span-10 last">
diff --git a/src/main/java/se/su/dsv/scipro/supervisor/pages/SupervisorProjectDetailsPage.java b/src/main/java/se/su/dsv/scipro/supervisor/pages/SupervisorProjectDetailsPage.java
index 0596926267..16847ebf82 100644
--- a/src/main/java/se/su/dsv/scipro/supervisor/pages/SupervisorProjectDetailsPage.java
+++ b/src/main/java/se/su/dsv/scipro/supervisor/pages/SupervisorProjectDetailsPage.java
@@ -1,28 +1,31 @@
 package se.su.dsv.scipro.supervisor.pages;
 
 import org.apache.wicket.PageParameters;
+import org.apache.wicket.markup.html.panel.EmptyPanel;
 
 import se.su.dsv.scipro.SciProSession;
+import se.su.dsv.scipro.conference.panels.ConferencePanel;
 import se.su.dsv.scipro.events.panels.SupervisorFeedbackTasksPanel;
-import se.su.dsv.scipro.project.panels.ProjectWallPanel;
 import se.su.dsv.scipro.schedule.panels.ProjectProgressPanel;
 import se.su.dsv.scipro.security.auth.Authorization;
 import se.su.dsv.scipro.security.auth.roles.Roles;
+
 /**
  * 
  * @author Martin Peters - mpeters@dsv.su.se
- *
+ * 
  */
-@Authorization(authorizedRoles={Roles.SYSADMIN}) //TODO Hidden for initial deployment
+@Authorization(authorizedRoles = { Roles.SYSADMIN })
+// TODO Hidden for initial deployment
 public class SupervisorProjectDetailsPage extends AbstractSupervisorProjectDetailsPage {
-	
+
 	public SupervisorProjectDetailsPage(PageParameters pp) {
 		super(pp);
 
-		add(new SupervisorFeedbackTasksPanel("feedbackTasks", SciProSession.get().getUser(), projectModel.getObject()));
+		add(new SupervisorFeedbackTasksPanel("feedbackTasks", SciProSession.get().getUser(),
+				projectModel.getObject()));
 		add(new ProjectProgressPanel("projectProgress", projectModel.getObject()));
-		add(new ProjectWallPanel("projectWallPanel", projectModel.getObject()));
+
 	}
 
-
 }
diff --git a/src/main/java/se/su/dsv/scipro/supervisor/pages/SupervisorStartPage.html b/src/main/java/se/su/dsv/scipro/supervisor/pages/SupervisorStartPage.html
index c134aa5543..2eef4ae585 100644
--- a/src/main/java/se/su/dsv/scipro/supervisor/pages/SupervisorStartPage.html
+++ b/src/main/java/se/su/dsv/scipro/supervisor/pages/SupervisorStartPage.html
@@ -1,27 +1,32 @@
 <!DOCTYPE html>
-<html xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd">
+<html
+	xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd">
 <body>
-<wicket:extend>
-	<div class="span-22 last">
-    	<div wicket:id="projectsOverviewPanel"></div>
-    </div>
-    <div class="span-22 last" wicket:id="temporaryHideContainer">
-    	<!-- Left column -->
-		<div class="span-10 colborder">
+	<wicket:extend>
+		<div class="span-22 last">
+			<div wicket:id="projectsOverviewPanel"></div>
+		</div>
+		<div class="span-22 last" wicket:id="temporaryHideContainer">
+			<!-- Left column -->
+			<div class="span-22 last">
+				<h5 class="peer-title">Notifications</h5>
+				<div wicket:id="notificationsPanel"></div>
+			</div>
+			<div class="span-10 colborder">
+				<div class="span-10 last">
+					<h5 class="peer-title">Upcoming group events</h5>
+					<div wicket:id="groupEvents"></div>
+				</div>
+			</div>
+			<!-- Right column -->
 			<div class="span-10 last">
-				<h5 class="peer-title">Upcoming group events</h5>
-				<div wicket:id="groupEvents"></div>
+				<div class="span-10 last">
+					<h5 class="peer-title">Feedback tasks</h5>
+					<div wicket:id="feedbackTasks"></div>
+				</div>
 			</div>
 		</div>
-		<!-- Right column -->
-		<div class="span-10 last">
-			<div class="span-10 last">
-				<h5 class="peer-title">Feedback tasks</h5>
-				<div wicket:id="feedbackTasks"></div>
-			</div>
-		</div>
-	</div>
-    
-</wicket:extend>
+
+	</wicket:extend>
 </body>
 </html>
\ No newline at end of file
diff --git a/src/main/java/se/su/dsv/scipro/supervisor/pages/SupervisorStartPage.java b/src/main/java/se/su/dsv/scipro/supervisor/pages/SupervisorStartPage.java
index 5c4ddb7eff..a997336c1f 100644
--- a/src/main/java/se/su/dsv/scipro/supervisor/pages/SupervisorStartPage.java
+++ b/src/main/java/se/su/dsv/scipro/supervisor/pages/SupervisorStartPage.java
@@ -7,6 +7,7 @@ import se.su.dsv.scipro.SciProSession;
 import se.su.dsv.scipro.data.dataobjects.User;
 import se.su.dsv.scipro.events.panels.SupervisorFeedbackTasksPanel;
 import se.su.dsv.scipro.events.panels.SupervisorGroupEventsPanel;
+import se.su.dsv.scipro.project.panels.NotificationsPanel;
 import se.su.dsv.scipro.security.auth.roles.Roles;
 import se.su.dsv.scipro.supervisor.panels.SupervisorProjectsOverviewPanel;
 
@@ -21,6 +22,7 @@ public class SupervisorStartPage extends AbstractSupervisorPage {
 		add(temporaryHideContainer);
 		final User user = SciProSession.get().getUser();
 		add(new SupervisorProjectsOverviewPanel("projectsOverviewPanel"));
+		temporaryHideContainer.add(new NotificationsPanel("notificationsPanel"));
 		temporaryHideContainer.add(new SupervisorGroupEventsPanel("groupEvents", user));
 		temporaryHideContainer.add(new SupervisorFeedbackTasksPanel("feedbackTasks", user));
 	}
diff --git a/src/main/java/se/su/dsv/scipro/supervisor/panels/SupervisorProjectSelectionPanel.java b/src/main/java/se/su/dsv/scipro/supervisor/panels/SupervisorProjectSelectionPanel.java
index 18006ede6e..b658520db7 100644
--- a/src/main/java/se/su/dsv/scipro/supervisor/panels/SupervisorProjectSelectionPanel.java
+++ b/src/main/java/se/su/dsv/scipro/supervisor/panels/SupervisorProjectSelectionPanel.java
@@ -46,6 +46,7 @@ public class SupervisorProjectSelectionPanel extends Panel {
 
 			protected void onUpdate(AjaxRequestTarget target) {
 				if(model.getObject() != null) {
+					System.out.println(model.getObject().getTitle());
 					setRedirect(true);
 					setResponsePage(getPage().getClass(), new PageParameters(Project.PP_PROJECT_ID+"="+model.getObject().getId()));
 				}
diff --git a/src/main/java/se/su/dsv/scipro/supervisor/panels/SupervisorTabMenuPanel.java b/src/main/java/se/su/dsv/scipro/supervisor/panels/SupervisorTabMenuPanel.java
index bd0ead6500..d54701397a 100644
--- a/src/main/java/se/su/dsv/scipro/supervisor/panels/SupervisorTabMenuPanel.java
+++ b/src/main/java/se/su/dsv/scipro/supervisor/panels/SupervisorTabMenuPanel.java
@@ -6,6 +6,7 @@ import java.util.List;
 import org.apache.wicket.Page;
 
 import se.su.dsv.scipro.components.AbstractMenuPanel;
+import se.su.dsv.scipro.conference.pages.SupervisorConferencePage;
 import se.su.dsv.scipro.peer.pages.SupervisorPeerPortalPage;
 import se.su.dsv.scipro.supervisor.pages.AbstractSupervisorPage;
 import se.su.dsv.scipro.supervisor.pages.SupervisorProjectDetailsPage;
@@ -34,6 +35,7 @@ public class SupervisorTabMenuPanel extends AbstractMenuPanel {
 		items.add(new MenuItem("Schedule templates", SupervisorScheduleTemplatesPage.class));
 		items.add(new MenuItem("Peer portal", SupervisorPeerPortalPage.class));
 		items.add(new MenuItem("Final Seminars", SupervisorProjectsFinalSeminarPage.class));
+		items.add(new MenuItem("Conferences", SupervisorConferencePage.class));
 		return items;
 	}
 
diff --git a/src/main/java/se/su/dsv/scipro/util/Mail.java b/src/main/java/se/su/dsv/scipro/util/Mail.java
index b9c65d1457..4202c5a724 100644
--- a/src/main/java/se/su/dsv/scipro/util/Mail.java
+++ b/src/main/java/se/su/dsv/scipro/util/Mail.java
@@ -10,13 +10,23 @@ import javax.mail.Transport;
 import javax.mail.internet.InternetAddress;
 import javax.mail.internet.MimeMessage;
 
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import se.su.dsv.scipro.data.dao.interfaces.GeneralSystemSettingsDao;
+
+@Component
 public class Mail {
 
-	private Mail() {}
+	@Autowired
+	GeneralSystemSettingsDao generalSystemSettingsDao;
 
-	public static void mail(String fromName, String fromEmail, String recipients[], String replyTo[], String subject, String message, Properties props, boolean debug) throws MessagingException, UnsupportedEncodingException{
+	public void mail(String fromName, String fromEmail, String recipients[], String replyTo[], String subject, String message, boolean debug) throws MessagingException, UnsupportedEncodingException{
 
-		Session session = Session.getDefaultInstance(props,null);
+		Properties p = new Properties();
+        p.put("mail.smtp.host", generalSystemSettingsDao.getGeneralSystemSettingsInstance().getSmtpServer());
+        
+		Session session = Session.getDefaultInstance(p,null);
 		
 		session.setDebug(debug);
 
diff --git a/src/main/java/se/su/dsv/scipro/util/PushApple.java b/src/main/java/se/su/dsv/scipro/util/PushApple.java
index 9ccf7720cc..561aa45b0d 100644
--- a/src/main/java/se/su/dsv/scipro/util/PushApple.java
+++ b/src/main/java/se/su/dsv/scipro/util/PushApple.java
@@ -1,5 +1,8 @@
 package se.su.dsv.scipro.util;
 
+import se.su.dsv.scipro.data.enums.NotificationPriority;
+import edu.emory.mathcs.backport.java.util.Arrays;
+
 
 public class PushApple {
 
@@ -7,6 +10,4 @@ public class PushApple {
 			String message) {
 
 	}
-
-
 }
\ No newline at end of file
diff --git a/src/main/java/se/su/dsv/scipro/util/TurnitinComponent.java b/src/main/java/se/su/dsv/scipro/util/TurnitinComponent.java
index 16032167a4..8dd52f0f66 100644
--- a/src/main/java/se/su/dsv/scipro/util/TurnitinComponent.java
+++ b/src/main/java/se/su/dsv/scipro/util/TurnitinComponent.java
@@ -4,11 +4,8 @@
 package se.su.dsv.scipro.util;
 
 import java.io.BufferedReader;
-import java.io.BufferedWriter;
 import java.io.File;
 import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileWriter;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
@@ -17,14 +14,11 @@ import java.io.UnsupportedEncodingException;
 import java.security.MessageDigest;
 import java.security.NoSuchAlgorithmException;
 import java.text.SimpleDateFormat;
-import java.util.ArrayList;
 import java.util.Date;
-import java.util.List;
 import java.util.TimeZone;
 
 import javax.xml.parsers.DocumentBuilder;
 import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
 
 import org.apache.commons.httpclient.Header;
 import org.apache.commons.httpclient.HttpClient;
@@ -37,23 +31,19 @@ import org.apache.commons.httpclient.methods.multipart.PartSource;
 import org.apache.commons.httpclient.methods.multipart.StringPart;
 import org.apache.log4j.Level;
 import org.apache.log4j.Logger;
-import org.apache.wicket.injection.web.InjectorHolder;
-import org.apache.wicket.spring.injection.annot.SpringBean;
 import org.apache.wicket.util.resource.IResourceStream;
 import org.apache.wicket.util.resource.ResourceStreamNotFoundException;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
-import org.w3c.dom.DOMException;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
 import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
 
-import se.su.dsv.scipro.data.dao.interfaces.FinalSeminarDao;
+import se.su.dsv.scipro.data.dao.interfaces.GeneralSystemSettingsDao;
 import se.su.dsv.scipro.data.dataobjects.FileDescription;
-import se.su.dsv.scipro.data.dataobjects.FinalSeminar;
+import se.su.dsv.scipro.data.dataobjects.GeneralSystemSettings;
 import se.su.dsv.scipro.repository.FileRepository;
 
 /**
@@ -77,14 +67,19 @@ public class TurnitinComponent {
 	private String utp = "2";
 	private String sharedKey = "thi9eaJ6";
 	private String ptype = "2";
-	private final static String apiAdress = "https://api.turnitin.com/";
+	private String apiAdress = "https://api.turnitin.com/";
 	@Autowired
 	private FileRepository fileRepository;
+	@Autowired
+	private GeneralSystemSettingsDao generalSystemSettingsDao;
 
 	public String returnReport(String oid) {
 
 		PostMethod filePost = new PostMethod(apiAdress + "/api.asp");
-
+		GeneralSystemSettings generalSystemSettings = generalSystemSettingsDao.getGeneralSystemSettingsInstance();
+		uem = generalSystemSettings.getTurnItInUsername();
+		ufn = generalSystemSettings.getTurnItInForname();
+		uln = generalSystemSettings.getTurnItInSurname();
 		fcmd = "1";
 		fid = "6";
 		String md5 = null;
@@ -98,11 +93,9 @@ public class TurnitinComponent {
 		try {
 			md5 = MD5(hash);
 		} catch (NoSuchAlgorithmException e1) {
-			// TODO Auto-generated catch block
 			Logger.getLogger(this.getClass()).log(Level.ERROR,
 					"Error with MD5 generation: " + e1.getMessage());
 		} catch (UnsupportedEncodingException e1) {
-			// TODO Auto-generated catch block
 			Logger.getLogger(this.getClass()).log(Level.ERROR,
 					"Error with MD5 generation: " + e1.getMessage());
 		}
@@ -148,7 +141,10 @@ public class TurnitinComponent {
 			final String ptl) throws Exception{
 		final IResourceStream stream  = fileRepository.getFileStream(fd);
 		PostMethod filePost = new PostMethod("https://api.turnitin.com/api.asp");
-
+		GeneralSystemSettings generalSystemSettings = generalSystemSettingsDao.getGeneralSystemSettingsInstance();
+		uem = generalSystemSettings.getTurnItInUsername();
+		ufn = generalSystemSettings.getTurnItInForname();
+		uln = generalSystemSettings.getTurnItInSurname();
 		fcmd = "2";
 		fid = "5";
 		String md5 = null;
@@ -315,46 +311,4 @@ public class TurnitinComponent {
 		is.close();
 		return bytes;
 	}
-
-	public static void parseXml(String string) {
-
-		try {
-			DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
-			DocumentBuilder db = dbf.newDocumentBuilder();
-
-			Document doc = db.parse(new InputSource(new StringReader(string)));
-			doc.getDocumentElement().normalize();
-			System.out.println("Root element "
-					+ doc.getDocumentElement().getNodeName());
-			NodeList nodeList = doc
-					.getElementsByTagName("student_paper_overlap");
-			Element studentPaperOverlapElement = (Element) nodeList.item(0);
-			NodeList studentPaperOverlap = studentPaperOverlapElement
-					.getChildNodes();
-			System.out.println("Student Paper Overlap: "
-					+ ((Node) studentPaperOverlap.item(0)).getNodeValue());
-
-			nodeList = doc.getElementsByTagName("web_overlap");
-			Element webOverlapElement = (Element) nodeList.item(0);
-			NodeList webPaperOverlap = webOverlapElement.getChildNodes();
-			System.out.println("Web Overlap: "
-					+ ((Node) webPaperOverlap.item(0)).getNodeValue());
-
-			nodeList = doc.getElementsByTagName("publication_overlap");
-			Element publicationOverlapElement = (Element) nodeList.item(0);
-			NodeList publicationOverlap = publicationOverlapElement
-					.getChildNodes();
-			System.out.println("Publication Overlap: "
-					+ ((Node) publicationOverlap.item(0)).getNodeValue());
-
-			nodeList = doc.getElementsByTagName("originalityscore");
-			Element originalityElement = (Element) nodeList.item(0);
-			NodeList originality = originalityElement.getChildNodes();
-			System.out.println("Originality Score: "
-					+ ((Node) originality.item(0)).getNodeValue());
-
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-	}
 }
diff --git a/src/main/java/se/su/dsv/scipro/workerthreads/MailEventWorker.java b/src/main/java/se/su/dsv/scipro/workerthreads/MailEventWorker.java
index c15d0ce6b4..edc840bb91 100644
--- a/src/main/java/se/su/dsv/scipro/workerthreads/MailEventWorker.java
+++ b/src/main/java/se/su/dsv/scipro/workerthreads/MailEventWorker.java
@@ -8,7 +8,9 @@ import java.util.Set;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import se.su.dsv.scipro.data.dao.interfaces.GeneralSystemSettingsDao;
 import se.su.dsv.scipro.data.dao.interfaces.MailEventDao;
+import se.su.dsv.scipro.data.dataobjects.GeneralSystemSettings;
 import se.su.dsv.scipro.data.dataobjects.MailEvent;
 import se.su.dsv.scipro.data.dataobjects.User;
 import se.su.dsv.scipro.util.Mail;
@@ -19,20 +21,16 @@ public class MailEventWorker extends AbstractWorker {
 
 	@Autowired
 	private MailEventDao mailEventDao;
+	@Autowired
+	private GeneralSystemSettingsDao generalSystemSettingsDao;
+	@Autowired
+	private Mail mail;
 
 	public MailEventWorker(){ }
 
 	@Override
 	protected void doManualTransactionWork(){
 
-		Properties props;
-		try {
-			props = PropsUtils.load("email.properties");
-		} catch (Exception e1) {
-			e1.printStackTrace();
-			throw new RuntimeException(e1);
-		}
-
 		List<MailEvent> mailEvents = new ArrayList<MailEvent>();
 
 		this.beginTransaction();
@@ -65,9 +63,8 @@ public class MailEventWorker extends AbstractWorker {
 				//TODO test-
 				//String[] tmp = new String[]{"mpeters@dsv.su.se"};
 
-				boolean sendMailEnabled = Boolean.parseBoolean(props.getProperty("sendMailEnabled"));
-				if( sendMailEnabled ){ //If false, mail-events "vanish"
-					Mail.mail(fromName, fromEmail, recipientsEmails /* tmp */, replyToEmails, subject, messageBody, props, false);
+				if( generalSystemSettingsDao.getGeneralSystemSettingsInstance().isMailNotifications() ){ //If false, mail-events "vanish"
+					mail.mail(fromName, fromEmail, recipientsEmails /* tmp */, replyToEmails, subject, messageBody, false);
 				}
 				mailEvent = mailEventDao.reLoad(mailEvent); //Re-attach to session so delete works
 				mailEventDao.delete(mailEvent);
diff --git a/src/main/resources/META-INF/persistence.xml b/src/main/resources/META-INF/persistence.xml
index b00912755d..cea9c530c7 100644
--- a/src/main/resources/META-INF/persistence.xml
+++ b/src/main/resources/META-INF/persistence.xml
@@ -29,11 +29,7 @@
 		<class>se.su.dsv.scipro.data.dataobjects.ProjectSchedule</class>
 		<class>se.su.dsv.scipro.data.dataobjects.ProjectFollower</class>
 		<class>se.su.dsv.scipro.data.dataobjects.ProjectTeamMember</class>
-		<class>se.su.dsv.scipro.data.dataobjects.Board</class>
 		<class>se.su.dsv.scipro.data.dataobjects.BoardMessage</class>
-		<class>se.su.dsv.scipro.data.dataobjects.SupervisorBoardMessage</class>
-		<class>se.su.dsv.scipro.data.dataobjects.SupervisorMessageBoard</class>
-		<class>se.su.dsv.scipro.data.dataobjects.Message</class>
 		<class>se.su.dsv.scipro.data.dataobjects.MessageBoard</class>
 		<class>se.su.dsv.scipro.data.dataobjects.PrivateMessage</class>
 		<class>se.su.dsv.scipro.data.dataobjects.Recipient</class>
@@ -70,6 +66,7 @@
 		<class>se.su.dsv.scipro.data.dataobjects.MailEvent</class>
 		<class>se.su.dsv.scipro.data.dataobjects.ProjectPartner</class>
 		<class>se.su.dsv.scipro.data.dataobjects.CheckPlagiarismEvent</class>
+		<class>se.su.dsv.scipro.data.dataobjects.WebNotification</class>
 		
 		<properties>
 		
@@ -81,7 +78,9 @@
    			<property name="hibernate.generate_statistics" value="false" />
 			
 			<!-- DEVELOPMENT VARIABLE, REMOVE FOR PRODUCTION USE -->
+
  			<property name="hibernate.hbm2ddl.auto" value="update" />
+
 			
 			<!-- production settings database -->
 			
@@ -134,11 +133,7 @@
 		<class>se.su.dsv.scipro.data.dataobjects.ProjectSchedule</class>
 		<class>se.su.dsv.scipro.data.dataobjects.ProjectFollower</class>
 		<class>se.su.dsv.scipro.data.dataobjects.ProjectTeamMember</class>
-		<class>se.su.dsv.scipro.data.dataobjects.Board</class>
 		<class>se.su.dsv.scipro.data.dataobjects.BoardMessage</class>
-		<class>se.su.dsv.scipro.data.dataobjects.SupervisorBoardMessage</class>
-		<class>se.su.dsv.scipro.data.dataobjects.SupervisorMessageBoard</class>
-		<class>se.su.dsv.scipro.data.dataobjects.Message</class>
 		<class>se.su.dsv.scipro.data.dataobjects.MessageBoard</class>
 		<class>se.su.dsv.scipro.data.dataobjects.PrivateMessage</class>
 		<class>se.su.dsv.scipro.data.dataobjects.Recipient</class>
@@ -175,6 +170,7 @@
 		<class>se.su.dsv.scipro.data.dataobjects.MailEvent</class>
 		<class>se.su.dsv.scipro.data.dataobjects.ProjectPartner</class>
 		<class>se.su.dsv.scipro.data.dataobjects.CheckPlagiarismEvent</class>
+		<class>se.su.dsv.scipro.data.dataobjects.WebNotification</class>
 		
 
 		<properties>
diff --git a/src/main/resources/email.properties b/src/main/resources/email.properties
deleted file mode 100644
index 77ff4d9f72..0000000000
--- a/src/main/resources/email.properties
+++ /dev/null
@@ -1,4 +0,0 @@
-mail.smtp.host=mail.dsv.su.se
-systemFromName=[TEST] SciPro-mailer
-sendMailEnabled=true
-systemFromEmail=no-reply@thesis.dsv.su.se
diff --git a/src/main/resources/notification.properties b/src/main/resources/notification.properties
new file mode 100644
index 0000000000..6b8344dfbf
--- /dev/null
+++ b/src/main/resources/notification.properties
@@ -0,0 +1,33 @@
+#General
+twoNewLines=\n\n
+twoNewLinesWithComma=,\n\n
+linkText = Click on the link to see it in SciPro:\n
+mailSubject=Notification for SciPro
+hello=Hello 
+autogenerated=This is an auto-generated message from SciPro
+colon=:
+#Conference
+conferenceNotification=\ posted on conference 
+conferenceNotificationComment=\ commented on conference 
+#Private message
+privateMessageNotification=\ wrote a private message to you.
+#Peer accepted
+acceptPeerReviewSubject=Your request for peer-review has been accepted
+requestAccepted=Your peer request was accepted by 
+heShe=, he/she now has 
+complete=\ days to complete a review.
+#Peer completed
+completedReviewSubject=A peer review has been completed!
+requestReviewed=Your peer request has now been reviewed and is available.
+supervisorMessageBody=You are getting this message because you are supervisor of "
+#Peer completed supervisor of project
+supervisorMessageBody2=".\nA peer review on this project has been completed and is available for you.
+#Peer completed supervisor of reviewer
+supervisorMessageBody3=\ has performed a peer review on someone elses work which is available for you.
+#Peer completed webnotification
+inProject=in project: 
+hasPerformed=\ has performed a peer review.
+commaWithLinebreak=".\n
+#Peer rated
+reviewRatedSubject=You have received a rating for a review you have done!
+reviewRatedBody=Your review has been rated.
diff --git a/src/main/webapp/css/scipro.css b/src/main/webapp/css/scipro.css
index bd86a24b31..39719404a2 100644
--- a/src/main/webapp/css/scipro.css
+++ b/src/main/webapp/css/scipro.css
@@ -140,6 +140,16 @@ img.department-logotype {
 	border: 1px solid #777A91;
 }
 
+.rounded-border-notification { 
+	padding:0.7em;
+	margin-bottom:0.5em; 
+	-webkit-border-radius: 6px; 
+	-moz-border-radius: 6px; 
+	border-radius: 6px; 
+	overflow: hidden; 
+	border: 1px solid #777A91;
+}
+
 .rounded-border h5 { 
 	background-color: #d7e0eb;
 	margin: -1.5em -1.5em 0.4em -1.5em;
diff --git a/src/test/java/se/su/dsv/scipro/dao/jpa/TestBoardMessageDaoJPA-context.xml b/src/test/java/se/su/dsv/scipro/dao/jpa/TestBoardMessageDaoJPA-context.xml
index d04ffe7131..4526009fc0 100644
--- a/src/test/java/se/su/dsv/scipro/dao/jpa/TestBoardMessageDaoJPA-context.xml
+++ b/src/test/java/se/su/dsv/scipro/dao/jpa/TestBoardMessageDaoJPA-context.xml
@@ -32,5 +32,17 @@
 		<property name="entityManagerFactory" ref="entityManagerFactory" />
 	</bean>
 	
+	<bean id="projectDao" class="se.su.dsv.scipro.data.dao.jpa.ProjectDaoJPAImp">
+		<property name="entityManagerFactory" ref="entityManagerFactory" />
+	</bean>
+	
+	<bean id="roleDao" class="se.su.dsv.scipro.data.dao.jpa.RoleDaoJPAImp">
+		<property name="entityManagerFactory" ref="entityManagerFactory" />
+	</bean>
+
+	
+	<bean id="projectClassDao" class="se.su.dsv.scipro.data.dao.jpa.ProjectClassDaoJPAImp">
+		<property name="entityManagerFactory" ref="entityManagerFactory" />
+	</bean>
 
 </beans>
\ No newline at end of file
diff --git a/src/test/java/se/su/dsv/scipro/dao/jpa/TestBoardMessageDaoJPA.java b/src/test/java/se/su/dsv/scipro/dao/jpa/TestBoardMessageDaoJPA.java
index bb6e895d6e..8b4ed74aa2 100644
--- a/src/test/java/se/su/dsv/scipro/dao/jpa/TestBoardMessageDaoJPA.java
+++ b/src/test/java/se/su/dsv/scipro/dao/jpa/TestBoardMessageDaoJPA.java
@@ -3,10 +3,8 @@
  */
 package se.su.dsv.scipro.dao.jpa;
 
-import java.util.ArrayList;
-import java.util.List;
-import java.util.SortedSet;
-import java.util.TreeSet;
+import java.util.HashSet;
+import java.util.Set;
 
 import org.junit.Assert;
 import org.junit.Before;
@@ -20,9 +18,16 @@ import org.springframework.transaction.annotation.Transactional;
 
 import se.su.dsv.scipro.data.dao.interfaces.BoardMessageDao;
 import se.su.dsv.scipro.data.dao.interfaces.MessageBoardDao;
+import se.su.dsv.scipro.data.dao.interfaces.ProjectClassDao;
+import se.su.dsv.scipro.data.dao.interfaces.ProjectDao;
+import se.su.dsv.scipro.data.dao.interfaces.RoleDao;
 import se.su.dsv.scipro.data.dao.interfaces.UserDao;
 import se.su.dsv.scipro.data.dataobjects.BoardMessage;
+import se.su.dsv.scipro.data.dataobjects.Employee;
 import se.su.dsv.scipro.data.dataobjects.MessageBoard;
+import se.su.dsv.scipro.data.dataobjects.Project;
+import se.su.dsv.scipro.data.dataobjects.ProjectClass;
+import se.su.dsv.scipro.data.dataobjects.Student;
 import se.su.dsv.scipro.data.dataobjects.User;
 
 /**
@@ -42,6 +47,16 @@ public class TestBoardMessageDaoJPA {
 	@Autowired 
 	private MessageBoardDao messageBoardDao;
 	
+	
+	@Autowired 
+	private ProjectClassDao projectClassDao;
+	
+	@Autowired 
+	private RoleDao roleDao;
+	
+	@Autowired 
+	private ProjectDao projectDao;
+	
 	private User user;
 	private BoardMessage boardMessage;
 	private MessageBoard messageBoard;
@@ -55,18 +70,42 @@ public class TestBoardMessageDaoJPA {
 		user.setFirstName("Test");
 		user.setLastName("Person");
 		user = userDao.save(user);
-
 		
-
+		ProjectClass projectClass = new ProjectClass();
+		projectClass.setName("Master");
+		projectClass.setCode(ProjectClass.MASTER);
+		projectClass = projectClassDao.save(projectClass);
 		
-		messageBoard = new MessageBoard();	
+		User presenter = new User();
+		presenter.setFirstName("Presenter");
+		presenter = userDao.save(presenter);
+		
+		Student presenterRole = roleDao.makeStudent(presenter);
+		
+		Employee opponentProjectSupervisorRole = roleDao.makeEmployee(presenter);
+		
+		
+		Project presenterProject = new Project();
+		presenterProject.setTitle("Presenter Project");
+		presenterProject.setHeadSupervisor(opponentProjectSupervisorRole);
+		presenterProject.setProjectClass(projectClass);
+		presenterProject.addProjectParticipant(presenterRole);
+		presenterProject = projectDao.save(presenterProject);
+		
+		Set<User> subscribers = new HashSet<User>();
+		subscribers.add(user);
+		messageBoard = new MessageBoard(presenterProject);	
+		messageBoard.setTitle("test");
 		messageBoard = messageBoardDao.save(messageBoard);
+	
+
 		
 		boardMessage = new BoardMessage();
 		boardMessage.setFromUser(user);
 		boardMessage.setMessage("Test");
 		boardMessage.setMessageBoard(messageBoard);
 		boardMessage = boardMessageDao.save(boardMessage);
+
 		
 	}
 	
@@ -76,6 +115,13 @@ public class TestBoardMessageDaoJPA {
 	public void testGetBoardMessageList() {
 		Assert.assertEquals(1, boardMessageDao.getBoardMessageList(messageBoard, 0, 1).size());
 	}
+	
+	@Test
+	@Transactional
+	@Rollback
+	public void testGetBoardMessageListCount() {
+		Assert.assertEquals(1, boardMessageDao.getBoardMessageListCount(messageBoard));
+	}
 
 
 }
diff --git a/src/test/java/se/su/dsv/scipro/dao/jpa/TestCommentThreadDaoJpa.java b/src/test/java/se/su/dsv/scipro/dao/jpa/TestCommentThreadDaoJPA.java
similarity index 97%
rename from src/test/java/se/su/dsv/scipro/dao/jpa/TestCommentThreadDaoJpa.java
rename to src/test/java/se/su/dsv/scipro/dao/jpa/TestCommentThreadDaoJPA.java
index 6e2c200381..a7ad4ab9c4 100644
--- a/src/test/java/se/su/dsv/scipro/dao/jpa/TestCommentThreadDaoJpa.java
+++ b/src/test/java/se/su/dsv/scipro/dao/jpa/TestCommentThreadDaoJPA.java
@@ -8,7 +8,6 @@ import java.util.TreeSet;
 
 import org.junit.Assert;
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -33,10 +32,10 @@ import se.su.dsv.scipro.data.dataobjects.User;
  * @author Johan Aschan - aschan@dsv.su.se
  *
  */
-@Ignore
+
 @RunWith(SpringJUnit4ClassRunner.class)
 @ContextConfiguration
-public class TestCommentThreadDaoJpa {
+public class TestCommentThreadDaoJPA {
 
 	@Autowired
 	private CommentDao commentDao;
diff --git a/src/test/java/se/su/dsv/scipro/dao/jpa/TestMessageBoardDaoJPA-context.xml b/src/test/java/se/su/dsv/scipro/dao/jpa/TestMessageBoardDaoJPA-context.xml
new file mode 100644
index 0000000000..38e51dd0cf
--- /dev/null
+++ b/src/test/java/se/su/dsv/scipro/dao/jpa/TestMessageBoardDaoJPA-context.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx"
+	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
+		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"
+	default-autowire="byName">
+
+	<bean id="entityManagerFactory"
+		class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
+		<property name="persistenceUnitName" value="testPersistenceUnit" />
+	</bean>
+
+	<!--
+		enable the configuration of transactional behavior based on
+		annotations
+	-->
+	<tx:annotation-driven transaction-manager="transactionManager" />
+
+	<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
+		<property name="entityManagerFactory" ref="entityManagerFactory" />
+	</bean>
+	
+	<bean id="userDao" class="se.su.dsv.scipro.data.dao.jpa.UserDaoJPAImp">
+		<property name="entityManagerFactory" ref="entityManagerFactory" />
+	</bean>
+	
+	<bean id="messageBoardDao" class="se.su.dsv.scipro.data.dao.jpa.MessageBoardDaoJPAImp">
+		<property name="entityManagerFactory" ref="entityManagerFactory" />
+	</bean>
+	
+	<bean id="projectDao" class="se.su.dsv.scipro.data.dao.jpa.ProjectDaoJPAImp">
+		<property name="entityManagerFactory" ref="entityManagerFactory" />
+	</bean>
+	
+	<bean id="roleDao" class="se.su.dsv.scipro.data.dao.jpa.RoleDaoJPAImp">
+		<property name="entityManagerFactory" ref="entityManagerFactory" />
+	</bean>
+
+	
+	<bean id="projectClassDao" class="se.su.dsv.scipro.data.dao.jpa.ProjectClassDaoJPAImp">
+		<property name="entityManagerFactory" ref="entityManagerFactory" />
+	</bean>
+
+</beans>
\ No newline at end of file
diff --git a/src/test/java/se/su/dsv/scipro/dao/jpa/TestMessageBoardDaoJPA.java b/src/test/java/se/su/dsv/scipro/dao/jpa/TestMessageBoardDaoJPA.java
new file mode 100644
index 0000000000..0380c558c9
--- /dev/null
+++ b/src/test/java/se/su/dsv/scipro/dao/jpa/TestMessageBoardDaoJPA.java
@@ -0,0 +1,109 @@
+/**
+ * 
+ */
+package se.su.dsv.scipro.dao.jpa;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.annotation.Rollback;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.transaction.annotation.Transactional;
+
+import se.su.dsv.scipro.data.dao.interfaces.BoardMessageDao;
+import se.su.dsv.scipro.data.dao.interfaces.MessageBoardDao;
+import se.su.dsv.scipro.data.dao.interfaces.ProjectClassDao;
+import se.su.dsv.scipro.data.dao.interfaces.ProjectDao;
+import se.su.dsv.scipro.data.dao.interfaces.RoleDao;
+import se.su.dsv.scipro.data.dao.interfaces.UserDao;
+import se.su.dsv.scipro.data.dataobjects.BoardMessage;
+import se.su.dsv.scipro.data.dataobjects.Employee;
+import se.su.dsv.scipro.data.dataobjects.MessageBoard;
+import se.su.dsv.scipro.data.dataobjects.Project;
+import se.su.dsv.scipro.data.dataobjects.ProjectClass;
+import se.su.dsv.scipro.data.dataobjects.Student;
+import se.su.dsv.scipro.data.dataobjects.User;
+
+/**
+ * @author Johan Aschan - aschan@dsv.su.se
+ *
+ */
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration
+public class TestMessageBoardDaoJPA {
+	
+	@Autowired 
+	private UserDao userDao;
+
+	@Autowired 
+	private MessageBoardDao messageBoardDao;
+	
+	
+	@Autowired 
+	private ProjectClassDao projectClassDao;
+	
+	@Autowired 
+	private RoleDao roleDao;
+	
+	@Autowired 
+	private ProjectDao projectDao;
+	
+	private User user;
+
+	private MessageBoard messageBoard;
+	private Project presenterProject;
+	
+	@Before
+	public void startTransaction()
+	{
+		user = new User();
+		user.setEmailAddress("test@dsv.su.se");
+		user.setIdentifier(new Long(666));
+		user.setFirstName("Test");
+		user.setLastName("Person");
+		user = userDao.save(user);
+		
+		ProjectClass projectClass = new ProjectClass();
+		projectClass.setName("Master");
+		projectClass.setCode(ProjectClass.MASTER);
+		projectClass = projectClassDao.save(projectClass);
+		
+		User presenter = new User();
+		presenter.setFirstName("Presenter");
+		presenter = userDao.save(presenter);
+		
+		Student presenterRole = roleDao.makeStudent(presenter);
+		
+		Employee opponentProjectSupervisorRole = roleDao.makeEmployee(presenter);
+		
+		
+		presenterProject = new Project();
+		presenterProject.setTitle("Presenter Project");
+		presenterProject.setHeadSupervisor(opponentProjectSupervisorRole);
+		presenterProject.setProjectClass(projectClass);
+		presenterProject.addProjectParticipant(presenterRole);
+		presenterProject = projectDao.save(presenterProject);
+		
+		Set<User> subscribers = new HashSet<User>();
+		subscribers.add(user);
+		messageBoard = new MessageBoard(presenterProject);	
+		messageBoard.setTitle("test");
+		messageBoard = messageBoardDao.save(messageBoard);
+		
+	}
+	
+	@Test
+	@Transactional
+	@Rollback
+	public void testGetBoardMessageList() {
+		Assert.assertEquals(messageBoard, messageBoardDao.getMessageBoard(presenterProject));
+	}
+
+
+}
diff --git a/src/test/java/se/su/dsv/scipro/dao/jpa/TestPrivateMessageDaoJPA.java b/src/test/java/se/su/dsv/scipro/dao/jpa/TestPrivateMessageDaoJPA.java
index c2e5086636..e346c70c59 100644
--- a/src/test/java/se/su/dsv/scipro/dao/jpa/TestPrivateMessageDaoJPA.java
+++ b/src/test/java/se/su/dsv/scipro/dao/jpa/TestPrivateMessageDaoJPA.java
@@ -3,11 +3,6 @@
  */
 package se.su.dsv.scipro.dao.jpa;
 
-import java.util.ArrayList;
-import java.util.List;
-import java.util.SortedSet;
-import java.util.TreeSet;
-
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
@@ -18,12 +13,8 @@ import org.springframework.test.context.ContextConfiguration;
 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
 import org.springframework.transaction.annotation.Transactional;
 
-import se.su.dsv.scipro.data.dao.interfaces.BoardMessageDao;
-import se.su.dsv.scipro.data.dao.interfaces.MessageBoardDao;
 import se.su.dsv.scipro.data.dao.interfaces.PrivateMessageDao;
 import se.su.dsv.scipro.data.dao.interfaces.UserDao;
-import se.su.dsv.scipro.data.dataobjects.BoardMessage;
-import se.su.dsv.scipro.data.dataobjects.MessageBoard;
 import se.su.dsv.scipro.data.dataobjects.PrivateMessage;
 import se.su.dsv.scipro.data.dataobjects.User;
 
diff --git a/src/test/java/se/su/dsv/scipro/dao/jpa/TestProjectPartnerDaoJPA.java b/src/test/java/se/su/dsv/scipro/dao/jpa/TestProjectPartnerDaoJPA.java
index 04e4eb6b7c..020fb62cdb 100644
--- a/src/test/java/se/su/dsv/scipro/dao/jpa/TestProjectPartnerDaoJPA.java
+++ b/src/test/java/se/su/dsv/scipro/dao/jpa/TestProjectPartnerDaoJPA.java
@@ -1,7 +1,6 @@
 package se.su.dsv.scipro.dao.jpa;
 
 import org.junit.Assert;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -17,7 +16,6 @@ import se.su.dsv.scipro.data.dataobjects.ProjectClass;
 import se.su.dsv.scipro.data.dataobjects.ProjectPartner;
 import se.su.dsv.scipro.data.dataobjects.User;
 
-@Ignore
 @RunWith(SpringJUnit4ClassRunner.class)
 @ContextConfiguration
 public class TestProjectPartnerDaoJPA {
diff --git a/src/test/java/se/su/dsv/scipro/dao/jpa/TestRecipientDaoJPA.java b/src/test/java/se/su/dsv/scipro/dao/jpa/TestRecipientDaoJPA.java
index 60c29b3b02..0ffb2832b4 100644
--- a/src/test/java/se/su/dsv/scipro/dao/jpa/TestRecipientDaoJPA.java
+++ b/src/test/java/se/su/dsv/scipro/dao/jpa/TestRecipientDaoJPA.java
@@ -3,11 +3,6 @@
  */
 package se.su.dsv.scipro.dao.jpa;
 
-import java.util.ArrayList;
-import java.util.List;
-import java.util.SortedSet;
-import java.util.TreeSet;
-
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
@@ -18,13 +13,9 @@ import org.springframework.test.context.ContextConfiguration;
 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
 import org.springframework.transaction.annotation.Transactional;
 
-import se.su.dsv.scipro.data.dao.interfaces.BoardMessageDao;
-import se.su.dsv.scipro.data.dao.interfaces.MessageBoardDao;
 import se.su.dsv.scipro.data.dao.interfaces.PrivateMessageDao;
 import se.su.dsv.scipro.data.dao.interfaces.RecipientDao;
 import se.su.dsv.scipro.data.dao.interfaces.UserDao;
-import se.su.dsv.scipro.data.dataobjects.BoardMessage;
-import se.su.dsv.scipro.data.dataobjects.MessageBoard;
 import se.su.dsv.scipro.data.dataobjects.PrivateMessage;
 import se.su.dsv.scipro.data.dataobjects.Recipient;
 import se.su.dsv.scipro.data.dataobjects.User;
diff --git a/src/test/java/se/su/dsv/scipro/dao/jpa/TestResourceDaoJPA.java b/src/test/java/se/su/dsv/scipro/dao/jpa/TestResourceDaoJPA.java
index 1ce8d7e947..8150366333 100644
--- a/src/test/java/se/su/dsv/scipro/dao/jpa/TestResourceDaoJPA.java
+++ b/src/test/java/se/su/dsv/scipro/dao/jpa/TestResourceDaoJPA.java
@@ -6,7 +6,6 @@ import java.util.List;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
-import org.junit.experimental.categories.Categories;
 import org.junit.runner.RunWith;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.test.annotation.Rollback;
diff --git a/src/test/java/se/su/dsv/scipro/dao/jpa/TestRoleDaoJPA.java b/src/test/java/se/su/dsv/scipro/dao/jpa/TestRoleDaoJPA.java
index d2a368bb50..66af6df332 100644
--- a/src/test/java/se/su/dsv/scipro/dao/jpa/TestRoleDaoJPA.java
+++ b/src/test/java/se/su/dsv/scipro/dao/jpa/TestRoleDaoJPA.java
@@ -1,9 +1,6 @@
 package se.su.dsv.scipro.dao.jpa;
 
 
-import java.util.ArrayList;
-import java.util.List;
-
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
@@ -17,8 +14,9 @@ import org.springframework.transaction.annotation.Transactional;
 import se.su.dsv.scipro.data.dao.interfaces.RoleDao;
 import se.su.dsv.scipro.data.dao.interfaces.UserDao;
 import se.su.dsv.scipro.data.dataobjects.Admin;
-import se.su.dsv.scipro.data.dataobjects.Student;
-import se.su.dsv.scipro.data.dataobjects.*;
+import se.su.dsv.scipro.data.dataobjects.Employee;
+import se.su.dsv.scipro.data.dataobjects.SysAdmin;
+import se.su.dsv.scipro.data.dataobjects.User;
 
 /**
  * 
diff --git a/src/test/java/se/su/dsv/scipro/dao/jpa/TestStringResourceDaoJPA.java b/src/test/java/se/su/dsv/scipro/dao/jpa/TestStringResourceDaoJPA.java
index 7fcddeb2d9..678ef3ab14 100644
--- a/src/test/java/se/su/dsv/scipro/dao/jpa/TestStringResourceDaoJPA.java
+++ b/src/test/java/se/su/dsv/scipro/dao/jpa/TestStringResourceDaoJPA.java
@@ -1,10 +1,6 @@
 package se.su.dsv.scipro.dao.jpa;
 
 
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
@@ -15,11 +11,7 @@ import org.springframework.test.context.ContextConfiguration;
 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
 import org.springframework.transaction.annotation.Transactional;
 
-import se.su.dsv.scipro.data.dao.interfaces.EventDao;
-import se.su.dsv.scipro.data.dao.interfaces.ProjectScheduleDao;
 import se.su.dsv.scipro.data.dao.interfaces.StringResourceDao;
-import se.su.dsv.scipro.data.dataobjects.Event;
-import se.su.dsv.scipro.data.dataobjects.ProjectSchedule;
 import se.su.dsv.scipro.data.dataobjects.StringResource;
 
 /**
diff --git a/src/test/java/se/su/dsv/scipro/dao/jpa/TestUserDaoJPA-context.xml b/src/test/java/se/su/dsv/scipro/dao/jpa/TestUserDaoJPA-context.xml
index 061e25ce06..2ae9d67473 100644
--- a/src/test/java/se/su/dsv/scipro/dao/jpa/TestUserDaoJPA-context.xml
+++ b/src/test/java/se/su/dsv/scipro/dao/jpa/TestUserDaoJPA-context.xml
@@ -25,10 +25,12 @@
 		<property name="entityManagerFactory" ref="entityManagerFactory" />
 	</bean>
 	
-		<bean id="usernameDao" class="se.su.dsv.scipro.data.dao.jpa.UserNameDaoJPAImp">
+	<bean id="usernameDao" class="se.su.dsv.scipro.data.dao.jpa.UserNameDaoJPAImp">
 		<property name="entityManagerFactory" ref="entityManagerFactory" />
 	</bean>
 	
-
+	<bean id="roleDao" class="se.su.dsv.scipro.data.dao.jpa.RoleDaoJPAImp">
+		<property name="entityManagerFactory" ref="entityManagerFactory" />
+	</bean>
 
 </beans>
diff --git a/src/test/java/se/su/dsv/scipro/dao/jpa/TestUserDaoJPA.java b/src/test/java/se/su/dsv/scipro/dao/jpa/TestUserDaoJPA.java
index f68db5c2ac..7f497a4669 100644
--- a/src/test/java/se/su/dsv/scipro/dao/jpa/TestUserDaoJPA.java
+++ b/src/test/java/se/su/dsv/scipro/dao/jpa/TestUserDaoJPA.java
@@ -14,8 +14,10 @@ import org.springframework.test.context.ContextConfiguration;
 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
 import org.springframework.transaction.annotation.Transactional;
 
+import se.su.dsv.scipro.data.dao.interfaces.RoleDao;
 import se.su.dsv.scipro.data.dao.interfaces.UserDao;
 import se.su.dsv.scipro.data.dao.interfaces.UsernameDao;
+import se.su.dsv.scipro.data.dataobjects.Employee;
 import se.su.dsv.scipro.data.dataobjects.User;
 import se.su.dsv.scipro.data.dataobjects.Username;
 
@@ -33,6 +35,9 @@ public class TestUserDaoJPA {
 	
 	@Autowired
 	private UsernameDao userNameDao;
+	
+	@Autowired
+	private RoleDao roleDao;
 
 	protected User user;
 	
@@ -143,12 +148,41 @@ public class TestUserDaoJPA {
 	
 	@Test @Transactional
 	@Rollback
-	public void findUserQueryCount() {
+	public void findUserQueryCount1() {
 		Username username = new Username();
 		username.setUser(user);
 		username.setUserName("test");
 		username.setRealm("test");
 		userNameDao.save(username);
-		Assert.assertEquals(1, userDao.findUserQueryCount(null, null));
+		
+		roleDao.makeEmployee(user);
+		
+		List<User> notIncludeList = new ArrayList<User>();
+		notIncludeList.add(user);
+		Assert.assertEquals(0, userDao.findUserQueryCount("test", Employee.class, notIncludeList));
 	}
+	
+	@Test @Transactional
+	@Rollback
+	public void findUserQuery1() {
+		Username username = new Username();
+		username.setUser(user);
+		username.setUserName("test");
+		username.setRealm("test");
+		userNameDao.save(username);
+		Assert.assertEquals(user, userDao.findUserQuery("test", 2).get(0));
+	}
+	
+	@Test @Transactional
+	@Rollback
+	public void findUserQuery2() {
+		Username username = new Username();
+		username.setUser(user);
+		username.setUserName("test");
+		username.setRealm("test");
+		userNameDao.save(username);
+		Assert.assertEquals(user, userDao.findUserQuery("test", 0, 2).get(0));
+	}
+	
+
 }
diff --git a/src/test/java/se/su/dsv/scipro/dao/jpa/TestWebNotificationDaoJPA-context.xml b/src/test/java/se/su/dsv/scipro/dao/jpa/TestWebNotificationDaoJPA-context.xml
new file mode 100644
index 0000000000..b82ffca1cb
--- /dev/null
+++ b/src/test/java/se/su/dsv/scipro/dao/jpa/TestWebNotificationDaoJPA-context.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx"
+	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
+		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"
+	default-autowire="byName">
+
+	<bean id="entityManagerFactory"
+		class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
+		<property name="persistenceUnitName" value="testPersistenceUnit" />
+	</bean>
+
+	<!--
+		enable the configuration of transactional behavior based on
+		annotations
+	-->
+	<tx:annotation-driven transaction-manager="transactionManager" />
+
+	<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
+		<property name="entityManagerFactory" ref="entityManagerFactory" />
+	</bean>
+	
+	<bean id="userDao" class="se.su.dsv.scipro.data.dao.jpa.UserDaoJPAImp">
+		<property name="entityManagerFactory" ref="entityManagerFactory" />
+	</bean>
+	
+	<bean id="notificationDao" class="se.su.dsv.scipro.data.dao.jpa.WebNotificationDaoJPAImp">
+		<property name="entityManagerFactory" ref="entityManagerFactory" />
+	</bean>
+
+</beans>
\ No newline at end of file
diff --git a/src/test/java/se/su/dsv/scipro/dao/jpa/TestWebNotificationDaoJPA.java b/src/test/java/se/su/dsv/scipro/dao/jpa/TestWebNotificationDaoJPA.java
new file mode 100644
index 0000000000..04ab158a39
--- /dev/null
+++ b/src/test/java/se/su/dsv/scipro/dao/jpa/TestWebNotificationDaoJPA.java
@@ -0,0 +1,81 @@
+/**
+ * 
+ */
+package se.su.dsv.scipro.dao.jpa;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.annotation.Rollback;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.transaction.annotation.Transactional;
+
+import se.su.dsv.scipro.data.dao.interfaces.WebNotificationDao;
+import se.su.dsv.scipro.data.dao.interfaces.UserDao;
+import se.su.dsv.scipro.data.dataobjects.WebNotification;
+import se.su.dsv.scipro.data.dataobjects.User;
+
+/**
+ * @author Johan Aschan - aschan@dsv.su.se
+ *
+ */
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration
+public class TestWebNotificationDaoJPA {
+	
+	@Autowired 
+	private UserDao userDao;
+	
+	@Autowired 
+	private WebNotificationDao notificationDao;
+
+	
+	private User user;
+
+
+	
+	@Before
+	public void startTransaction()
+	{
+		user = new User();
+		user.setEmailAddress("test@dsv.su.se");
+		user.setIdentifier(new Long(666));
+		user.setFirstName("Test");
+		user.setLastName("Person");
+		user = userDao.save(user);
+		
+		WebNotification notification = new WebNotification();
+		notification.setInfoText("Test");
+		notification.setUrl("/test/");
+		notification.setUser(user);
+		notificationDao.save(notification);
+
+		
+	}
+	
+	@Test
+	@Transactional
+	@Rollback
+	public void testGetNotifications() {
+		Assert.assertEquals(1, notificationDao.getWebNotifications(user).size());
+	}
+	
+	@Test
+	@Transactional
+	@Rollback
+	public void testGetNotificationsFirstCount() {
+		Assert.assertEquals(1, notificationDao.getWebNotifications(user, 0, 1).size());
+	}
+	
+	@Test
+	@Transactional
+	@Rollback
+	public void testGetNumberOfNotifications() {
+		Assert.assertEquals(1, notificationDao.getCountOfWebNotifications(user));
+	}
+
+
+}
diff --git a/src/test/java/se/su/dsv/scipro/wicket/BaseWicketTest.java b/src/test/java/se/su/dsv/scipro/wicket/BaseWicketTest.java
index 39bead90e1..f245abf959 100644
--- a/src/test/java/se/su/dsv/scipro/wicket/BaseWicketTest.java
+++ b/src/test/java/se/su/dsv/scipro/wicket/BaseWicketTest.java
@@ -21,6 +21,7 @@ import org.springframework.orm.jpa.LocalEntityManagerFactoryBean;
 import se.su.dsv.scipro.ApplicationSettings;
 import se.su.dsv.scipro.SciProApplication;
 import se.su.dsv.scipro.data.controllers.FinalSeminarUploadController;
+import se.su.dsv.scipro.data.controllers.NotificationController;
 import se.su.dsv.scipro.data.dao.interfaces.BoardMessageDao;
 import se.su.dsv.scipro.data.dao.interfaces.CommentDao;
 import se.su.dsv.scipro.data.dao.interfaces.CommentThreadDao;
@@ -44,6 +45,7 @@ import se.su.dsv.scipro.data.dao.interfaces.ScheduleTemplateDao;
 import se.su.dsv.scipro.data.dao.interfaces.StringResourceDao;
 import se.su.dsv.scipro.data.dao.interfaces.UserDao;
 import se.su.dsv.scipro.data.dao.interfaces.UserSettingsDao;
+import se.su.dsv.scipro.data.dao.interfaces.WebNotificationDao;
 import se.su.dsv.scipro.data.dao.interfaces.WorkerDataDao;
 import se.su.dsv.scipro.data.dataobjects.GeneralSystemSettings;
 import se.su.dsv.scipro.data.dataobjects.Project;
@@ -100,6 +102,8 @@ public class BaseWicketTest {
 	@Mock HandInActivityDao handInActivityDao;
 	@Mock ScheduleTemplateDao scheduleTemplateDao;
 	@Mock ProjectPartnerDao projectPartnerDao;
+	@Mock WebNotificationDao webNotificationDao;
+	@Mock NotificationController notificationController;
 
 	@Mock ApplicationSettings applicationSettings;
 	
diff --git a/src/test/java/se/su/dsv/scipro/wicket/TestWicketPages.java b/src/test/java/se/su/dsv/scipro/wicket/TestWicketPages.java
index 1598642fd7..61b0886b8f 100644
--- a/src/test/java/se/su/dsv/scipro/wicket/TestWicketPages.java
+++ b/src/test/java/se/su/dsv/scipro/wicket/TestWicketPages.java
@@ -9,6 +9,8 @@ import se.su.dsv.scipro.HomePage;
 import se.su.dsv.scipro.admin.pages.AdminProjectPartnerPage;
 import se.su.dsv.scipro.admin.pages.SystemMaintenancePage;
 import se.su.dsv.scipro.admin.pages.settings.AdminServerEnvironmentSettingsPage;
+import se.su.dsv.scipro.conference.pages.ProjectConferencePage;
+import se.su.dsv.scipro.conference.pages.SupervisorConferencePage;
 import se.su.dsv.scipro.data.dataobjects.GeneralSystemSettings;
 import se.su.dsv.scipro.data.dataobjects.Project;
 import se.su.dsv.scipro.data.dataobjects.ProjectClass;
@@ -16,10 +18,12 @@ import se.su.dsv.scipro.data.dataobjects.User;
 import se.su.dsv.scipro.loginlogout.pages.LoginPage;
 import se.su.dsv.scipro.loginlogout.pages.LogoutPage;
 import se.su.dsv.scipro.project.pages.FinalSeminarProjectListPage;
+import se.su.dsv.scipro.project.pages.NoActiveProjectPage;
 import se.su.dsv.scipro.project.pages.ProjectFilePage;
 import se.su.dsv.scipro.project.pages.ProjectOppositionPage;
 import se.su.dsv.scipro.project.pages.ProjectPartnerPage;
 import se.su.dsv.scipro.project.pages.ProjectSchedulePlannerPage;
+import se.su.dsv.scipro.project.pages.ProjectStartPage;
 import se.su.dsv.scipro.supervisor.pages.SupervisorFinalSeminarListingPage;
 import se.su.dsv.scipro.supervisor.pages.SupervisorProjectDetailsPage;
 import se.su.dsv.scipro.supervisor.pages.SupervisorScheduleTemplatesPage;
@@ -86,14 +90,14 @@ public class TestWicketPages extends BaseWicketTest {
 	 * Project/author/student pages
 	 */
 	@Test
-	public void testProjectStartPage() {
-		//tester.startPage(ProjectStartPage.class);
-		//tester.assertRenderedPage(NoActiveProjectPage.class);
+	public void testProjectStartPage(){ 
 		
+		tester.startPage(ProjectStartPage.class);
+		tester.assertRenderedPage(NoActiveProjectPage.class);
 		//TODO: Set an active project so that the following test works
-		
-		//tester.startPage(ProjectStartPage.class);
-		//tester.assertRenderedPage(ProjectStartPage.class);
+		this.setActiveProject(activeProject);
+		tester.startPage(ProjectStartPage.class);
+		tester.assertRenderedPage(ProjectStartPage.class);
 	}
 	
 	@Test
@@ -129,12 +133,14 @@ public class TestWicketPages extends BaseWicketTest {
 		tester.assertRenderedPage(ProjectFilePage.class);
 	}	
 	
+	
 	/*
 	 * Supervisor pages
 	 */
 	@Test
 	public void testSupervisorStartPage(){
 		MockSciProSession.currentSession.setLoggedInAsEmployee();
+		
 		tester.startPage(SupervisorStartPage.class);
 		tester.assertRenderedPage(SupervisorStartPage.class);
 	}
@@ -160,6 +166,12 @@ public class TestWicketPages extends BaseWicketTest {
 		tester.assertRenderedPage(SupervisorScheduleTemplatesPage.class);
 	}
 	
+	@Test
+	public void testSupervisorConferencePage(){
+		tester.startPage(SupervisorConferencePage.class);
+		tester.assertRenderedPage(SupervisorConferencePage.class);
+	}
+	
 	/*
 	 * Admin pages
 	 */
@@ -190,6 +202,7 @@ public class TestWicketPages extends BaseWicketTest {
 	public void testAdminServerEnvironmentSettingsPage(){
 		tester.startPage(AdminServerEnvironmentSettingsPage.class);
 	}
+	
 
 
 }