diff --git a/smash/web/api_urls.py b/smash/web/api_urls.py
index 99f0b92707ab66904a16f2c92d7b943eda5a597d..4db32fe7df7a63bb925204d415e42589b69c3d17 100644
--- a/smash/web/api_urls.py
+++ b/smash/web/api_urls.py
@@ -32,7 +32,6 @@ urlpatterns = [
 
     # subjects data
     url(r'^cities$', subject.cities, name='web.api.cities'),
-    url(r'^countries$', subject.countries, name='web.api.countries'),
     url(r'^referrals$', subject.referrals, name='web.api.referrals'),
     url(r'^subjects/(?P<type>[A-z]+)$', subject.subjects, name='web.api.subjects'),
     url(r'^subject_types', subject.types, name='web.api.subject_types'),
diff --git a/smash/web/api_views/subject.py b/smash/web/api_views/subject.py
index 6d1bb1f598bf7371d94cb3e5a4e12a085f125306..b84e207c373bdb98fbd3169817c69105df9b3549 100644
--- a/smash/web/api_views/subject.py
+++ b/smash/web/api_views/subject.py
@@ -22,14 +22,6 @@ def cities(request):
     })
 
 
-@login_required
-def countries(request):
-    result_subjects = Subject.objects.filter(country__isnull=False).values_list('country').distinct()
-    return JsonResponse({
-        "countries": [x[0] for x in result_subjects]
-    })
-
-
 @login_required
 def referrals(request):
     result_subjects = Subject.objects.filter(referral__isnull=False).values_list('referral').distinct()
@@ -103,7 +95,7 @@ def get_subjects_order(subjects_to_be_ordered, order_column, order_direction):
     elif order_column == "visit_8":
         result = order_by_visit(subjects_to_be_ordered, order_direction, 8)
     else:
-        logger.warn("Unknown sort column: "+order_column)
+        logger.warn("Unknown sort column: " + order_column)
     return result
 
 
diff --git a/smash/web/forms.py b/smash/web/forms.py
index e4e4c2bb8b0594b62ea16fba51132eb68282f19b..3b2d60066bc7cbd41e727477aa84e93610b24c4f 100644
--- a/smash/web/forms.py
+++ b/smash/web/forms.py
@@ -5,10 +5,10 @@ from django import forms
 from django.forms import ModelForm, Form
 from django.utils.dates import MONTHS
 
-from models import Subject, Worker, Appointment, Visit, AppointmentType, ContactAttempt, AppointmentTypeLink, \
-    Availability, Holiday
-from models.constants import SUBJECT_TYPE_CHOICES, SCREENING_NUMBER_PREFIXES_FOR_TYPE
-from views.notifications import get_filter_locations
+from web.models import Subject, Worker, Appointment, Visit, AppointmentType, ContactAttempt, AppointmentTypeLink, \
+    Availability, Holiday, Country
+from web.models.constants import SUBJECT_TYPE_CHOICES, SCREENING_NUMBER_PREFIXES_FOR_TYPE, COUNTRY_OTHER_ID
+from web.views.notifications import get_filter_locations
 
 """
 Possible redundancy, but if need arises, contents of forms can be easily customized
@@ -44,6 +44,11 @@ def validate_subject_nd_number(self, cleaned_data):
                 self.add_error('nd_number', "ND number already in use")
 
 
+def validate_subject_country(self, cleaned_data):
+    if cleaned_data['country'].id == COUNTRY_OTHER_ID:
+        self.add_error('country', "Select valid country")
+
+
 def validate_subject_mpower_number(self, cleaned_data):
     if cleaned_data['mpower_id'] != "":
         subjects_from_db = Subject.objects.filter(mpower_id=cleaned_data['mpower_id'])
@@ -96,6 +101,7 @@ class SubjectAddForm(ModelForm):
 
             if len(subjects_from_db) > 0:
                 self.add_error('screening_number', "Screening number already in use")
+        validate_subject_country(self, cleaned_data)
         validate_subject_nd_number(self, cleaned_data)
         validate_subject_mpower_number(self, cleaned_data)
         return cleaned_data
@@ -167,6 +173,7 @@ class SubjectEditForm(ModelForm):
     def clean(self):
         validate_subject_nd_number(self, self.cleaned_data)
         validate_subject_mpower_number(self, self.cleaned_data)
+        validate_subject_country(self, self.cleaned_data)
 
     class Meta:
         model = Subject
diff --git a/smash/web/migrations/0058_country.py b/smash/web/migrations/0058_country.py
new file mode 100644
index 0000000000000000000000000000000000000000..e1f51c42295c51137e0ed14c3726e1811cd3546c
--- /dev/null
+++ b/smash/web/migrations/0058_country.py
@@ -0,0 +1,26 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.10.7 on 2017-10-31 08:02
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+    dependencies = [
+        ('web', '0057_update_visit_number_for_existing_visits'),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name='Country',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('name', models.CharField(max_length=20)),
+                ('order', models.IntegerField(default=0)),
+            ],
+            options={
+                'ordering': ['order'],
+            },
+        ),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'OTHER\', 1000);')
+    ]
diff --git a/smash/web/migrations/0059_subject_country_2.py b/smash/web/migrations/0059_subject_country_2.py
new file mode 100644
index 0000000000000000000000000000000000000000..9c48092005d9db60f437c64b5c2ada3544cb6ed1
--- /dev/null
+++ b/smash/web/migrations/0059_subject_country_2.py
@@ -0,0 +1,21 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.10.7 on 2017-10-31 08:36
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('web', '0058_country'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='subject',
+            name='country_2',
+            field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, to='web.Country', verbose_name=b'Country'),
+        ),
+    ]
diff --git a/smash/web/migrations/0060_remove_subject_country.py b/smash/web/migrations/0060_remove_subject_country.py
new file mode 100644
index 0000000000000000000000000000000000000000..43603845117ded69fa8c64998f469734bcc3c119
--- /dev/null
+++ b/smash/web/migrations/0060_remove_subject_country.py
@@ -0,0 +1,219 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.10.7 on 2017-10-31 09:15
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+    dependencies = [
+        ('web', '0059_subject_country_2'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='country',
+            name='name',
+            field=models.CharField(max_length=50),
+        ),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Afghanistan\', 100);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Albania\', 101);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Algeria\', 102);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Andorra\', 103);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Angola\', 104);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Antigua & Deps\', 105);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Argentina\', 106);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Armenia\', 107);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Australia\', 108);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Austria\', 109);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Azerbaijan\', 110);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Bahamas\', 111);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Bahrain\', 112);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Bangladesh\', 113);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Barbados\', 114);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Belarus\', 115);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Belgium\', 4);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Belize\', 117);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Benin\', 118);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Bhutan\', 119);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Bolivia\', 120);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Bosnia Herzegovina\', 121);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Botswana\', 122);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Brazil\', 123);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Brunei\', 124);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Bulgaria\', 125);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Burkina\', 126);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Burundi\', 127);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Cambodia\', 128);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Cameroon\', 129);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Canada\', 130);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Cape Verde\', 131);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Central African Rep\', 132);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Chad\', 133);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Chile\', 134);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'China\', 135);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Colombia\', 136);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Comoros\', 137);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Congo\', 138);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Congo {Democratic Rep}\', 139);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Costa Rica\', 140);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Croatia\', 141);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Cuba\', 142);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Cyprus\', 143);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Czech Republic\', 144);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Denmark\', 145);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Djibouti\', 146);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Dominica\', 147);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Dominican Republic\', 148);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'East Timor\', 149);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Ecuador\', 150);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Egypt\', 151);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'El Salvador\', 152);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Equatorial Guinea\', 153);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Eritrea\', 154);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Estonia\', 155);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Ethiopia\', 156);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Fiji\', 157);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Finland\', 158);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'France\', 2);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Gabon\', 160);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Gambia\', 161);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Georgia\', 162);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Germany\', 3);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Ghana\', 164);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Greece\', 165);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Grenada\', 166);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Guatemala\', 167);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Guinea\', 168);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Guinea-Bissau\', 169);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Guyana\', 170);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Haiti\', 171);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Honduras\', 172);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Hungary\', 173);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Iceland\', 174);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'India\', 175);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Indonesia\', 176);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Iran\', 177);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Iraq\', 178);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Ireland {Republic}\', 179);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Israel\', 180);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Italy\', 181);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Ivory Coast\', 182);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Jamaica\', 183);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Japan\', 184);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Jordan\', 185);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Kazakhstan\', 186);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Kenya\', 187);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Kiribati\', 188);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Korea North\', 189);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Korea South\', 190);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Kosovo\', 191);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Kuwait\', 192);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Kyrgyzstan\', 193);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Laos\', 194);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Latvia\', 195);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Lebanon\', 196);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Lesotho\', 197);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Liberia\', 198);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Libya\', 199);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Liechtenstein\', 200);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Lithuania\', 201);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Luxembourg\', 1);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Macedonia\', 203);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Madagascar\', 204);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Malawi\', 205);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Malaysia\', 206);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Maldives\', 207);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Mali\', 208);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Malta\', 209);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Marshall Islands\', 210);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Mauritania\', 211);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Mauritius\', 212);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Mexico\', 213);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Micronesia\', 214);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Moldova\', 215);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Monaco\', 216);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Mongolia\', 217);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Montenegro\', 218);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Morocco\', 219);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Mozambique\', 220);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Myanmar, {Burma}\', 221);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Namibia\', 222);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Nauru\', 223);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Nepal\', 224);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Netherlands\', 225);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'New Zealand\', 226);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Nicaragua\', 227);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Niger\', 228);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Nigeria\', 229);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Norway\', 230);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Oman\', 231);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Pakistan\', 232);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Palau\', 233);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Panama\', 234);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Papua New Guinea\', 235);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Paraguay\', 236);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Peru\', 237);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Philippines\', 238);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Poland\', 239);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Portugal\', 240);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Qatar\', 241);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Romania\', 242);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Russian Federation\', 243);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Rwanda\', 244);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'St Kitts & Nevis\', 245);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'St Lucia\', 246);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Saint Vincent & the Grenadines\', 247);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Samoa\', 248);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'San Marino\', 249);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Sao Tome & Principe\', 250);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Saudi Arabia\', 251);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Senegal\', 252);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Serbia\', 253);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Seychelles\', 254);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Sierra Leone\', 255);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Singapore\', 256);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Slovakia\', 257);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Slovenia\', 258);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Solomon Islands\', 259);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Somalia\', 260);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'South Africa\', 261);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'South Sudan\', 262);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Spain\', 263);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Sri Lanka\', 264);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Sudan\', 265);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Suriname\', 266);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Swaziland\', 267);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Sweden\', 268);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Switzerland\', 269);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Syria\', 270);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Taiwan\', 271);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Tajikistan\', 272);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Tanzania\', 273);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Thailand\', 274);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Togo\', 275);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Tonga\', 276);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Trinidad & Tobago\', 277);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Tunisia\', 278);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Turkey\', 279);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Turkmenistan\', 280);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Tuvalu\', 281);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Uganda\', 282);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Ukraine\', 283);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'United Arab Emirates\', 284);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'United Kingdom\', 285);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'United States\', 286);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Uruguay\', 287);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Uzbekistan\', 288);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Vanuatu\', 289);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Vatican City\', 290);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Venezuela\', 291);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Vietnam\', 292);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Yemen\', 293);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Zambia\', 294);'),
+        migrations.RunSQL('insert into web_country (name, "order") values(\'Zimbabwe\', 295);'),
+
+        migrations.RunSQL('update web_subject t set country_2_id = '
+                          'case when (select id from web_country u where t.country=u.name) is Null then 1 '
+                          'else (select id from web_country u where t.country=u.name) end;'),
+    ]
diff --git a/smash/web/migrations/0061_remove_subject_country.py b/smash/web/migrations/0061_remove_subject_country.py
new file mode 100644
index 0000000000000000000000000000000000000000..526e2ec7f457107449172dc77ecc9b4e84289630
--- /dev/null
+++ b/smash/web/migrations/0061_remove_subject_country.py
@@ -0,0 +1,24 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.10.7 on 2017-10-31 09:15
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+    dependencies = [
+        ('web', '0060_remove_subject_country'),
+    ]
+
+    operations = [
+        migrations.RemoveField(
+            model_name='subject',
+            name='country',
+        ),
+        migrations.RenameField(
+            model_name='subject',
+            old_name='country_2',
+            new_name='country',
+        ),
+        migrations.RunSQL('update web_country set name=\'---\', "order"=0 where id=1;'),
+    ]
diff --git a/smash/web/models/__init__.py b/smash/web/models/__init__.py
index 6c0f4e1ec5b043bbccd4afb39de3a9aa4a424395..28a4bfa0bbae63229028fc45c83657f1031f9370 100644
--- a/smash/web/models/__init__.py
+++ b/smash/web/models/__init__.py
@@ -7,6 +7,7 @@ from configuration_item import ConfigurationItem
 from flying_team import FlyingTeam
 from location import Location
 from appointment_type_link import AppointmentTypeLink
+from country import Country
 from room import Room
 from visit import Visit
 from worker import Worker
@@ -25,4 +26,4 @@ from inconsistent_subject import InconsistentSubject, InconsistentField
 
 __all__ = [FlyingTeam, Appointment, AppointmentType, Availability, Holiday, Item, Language, Location, Room, Subject,
            Visit, Worker, ContactAttempt, ConfigurationItem, MailTemplate, AppointmentTypeLink, MissingSubject,
-           InconsistentSubject, InconsistentField]
+           InconsistentSubject, InconsistentField, Country]
diff --git a/smash/web/models/constants.py b/smash/web/models/constants.py
index 2dfee4e2c98362f30a49e5f2ac982796b313827a..d2defa4d3d1f8a52f4f40fe60fc0dcf71f0963be 100644
--- a/smash/web/models/constants.py
+++ b/smash/web/models/constants.py
@@ -74,3 +74,6 @@ WEEKDAY_CHOICES = (
 
 REDCAP_TOKEN_CONFIGURATION_TYPE = "REDCAP_TOKEN_CONFIGURATION_TYPE"
 REDCAP_BASE_URL_CONFIGURATION_TYPE = "REDCAP_BASE_URL_CONFIGURATION_TYPE"
+
+COUNTRY_OTHER_ID = 1
+COUNTRY_AFGHANISTAN_ID = 2
\ No newline at end of file
diff --git a/smash/web/models/country.py b/smash/web/models/country.py
new file mode 100644
index 0000000000000000000000000000000000000000..ce180a164850ae034d9651cf70f6631f443fe35c
--- /dev/null
+++ b/smash/web/models/country.py
@@ -0,0 +1,18 @@
+# coding=utf-8
+
+from django.db import models
+
+
+class Country(models.Model):
+    class Meta:
+        app_label = 'web'
+        ordering = ["order"]
+
+    name = models.CharField(max_length=50)
+    order = models.IntegerField(default=0)
+
+    def __str__(self):
+        return self.name
+
+    def __unicode__(self):
+        return "%s" % self.name
diff --git a/smash/web/models/mail_template.py b/smash/web/models/mail_template.py
index a5dabfbcfc323ca18a2caf8d39c36e45a83d8991..8c3a7fa699c17b2965123ede3c2b5a6243164011 100644
--- a/smash/web/models/mail_template.py
+++ b/smash/web/models/mail_template.py
@@ -206,7 +206,7 @@ class MailTemplate(models.Model):
                 "##S_LAST_NAME##": subject.last_name,
                 "##S_ADDRESS##": subject.address,
                 "##S_CITY##": subject.city,
-                "##S_COUNTRY##": subject.country,
+                "##S_COUNTRY##": unicode(subject.country),
                 "##S_DIAGNOSIS_YEAR##": subject.year_of_diagnosis,
                 "##S_DATE_ADDED##": subject.date_added.strftime(DATE_FORMAT_SHORT),
                 "##S_DATE_BORN##": date_born,
diff --git a/smash/web/models/subject.py b/smash/web/models/subject.py
index 756cb960ea2bbf9ec58382fefe724bce9d4c8c7e..e87f3ab83e3f274ec8d40845e318b8d3868bf1d1 100644
--- a/smash/web/models/subject.py
+++ b/smash/web/models/subject.py
@@ -1,7 +1,8 @@
 # coding=utf-8
 from django.db import models
 
-from constants import BOOL_CHOICES, SEX_CHOICES, SUBJECT_TYPE_CHOICES
+from constants import BOOL_CHOICES, SEX_CHOICES, SUBJECT_TYPE_CHOICES, COUNTRY_OTHER_ID
+from web.models import Country
 from . import Appointment, Language, Location, Visit
 
 
@@ -111,9 +112,12 @@ class Subject(models.Model):
                             blank=True,
                             verbose_name='City'
                             )
-    country = models.CharField(max_length=50,
-                               verbose_name='Country'
-                               )
+    country = models.ForeignKey(Country,
+                                null=False,
+                                blank=False,
+                                default=COUNTRY_OTHER_ID,
+                                verbose_name='Country'
+                                )
     screening_number = models.CharField(max_length=50,
                                         unique=True,
                                         verbose_name='Screening number', blank=False, null=False
diff --git a/smash/web/templates/subjects/add.html b/smash/web/templates/subjects/add.html
index fc6931871cd604134379b9e519268ee3dc2a8472..317c54e6953fe565d2e5e01216834c30228340a8 100644
--- a/smash/web/templates/subjects/add.html
+++ b/smash/web/templates/subjects/add.html
@@ -83,9 +83,6 @@
             $.get("{% url 'web.api.cities' %}", function (data) {
                 new Awesomplete(document.querySelector("#id_city")).list = data.cities;
             });
-            $.get("{% url 'web.api.countries' %}", function (data) {
-                new Awesomplete(document.querySelector("#id_country")).list = data.countries;
-            });
             $.get("{% url 'web.api.referrals' %}", function (data) {
                 new Awesomplete(document.querySelector("#id_referral")).list = data.referrals;
             });
diff --git a/smash/web/tests/api_views/test_subject.py b/smash/web/tests/api_views/test_subject.py
index b4b074f3f031cdcc26d84a5c6890ad084f0aff6f..7fafc2f84a3705ade0f09c9701f60412b022f67d 100644
--- a/smash/web/tests/api_views/test_subject.py
+++ b/smash/web/tests/api_views/test_subject.py
@@ -43,24 +43,6 @@ class TestApi(TestCase):
 
         self.assertTrue(city_name in cities)
 
-    def test_countries(self):
-        country_name = "some country"
-
-        response = self.client.get(reverse('web.api.countries'))
-        self.assertEqual(response.status_code, 200)
-
-        countries = json.loads(response.content)['countries']
-
-        self.assertFalse(country_name in countries)
-
-        self.subject.country = country_name
-        self.subject.save()
-
-        response = self.client.get(reverse('web.api.countries'))
-        countries = json.loads(response.content)['countries']
-
-        self.assertTrue(country_name in countries)
-
     def test_referrals(self):
         referral_name = "some referral"
 
diff --git a/smash/web/tests/forms/test_SubjectAddForm.py b/smash/web/tests/forms/test_SubjectAddForm.py
index c22fee47c48f9c39f4b4a4567b5f93cf0fe73673..2cadc938002c790cce798e4ce9e33ff93fd08bd6 100644
--- a/smash/web/tests/forms/test_SubjectAddForm.py
+++ b/smash/web/tests/forms/test_SubjectAddForm.py
@@ -1,31 +1,22 @@
-from django.contrib.auth.models import User
-from django.test import Client
-from django.test import TestCase
-
 from web.forms import SubjectAddForm, get_new_screening_number
-from web.models.constants import SEX_CHOICES_MALE, SUBJECT_TYPE_CHOICES_CONTROL
-from web.tests.functions import get_test_location, create_subject, create_worker
+from web.models.constants import SEX_CHOICES_MALE, SUBJECT_TYPE_CHOICES_CONTROL, COUNTRY_AFGHANISTAN_ID
+from web.tests import LoggedInWithWorkerTestCase
+from web.tests.functions import create_subject
 
 
-class SubjectAddFormTests(TestCase):
+class SubjectAddFormTests(LoggedInWithWorkerTestCase):
     def setUp(self):
-        location = get_test_location()
+        super(SubjectAddFormTests, self).setUp()
+
+        location = self.worker.locations.all()[0]
         self.sample_data = {'first_name': 'name',
                             'last_name': 'name',
                             'sex': SEX_CHOICES_MALE,
                             'type': SUBJECT_TYPE_CHOICES_CONTROL,
                             'default_location': location.id,
                             'screening_number': "123",
-                            'country': 'Luxembourg'
+                            'country': COUNTRY_AFGHANISTAN_ID,
                             }
-        self.client = Client()
-        username = 'piotr'
-        password = 'top_secret'
-        self.user = User.objects.create_user(
-            username=username, email='jacob@bla', password=password)
-        self.worker = create_worker(self.user, True)
-
-        self.client.login(username=username, password=password)
 
     def test_validation(self):
         form = SubjectAddForm(data=self.sample_data, user=self.user)
diff --git a/smash/web/tests/forms/test_SubjectEditForm.py b/smash/web/tests/forms/test_SubjectEditForm.py
index 25f2047ac34f8da86c28b130ace30aa68b3832e9..ea4e25fef50879c45cdc64852e996790551959a2 100644
--- a/smash/web/tests/forms/test_SubjectEditForm.py
+++ b/smash/web/tests/forms/test_SubjectEditForm.py
@@ -1,34 +1,24 @@
-from django.contrib.auth.models import User
-from django.test import Client
-from django.test import TestCase
-
 from web.forms import SubjectAddForm
 from web.forms import SubjectEditForm
 from web.models import Subject
-from web.models.constants import SEX_CHOICES_MALE, SUBJECT_TYPE_CHOICES_CONTROL
-from web.tests.functions import get_test_location, create_worker
+from web.models.constants import SEX_CHOICES_MALE, SUBJECT_TYPE_CHOICES_CONTROL, COUNTRY_AFGHANISTAN_ID
+from web.tests import LoggedInWithWorkerTestCase
 
 
-class SubjectEditFormTests(TestCase):
+class SubjectEditFormTests(LoggedInWithWorkerTestCase):
     def setUp(self):
-        location = get_test_location()
+        super(SubjectEditFormTests, self).setUp()
+
+        location = self.worker.locations.all()[0]
         self.sample_data = {'first_name': 'name',
                             'last_name': 'name',
                             'sex': SEX_CHOICES_MALE,
                             'type': SUBJECT_TYPE_CHOICES_CONTROL,
                             'default_location': location.id,
-                            'country': 'Luxembourg',
+                            'country': COUNTRY_AFGHANISTAN_ID,
                             'screening_number': '123',
                             'nd_number': 'nd_123'
                             }
-        self.client = Client()
-        username = 'piotr'
-        password = 'top_secret'
-        self.user = User.objects.create_user(
-            username=username, email='jacob@bla', password=password)
-        self.worker = create_worker(self.user, True)
-
-        self.client.login(username=username, password=password)
 
     def tearDown(self):
         Subject.objects.all().delete()
diff --git a/smash/web/tests/functions.py b/smash/web/tests/functions.py
index 68a6a057725942b70ef5896bfc567225b3bb1d34..aa6ee1114a859f7df40d03b71f71c5821f22a10f 100644
--- a/smash/web/tests/functions.py
+++ b/smash/web/tests/functions.py
@@ -7,7 +7,7 @@ from web.models import Location, AppointmentType, Subject, Worker, Visit, Appoin
     ContactAttempt, FlyingTeam, Availability
 from web.models.constants import REDCAP_TOKEN_CONFIGURATION_TYPE, REDCAP_BASE_URL_CONFIGURATION_TYPE, \
     SEX_CHOICES_MALE, SUBJECT_TYPE_CHOICES_CONTROL, CONTACT_TYPES_PHONE, \
-    MONDAY_AS_DAY_OF_WEEK
+    MONDAY_AS_DAY_OF_WEEK, COUNTRY_AFGHANISTAN_ID
 from web.redcap_connector import RedcapSubject
 from web.views.notifications import get_today_midnight_date
 
@@ -62,7 +62,7 @@ def create_subject(subject_id=1):
         sex=SEX_CHOICES_MALE,
         type=SUBJECT_TYPE_CHOICES_CONTROL,
         screening_number="piotr's number" + str(subject_id),
-        country="france"
+        country_id=COUNTRY_AFGHANISTAN_ID
     )
 
 
diff --git a/smash/web/tests/models/test_mail_template.py b/smash/web/tests/models/test_mail_template.py
index df6611fa60ba7e30d85dd82241d422b2508e3b0f..d718ba2e5ddf4a02f283ae4008d6297b831ec5b5 100644
--- a/smash/web/tests/models/test_mail_template.py
+++ b/smash/web/tests/models/test_mail_template.py
@@ -89,7 +89,7 @@ class MailTemplateModelTests(TestCase):
         doc = Document(stream)
         worker_name = str(self.user.worker)
 
-        self.check_doc_contains(doc, [worker_name, str(subject), subject.country, subject.nd_number,
+        self.check_doc_contains(doc, [worker_name, str(subject), str(subject.country), subject.nd_number,
                                       subject.get_type_display()])
 
     def test_apply_visit(self):
@@ -103,7 +103,7 @@ class MailTemplateModelTests(TestCase):
         doc = Document(stream)
         worker_name = str(self.user.worker)
 
-        self.check_doc_contains(doc, [worker_name, str(visit.subject), visit.subject.country, visit.subject.nd_number,
+        self.check_doc_contains(doc, [worker_name, str(visit.subject), str(visit.subject.country), visit.subject.nd_number,
                                       visit.subject.get_type_display(),
                                       visit.datetime_begin.strftime(DATE_FORMAT_SHORT),
                                       visit.datetime_end.strftime(DATE_FORMAT_SHORT)])
diff --git a/smash/web/tests/view/test_subjects.py b/smash/web/tests/view/test_subjects.py
index 8c721780bb9852e2ca929198ca69515e12d90b1b..fae555669992cc0910070a1196be4faa015af6e3 100644
--- a/smash/web/tests/view/test_subjects.py
+++ b/smash/web/tests/view/test_subjects.py
@@ -1,27 +1,19 @@
 import datetime
 
-from django.contrib.auth.models import User
-from django.test import Client
-from django.test import TestCase
 from django.urls import reverse
 
-from web.tests.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, SUBJECT_TYPE_CHOICES_PATIENT
+from web.models.constants import SEX_CHOICES_MALE, SUBJECT_TYPE_CHOICES_CONTROL, SUBJECT_TYPE_CHOICES_PATIENT, \
+    COUNTRY_AFGHANISTAN_ID, COUNTRY_OTHER_ID
+from web.tests import LoggedInWithWorkerTestCase
+from web.tests.functions import create_subject, create_visit, create_appointment, get_test_location
 from web.views.notifications import get_today_midnight_date
 
 
-class SubjectsViewTests(TestCase):
+class SubjectsViewTests(LoggedInWithWorkerTestCase):
     def setUp(self):
-        self.client = Client()
-        username = 'piotr'
-        password = 'top_secret'
-        self.user = User.objects.create_user(
-            username=username, email='jacob@bla', password=password)
-        self.worker = create_worker(self.user, True)
-
-        self.client.login(username=username, password=password)
+        super(SubjectsViewTests, self).setUp()
 
     def test_subjects_add(self):
         self.worker.save()
@@ -77,10 +69,7 @@ class SubjectsViewTests(TestCase):
             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
+        self.add_valid_form_data_for_subject_add(form_data)
         form_data["type"] = SUBJECT_TYPE_CHOICES_CONTROL
         form_data["default_location"] = get_test_location().id
         response = self.client.post(reverse('web.views.subject_add'), data=form_data)
@@ -93,6 +82,14 @@ class SubjectsViewTests(TestCase):
                          "prefix should start by L" +
                          " as default location prefix is not defined and subject type is control")
 
+    @staticmethod
+    def add_valid_form_data_for_subject_add(form_data):
+        form_data["country"] = COUNTRY_AFGHANISTAN_ID
+        form_data["first_name"] = "John"
+        form_data["last_name"] = "Doe"
+        form_data["sex"] = SEX_CHOICES_MALE
+        form_data["type"] = SUBJECT_TYPE_CHOICES_PATIENT
+
     def test_subjects_add_patient(self):
 
         form = SubjectAddForm(user=self.user)
@@ -101,11 +98,7 @@ class SubjectsViewTests(TestCase):
             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
+        self.add_valid_form_data_for_subject_add(form_data)
         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)
@@ -117,6 +110,20 @@ class SubjectsViewTests(TestCase):
                          "prefix should start by P" +
                          " as default location prefix is not defined and subject type is patient")
 
+    def test_subjects_add_invalid(self):
+
+        form = SubjectAddForm(user=self.user)
+        form_data = {}
+        for key, value in form.initial.items():
+            if value is not None:
+                form_data[key] = value
+
+        self.add_valid_form_data_for_subject_add(form_data)
+        form_data["country"] = COUNTRY_OTHER_ID
+        response = self.client.post(reverse('web.views.subject_add'), data=form_data)
+
+        self.assertTrue("Invalid data" in response.content)
+
     def test_subjects_add_with_prefixed_location(self):
 
         form = SubjectAddForm(user=self.user)
@@ -125,11 +132,7 @@ class SubjectsViewTests(TestCase):
             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
+        self.add_valid_form_data_for_subject_add(form_data)
         location = get_test_location()
         location.prefix = 'X'
         location.save()
diff --git a/smash/web/views/subject.py b/smash/web/views/subject.py
index 9031c0d52635fad4c8c8dc027cd2883d093886e4..09509ef2af1e53055f848353a924845ead5c4655 100644
--- a/smash/web/views/subject.py
+++ b/smash/web/views/subject.py
@@ -26,6 +26,9 @@ def subject_add(request):
             form.save()
             messages.add_message(request, messages.SUCCESS, 'Subject created')
             return redirect('web.views.subject_edit', id=form.instance.id)
+        else:
+            messages.add_message(request, messages.ERROR, 'Invalid data. Please fix data and try again.')
+
     else:
         form = SubjectAddForm(user=request.user)