diff --git a/smash/web/forms.py b/smash/web/forms.py
index f4ec2a3bd1a9cd1612aff423c08570eec9702662..62984dc777df1fa50514cf3e6764f2cbde6e8ac6 100644
--- a/smash/web/forms.py
+++ b/smash/web/forms.py
@@ -5,7 +5,7 @@ from django.forms import ModelForm, Form
 from django.utils.dates import MONTHS
 
 from models import Subject, Worker, Appointment, Visit, AppointmentType, ContactAttempt
-from models.constants import SUBJECT_TYPE_CHOICES
+from models.constants import SUBJECT_TYPE_CHOICES, SCREENING_NUMBER_PREFIXES_FOR_TYPE
 
 """
 Possible redundancy, but if need arises, contents of forms can be easily customized
@@ -26,12 +26,11 @@ DATETIMEPICKER_DATE_ATTRS = {
 START_YEAR_STATISTICS = 2015
 
 
-def validate_subject_nd_number(self):
-    subject = self.cleaned_data
-    if subject['nd_number'] != "":
-        subjects_from_db = Subject.objects.filter(nd_number=subject['nd_number'])
+def validate_subject_nd_number(self, cleaned_data):
+    if cleaned_data['nd_number'] != "":
+        subjects_from_db = Subject.objects.filter(nd_number=cleaned_data['nd_number'])
         if subjects_from_db:
-            if subjects_from_db[0].screening_number != subject.get('screening_number', ''):
+            if subjects_from_db[0].screening_number != cleaned_data.get('screening_number', ''):
                 self.add_error('nd_number', "ND number already in use")
 
 
@@ -42,9 +41,9 @@ class SubjectAddForm(ModelForm):
                                 )
 
     datetime_contact_reminder = forms.DateTimeField(label="Contact on",
-                                                widget=forms.DateTimeInput(DATETIMEPICKER_DATE_ATTRS),
-                                                required=False
-                                                )
+                                                    widget=forms.DateTimeInput(DATETIMEPICKER_DATE_ATTRS),
+                                                    required=False
+                                                    )
 
     class Meta:
         model = Subject
@@ -60,24 +59,41 @@ class SubjectAddForm(ModelForm):
             raise TypeError("Worker not defined for: " + user.username)
 
         super(ModelForm, self).__init__(*args, **kwargs)
-
-    def clean_screening_number(self):
-        screening_number = self.cleaned_data['screening_number']
-        prefix_screening_number = get_prefix_screening_number(self.user)
-        if screening_number == prefix_screening_number:
-            screening_number = get_new_screening_number(prefix_screening_number)
+        self.fields['screening_number'].required = False
+
+    def build_screening_number(self, cleaned_data):
+        screening_number = cleaned_data.get('screening_number', None)
+        if not screening_number:
+            prefix_screening_number = self.get_prefix_screening_number()
+            if prefix_screening_number is not None:
+                screening_number = get_new_screening_number(prefix_screening_number)
         return screening_number
 
     def clean(self):
-        subject = self.cleaned_data
-        screening_number = subject.get('screening_number', '')
-
-        subjects_from_db = Subject.objects.filter(screening_number=screening_number)
-
-        if len(subjects_from_db) > 0:
-            self.add_error('screening_number', "Screening number already in use")
-
-        validate_subject_nd_number(self)
+        cleaned_data = super(SubjectAddForm, self).clean()
+        screening_number = self.build_screening_number(cleaned_data)
+        if screening_number is not None:
+            cleaned_data['screening_number'] = screening_number
+            subjects_from_db = Subject.objects.filter(screening_number=screening_number)
+
+            if len(subjects_from_db) > 0:
+                self.add_error('screening_number', "Screening number already in use")
+        validate_subject_nd_number(self, cleaned_data)
+        return cleaned_data
+
+    def get_prefix_screening_number(self):
+        default_location = self.cleaned_data.get('default_location', None)
+        screening_number_prefix = None
+        if default_location is not None and default_location.prefix is not None:
+            screening_number_prefix = default_location.prefix
+        else:
+            subject_type = self.cleaned_data.get('type', None)
+            if subject_type is not None:
+                screening_number_prefix = SCREENING_NUMBER_PREFIXES_FOR_TYPE[subject_type]
+        if screening_number_prefix is None:
+            return None
+        prefix_screening_number = screening_number_prefix + "-"
+        return prefix_screening_number
 
 
 def get_new_screening_number(screening_number_prefix):
@@ -97,13 +113,6 @@ def get_new_screening_number(screening_number_prefix):
     return screening_number_prefix + str(result_number + 1).zfill(3)
 
 
-def get_prefix_screening_number(user):
-    prefix_screening_number = ''
-    if (user is not None) and (user.screening_number_prefix is not None) and (user.screening_number_prefix != ""):
-        prefix_screening_number = user.screening_number_prefix + "-"
-    return prefix_screening_number
-
-
 class SubjectDetailForm(ModelForm):
     class Meta:
         model = Subject
@@ -112,9 +121,9 @@ class SubjectDetailForm(ModelForm):
 
 class SubjectEditForm(ModelForm):
     datetime_contact_reminder = forms.DateTimeField(label="Contact on",
-                                                widget=forms.DateTimeInput(DATETIMEPICKER_DATE_ATTRS),
-                                                required=False
-                                                )
+                                                    widget=forms.DateTimeInput(DATETIMEPICKER_DATE_ATTRS),
+                                                    required=False
+                                                    )
     date_born = forms.DateField(label="Date of birth",
                                 widget=forms.DateInput(DATEPICKER_DATE_ATTRS, "%Y-%m-%d"),
                                 required=False
@@ -137,7 +146,7 @@ class SubjectEditForm(ModelForm):
             self.fields['resigned'].disabled = True
 
     def clean(self):
-        validate_subject_nd_number(self)
+        validate_subject_nd_number(self, self.cleaned_data)
 
     class Meta:
         model = Subject
diff --git a/smash/web/migrations/0035_screening_number.py b/smash/web/migrations/0035_screening_number.py
new file mode 100644
index 0000000000000000000000000000000000000000..406772337549cb70cef84e75deb7bcde19eff850
--- /dev/null
+++ b/smash/web/migrations/0035_screening_number.py
@@ -0,0 +1,39 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.10.3 on 2017-04-20 14:35
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+def add_prefixes(apps, schema_editor):
+    Location = apps.get_model("web", "Location")
+    updates_to_perform = [
+        ("LIH", "L"),
+        ("PRC", "P"),
+    ]
+    for update_to_perform in updates_to_perform:
+        name, prefix = update_to_perform
+        location = Location.objects.filter(name=name).first()
+        if location is not None:
+            location.prefix = prefix
+            location.save()
+
+
+class Migration(migrations.Migration):
+    dependencies = [
+        ('web', '0034_mail_templates'),
+    ]
+
+    operations = [
+        migrations.RemoveField(
+            model_name='worker',
+            name='screening_number_prefix',
+        ),
+        migrations.AddField(
+            model_name='location',
+            name='prefix',
+            field=models.CharField(max_length=1, null=True),
+        ),
+        migrations.RunPython(add_prefixes, reverse_code=lambda x, y: None),
+
+    ]
diff --git a/smash/web/models/constants.py b/smash/web/models/constants.py
index 6fb833e06cc3dd8748fed23716c384c2beecc891..fb01625467218e48e9111f775824a84e93372843 100644
--- a/smash/web/models/constants.py
+++ b/smash/web/models/constants.py
@@ -9,10 +9,16 @@ SEX_CHOICES = (
     (SEX_CHOICES_FEMALE, 'Female'),
 )
 SUBJECT_TYPE_CHOICES_CONTROL = 'C'
+SUBJECT_TYPE_CHOICES_PATIENT = 'P'
 SUBJECT_TYPE_CHOICES = {
     SUBJECT_TYPE_CHOICES_CONTROL: 'CONTROL',
-    'P': 'PATIENT',
+    SUBJECT_TYPE_CHOICES_PATIENT: 'PATIENT',
 }
+SCREENING_NUMBER_PREFIXES_FOR_TYPE = {
+    SUBJECT_TYPE_CHOICES_CONTROL: "L",
+    SUBJECT_TYPE_CHOICES_PATIENT: "P",
+}
+
 APPOINTMENT_TYPE_DEFAULT_COLOR = '#cfc600'
 APPOINTMENT_TYPE_DEFAULT_FONT_COLOR = '#00000'
 
diff --git a/smash/web/models/location.py b/smash/web/models/location.py
index c185a5f26736228b572b828d1504296edb0e15d4..1ff5bbbfc8073cbb9244cbc34c0311fae64f03a3 100644
--- a/smash/web/models/location.py
+++ b/smash/web/models/location.py
@@ -13,6 +13,8 @@ class Location(models.Model):
                              blank=True,
                              default="")
 
+    prefix = models.CharField(max_length=1, null=True)
+
     def __str__(self):
         return "%s" % self.name
 
diff --git a/smash/web/models/subject.py b/smash/web/models/subject.py
index 53c798d39a212a4c27969344efa53a59c628b452..394c7df1e7dd16abd80e67316c7ff4715a68fd55 100644
--- a/smash/web/models/subject.py
+++ b/smash/web/models/subject.py
@@ -110,7 +110,7 @@ class Subject(models.Model):
                                )
     screening_number = models.CharField(max_length=50,
                                         unique=True,
-                                        verbose_name='Screening number'
+                                        verbose_name='Screening number', blank=False, null=False
                                         )
     nd_number = models.CharField(max_length=6,
                                  blank=True,
diff --git a/smash/web/models/worker.py b/smash/web/models/worker.py
index 3272433486b8347f765dc6fea8eaeef634b5585e..fe6fc96e2e3e07f3290b7010c96c20a6d215b5fe 100644
--- a/smash/web/models/worker.py
+++ b/smash/web/models/worker.py
@@ -36,11 +36,6 @@ class Worker(models.Model):
     email = models.EmailField(
         verbose_name='E-mail'
     )
-    screening_number_prefix = models.CharField(max_length=1,
-        null=True,
-        blank=True,
-        verbose_name='Default screening number prefix',
-    )
 
     ROLE_CHOICES_SECRETARY = "SECRETARY"
     ROLE_CHOICES = (
diff --git a/smash/web/tests/test_SubjectAddForm.py b/smash/web/tests/test_SubjectAddForm.py
index 158814504a49e84a5c26e84e8e837ad9c5aa92d4..5e20ce73466e21b344a66516f2def31c8e06c696 100644
--- a/smash/web/tests/test_SubjectAddForm.py
+++ b/smash/web/tests/test_SubjectAddForm.py
@@ -1,6 +1,6 @@
 from django.contrib.auth.models import User
-from django.test import TestCase
 from django.test import Client
+from django.test import TestCase
 
 from functions import get_test_location, create_subject, create_worker
 from web.forms import SubjectAddForm, get_new_screening_number
@@ -61,15 +61,6 @@ class SubjectAddFormTests(TestCase):
         self.assertFalse(validation_status)
         self.assertTrue("nd_number" in form2.errors)
 
-    def test_invalid_3(self):
-        form_data = self.sample_data
-        form_data['screening_number'] = ""
-
-        form = SubjectAddForm(data=form_data, user=self.user)
-        validation_status = form.is_valid()
-        self.assertFalse(validation_status)
-        self.assertTrue("screening_number" in form.errors)
-
     def test_get_new_screening_number(self):
         prefix = "X-"
         subject = create_subject()
@@ -88,15 +79,6 @@ class SubjectAddFormTests(TestCase):
         new_screening_number = get_new_screening_number(prefix)
         self.assertEqual(prefix + "301", new_screening_number)
 
-    def test_get_new_screening_number_3(self):
-        prefix = "X-"
-        subject = create_subject()
-        subject.screening_number = prefix + "300" + "; L-1111"
-        subject.save()
-
-        new_screening_number = get_new_screening_number(prefix)
-        self.assertEqual(prefix + "301", new_screening_number)
-
     def test_get_new_screening_number_3(self):
         prefix = "X-"
         subject = create_subject()
diff --git a/smash/web/tests/test_view_subjects.py b/smash/web/tests/test_view_subjects.py
index 5ce3d247a2343b9a4dffcae29f3d8750c51e30a4..92444e1b6f7a388518429a2438ba558008b4419d 100644
--- a/smash/web/tests/test_view_subjects.py
+++ b/smash/web/tests/test_view_subjects.py
@@ -8,7 +8,7 @@ from django.urls import reverse
 from functions import create_subject, create_visit, create_appointment, create_worker, get_test_location
 from web.forms import SubjectAddForm, SubjectEditForm
 from web.models import Subject
-from web.models.constants import SEX_CHOICES_MALE, SUBJECT_TYPE_CHOICES_CONTROL
+from web.models.constants import SEX_CHOICES_MALE, SUBJECT_TYPE_CHOICES_CONTROL, SUBJECT_TYPE_CHOICES_PATIENT
 from web.views.notifications import get_today_midnight_date
 
 
@@ -24,15 +24,11 @@ class SubjectsViewTests(TestCase):
         self.client.login(username=username, password=password)
 
     def test_subjects_add(self):
-        self.worker.screening_number_prefix = "X"
         self.worker.save()
 
         response = self.client.get(reverse('web.views.subject_add'))
         self.assertEqual(response.status_code, 200)
 
-        # check if screening number prefix is there
-        self.assertTrue("value=\"X-\"" in response.content)
-
     def test_render_subject_edit(self):
         subject = create_subject()
 
@@ -66,8 +62,6 @@ class SubjectsViewTests(TestCase):
         self.assertTrue(updated_subject.resigned)
 
     def test_subjects_add_2(self):
-        self.worker.screening_number_prefix = "X"
-        self.worker.save()
 
         form = SubjectAddForm(user=self.user)
         form_data = {}
@@ -75,7 +69,6 @@ class SubjectsViewTests(TestCase):
             if value is not None:
                 form_data[key] = value
 
-        form_data["screening_number"] = "X-"
         form_data["country"] = "Luxembourg"
         form_data["first_name"] = "John"
         form_data["last_name"] = "Doe"
@@ -88,7 +81,57 @@ class SubjectsViewTests(TestCase):
         self.assertContains(response, "Subject created")
 
         subject = Subject.objects.all()[0]
-        self.assertEqual("X-001", subject.screening_number)
+        self.assertEqual("L-001", subject.screening_number,
+                         "prefix should start by L as default location prefix is not defined and subject type is control")
+
+    def test_subjects_add_patient(self):
+
+        form = SubjectAddForm(user=self.user)
+        form_data = {}
+        for key, value in form.initial.items():
+            if value is not None:
+                form_data[key] = value
+
+        form_data["country"] = "Luxembourg"
+        form_data["first_name"] = "John"
+        form_data["last_name"] = "Doe"
+        form_data["sex"] = SEX_CHOICES_MALE
+        form_data["type"] = SUBJECT_TYPE_CHOICES_PATIENT
+        form_data["default_location"] = get_test_location().id
+        response = self.client.post(reverse('web.views.subject_add'), data=form_data)
+        self.assertEqual(response.status_code, 302)
+        response = self.client.get(response.url)
+        self.assertContains(response, "Subject created")
+
+        subject = Subject.objects.all()[0]
+        self.assertEqual("P-001", subject.screening_number,
+                         "prefix should start by P as default location prefix is not defined and subject type is patient")
+
+    def test_subjects_add_with_prefixed_location(self):
+
+        form = SubjectAddForm(user=self.user)
+        form_data = {}
+        for key, value in form.initial.items():
+            if value is not None:
+                form_data[key] = value
+
+        form_data["country"] = "Luxembourg"
+        form_data["first_name"] = "John"
+        form_data["last_name"] = "Doe"
+        form_data["sex"] = SEX_CHOICES_MALE
+        form_data["type"] = SUBJECT_TYPE_CHOICES_PATIENT
+        location = get_test_location()
+        location.prefix = 'X'
+        location.save()
+        form_data["default_location"] = location.id
+        response = self.client.post(reverse('web.views.subject_add'), data=form_data)
+        self.assertEqual(response.status_code, 302)
+        response = self.client.get(response.url)
+        self.assertContains(response, "Subject created")
+
+        subject = Subject.objects.all()[0]
+        self.assertEqual("X-001", subject.screening_number,
+                         "prefix should start by X as default location prefix is equal to 'X'")
 
     def test_render_subjects(self):
         create_subject()
diff --git a/smash/web/views/subject.py b/smash/web/views/subject.py
index f0e96b4a167646acfbf5cb2aada2b973ad30a3d6..7c7ca07dd5ab8ff0fb0591dae023556e0587037d 100644
--- a/smash/web/views/subject.py
+++ b/smash/web/views/subject.py
@@ -3,8 +3,8 @@ from django.contrib import messages
 from django.shortcuts import redirect, get_object_or_404
 
 from . import wrap_response
-from ..forms import SubjectAddForm, SubjectEditForm, VisitDetailForm, get_prefix_screening_number
-from ..models import Subject, Worker, MailTemplate
+from ..forms import SubjectAddForm, SubjectEditForm, VisitDetailForm
+from ..models import Subject, MailTemplate
 
 SUBJECT_LIST_GENERIC = "GENERIC"
 SUBJECT_LIST_NO_VISIT = "NO_VISIT"
@@ -26,8 +26,7 @@ def subject_add(request):
             messages.add_message(request, messages.SUCCESS, 'Subject created')
             return redirect('web.views.subject_edit', id=form.instance.id)
     else:
-        worker = Worker.get_by_user(request.user)
-        form = SubjectAddForm(user=request.user, initial={'screening_number': get_prefix_screening_number(worker)})
+        form = SubjectAddForm(user=request.user)
 
     return wrap_response(request, 'subjects/add.html', {'form': form})