diff --git a/smash/web/tests/test_view_notifications.py b/smash/web/tests/test_view_notifications.py
index 2c9113fbafd1fbeb47656f7d4a9bc449defa07a1..f313714203b6abc9b5193a0ea4f0781f98a3029d 100644
--- a/smash/web/tests/test_view_notifications.py
+++ b/smash/web/tests/test_view_notifications.py
@@ -106,3 +106,46 @@ class NotificationViewTests(TestCase):
 
         notification = get_approaching_visits_without_appointments_count()
         self.assertEquals(original_notification.count + 1, notification.count)
+
+    def test_get_subject_with_no_visit_notifications_count(self):
+        original_notification = get_subject_with_no_visit_notifications_count()
+        subject = create_subject()
+
+        notification = get_subject_with_no_visit_notifications_count()
+        self.assertEquals(original_notification.count + 1, notification.count)
+
+    def test_get_subject_with_no_visit_notifications_count_2(self):
+        original_notification = get_subject_with_no_visit_notifications_count()
+        subject = create_subject()
+
+        visit = create_visit(subject)
+        visit.is_finished=True
+        visit.save()
+
+        notification = get_subject_with_no_visit_notifications_count()
+        self.assertEquals(original_notification.count + 1, notification.count)
+
+    def test_get_subject_with_no_visit_notifications_count_3(self):
+        original_notification = get_subject_with_no_visit_notifications_count()
+        subject = create_subject()
+
+        visit = create_visit(subject)
+
+        notification = get_subject_with_no_visit_notifications_count()
+        self.assertEquals(original_notification.count, notification.count)
+    def test_get_subject_with_no_visit_notifications_count_4(self):
+        original_notification = get_subject_with_no_visit_notifications_count()
+        subject = create_subject()
+        subject.dead = True
+        subject.save()
+
+        notification = get_subject_with_no_visit_notifications_count()
+        self.assertEquals(original_notification.count, notification.count)
+    def test_get_subject_with_no_visit_notifications_count_5(self):
+        original_notification = get_subject_with_no_visit_notifications_count()
+        subject = create_subject()
+        subject.resigned = True
+        subject.save()
+
+        notification = get_subject_with_no_visit_notifications_count()
+        self.assertEquals(original_notification.count, notification.count)
diff --git a/smash/web/views.py b/smash/web/views.py
index a8d50376e13aa94dfd262497dbc9cd9c997e6a2e..2069b46153787bad38b72dd413b114486ae80c61 100644
--- a/smash/web/views.py
+++ b/smash/web/views.py
@@ -12,6 +12,9 @@ from django.shortcuts import render
 from django.db.models import Q
 import collections
 import datetime
+from django.db.models import Count
+from django.db.models import Case
+from django.db.models import When
 
 # See https://docs.djangoproject.com/en/1.10/topics/http/views/#customizing-error-views
 # They should work ONLY in production! (DEBUG=False)
@@ -68,77 +71,63 @@ class NotificationCount(object):
 		self.style = style
 		self.type = type
 
+def get_exceeded_visits():
+	return Visit.objects.filter(datetime_end__lt =  get_today_midnight_date(), is_finished = False).order_by('datetime_begin')
+
 def get_exceeded_visit_notifications_count():
-	notification = NotificationCount("exceeded visit time",0 , "fa fa-thermometer-4 text-red", 'web.views.exceeded_visits')
-	today = get_today_midnight_date()
-	count = Visit.objects.filter(datetime_end__lt = today, is_finished = False).count()
-	notification.count = count
+	notification = NotificationCount(
+		title = "exceeded visit time",
+		count = get_exceeded_visits().count(),
+		style = "fa fa-thermometer-4 text-red",
+		type = 'web.views.exceeded_visits')
+	return notification
+
+
+def get_subjects_with_no_visit():
+	return Subject.objects.annotate(my_count=Count(Case(When(visit__is_finished=False, then=1)))).filter(dead=False, resigned=False, my_count=0)
+
+def get_subject_with_no_visit_notifications_count():
+	notification = NotificationCount(
+		title = "subject without visit",
+		count = get_subjects_with_no_visit().count(),
+	 	style = "fa fa-users text-aqua",
+		type = 'web.views.subject_no_visits')
 	return notification
 
-def get_exceeded_visits():
-	return Visit.objects.filter(datetime_end__lt =  get_today_midnight_date(), is_finished = False).order_by('datetime_begin')
 
 def get_visits_without_appointments_count():
-	notification = NotificationCount("unfinished visits ",0 , "fa fa-user-times text-yellow", 'web.views.unfinished_visits')
-	today = get_today_midnight_date()
-	count = 0
-	#visits in progress
-	visits = Visit.objects.filter(datetime_begin__lt = today, datetime_end__gt = today, is_finished = False)
-	for visit in visits:
-		app_count =  Appointment.objects.filter(visit = visit, status = Appointment.APPOINTMENT_STATUS_SCHEDULED).count()
-		if app_count==0:
-			count+=1
-
-	notification.count = count
+	notification = NotificationCount(
+		title = "unfinished visits ",
+		count = get_unfinished_visits().count(),
+		style = "fa fa-user-times text-yellow",
+		type = 'web.views.unfinished_visits')
 	return notification
 
 def get_unfinished_visits():
 	today = get_today_midnight_date()
-	result = [];
-	#visits in progress
-	visits = Visit.objects.filter(datetime_begin__lt = today, datetime_end__gt = today, is_finished = False)
-	for visit in visits:
-		app_count =  Appointment.objects.filter(visit = visit, status = Appointment.APPOINTMENT_STATUS_SCHEDULED).count()
-		if app_count==0:
-			result.append(visit)
-	return result
+	#list visits that have no scheduled appointments and taking place now
+	return Visit.objects.annotate(my_count=Count(Case(When(appointment__status=Appointment.APPOINTMENT_STATUS_SCHEDULED, then=1)))).filter(datetime_begin__lt = today, datetime_end__gt = today, is_finished = False, my_count=0)
 
 def get_approaching_visits_without_appointments_count():
-	notification = NotificationCount("approaching visits ",0 , "fa fa-users text-aqua",'web.views.approaching_visits_without_appointments')
-	today = get_today_midnight_date()
-	today_plus_two_months =today+datetime.timedelta(days=62)
-	count = 0
-	#visits in near future (2 months)
-	visits = Visit.objects.filter(datetime_begin__gt = today, datetime_begin__lt = today_plus_two_months, is_finished = False)
-	for visit in visits:
-		app_count =  Appointment.objects.filter(visit = visit, status = Appointment.APPOINTMENT_STATUS_SCHEDULED).count()
-		if app_count==0:
-			count+=1
-
-	notification.count = count
+	notification = NotificationCount(
+		title = "approaching visits ",
+		count = get_approaching_visits_without_appointments().count(),
+		style = "fa fa-users text-aqua",
+		type = 'web.views.approaching_visits_without_appointments')
 	return notification
 
 def get_approaching_visits_without_appointments():
 	today = get_today_midnight_date()
 	today_plus_two_months =today+datetime.timedelta(days=62)
-	result = [];
-	#visits in progress
-	visits = Visit.objects.filter(datetime_begin__gt = today, datetime_begin__lt = today_plus_two_months, is_finished = False)
-	for visit in visits:
-		app_count =  Appointment.objects.filter(visit = visit, status = Appointment.APPOINTMENT_STATUS_SCHEDULED).count()
-		if app_count==0:
-			result.append(visit)
-	return result
+	return Visit.objects.annotate(my_count=Count(Case(When(appointment__status=Appointment.APPOINTMENT_STATUS_SCHEDULED, then=1)))).filter(datetime_begin__gt = today, datetime_begin__lt = today_plus_two_months, is_finished = False, my_count=0)
 
 
 def get_unfinished_appointments_count():
-	notification = NotificationCount("unfinished appointments ",0 , "fa fa-history text-yellow",'web.views.unfinished_appointments')
-	today = get_today_midnight_date()
-
-	count = Appointment.objects.filter(datetime_when__lt = today, status = Appointment.APPOINTMENT_STATUS_SCHEDULED).count()
-
-	notification.count = count
-	return notification
+	return NotificationCount(
+		title = "unfinished appointments ",
+		count = get_unfinished_appointments(),
+		style = "fa fa-history text-yellow",
+		type = 'web.views.unfinished_appointments')
 
 def get_unfinished_appointments():
 	return Appointment.objects.filter(datetime_when__lt = get_today_midnight_date(), status = Appointment.APPOINTMENT_STATUS_SCHEDULED)
@@ -154,6 +143,7 @@ def get_notifications(the_user):
 			notifications.append(get_visits_without_appointments_count())
 			notifications.append(get_approaching_visits_without_appointments_count())
 			notifications.append(get_unfinished_appointments_count())
+			notifications.append(get_subject_with_no_visit_notifications_count())
 			for notification in notifications:
 				count += notification.count
 	return (count, notifications)