diff --git a/pom.xml b/pom.xml
index 38bb6a6d38..07c4a944d2 100644
--- a/pom.xml
+++ b/pom.xml
@@ -24,11 +24,6 @@
             <name>Spring Maven MILESTONE Repository</name>
             <url>http://repo.springsource.org/libs-milestone</url>
         </repository>
-        <repository>
-            <id>spring-roo-repository</id>
-            <name>Spring Roo Repository</name>
-            <url>http://spring-roo-repository.springsource.org/release</url>
-        </repository>
     </repositories>
     <dependencies>
         <!-- WICKET DEPENDENCIES -->
diff --git a/src/main/java/se/su/dsv/scipro/admin/panels/ManualMatchPanel.java b/src/main/java/se/su/dsv/scipro/admin/panels/ManualMatchPanel.java
index 4731beb5e8..3d2f82356e 100644
--- a/src/main/java/se/su/dsv/scipro/admin/panels/ManualMatchPanel.java
+++ b/src/main/java/se/su/dsv/scipro/admin/panels/ManualMatchPanel.java
@@ -12,6 +12,7 @@ import org.apache.wicket.markup.html.panel.Fragment;
 import org.apache.wicket.markup.html.panel.Panel;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.spring.injection.annot.SpringBean;
+import org.apache.wicket.util.string.Strings;
 import se.su.dsv.scipro.SciProSession;
 import se.su.dsv.scipro.admin.pages.match.AdminManageProjectIdeaPage;
 import se.su.dsv.scipro.data.dataobjects.Employee;
@@ -56,16 +57,19 @@ public class ManualMatchPanel extends Panel {
         add(currentFragment.setOutputMarkupId(true));
     }
 
-
-    private String createNameAndEmail(Employee employee) {
+    private String createNameAndEmailOutput(Employee employee) {
         return employee.getNameAsString() + " <" + employee.getEmailAsString()+">";
     }
 
+    private String createNameAndEmailAutoComplete(Employee employee) {
+        return employee.getNameAsString() + " &lt;" + employee.getEmailAsString()+"&gt;";
+    }
+
     private boolean testACInputString(EmployeeAutoComplete autoCompleteObjectField) {
         return autoCompleteObjectField.getModelObject() == null ||
                 autoCompleteObjectField.getInput() == null ||
                 autoCompleteObjectField.getInput().isEmpty() ||
-                !autoCompleteObjectField.getInput().equals(createNameAndEmail(autoCompleteObjectField.getModelObject()));
+                !autoCompleteObjectField.getInput().equals(autoCompleteObjectField.getModelObject().getNameAsString());
     }
 
     private ConfirmerAjaxSubmitLink createSubmitLink(final IModel<Match> matchModel, final Component feedbackPanel, final Match.Status status,
@@ -81,7 +85,7 @@ public class ManualMatchPanel extends Panel {
                     matchModel.getObject().setSupervisor(autoCompleteObjectField.getModelObject() != null ? autoCompleteObjectField.getModelObject():null);
                     matchModel.getObject().setStatus(status);
                     matchDao.changeStatus(SciProSession.get().getUser(), matchModel.getObject(), null);
-                    Session.get().info(createMatchMessage(createNameAndEmail(autoCompleteObjectField.getModelObject()), matchModel.getObject().getProjectIdea().getTitle(), status));
+                    Session.get().info(createMatchMessage(autoCompleteObjectField.getModelObject(), matchModel.getObject().getProjectIdea().getTitle(), status));
                     setResponsePage(AdminManageProjectIdeaPage.class);
                     target.addComponent(feedbackPanel);
                 }
@@ -197,19 +201,14 @@ public class ManualMatchPanel extends Panel {
             private static final long serialVersionUID = 7734889540424308421L;
             @Override
             public void action(AjaxRequestTarget pTarget, Employee newSelection) {
-//                these checks have already been performed when action is called
-//                if (newSelection != null) {
-//                    if (pTarget != null) {
-                        final String declineMessage = createDeclineMessage(newSelection, projectIdea, status);
-                        if(declineMessage != null && !declineMessage.isEmpty()) {
-                            saveButton.setMessageContentHTML(declineMessage);
-                            pTarget.addComponent(saveButton);
-                        } else {
-                            saveButton.setMessageContentHTML(createConfirmationMessage(newSelection, status));
-                            pTarget.addComponent(saveButton);
-                        }
-//                    }
-//                }
+                final String declineMessage = createDeclineMessage(newSelection, projectIdea, status);
+                if(declineMessage != null && !declineMessage.isEmpty()) {
+                    saveButton.setMessageContentHTML(declineMessage);
+                    pTarget.addComponent(saveButton);
+                } else {
+                    saveButton.setMessageContentHTML(createConfirmationMessage(newSelection, status));
+                    pTarget.addComponent(saveButton);
+                }
             }
         };
     }
@@ -217,20 +216,20 @@ public class ManualMatchPanel extends Panel {
     /**
      *
      * This method is used to return a match message that the employee was matched or suggested to supervise the project idea .
-     * @param nameAndEmail  the name and email of the employee
+     * @param employee  the employee that is confirmed or suggested to supervise
      * @param projectIdeaTitle  the title of the project idea
      * @param status the status of the match
      * @return  String the match message
      */
-    private String createMatchMessage(final String nameAndEmail, final String projectIdeaTitle, Match.Status status) {
+    private String createMatchMessage(final Employee employee, final String projectIdeaTitle, Match.Status status) {
         StringBuilder messageStr = new StringBuilder();
-        messageStr.append(nameAndEmail != null ? nameAndEmail : "" );
+        messageStr.append(createNameAndEmailOutput(employee));
         if(status.equals(Match.Status.CONFIRMED)) {
             messageStr.append(" was accepted ");
         } else if (status.equals(Match.Status.PUBLISHED)) {
             messageStr.append(" was suggested ");
         }
-        messageStr.append("as supervisor to The project idea ");
+        messageStr.append("as supervisor for The project idea ");
         messageStr.append(projectIdeaTitle != null ? projectIdeaTitle : "");
         messageStr.append(".");
         return messageStr.toString();
@@ -250,7 +249,7 @@ public class ManualMatchPanel extends Panel {
             StringBuilder stringBuilder = new StringBuilder();
             if(declineMessage != null && !declineMessage.isEmpty()) {
                 stringBuilder.append("The project idea has already been rejected by ");
-                stringBuilder.append(createNameAndEmail(supervisor));
+                stringBuilder.append(createNameAndEmailAutoComplete(supervisor));
                 stringBuilder.append(". The decline message was: '");
                 stringBuilder.append(declineMessage);
                 if(status.equals(Match.Status.CONFIRMED)) {
@@ -280,7 +279,7 @@ public class ManualMatchPanel extends Panel {
         } else if (status.equals(Match.Status.PUBLISHED)) {
             stringBuilder.append("suggest ");
         }
-        stringBuilder.append(createNameAndEmail(supervisor));
+        stringBuilder.append(createNameAndEmailAutoComplete(supervisor));
         stringBuilder.append(" as supervisor for the project idea.");
         return stringBuilder.toString();
     }
diff --git a/src/main/java/se/su/dsv/scipro/admin/panels/ManualSetReviewerPanel.java b/src/main/java/se/su/dsv/scipro/admin/panels/ManualSetReviewerPanel.java
index 2a23cb5f25..c5be6a0840 100644
--- a/src/main/java/se/su/dsv/scipro/admin/panels/ManualSetReviewerPanel.java
+++ b/src/main/java/se/su/dsv/scipro/admin/panels/ManualSetReviewerPanel.java
@@ -46,16 +46,20 @@ public class ManualSetReviewerPanel extends Panel {
         add(currentFragment);
     }
 
-
-    private String createNameAndEmail(EmployeeAutoComplete autoCompleteObjectField) {
-        return autoCompleteObjectField.getModelObject().getNameAsString() + " <" + autoCompleteObjectField.getModelObject().getEmailAsString()+">";
+    private String createNameAndEmailOutput(Employee employee) {
+        return employee.getNameAsString() + " <" + employee.getEmailAsString()+">";
     }
 
+    private String createNameAndEmailAutoComplete(Employee employee) {
+        return employee.getNameAsString() + " &lt;" + employee.getEmailAsString()+"&gt;";
+    }
+
+
     private boolean testACInputString(EmployeeAutoComplete autoCompleteObjectField) {
         return autoCompleteObjectField.getModelObject() == null ||
                 autoCompleteObjectField.getInput() == null ||
                 autoCompleteObjectField.getInput().isEmpty() ||
-                !autoCompleteObjectField.getInput().equals(createNameAndEmail(autoCompleteObjectField));
+                !autoCompleteObjectField.getInput().equals(autoCompleteObjectField.getModelObject().getNameAsString());
     }
 
     private ConfirmerAjaxSubmitLink createSubmitLink(final IModel<ProjectIdea> projectIdeaModel, final Component feedbackPanel,
@@ -73,7 +77,7 @@ public class ManualSetReviewerPanel extends Panel {
                     ProjectIdea projectIdea = projectIdeaModel.getObject();
                     projectIdea.setSuggestedReviewer(autocompleteReviewerField.getModelObject());
                     projectIdeaDao.save(projectIdea);
-                    Session.get().info(getInfoMessage(projectIdea.getTitle(), createNameAndEmail(autocompleteReviewerField)));
+                    Session.get().info(getInfoMessage(projectIdea.getTitle(), autocompleteReviewerField.getModelObject()));
                     setResponsePage(AdminManageProjectIdeaPage.class);
                     target.addComponent(feedbackPanel);
                 }
@@ -81,7 +85,7 @@ public class ManualSetReviewerPanel extends Panel {
 
             @Override    //Listener method invoked on form submit with errors
             protected void onError(AjaxRequestTarget target, Form<?> form) {
-                Session.get().error(getErrorMessage(projectIdeaModel.getObject().getTitle(), autocompleteReviewerField.getModelObject().getNameAsString()));
+                Session.get().error(getErrorMessage(projectIdeaModel.getObject().getTitle(), autocompleteReviewerField.getModelObject()));
                 super.onError(target, form);
                 setResponsePage(AdminManageProjectIdeaPage.class);
                 target.addComponent(feedbackPanel); // is only activated on "this"
@@ -165,13 +169,8 @@ public class ManualSetReviewerPanel extends Panel {
 
             @Override
             public void action(AjaxRequestTarget pTarget, Employee newSelection) {
-//                these checks have already been performed when action is called
-//                if (newSelection != null) {
-//                    if (pTarget != null) {
-                        saveButton.setMessageContentHTML(getConfirmMessage(newSelection.getNameAsString(), projectIdea.getTitle()));
-                        pTarget.addComponent(saveButton);
-//                    }
-//                }
+                saveButton.setMessageContentHTML(getConfirmMessage(newSelection));
+                pTarget.addComponent(saveButton);
             }
         };
     }
@@ -179,31 +178,30 @@ public class ManualSetReviewerPanel extends Panel {
     /**
      *
      * This method is used to return an confirmation message (is shown in a confirmation dialog)
-     * to the administrator, that the employee really should be suggested as a reviewer for the project idea.
-     * @param projectIdeaTitle  the title of the project idea
-     * @param reviewerName  the name of the suggested reviewer
+     * to the administrator, that the employee really should be suggested as reviewer for the project idea.
+     * @param reviewer  the suggested reviewer
      * @return  String the confirmation message
      */
-    private String getConfirmMessage(final String reviewerName, final String projectIdeaTitle) {
+    private String getConfirmMessage(final Employee reviewer) {
         StringBuilder stringBuilder = new StringBuilder();
         stringBuilder.append("Confirm that you want to suggest ");
-        stringBuilder.append(reviewerName);
-        stringBuilder.append(" as a reviewer for the project idea.");
+        stringBuilder.append(createNameAndEmailAutoComplete(reviewer));
+        stringBuilder.append(" as reviewer for the project idea.");
         return stringBuilder.toString();
     }
 
 
     /**
      *
-     * This method is used to return an information message that the employee was suggested as a reviewer for the project idea.
+     * This method is used to return an information message that the employee was suggested as reviewer for the project idea.
      * @param projectIdeaTitle  the title of the project idea
-     * @param reviewerName  the name of the suggested reviewer
+     * @param reviewer  the suggested reviewer
      * @return  String the information message
      */
-    private String getInfoMessage(final String projectIdeaTitle, final String reviewerName) {
+    private String getInfoMessage(final String projectIdeaTitle, final Employee reviewer) {
         StringBuilder stringBuilder = new StringBuilder();
-        stringBuilder.append(reviewerName);
-        stringBuilder.append(" was suggested reviewer for the project idea ");
+        stringBuilder.append(createNameAndEmailOutput(reviewer));
+        stringBuilder.append(" was suggested as reviewer for the project idea ");
         stringBuilder.append(projectIdeaTitle);
         stringBuilder.append(".");
         return stringBuilder.toString();
@@ -213,13 +211,13 @@ public class ManualSetReviewerPanel extends Panel {
      *
      * This method is used to return an error message which is shown in case of an unforeseen error.
      * @param projectIdeaTitle  the title of the project idea
-     * @param reviewerName  the name of the presumed reviewer
+     * @param reviewer  the presumed reviewer
      * @return  String the error message
      */
-    private String getErrorMessage(String projectIdeaTitle, String reviewerName) {
+    private String getErrorMessage(final String projectIdeaTitle, final Employee reviewer) {
         StringBuilder stringBuilder = new StringBuilder();
         stringBuilder.append("An error occurred when suggesting ");
-        stringBuilder.append(reviewerName);
+        stringBuilder.append(createNameAndEmailAutoComplete(reviewer));
         stringBuilder.append(" as reviewer for the project idea ");
         stringBuilder.append(projectIdeaTitle);
         stringBuilder.append(".");
diff --git a/src/main/java/se/su/dsv/scipro/admin/panels/match/AdminSupervisorKeywordPanel.html b/src/main/java/se/su/dsv/scipro/admin/panels/match/AdminSupervisorKeywordPanel.html
index 68e12de8a0..2167576974 100644
--- a/src/main/java/se/su/dsv/scipro/admin/panels/match/AdminSupervisorKeywordPanel.html
+++ b/src/main/java/se/su/dsv/scipro/admin/panels/match/AdminSupervisorKeywordPanel.html
@@ -18,7 +18,11 @@
 		<table wicket:id="table" class="rounded-corner">
 		<thead>
 			<tr>
-			<th class="rounded-left-top"><a href="#" wicket:id="nameSortLink">Name</a></th><th>Research Areas</th><th class="rounded-right-top">Regular keywords</th>
+			    <th class="rounded-left-top"><a href="#" wicket:id="nameSortLink">Name</a></th>
+                <th>Research Areas</th>
+                <th class="rounded-right-top">
+                    <a href="#" wicket:id="numberOfRegularsSortLink">Regular keywords</a>
+                </th>
 			</tr>
 		</thead>
 		<tbody>
diff --git a/src/main/java/se/su/dsv/scipro/admin/panels/match/AdminSupervisorKeywordPanel.java b/src/main/java/se/su/dsv/scipro/admin/panels/match/AdminSupervisorKeywordPanel.java
index ef005486bf..51ad32555a 100644
--- a/src/main/java/se/su/dsv/scipro/admin/panels/match/AdminSupervisorKeywordPanel.java
+++ b/src/main/java/se/su/dsv/scipro/admin/panels/match/AdminSupervisorKeywordPanel.java
@@ -1,7 +1,6 @@
 package se.su.dsv.scipro.admin.panels.match;
 
 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;
@@ -9,21 +8,22 @@ 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.TextField;
+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.markup.repeater.Item;
-import org.apache.wicket.markup.repeater.data.DataView;
+import org.apache.wicket.model.LoadableDetachableModel;
 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.data.dao.interfaces.Dao.SortableParams.Sort;
 import se.su.dsv.scipro.data.dataobjects.Employee;
-import se.su.dsv.scipro.dataproviders.QueryableDataProvider;
 import se.su.dsv.scipro.match.dao.interfaces.KeywordTypeDao;
 import se.su.dsv.scipro.match.dao.interfaces.SupervisorDao;
 import se.su.dsv.scipro.match.dao.interfaces.SupervisorDaoParams;
 import se.su.dsv.scipro.match.dataobject.Keyword;
+import se.su.dsv.scipro.springdata.services.SupervisorService;
 
 public class AdminSupervisorKeywordPanel extends Panel {
 
@@ -32,6 +32,9 @@ public class AdminSupervisorKeywordPanel extends Panel {
     @SpringBean
 	private SupervisorDao supervisorDao;
 
+    @SpringBean
+    private SupervisorService supervisorService;
+
 	public AdminSupervisorKeywordPanel(String str) {
 		super(str);
         Dialog dialog = new Dialog("detailsDialog");
@@ -39,10 +42,12 @@ public class AdminSupervisorKeywordPanel extends Panel {
         WebMarkupContainer tableContainer = new WebMarkupContainer("table");
         SupervisorDaoParams params =  new SupervisorDaoParams();
         params.setSortOn("user.lastName", Sort.ASCENDING);
+        params.setSortOn("keywords.size()", Sort.ASCENDING);
         TextField<String> supervisorField = new TextField<String>("supervisorField", new Model<String>());
 		setUpTable(dialog, tableContainer, params);
 		setUpFiltering(tableContainer, params, supervisorField);
-	}
+//addSortLink("numberOfRegulars", "keywords.size()", tableContainer, params);
+    }
 
 	private void setUpFiltering(WebMarkupContainer tableContainer, SupervisorDaoParams params, TextField<String> supervisorField) {
 		FilterForm form = new FilterForm(tableContainer, params, supervisorField);
@@ -58,15 +63,46 @@ public class AdminSupervisorKeywordPanel extends Panel {
 		dialog.add(new EmptyPanel("dialogContent"));
 		add(dialog.setOutputMarkupId(true));
 	}
+
+    private void addSortLink(String markup, final String sortField, final WebMarkupContainer allContainer, final SupervisorDaoParams params) {
+        final AjaxLink<Void> sortLink = new AjaxLink<Void>(markup + "SortLink") {
+
+            private static final long serialVersionUID = -8463105615994034854L;
+
+            @Override
+            public void onClick(AjaxRequestTarget target) {
+                if (params.getDirection().equals(Sort.ASCENDING)) {
+                    params.setSortOn(sortField, Sort.DESCENDING);
+                } else {
+                    params.setSortOn(sortField, Sort.ASCENDING);
+                }
+                target.addComponent(allContainer);
+            }
+        };
+        allContainer.add(sortLink);
+    }
 	
 	private void setUpTable(final Dialog dialog, final WebMarkupContainer tableContainer, final SupervisorDaoParams params) {
-        QueryableDataProvider<Employee, SupervisorDaoParams> provider = new QueryableDataProvider<Employee, SupervisorDaoParams>(supervisorDao, params);
-        DataView<Employee> dataView = new DataView<Employee>("supervisorList", provider, 1000) {
+        final StringBuffer definedSortOrder = new StringBuffer();
+        definedSortOrder.append("user.firstName");
+        final StringBuffer definedSortDirection = new StringBuffer();
+        definedSortDirection.append("ASC");
+
+
+
+        final ListView<Employee> dataView = new ListView<Employee>("supervisorList", new LoadableDetachableModel<List<Employee>>() {
+            private static final long serialVersionUID = -2395796971679213814L;
+
+            @Override
+            protected List<Employee> load() {
+                return supervisorService.findAllEmployees(new org.springframework.data.domain.Sort(definedSortOrder.toString()));
+            }
+        }) {
 
             private static final long serialVersionUID = 3572766096237883198L;
 
             @Override
-            protected void populateItem(Item<Employee> item) {
+            protected void populateItem(ListItem<Employee> item) {
                 final Employee supervisor = item.getModelObject();
                 List<Keyword> areaKeywords = supervisor.getKeywords().getFiltered(KeywordTypeDao.TYPE.RESEARCH_AREA.toDbName());
                 List<Keyword> regularKeywords = supervisor.getKeywords().getFiltered(KeywordTypeDao.TYPE.REGULAR.toDbName());
@@ -98,20 +134,40 @@ public class AdminSupervisorKeywordPanel extends Panel {
             }
         };
 		final AjaxLink<Void> nameSortLink = new AjaxLink<Void>("nameSortLink") {
-
 			private static final long serialVersionUID = -6459164267551936706L;
-
 			@Override
 			public void onClick(AjaxRequestTarget target) {
-				if(params.getDirection().equals(Sort.ASCENDING)) {
-					params.setSortOn("user.lastName", Sort.DESCENDING);
+                org.springframework.data.domain.Sort sortOrder;
+                if(definedSortDirection.toString().equals("ASC")) {
+                    sortOrder = new org.springframework.data.domain.Sort(org.springframework.data.domain.Sort.Direction.DESC, "user.lastName");
+                    definedSortDirection.delete(0, definedSortDirection.length()-1);
+                    definedSortDirection.append("DESC");
                 } else {
-					params.setSortOn("user.lastName", Sort.ASCENDING);
+                    sortOrder = new org.springframework.data.domain.Sort(org.springframework.data.domain.Sort.Direction.ASC, "user.lastName");
+                    definedSortDirection.delete(0, definedSortDirection.length()-1);
+                    definedSortDirection.append("ASC");
                 }
+                dataView.setDefaultModelObject(supervisorService.findAllEmployees(sortOrder));
 				target.addComponent(tableContainer);
 			}
 		};
 		tableContainer.add(nameSortLink);
+
+        final AjaxLink<Void> numberOfRegularsSortLink = new AjaxLink<Void>("numberOfRegularsSortLink") {
+
+            private static final long serialVersionUID = 5809993580126828318L;
+
+            @Override
+            public void onClick(AjaxRequestTarget target) {
+                if(params.getDirection().equals(Sort.ASCENDING)) {
+                    params.setSortOn("keywords.size", Sort.DESCENDING);
+                } else {
+                    params.setSortOn("keywords.size", Sort.ASCENDING);
+                }
+                target.addComponent(tableContainer);
+            }
+        };
+        tableContainer.add(numberOfRegularsSortLink);
 		tableContainer.add(dataView);
 		add(tableContainer.setOutputMarkupId(true));
 	}
diff --git a/src/main/java/se/su/dsv/scipro/reusable/AbstractRoleAutoCompleteComponent.java b/src/main/java/se/su/dsv/scipro/reusable/AbstractRoleAutoCompleteComponent.java
index b5bb7229e3..c630cc8612 100644
--- a/src/main/java/se/su/dsv/scipro/reusable/AbstractRoleAutoCompleteComponent.java
+++ b/src/main/java/se/su/dsv/scipro/reusable/AbstractRoleAutoCompleteComponent.java
@@ -47,7 +47,9 @@ public abstract class AbstractRoleAutoCompleteComponent<T extends Role> extends
 	@Override
 	protected Renderer<T> getListItemRenderer() {
 		return new Renderer<T>() {
-			@Override
+            private static final long serialVersionUID = -7256889096575950095L;
+
+            @Override
 			protected String getHeader(T item) {
 				return item.getNameAsString();
 			}
diff --git a/src/main/java/se/su/dsv/scipro/springdata/serviceimpls/SupervisorServiceImpl.java b/src/main/java/se/su/dsv/scipro/springdata/serviceimpls/SupervisorServiceImpl.java
index df56d6fb63..9041daecb2 100644
--- a/src/main/java/se/su/dsv/scipro/springdata/serviceimpls/SupervisorServiceImpl.java
+++ b/src/main/java/se/su/dsv/scipro/springdata/serviceimpls/SupervisorServiceImpl.java
@@ -27,8 +27,8 @@ public class SupervisorServiceImpl extends AbstractQueryService<Employee, Long>
     }
 
     @Override
-    public List<Employee> findAllEmployees() {
-        return supervisorRepo.findAll();
+    public List<Employee> findAllEmployees(org.springframework.data.domain.Sort orders) {
+        return supervisorRepo.findAll(orders);
     }
 
 }
diff --git a/src/main/java/se/su/dsv/scipro/springdata/services/SupervisorService.java b/src/main/java/se/su/dsv/scipro/springdata/services/SupervisorService.java
index 6189a4c8ba..439d9e1c97 100644
--- a/src/main/java/se/su/dsv/scipro/springdata/services/SupervisorService.java
+++ b/src/main/java/se/su/dsv/scipro/springdata/services/SupervisorService.java
@@ -8,5 +8,5 @@ import java.util.List;
  * date: 2012 03 26
  */
 public interface SupervisorService extends CrudService<Employee,Long>, QueryService<Employee, Long> {
-    public List<Employee> findAllEmployees();
+    public List<Employee> findAllEmployees(org.springframework.data.domain.Sort orders);
 }
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 8f0c06eed6..f2f28d8862 100644
--- a/src/main/java/se/su/dsv/scipro/workerthreads/MailEventWorker.java
+++ b/src/main/java/se/su/dsv/scipro/workerthreads/MailEventWorker.java
@@ -7,13 +7,12 @@ import java.util.Set;
 
 import javax.mail.Address;
 import javax.mail.MessagingException;
+import javax.mail.SendFailedException;
 
 import org.apache.log4j.Logger;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
-import com.sun.mail.smtp.SMTPSendFailedException;
-
 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.MailEvent;
@@ -65,7 +64,7 @@ public class MailEventWorker extends AbstractWorker {
 					replyToEmails[i] = u.getEmailAddress();
 					i++;
 				}
-
+				
 				if( generalSystemSettingsDao.getGeneralSystemSettingsInstance().isMailNotifications() ){ //If false, mail-events "vanish"
 					logger.debug("Sending mail notification to: "+recipients);
 					mail.mail(fromName, fromEmail, recipientsEmails, replyToEmails, subject, messageBody, false);
@@ -75,19 +74,26 @@ public class MailEventWorker extends AbstractWorker {
 
 				this.commitTransaction();
 
-			} catch(SMTPSendFailedException e){
+			} catch(SendFailedException e){
 				// We need to catch this exception for the use case when one or
 				// more of the recipients are invalid, to make sure we still
 				// send the mail to the valid recipients, and delete the mail
-				// event to prevent spamming.
+				// event to prevent spamming. 
+				logger.info("Could not send mail to all of the recipients, more info:");
+				if(e.getInvalidAddresses()!=null){
 				for(Address a : e.getInvalidAddresses()) {
 					logger.info("Message could not be sent to the following invalid address: "+a.toString());
+					}
 				}
+				if(e.getValidSentAddresses()!=null){
 				for(Address a : e.getValidSentAddresses()){
 					logger.info("Message have been sent to the following valid address: "+a.toString());				
 					}
+				}
+				if(e.getValidUnsentAddresses()!=null){
 				for(Address a : e.getValidUnsentAddresses()){
 					logger.info("Message have not been sent to the following valid address: "+a.toString());
+					}
 				}
 				mailEvent = mailEventDao.reLoad(mailEvent);
 				mailEventDao.delete(mailEvent);
diff --git a/src/test/java/se/su/dsv/scipro/springdata/TestSupervisor.java b/src/test/java/se/su/dsv/scipro/springdata/TestSupervisor.java
index fcc16afbf2..11b6ffa01f 100644
--- a/src/test/java/se/su/dsv/scipro/springdata/TestSupervisor.java
+++ b/src/test/java/se/su/dsv/scipro/springdata/TestSupervisor.java
@@ -5,15 +5,19 @@ import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Sort;
 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.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;
+import se.su.dsv.scipro.match.Weights;
+import se.su.dsv.scipro.match.dao.interfaces.KeywordDao;
+import se.su.dsv.scipro.match.dao.interfaces.KeywordTypeDao;
+import se.su.dsv.scipro.match.dataobject.Keyword;
+import se.su.dsv.scipro.match.dataobject.KeywordType;
 import se.su.dsv.scipro.springdata.services.SupervisorService;
 
 import java.util.ArrayList;
@@ -24,6 +28,7 @@ import static org.junit.Assert.*;
 @ContextConfiguration(inheritLocations = false, locations = {
         "classpath:test-applicationContext.xml"
 })
+
 public class TestSupervisor {
 
     @Autowired
@@ -32,11 +37,57 @@ public class TestSupervisor {
     @Autowired
     private UserDao userDao;
 
+    @Autowired
+    private KeywordDao keywordDao;
+
+    @Autowired
+    private KeywordTypeDao keywordTypeDao;
+
+    private KeywordType keywordTypeArea;
+    private KeywordType keywordTypeWord;
+    private Weights weights;
+
     @SuppressWarnings("EmptyMethod")
     @Before
     public void startTransaction() throws Exception {
+        keywordTypeArea = keywordTypeDao.save(new KeywordType("Area"));
+        keywordTypeWord = keywordTypeDao.save(new KeywordType("Word"));
+        weights = createWeights();
     }
 
+    private Weights createWeights() {
+        Weights weights = new Weights();
+        weights.setKeywordPoints(3);                // "Word" + "Unit"??
+        weights.setResearchAreaPoints(5);          // "Area"
+        weights.setPreferredSupervisorPoints(10);
+        return weights;
+    }
+
+    private Employee getEmployee(final String firstName, final String lastName, final String email) {
+        User user = new User();
+        user.setFirstName(firstName);
+        user.setLastName(lastName);
+        user.setEmailAddress(email);
+        user = userDao.save(user);
+        assertNotNull(user);
+        Employee employee = new Employee();
+        employee.setUser(user);
+        return supervisorService.save(employee);
+    }
+
+
+    private Keyword createKeyword(final KeywordType keyWordType , final String keyWordName, final boolean deleted) {
+        Keyword keyword = keywordDao.getKeywordByNameAndType(keyWordName, keyWordType);
+        if(keyword == null)  {
+            keyword = new Keyword();
+            keyword.setType(keyWordType);
+            keyword.setKeyword(keyWordName);
+            keyword.setDeleted(deleted);
+            return keywordDao.save(keyword);
+        } else {
+            return keyword;
+        }
+    }
 
     /**
      *   Test for implementing a supervisorService with Spring Data
@@ -44,18 +95,69 @@ public class TestSupervisor {
     @Test
     @Transactional
     @Rollback
-    public void findAllSupervisorsWithSpringData() {
+    public void findSupervisorLastName() {
         List<Employee> employeeList = new ArrayList<Employee>();
-        User davidH = new User();
-        davidH.setFirstName("David");
-        davidH.setLastName("Hallberg");
-        davidH.setEmailAddress("dhallb@dsv.su.se");
-        davidH = userDao.save(davidH);
+        Employee larsson = getEmployee("Ken", "Larsson", "kenlars@dsv.su.se");
+        Employee hallberg = getEmployee("David", "Hallberg", "dhallb@dsv.su.se");
+        Employee tholerus = getEmployee("Torgny", "Tholerus", "torgny@dsv.su.se");
+        Employee moattar = getEmployee("Golrokh", "Moattar", "goli@dsv.su.se");
+        Employee friis = getEmployee("Fredrik", "Friis", "fre-fri@dsv.su.se");
+        Employee herder = getEmployee("Niklas", "Herder", "herder@dsv.su.se");
+        Sort sortOrder = new Sort("user.lastName");
+        employeeList.addAll(supervisorService.findAllEmployees(sortOrder));
+        assertFalse(employeeList.isEmpty());
+        assertTrue(employeeList.get(0).equals(friis));
+        assertTrue(employeeList.get(5).equals(tholerus));
+    }
 
-        Employee supervisor = new Employee();
-        supervisor.setUser(davidH);
-        supervisorService.save(supervisor);
-       // employeeList.addAll(supervisorService.findAllEmployees());
-       // assertTrue(employeeList.size() == 1);
+    /**
+     *   Test for implementing a supervisorService with Spring Data
+     */
+    @Test
+    @Transactional
+    @Rollback
+    public void findSupervisorFirstName() {
+        List<Employee> employeeList = new ArrayList<Employee>();
+        Employee larsson = getEmployee("Ken", "Larsson", "kenlars@dsv.su.se");
+        Employee hallberg = getEmployee("David", "Hallberg", "dhallb@dsv.su.se");
+        Employee tholerus = getEmployee("Torgny", "Tholerus", "torgny@dsv.su.se");
+        Employee moattar = getEmployee("Golrokh", "Moattar", "goli@dsv.su.se");
+        Employee friis = getEmployee("Fredrik", "Friis", "fre-fri@dsv.su.se");
+        Employee herder = getEmployee("Niklas", "Herder", "herder@dsv.su.se");
+        Sort sortOrder = new Sort("user.firstName");
+        employeeList.addAll(supervisorService.findAllEmployees(sortOrder));
+        assertFalse(employeeList.isEmpty());
+        assertTrue(employeeList.get(0).equals(hallberg));
+        assertTrue(employeeList.get(5).equals(tholerus));
+    }
+
+    /**
+     *   Test for implementing a supervisorService with Spring Data
+     */
+    @Test
+    @Transactional
+    @Rollback
+    public void findSupervisorKeywords() {
+        List<Employee> employeeList = new ArrayList<Employee>();
+        Employee larsson = getEmployee("Ken", "Larsson", "kenlars@dsv.su.se");
+        Employee hallberg = getEmployee("David", "Hallberg", "dhallb@dsv.su.se");
+        Employee tholerus = getEmployee("Torgny", "Tholerus", "torgny@dsv.su.se");
+        Employee herder = getEmployee("Niklas", "Herder", "herder@dsv.su.se");
+        Employee moattar = getEmployee("Golrokh", "Moattar", "goli@dsv.su.se");
+        Employee friis = getEmployee("Fredrik", "Friis", "fre-fri@dsv.su.se");
+
+
+
+        Keyword keyword = createKeyword(keywordTypeWord, "JUnit", false);
+        herder.getKeywords().getAll().add(keyword);
+        keyword = createKeyword(keywordTypeWord, "Maven", false);
+        herder.getKeywords().getAll().add(keyword);
+        herder =  supervisorService.save(herder);
+
+      /*  Sort sortOrder = new Sort("keywords.getAll().size");
+        employeeList.addAll(supervisorService.findAllEmployees(sortOrder));
+        assertFalse(employeeList.isEmpty());
+        assertTrue(employeeList.get(0).equals(herder));*/
+//assertTrue(employeeList.get(5).equals(tholerus));
     }
 }