diff --git a/local_settings_ci.py b/local_settings_ci.py
index 2d800c09d81d71a66bac4fdc53b44dc31948baa7..3a42e373d5140f1c3e4a07be95c79c81c53161f1 100644
--- a/local_settings_ci.py
+++ b/local_settings_ci.py
@@ -33,3 +33,6 @@ MEDIA_ROOT = '/tmp/media'  # Warning! `/tmp` directory can be flushed in any mom
 ALLOWED_HOSTS = ["127.0.0.1", "localhost"]
 
 STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.StaticFilesStorage'
+NEXMO_API_KEY = 'API_KEY'
+NEXMO_API_SECRET = 'API_SECRET'
+NEXMO_DEFAULT_FROM = 'Scheduling'  # the sender of the message (phone number or text)
diff --git a/requirements-dev.txt b/requirements-dev.txt
index c98d53a535b2af51259e18d8888b30b135f37b42..5bb00bd7e43df115c62f2a24dcdbe44b513133ef 100644
--- a/requirements-dev.txt
+++ b/requirements-dev.txt
@@ -1,2 +1,3 @@
 coverage
-django-debug-toolbar
\ No newline at end of file
+django-debug-toolbar
+mockito
diff --git a/smash/web/models/__init__.py b/smash/web/models/__init__.py
index 3b9f8e50c878e0764d4ff6a7bb5c288ca933b56c..6c0f4e1ec5b043bbccd4afb39de3a9aa4a424395 100644
--- a/smash/web/models/__init__.py
+++ b/smash/web/models/__init__.py
@@ -1,8 +1,6 @@
 # coding=utf-8
 from __future__ import unicode_literals
 
-import datetime
-
 from django.contrib.auth.models import User
 
 from configuration_item import ConfigurationItem
@@ -25,10 +23,6 @@ from missing_subject import MissingSubject
 from inconsistent_subject import InconsistentSubject, InconsistentField
 
 
-def get_current_year():
-    return datetime.datetime.now().year
-
-
 __all__ = [FlyingTeam, Appointment, AppointmentType, Availability, Holiday, Item, Language, Location, Room, Subject,
            Visit, Worker, ContactAttempt, ConfigurationItem, MailTemplate, AppointmentTypeLink, MissingSubject,
            InconsistentSubject, InconsistentField]
diff --git a/smash/web/nexmo_gateway.py b/smash/web/nexmo_gateway.py
index 0515c732b1ce3a96e8a414eb9bc6fb712054efcd..bf5147d634ef5c0adc4b7cae222cf8d26e99098d 100644
--- a/smash/web/nexmo_gateway.py
+++ b/smash/web/nexmo_gateway.py
@@ -25,9 +25,6 @@ class Nexmo:
         self.client = nexmo.Client(key=getattr(settings, 'NEXMO_API_KEY'), secret=getattr(settings, 'NEXMO_API_SECRET'))
         self.default_from = getattr(settings, 'NEXMO_DEFAULT_FROM')
 
-    def make_call(self, device, token):
-        pass
-
     def send_sms(self, device, token):
         body = 'Your authentication token is %s' % token
         phone_number = device.number.as_e164
diff --git a/smash/web/tests/functions.py b/smash/web/tests/functions.py
index 3d84268e3fc699814ddddb5dc3eef508d26d78ba..a350938b7cce2cf517e696244398a88ed9948934 100644
--- a/smash/web/tests/functions.py
+++ b/smash/web/tests/functions.py
@@ -1,13 +1,13 @@
 import datetime
-
 import os
+
 from django.contrib.auth.models import User
 
-from web.redcap_connector import RedcapSubject
 from web.models import Location, AppointmentType, Subject, Worker, Visit, Appointment, ConfigurationItem, Language, \
-    ContactAttempt, FlyingTeam
-from web.models.constants import SEX_CHOICES_MALE, SUBJECT_TYPE_CHOICES_CONTROL, CONTACT_TYPES_PHONE
-
+    ContactAttempt, FlyingTeam, Availability
+from web.models.constants import SEX_CHOICES_MALE, SUBJECT_TYPE_CHOICES_CONTROL, CONTACT_TYPES_PHONE, \
+    MONDAY_AS_DAY_OF_WEEK
+from web.redcap_connector import RedcapSubject
 from web.views.notifications import get_today_midnight_date
 
 
@@ -98,6 +98,17 @@ def create_worker(user=None, with_test_location=False):
     return worker
 
 
+def create_availability(worker=None):
+    if worker is None:
+        worker = create_worker()
+    availability = Availability.objects.create(person=worker,
+                                               day_number=MONDAY_AS_DAY_OF_WEEK,
+                                               available_from=get_today_midnight_date(),
+                                               available_till=get_today_midnight_date(),
+                                               )
+    return availability
+
+
 def create_visit(subject=None):
     if subject is None:
         subject = create_subject()
diff --git a/smash/web/tests/test_nexmo_gateway.py b/smash/web/tests/test_nexmo_gateway.py
new file mode 100644
index 0000000000000000000000000000000000000000..0ee3fea16e2b22699b64d7fb82f886446d2d6c2b
--- /dev/null
+++ b/smash/web/tests/test_nexmo_gateway.py
@@ -0,0 +1,18 @@
+# coding=utf-8
+
+from django.test import TestCase
+from mockito import when, verify, ARGS
+from phonenumbers import PhoneNumber
+from two_factor.models import PhoneDevice
+
+from web.nexmo_gateway import Nexmo
+
+
+class TestNexmo(TestCase):
+    def test_send_sms(self):
+        nexmo = Nexmo()
+        when(nexmo.client).send_message(*ARGS).thenReturn(True)
+        device = PhoneDevice()
+        device.number = PhoneNumber()
+        nexmo.send_sms(device=device, token="xxy")
+        verify(nexmo.client).send_message(*ARGS)
diff --git a/smash/web/tests/test_view_kit_request.py b/smash/web/tests/test_view_kit_request.py
index 00967ccd05c7072169f177071669ee3cf59ae772..cc82b543178595e8433f7f5c26ac2aadb3090f39 100644
--- a/smash/web/tests/test_view_kit_request.py
+++ b/smash/web/tests/test_view_kit_request.py
@@ -96,23 +96,22 @@ class ViewFunctionsTests(LoggedInTestCase):
         self.assertEqual(appointment1, result['appointments'][1])
         self.assertEqual(appointment2, result['appointments'][2])
 
+    def test_kit_requests_send_email(self):
+        item_name = "Test item to be ordered"
+        item = Item.objects.create(disposable=True, name=item_name)
+        appointment_type = create_appointment_type()
+        appointment_type.required_equipment.add(item)
+        appointment_type.save()
 
-def test_kit_requests_send_email(self):
-    item_name = "Test item to be ordered"
-    item = Item.objects.create(disposable=True, name=item_name)
-    appointment_type = create_appointment_type()
-    appointment_type.required_equipment.add(item)
-    appointment_type.save()
-
-    appointment = create_appointment()
-    appointment.datetime_when = get_today_midnight_date() + datetime.timedelta(days=2)
-    appointment.save()
-    AppointmentTypeLink.objects.create(appointment=appointment, appointment_type=appointment_type)
+        appointment = create_appointment()
+        appointment.datetime_when = get_today_midnight_date() + datetime.timedelta(days=2)
+        appointment.save()
+        AppointmentTypeLink.objects.create(appointment=appointment, appointment_type=appointment_type)
 
-    response = self.client.get(reverse('web.views.kit_requests_send_mail',
-                                       kwargs={'start_date': str(get_today_midnight_date().strftime("%Y-%m-%d"))}))
-    self.assertEqual(response.status_code, 200)
+        response = self.client.get(reverse('web.views.kit_requests_send_mail',
+                                           kwargs={'start_date': str(get_today_midnight_date().strftime("%Y-%m-%d"))}))
+        self.assertEqual(response.status_code, 200)
 
-    self.assertTrue(item_name in response.content)
+        self.assertTrue(item_name in response.content)
 
-    self.assertEqual(1, len(mail.outbox))
+        self.assertEqual(1, len(mail.outbox))
diff --git a/smash/web/tests/view/__init__.py b/smash/web/tests/view/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/smash/web/tests/view/test_doctor.py b/smash/web/tests/view/test_doctor.py
new file mode 100644
index 0000000000000000000000000000000000000000..5689a18676c0a8dd5b67e357a9302d1c58785304
--- /dev/null
+++ b/smash/web/tests/view/test_doctor.py
@@ -0,0 +1,78 @@
+import logging
+
+from django.urls import reverse
+
+from web.tests.functions import create_language, create_location, create_availability
+from web.forms import WorkerAddForm
+from web.tests import create_worker
+from web.models import Worker
+from .. import LoggedInTestCase
+
+logger = logging.getLogger(__name__)
+
+
+class DoctorViewTests(LoggedInTestCase):
+    def test_render_workers_list_request(self):
+        create_worker()
+
+        response = self.client.get(reverse('web.views.doctors'))
+        self.assertEqual(response.status_code, 200)
+
+    def test_render_add_worker_request(self):
+        create_worker()
+
+        response = self.client.get(reverse('web.views.doctor_add'))
+        self.assertEqual(response.status_code, 200)
+
+    def test_render_worker_added_request(self):
+
+        language = create_language()
+        location = create_location()
+        count = Worker.objects.all().count()
+
+        form = WorkerAddForm()
+        form_data = {}
+        for key, value in form.initial.items():
+            if value is not None:
+                form_data[key] = value
+        form_data["first_name"] = "John"
+        form_data["last_name"] = "Doe"
+        form_data["phone_number"] = "0123456789"
+        form_data["unit"] = "TEST DEPARTMENT"
+        form_data["email"] = "john.doe@unknown.domain.com"
+        form_data["role"] = Worker.ROLE_CHOICES_DOCTOR
+        form_data["specialization"] = "tester"
+        form_data["languages"] = [language.id]
+        form_data["locations"] = [location.id]
+
+        response = self.client.post(reverse('web.views.doctor_add'), data=form_data)
+
+        self.assertEqual(response.status_code, 302)
+
+        new_count = Worker.objects.all().count()
+        self.assertEqual(count + 1, new_count)
+
+    def test_render_edit_worker_request(self):
+        worker = create_worker()
+
+        response = self.client.get(reverse('web.views.doctor_edit', args=[worker.id]))
+        self.assertEqual(response.status_code, 200)
+
+    def test_render_add_availability_request(self):
+        worker = create_worker()
+
+        response = self.client.get(reverse('views.doctor.doctor_availability_add', args=[worker.id]))
+        self.assertEqual(response.status_code, 200)
+
+    def test_render_edit_availability_request(self):
+        worker = create_worker()
+        availability = create_availability(worker)
+
+        response = self.client.get(reverse('web.views.doctor_availability_edit', args=[availability.id]))
+        self.assertEqual(response.status_code, 200)
+
+    def test_render_add_holiday_request(self):
+        worker = create_worker()
+
+        response = self.client.get(reverse('views.doctor.doctor_holiday_add', args=[worker.id]))
+        self.assertEqual(response.status_code, 200)
diff --git a/smash/web/tests/view/test_redcap.py b/smash/web/tests/view/test_redcap.py
new file mode 100644
index 0000000000000000000000000000000000000000..21d1f3527285c7180dc41e54e57896a0a1192189
--- /dev/null
+++ b/smash/web/tests/view/test_redcap.py
@@ -0,0 +1,17 @@
+import logging
+
+from django.urls import reverse
+
+from .. import LoggedInTestCase
+
+logger = logging.getLogger(__name__)
+
+
+class RedcapViewTests(LoggedInTestCase):
+    def test_render_workers_list_request(self):
+        response = self.client.get(reverse('web.views.missing_redcap_subject'))
+        self.assertEqual(response.status_code, 200)
+
+    def test_render_add_worker_request(self):
+        response = self.client.get(reverse('web.views.inconsistent_redcap_subject'))
+        self.assertEqual(response.status_code, 200)
diff --git a/smash/web/urls.py b/smash/web/urls.py
index 55216a0476214da6380ca798a75ad05967ed2106..825d5e003f646ea653a95f897873f870a048e1e5 100644
--- a/smash/web/urls.py
+++ b/smash/web/urls.py
@@ -81,7 +81,8 @@ urlpatterns = [
     #########################
 
     url(r'^redcap/missing_subjects$', views.redcap.missing_subjects, name='web.views.missing_redcap_subject'),
-    url(r'^redcap/inconsistent_subjects$', views.redcap.inconsistent_subjects, name='web.views.inconsistent_redcap_subject'),
+    url(r'^redcap/inconsistent_subjects$', views.redcap.inconsistent_subjects,
+        name='web.views.inconsistent_redcap_subject'),
 
     ####################
     #    CONTACTS      #