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 ac6e6dcaf6..e6084cef8d 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
@@ -10,10 +10,11 @@
 		This page contains a list of all supervisors with number of research areas and keywords attached to them. 
 		You may filter the list by searching for name of supervisor. Click on the supervisors name to see which research areas and keywords that is attached.
 		</div>
-		<form wicket:id="filterForm">
-		<label for="supervisorField">Filter using supervisor name:</label><br />
-		<input style="width:300px;" wicket:id="supervisorField" type="text" />
-		<input type="submit" wicket:id="filterButton" value="Filter"/>
+
+		<label for="autoComplete">Filter using supervisor name:</label><br />
+        <input wicket:id="autoComplete" /><br />
+        <form wicket:id="showAllForm">
+            <div><button wicket:id="showAllButton">Show all</button></div>
 		</form>
 		<table wicket:id="table" class="rounded-corner">
 		<thead>
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 b0e6d70a1e..627c8aff10 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
@@ -9,21 +9,21 @@ 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.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.model.LoadableDetachableModel;
-import org.apache.wicket.model.Model;
 import org.apache.wicket.spring.injection.annot.SpringBean;
 import org.odlabs.wiquery.ui.dialog.Dialog;
 
+import org.springframework.data.domain.Sort;
 import se.su.dsv.scipro.data.dataobjects.Employee;
 import se.su.dsv.scipro.match.dao.interfaces.KeywordTypeDao;
 import se.su.dsv.scipro.match.dao.interfaces.SupervisorDao;
 import se.su.dsv.scipro.match.dataobject.Keyword;
 import se.su.dsv.scipro.match.dataobject.KeywordType;
+import se.su.dsv.scipro.reusable.EmployeeAutoComplete;
 import se.su.dsv.scipro.springdata.services.SupervisorService;
 
 public class AdminSupervisorKeywordPanel extends Panel {
@@ -31,7 +31,7 @@ public class AdminSupervisorKeywordPanel extends Panel {
     private static final long serialVersionUID = -6390936928562430893L;
 
     @SpringBean
-	private SupervisorDao supervisorDao;
+    private SupervisorDao supervisorDao;
 
     @SpringBean
     private SupervisorService supervisorService;
@@ -39,57 +39,60 @@ public class AdminSupervisorKeywordPanel extends Panel {
     @SpringBean
     private KeywordTypeDao keywordTypeDao;
 
-	public AdminSupervisorKeywordPanel(String str) {
-		super(str);
+    public AdminSupervisorKeywordPanel(String str) {
+        super(str);
         Dialog dialog = new Dialog("detailsDialog");
         setUpDialog(dialog);
-        WebMarkupContainer tableContainer = new WebMarkupContainer("table");
-        TextField<String> supervisorField = new TextField<String>("supervisorField", new Model<String>());
-        StringBuffer supervisorName = new StringBuffer();
-        add(new FilterForm(tableContainer, supervisorField, supervisorName));
-        setUpTable(dialog, tableContainer, supervisorName);
+        final WebMarkupContainer tableContainer = new WebMarkupContainer("table");
+        final EmployeeAutoComplete autoCompleteObjectField = createDsvAutocompleteComponent(tableContainer);
+        add(autoCompleteObjectField.setOutputMarkupId(true));
+        add(new Form<Void>("showAllForm").add(createShowAllButton(tableContainer, autoCompleteObjectField)));
+        setUpTable(dialog, tableContainer, autoCompleteObjectField);
     }
 
-	private void setUpDialog(Dialog dialog) {
-		dialog.setModal(true);
-		dialog.setAutoOpen(false);
-		dialog.setWidth(500);
-		dialog.setHeight(400);
-		dialog.setTitle("Supervisor details");
-		dialog.add(new EmptyPanel("dialogContent"));
-		add(dialog.setOutputMarkupId(true));
-	}
+    private EmployeeAutoComplete createDsvAutocompleteComponent(final WebMarkupContainer tableContainer) {
+        return new EmployeeAutoComplete("autoComplete") {
+            private static final long serialVersionUID = 8758471618644888953L;
 
-    private void getSortOrder(StringBuffer sortDirection, StringBuffer orderBy__, String orderBy, final StringBuffer supervisorName) {
-if(!supervisorName.toString().isEmpty()) {
-    String addToSearch = "true";
-}
-        if ((sortDirection.toString().isEmpty() && !orderBy.equals("keywords.all.size")) || sortDirection.toString().equalsIgnoreCase("asc")) {
-            sortDirection.delete(0, sortDirection.length());
-            sortDirection.append("desc");
-        } else {
-            sortDirection.delete(0, sortDirection.length());
-            sortDirection.append("asc");
-        }
-        orderBy__.delete(0, orderBy__.length());
-        orderBy__.append(orderBy);
-    }
-
-
-    private List<Employee> addEmployeesToList(final StringBuffer supervisorName, List<Employee> employeeList) {
-        List<Employee> employeeListName = new ArrayList<Employee>();
-        for(Employee employee : employeeList) {
-            if(employee.getNameAsString().equals(supervisorName.toString())) {
-                employeeListName.add(employee);
+            @Override
+            public void action(AjaxRequestTarget pTarget, Employee newSelection) {
+                pTarget.addComponent(tableContainer);
             }
-        }
-        if(!employeeListName.isEmpty()) {
-            return employeeListName;
-        }
-        return employeeList;
+        };
     }
 
-    private void loadEmployeeList(List<Employee> employeeList, StringBuffer orderBy, StringBuffer sortDirection) {
+    private AjaxButton createShowAllButton(final WebMarkupContainer tableContainer, final EmployeeAutoComplete autoCompleteObjectField) {
+        return new AjaxButton("showAllButton") { //button to click for performing overriden method
+            private static final long serialVersionUID = 1L;
+            @Override
+            protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
+                List<Employee> employeeList = new ArrayList<Employee>();
+                employeeList.addAll(supervisorService.findAllEmployees(new Sort(Sort.Direction.ASC, "user.lastName")));
+                tableContainer.get("supervisorList").setDefaultModelObject(employeeList);
+                autoCompleteObjectField.setDefaultModelObject(null);
+                autoCompleteObjectField.clearInput();
+                target.addComponent(tableContainer);
+                target.addComponent(autoCompleteObjectField);
+            }
+        };
+    }
+
+    private void setUpDialog(Dialog dialog) {
+        dialog.setModal(true);
+        dialog.setAutoOpen(false);
+        dialog.setWidth(500);
+        dialog.setHeight(400);
+        dialog.setTitle("Supervisor details");
+        dialog.add(new EmptyPanel("dialogContent"));
+        add(dialog.setOutputMarkupId(true));
+    }
+
+    private void changeOrderBy(StringBuffer orderBy, String newOrderBy) {
+        orderBy.delete(0, orderBy.length());
+        orderBy.append(newOrderBy);
+    }
+
+    private void loadEmployeeList(List<Employee> employeeList, StringBuffer orderBy, StringBuffer sortDirection, StringBuffer previousOrderBy) {
         KeywordType keywordType = keywordTypeDao.findByType(KeywordTypeDao.TYPE.REGULAR);
         if(orderBy.toString().equals("keywords.all.size")) {
             keywordType = keywordTypeDao.findByType(KeywordTypeDao.TYPE.REGULAR);
@@ -97,24 +100,46 @@ if(!supervisorName.toString().isEmpty()) {
             keywordType = keywordTypeDao.findByType(KeywordTypeDao.TYPE.RESEARCH_AREA);
         }
 
+        if(!orderBy.toString().equalsIgnoreCase(previousOrderBy.toString())) {  // the direction should always be desc for numbers when there is a new sort term
+            sortDirection.delete(0, sortDirection.length());
+            sortDirection.append("desc");
+        }
+
         if(sortDirection.toString().equalsIgnoreCase("asc")) {
-            for(Employee employee : supervisorService.findSupervisorDescDirection(keywordType.getName())) {
+            for(Employee employee : supervisorService.findSupervisorBySQL(keywordType.getName(), "asc")) {
                 if(!employeeList.contains(employee)) {
                     employeeList.add(employee);
                 }
             }
-        } else {
-            for(Employee employee : supervisorService.findSupervisorDescDirection(keywordType.getName())) {
+        } else if(sortDirection.toString().equalsIgnoreCase("desc")) {
+            for(Employee employee : supervisorService.findSupervisorBySQL(keywordType.getName(), "desc")) {
                 if(!employeeList.contains(employee)) {
                     employeeList.add(employee);
                 }
             }
         }
+        changePreviousOrderBy(previousOrderBy, orderBy);
+        if(sortDirection.toString().equalsIgnoreCase("asc")) {
+            changeSortDirection(sortDirection, "desc");
+        } else if(sortDirection.toString().equalsIgnoreCase("desc")) {
+            changeSortDirection(sortDirection, "asc");
+        }
     }
 
-	private void setUpTable(final Dialog dialog, final WebMarkupContainer tableContainer, final StringBuffer supervisorName) {
+    private void changeSortDirection(StringBuffer sortDirection, String direction) {
+        sortDirection.delete(0, sortDirection.length());
+        sortDirection.append(direction);
+    }
+
+    private void changePreviousOrderBy(StringBuffer previousOrderBy, StringBuffer orderBy) {
+        previousOrderBy.delete(0, previousOrderBy.length());
+        previousOrderBy.append(orderBy.toString());
+    }
+
+    private void setUpTable(final Dialog dialog, final WebMarkupContainer tableContainer, final EmployeeAutoComplete autoCompleteObjectField) {
         final StringBuffer sortDirection = new StringBuffer();
         final StringBuffer orderBy = new StringBuffer();
+        final StringBuffer previousOrderBy = new StringBuffer();
 
         final ListView<Employee> dataView = new ListView<Employee>("supervisorList", new LoadableDetachableModel<List<Employee>>() {
             private static final long serialVersionUID = -2395796971679213814L;
@@ -122,25 +147,28 @@ if(!supervisorName.toString().isEmpty()) {
             @Override
             protected List<Employee> load() {
                 List<Employee> employeeList = new ArrayList<Employee>();
-                if(!orderBy.toString().equals("areas.all.size") && !orderBy.toString().equals("keywords.all.size")) {
-                    org.springframework.data.domain.Sort sorter;
-                    if (sortDirection.toString().isEmpty() || sortDirection.toString().equalsIgnoreCase("asc")) {
-                        sorter = new org.springframework.data.domain.Sort(org.springframework.data.domain.Sort.Direction.ASC, "user.lastName");
-                        employeeList.addAll(supervisorService.findAllEmployees(sorter));
-                    } else {
-                        sorter = new org.springframework.data.domain.Sort(org.springframework.data.domain.Sort.Direction.DESC, "user.lastName");
-                        employeeList.addAll(supervisorService.findAllEmployees(sorter));
-                    }
-                } else {
-                    loadEmployeeList(employeeList, orderBy, sortDirection);
-                }
-                if(supervisorName.toString().isEmpty()) {
+                if(autoCompleteObjectField.getDefaultModelObject() != null) {
+                    employeeList.add((Employee) autoCompleteObjectField.getDefaultModelObject());
                     return employeeList;
+                } else if (orderBy.toString().isEmpty()) {
+                    employeeList.addAll(supervisorService.findAllEmployees(new Sort(Sort.Direction.ASC, "user.lastName")));   // the direction should always be asc for characters when there is a new sort term
+                    changeSortDirection(sortDirection, "desc");
+                    previousOrderBy.append("user.lastName");
+                } else if (orderBy.toString().equals("user.lastName")) {        // if there has been a previous search and the search term was different than the present search term or direction should be asc
+                    if((!previousOrderBy.toString().isEmpty() && !previousOrderBy.toString().equals(orderBy.toString())) || sortDirection.toString().equalsIgnoreCase("asc")) {
+                        employeeList.addAll(supervisorService.findAllEmployees(new Sort(Sort.Direction.ASC, "user.lastName")));
+                        changeSortDirection(sortDirection, "desc");
+                    } else if(sortDirection.toString().equalsIgnoreCase("desc")){
+                        employeeList.addAll(supervisorService.findAllEmployees(new Sort(Sort.Direction.DESC, "user.lastName")));
+                        changeSortDirection(sortDirection, "asc");
+                    }
+                    changePreviousOrderBy(previousOrderBy, orderBy);
+                } else {
+                    loadEmployeeList(employeeList, orderBy, sortDirection, previousOrderBy);
                 }
-                return addEmployeesToList(supervisorName, employeeList);
+                return employeeList;
             }
         }) {
-
             private static final long serialVersionUID = 3572766096237883198L;
 
             @Override
@@ -149,9 +177,7 @@ if(!supervisorName.toString().isEmpty()) {
                 List<Keyword> areaKeywords = supervisor.getKeywords().getFiltered(KeywordTypeDao.TYPE.RESEARCH_AREA.toDbName());
                 List<Keyword> regularKeywords = supervisor.getKeywords().getFiltered(KeywordTypeDao.TYPE.REGULAR.toDbName());
                 final AjaxLink<Void> detailsLink = new AjaxLink<Void>("detailsLink") {
-
                     private static final long serialVersionUID = 8902222410746133732L;
-
                     @Override
                     public void onClick(AjaxRequestTarget target) {
                         target.addComponent(dialog);
@@ -172,15 +198,15 @@ if(!supervisorName.toString().isEmpty()) {
             }
         };
 
-		final AjaxLink<Void> nameSortLink = new AjaxLink<Void>("nameSortLink") {
-			private static final long serialVersionUID = -6459164267551936706L;
-			@Override
-			public void onClick(AjaxRequestTarget target) {
-                getSortOrder(sortDirection, orderBy, "user.lastName", supervisorName);
+        final AjaxLink<Void> nameSortLink = new AjaxLink<Void>("nameSortLink") {
+            private static final long serialVersionUID = -6459164267551936706L;
+            @Override
+            public void onClick(AjaxRequestTarget target) {
+                changeOrderBy(orderBy, "user.lastName");
                 target.addComponent(tableContainer);
-			}
-		};
-		tableContainer.add(nameSortLink);
+            }
+        };
+        tableContainer.add(nameSortLink);
 
         final AjaxLink<Void> numberOfAreasSortLink = new AjaxLink<Void>("numberOfAreasSortLink") {
 
@@ -188,7 +214,7 @@ if(!supervisorName.toString().isEmpty()) {
 
             @Override
             public void onClick(AjaxRequestTarget target) {
-                getSortOrder(sortDirection, orderBy, "areas.all.size", supervisorName);
+                changeOrderBy(orderBy, "areas.all.size");
                 target.addComponent(tableContainer);
             }
         };
@@ -200,35 +226,12 @@ if(!supervisorName.toString().isEmpty()) {
 
             @Override
             public void onClick(AjaxRequestTarget target) {
-                getSortOrder(sortDirection, orderBy, "keywords.all.size", supervisorName);
+                changeOrderBy(orderBy, "keywords.all.size");
                 target.addComponent(tableContainer);
             }
         };
         tableContainer.add(numberOfRegularsSortLink);
-		tableContainer.add(dataView);
-		add(tableContainer.setOutputMarkupId(true));
-	}
-	
-	private class FilterForm extends Form<Void> {
-
-		private static final long serialVersionUID = 3488715734113880308L;
-
-		public FilterForm(final WebMarkupContainer tableContainer, final TextField<String> supervisorField, final StringBuffer supervisorName) {
-			super("filterForm");
-			AjaxButton filterButton = new AjaxButton("filterButton") {
-
-				private static final long serialVersionUID = -8216928567709372986L;
-
-				@Override
-				protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
-                    supervisorName.append(supervisorField.getModelObject());
-					target.addComponent(tableContainer);
-				}
-			};
-			add(supervisorField);
-			add(filterButton);
-		}
-
-	}
-
+        tableContainer.add(dataView);
+        add(tableContainer.setOutputMarkupId(true));
+    }
 }
\ No newline at end of file
diff --git a/src/main/java/se/su/dsv/scipro/springdata/repos/SupervisorRepo.java b/src/main/java/se/su/dsv/scipro/springdata/repos/SupervisorRepo.java
index 6e9bc33484..d825066ddd 100644
--- a/src/main/java/se/su/dsv/scipro/springdata/repos/SupervisorRepo.java
+++ b/src/main/java/se/su/dsv/scipro/springdata/repos/SupervisorRepo.java
@@ -1,5 +1,6 @@
 package se.su.dsv.scipro.springdata.repos;
 
+import org.springframework.data.domain.Sort.Direction;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.Query;
 import org.springframework.data.querydsl.QueryDslPredicateExecutor;
@@ -15,13 +16,49 @@ import java.util.List;
  */
 @Transactional ( readOnly = true )
 public interface SupervisorRepo extends JpaRepository<Employee, Long>, QueryDslPredicateExecutor<Employee> {
+             // select employeeFull from Employee employeeFull where employeeFull.id in (
+	@Query ("select employee.id " +
+            "from Employee employee " +
+                "join employee.keywords.keywords keywords " +
+                "where keywords.type.name = :keywordTypeName " +
+			    "group by employee.id " +
+                "order by size(employee.keywords.keywords) desc ")
+	public List<Long> findSupervisorsOrderedByNumKeywordsDescending(
+            @Param("keywordTypeName")
+            String keywordTypeName);
 
-	@Query ( "select employee from Employee employee left outer join employee.keywords.keywords keywords " +
-					 "where (size(employee.keywords.keywords) = 0 or (keywords.type.name = :keywordTypeName and keywords.deleted = false)) " +
-					 "order by size(employee.keywords.keywords) desc, employee.user.lastName" )
-	public List<Employee> findSupervisorDescDirection(
-			@Param ( "keywordTypeName" )
-			String keywordTypeName);
+    // hämtar employees med keywords där typen är type name... men en employee kan ha keywords av flera olika type names
 
+    @Query ("select employee.id " +
+            "from Employee employee " +
+            "join employee.keywords.keywords keywords " +
+            "where keywords.type.name = :keywordTypeName " +
+            "group by employee.id " +
+            //"order by size(employee.keywords.keywords) asc ")
+            "order by size(employee.keywords.keywords) asc ")
+                      // sum(keywords.type.name = :keywordTypeName)
+    /*@Query ("select employeeFull from Employee employeeFull where employeeFull.id in (" +
+            "select employee.id from Employee employee inner join employee.keywords.keywords keywords " +
+            "where keywords.type.name = :keywordTypeName " + //and keywords.deleted = false and employee.deleted = false)) " +
+            "group by employee.id " +
+            "order by size(employeeFull.keywords.keywords) asc)")*/
+//"CASE ':ascending' WHEN 'true' THEN (size(employeeFull.keywords.keywords) asc " +
+//"ELSE size(employeeFull.keywords.keywords) desc END" +
+//"ELSE employeeFull.keywords.keywords.size desc " +
+//"END"
+    public List<Long> findSupervisorsOrderedByNumKeywordsAscending(
+            @Param("keywordTypeName")
+            String keywordTypeName);
+
+   /* public List<Employee> findSupervisorsOrderedByNumKeywords(String keywordTypeName, Boolean asc) {
+        switch (asc) {
+            case Direction.ASC:
+                return findSupervisorsOrderedByNumKeywordsAscending(keywordTypeName);
+            case Direction.DESC:
+            default:
+                return findSupervisorsOrderedByNumKeywordsAscending(keywordTypeName);
+        }
+        return findSupervisorsOrderedByNumKeywordsAscending(keywordTypeName);
+    }*/
 }
 
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 63fe970f87..e039f044f7 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
@@ -2,6 +2,7 @@ package se.su.dsv.scipro.springdata.serviceimpls;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.data.domain.Sort;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import se.su.dsv.scipro.data.dataobjects.Employee;
@@ -37,17 +38,55 @@ public class SupervisorServiceImpl extends AbstractQueryService<Employee, Long>
 
     @Override
     public List<Employee> findAllEmployees(org.springframework.data.domain.Sort orders) {
-        return supervisorRepo.findAll(orders);
+        return supervisorRepo.findAll(orders);            // 218 st
+    }
+
+   /* @Override
+    public List<Employee> findSupervisorsOrderedByNumKeywords(String keywordTypeName, Sort.Direction sortDirection) {
+        return supervisorRepo.findSupervisorsOrderedByNumKeywords(keywordTypeName, sortDirection);
+    }*/
+
+    @Override
+    public List<Employee> findSupervisorsOrderedByNumKeywordsDescending(String keywordTypeName) {
+        List<Long> employeeIDs = new ArrayList<Long>();
+        employeeIDs.addAll(supervisorRepo.findSupervisorsOrderedByNumKeywordsDescending(keywordTypeName));
+        return loadEmployeeList(employeeIDs);
     }
 
     @Override
-    public List<Employee> findSupervisorDescDirection(String keywordTypeName) {
-        return supervisorRepo.findSupervisorDescDirection(keywordTypeName);
+    public List<Employee> findSupervisorsOrderedByNumKeywordsAscending(String keywordTypeName) {
+        List<Long> employeeIDs = new ArrayList<Long>();
+        employeeIDs.addAll(supervisorRepo.findSupervisorsOrderedByNumKeywordsAscending(keywordTypeName));
+        return loadEmployeeList(employeeIDs);
+    }
+
+
+    private List<Employee> loadEmployeeList(List<Long> employeeIDs) {
+        List<Employee> employeeList = new ArrayList<Employee>();
+        for (Long employeeID : employeeIDs) {
+            Employee employee = (Employee) em.createQuery("from Employee employee where employee.id = " + employeeID).getResultList().get(0);
+            if(employee != null && !employeeList.contains(employee)) {
+                employeeList.add(employee);
+            }
+        }
+        return employeeList;
     }
 
     @Override
     public List<Employee> findSupervisorBySQL(String keywordTypeName, String direction) {
+        List<Employee> employeeList = new ArrayList<Employee>();
+        if(direction.equalsIgnoreCase("desc")) {
+            employeeList.addAll(getEmployeesThatHaveKeywords(keywordTypeName, direction));
+            employeeList.addAll(getEmployeesWithoutKeywords());
+        } else {
+            employeeList.addAll(getEmployeesWithoutKeywords());
+            employeeList.addAll(getEmployeesThatHaveKeywords(keywordTypeName, direction));
+        }
+        return employeeList;  // totalt 129 st för regular men 156 st för area och 218 för last name (vilken innehåller både keywords Area och Regular)
+    }
 
+    private List<Employee> getEmployeesThatHaveKeywords(String keywordTypeName, String direction) {
+        List<Employee> employeeList = new ArrayList<Employee>();
         String nativeSQL = "select " +
                                     "role.id " +
                             "from " +
@@ -66,23 +105,41 @@ public class SupervisorServiceImpl extends AbstractQueryService<Employee, Long>
                                     "role_id " +
                             "order by " +
                                     "count(keywords_id) " + direction + ", user.lastName asc ";
+        return runQueryAddToList(employeeList, nativeSQL);
+    }
 
+
+    private List<Employee> getEmployeesWithoutKeywords() {
+        List<Employee> employeeList = new ArrayList<Employee>();
+        String nativeSQL = "select  " +
+                                    "role.id " +
+                            "from  " +
+                                    "role role, " +
+                                    "user user " +
+                            "where " +
+                                    "role.rolename = 'Employee' and " +
+                                    "user.id = role.user_id and not exists " +
+                                    "(select " +
+                                            "1 " +
+                                     "from " +
+                                            "Employee_Keyword ek " +
+                                     "where " +
+                                            "ek.role_id = role.id)  " +
+                                      "order by  " +
+                                            "user.lastName asc ";
+        return runQueryAddToList(employeeList, nativeSQL);
+    }
+
+    private List<Employee> runQueryAddToList(List<Employee> employeeList, final String nativeSQL) {
         List<BigInteger> dBlist= new ArrayList<BigInteger>();
         //noinspection unchecked
         dBlist.addAll(em.createNativeQuery(nativeSQL).getResultList());
-
-        List<Long> employeeIDs  = new ArrayList<Long>();
         for (BigInteger number : dBlist) {
-            employeeIDs.add(number.longValue());
-        }
-
-        List<Employee> employeeList = new ArrayList<Employee>();
-        for(Long employeeID : employeeIDs) {
-            Employee employee = (Employee) em.createQuery("from Employee employee where employee.id = " + employeeID).getResultList().get(0);
+            Employee employee = (Employee) em.createQuery("from Employee employee where employee.id = " + number.longValue()).getResultList().get(0);
             if(employee != null && !employeeList.contains(employee)) {
                 employeeList.add(employee);
             }
         }
-        return employeeList;
+        return employeeList;        // 36 st   + 93 st
     }
 }
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 cffeb0e52e..1b732dc1e3 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
@@ -1,11 +1,13 @@
 package se.su.dsv.scipro.springdata.services;
 
 
+import org.springframework.data.domain.Sort;
 import se.su.dsv.scipro.data.dataobjects.Employee;
 import javax.persistence.EntityManager;
 import java.util.Date;
 import java.util.Iterator;
 import java.util.List;
+import org.springframework.data.domain.Sort.Direction;
 
 /**
  * fred-fri
@@ -14,7 +16,11 @@ import java.util.List;
 public interface SupervisorService extends CrudService<Employee,Long>, QueryService<Employee, Long> {
     public List<Employee> findAllEmployees(org.springframework.data.domain.Sort orders);
 
-    public List<Employee> findSupervisorDescDirection(String keywordTypeName);
+    public List<Employee> findSupervisorsOrderedByNumKeywordsDescending(String keywordTypeName);
+
+    public List<Employee> findSupervisorsOrderedByNumKeywordsAscending(String keywordTypeName);
+
+//    public List<Employee> findSupervisorsOrderedByNumKeywords(String keywordTypeName, Sort.Direction sortDirection);
 
     public List<Employee> findSupervisorBySQL(String keywordTypeName, String sortOrder);
 }
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 533fca0428..b5a9e7a842 100644
--- a/src/test/java/se/su/dsv/scipro/springdata/TestSupervisor.java
+++ b/src/test/java/se/su/dsv/scipro/springdata/TestSupervisor.java
@@ -140,7 +140,7 @@ public class TestSupervisor {
         createAndAddKeyword(larsson, keywordTypeArea, "Area2");
         createAndAddKeyword(larsson, keywordTypeArea, "Area3");
 
-        for(Employee employee : supervisorService.findSupervisorDescDirection(keywordTypeArea.getName())) {
+        for(Employee employee : supervisorService.findSupervisorsOrderedByNumKeywordsDescending(keywordTypeArea.getName())) {
             if(!employeeList.contains(employee)) {
                 employeeList.add(employee);
             }
@@ -186,4 +186,56 @@ public class TestSupervisor {
         assertTrue(employeeList.get(0).equals(herder));
         assertTrue(employeeList.get(1).equals(tholerus));*/
     }
+
+    @Test
+    @Transactional
+    @Rollback
+    public void testFindSupervisorsOrderedByNumKeywordsDescending() {
+        Employee tholerus = getEmployee("Torgny", "Tholerus", "torgny@dsv.su.se");
+        Employee vahlman = getEmployee("Tom", "Vahlman", "tom@dsv.su.se");
+        Employee gomes = getEmployee("Anton", "Gomes", "anton@dsv.su.se");
+
+        createAndAddKeyword(vahlman,  keywordTypeArea, "Information systems");
+        createAndAddKeyword(tholerus, keywordTypeArea, "IT for health");
+        createAndAddKeyword(tholerus, keywordTypeArea, "IT for learning");
+        createAndAddKeyword(gomes,    keywordTypeWord, "Online gaming communities");
+
+        List<Employee> employeeList = supervisorService.findSupervisorsOrderedByNumKeywordsDescending(KeywordTypeDao.TYPE.RESEARCH_AREA.toDbName());
+
+        assertFalse(employeeList.isEmpty());
+        assertTrue(employeeList.size() == 2);
+        assertFalse(employeeList.contains(gomes));
+        assertTrue(employeeList.get(0).equals(tholerus));
+
+        createAndAddKeyword(vahlman,  keywordTypeArea, "IT for health");
+        createAndAddKeyword(vahlman,  keywordTypeArea, "Aprikoskärnor");
+        employeeList = supervisorService.findSupervisorsOrderedByNumKeywordsDescending(KeywordTypeDao.TYPE.RESEARCH_AREA.toDbName());
+        assertTrue(employeeList.get(0).equals(vahlman));
+    }
+
+    @Test
+    @Transactional
+    @Rollback
+    public void testFindSupervisorsOrderedByNumKeywordsAscending() {
+        Employee tholerus = getEmployee("Torgny", "Tholerus", "torgny@dsv.su.se");
+        Employee vahlman = getEmployee("Tom", "Vahlman", "tom@dsv.su.se");
+        Employee gomes = getEmployee("Anton", "Gomes", "anton@dsv.su.se");
+
+        createAndAddKeyword(vahlman,  keywordTypeArea, "Information systems");
+        createAndAddKeyword(tholerus, keywordTypeArea, "IT for health");
+        createAndAddKeyword(tholerus, keywordTypeArea, "IT for learning");
+        createAndAddKeyword(gomes,    keywordTypeWord, "Online gaming communities");
+
+        List<Employee> employeeList = supervisorService.findSupervisorsOrderedByNumKeywordsAscending(KeywordTypeDao.TYPE.RESEARCH_AREA.toDbName());
+
+        assertFalse(employeeList.isEmpty());
+        assertTrue(employeeList.size() == 2);
+        assertFalse(employeeList.contains(gomes));
+        assertTrue(employeeList.get(1).equals(tholerus));
+
+        createAndAddKeyword(vahlman,  keywordTypeArea, "IT for health");
+        createAndAddKeyword(vahlman,  keywordTypeArea, "Aprikoskärnor");
+        employeeList = supervisorService.findSupervisorsOrderedByNumKeywordsAscending(KeywordTypeDao.TYPE.RESEARCH_AREA.toDbName());
+        assertTrue(employeeList.get(0).equals(tholerus));
+    }
 }