diff --git a/hypha/apply/dashboard/views.py b/hypha/apply/dashboard/views.py
index 2484885c534bda0bc27e366659ed609e10fe37be..54cd30706ad98849d4c5a73bb586107fc5e9d9d3 100644
--- a/hypha/apply/dashboard/views.py
+++ b/hypha/apply/dashboard/views.py
@@ -15,7 +15,7 @@ from hypha.apply.funds.tables import (
     review_filter_for_user,
 )
 from hypha.apply.projects.filters import ProjectListFilter
-from hypha.apply.projects.models import PaymentRequest, Project
+from hypha.apply.projects.models import PaymentRequest, Project, vendor
 from hypha.apply.projects.tables import (
     PaymentRequestsDashboardTable,
     ProjectsDashboardTable,
@@ -295,7 +295,7 @@ class ApplicantDashboardView(MultiTableMixin, TemplateView):
         return context
 
     def active_project_data(self, user):
-        return Project.objects.filter(user=user).active().for_table()
+        return Project.objects.filter(vendor__user=user).active().for_table()
 
     def my_active_submissions(self, user):
         active_subs = ApplicationSubmission.objects.filter(
@@ -306,7 +306,7 @@ class ApplicantDashboardView(MultiTableMixin, TemplateView):
             yield submission.from_draft()
 
     def historical_project_data(self, user):
-        return Project.objects.filter(user=user).complete().for_table()
+        return Project.objects.filter(vendor__user=user).complete().for_table()
 
     def historical_submission_data(self, user):
         return ApplicationSubmission.objects.filter(
diff --git a/hypha/apply/projects/forms/__init__.py b/hypha/apply/projects/forms/__init__.py
index c6a28ea673eb34cad03abbcc71274c00089e69b5..02d6cffde33b5c07f83309ef79b408f52201d674 100644
--- a/hypha/apply/projects/forms/__init__.py
+++ b/hypha/apply/projects/forms/__init__.py
@@ -23,6 +23,14 @@ from .report import (
     ReportEditForm,
     ReportFrequencyForm,
 )
+from .vendor import (
+    CreateVendorFormStep1,
+    CreateVendorFormStep2,
+    CreateVendorFormStep3,
+    CreateVendorFormStep4,
+    CreateVendorFormStep5,
+    CreateVendorFormStep6,
+)
 
 __all__ = [
     'ChangePaymentRequestStatusForm',
@@ -43,4 +51,10 @@ __all__ = [
     'UpdateProjectLeadForm',
     'ReportEditForm',
     'ReportFrequencyForm',
+    'CreateVendorFormStep1',
+    'CreateVendorFormStep2',
+    'CreateVendorFormStep3',
+    'CreateVendorFormStep4',
+    'CreateVendorFormStep5',
+    'CreateVendorFormStep6',
 ]
diff --git a/hypha/apply/projects/forms/project.py b/hypha/apply/projects/forms/project.py
index e229aa7eb00ddfe732455adce5f02e5e9e89e035..b2ee7233e9fe55c25267e5ffc441dbde09485a78 100644
--- a/hypha/apply/projects/forms/project.py
+++ b/hypha/apply/projects/forms/project.py
@@ -82,10 +82,6 @@ class ProjectEditForm(forms.ModelForm):
     class Meta:
         fields = [
             'title',
-            'contact_legal_name',
-            'contact_email',
-            'contact_address',
-            'contact_phone',
             'value',
             'proposed_start',
             'proposed_end',
@@ -93,9 +89,6 @@ class ProjectEditForm(forms.ModelForm):
         model = Project
         widgets = {
             'title': forms.TextInput,
-            'contact_legal_name': forms.TextInput,
-            'contact_email': forms.TextInput,
-            'contact_phone': forms.TextInput,
             'proposed_end': forms.DateInput,
             'proposed_start': forms.DateInput,
         }
diff --git a/hypha/apply/projects/forms/vendor.py b/hypha/apply/projects/forms/vendor.py
new file mode 100644
index 0000000000000000000000000000000000000000..23fbf74ec7d1f4f452079247b5e31e1f173f9a7e
--- /dev/null
+++ b/hypha/apply/projects/forms/vendor.py
@@ -0,0 +1,124 @@
+from django import forms
+from django.db import models
+
+from babel.numbers import list_currencies, get_currency_name
+
+from addressfield.fields import AddressField
+from ..models.vendor import Vendor, VendorFormSettings
+
+
+class BaseVendorForm:
+    def __init__(self, site=None, *args, **kwargs):
+        if site:
+            self.form_settings = VendorFormSettings.for_site(site)
+        super().__init__(*args, **kwargs)
+
+    def apply_form_settings(self, fields):
+        for field in fields:
+            try:
+                self.fields[field].label = getattr(self.form_settings, f'{field}_label')
+            except AttributeError:
+                pass
+            try:
+                self.fields[field].help_text = getattr(self.form_settings, f'{field}_help_text')
+            except AttributeError:
+                pass
+        return fields
+
+
+class CreateVendorFormStep1(BaseVendorForm, forms.ModelForm):
+    class Meta:
+        fields = [
+            'name',
+            'contractor_name',
+            'type',
+        ]
+        model = Vendor
+        widgets = {
+            'type': forms.RadioSelect,
+        }
+
+    def __init__(self, *args, **kwargs):
+        super(CreateVendorFormStep1, self).__init__(*args, **kwargs)
+        self.fields = self.apply_form_settings(self.fields)
+        self.fields['type'].choices = self.fields['type'].choices[1:]
+
+
+class CreateVendorFormStep2(BaseVendorForm, forms.ModelForm):
+    required_to_pay_taxes = forms.ChoiceField(
+        choices=((False, 'No'), (True, 'Yes')),
+        widget=forms.RadioSelect
+    )
+
+    class Meta:
+        fields = [
+            'required_to_pay_taxes',
+        ]
+        model = Vendor
+
+    def __init__(self, *args, **kwargs):
+        super(CreateVendorFormStep2, self).__init__(*args, **kwargs)
+        self.fields = self.apply_form_settings(self.fields)
+
+
+class CreateVendorFormStep3(BaseVendorForm, forms.Form):
+    due_diligence_documents = forms.FileField(widget=forms.ClearableFileInput(attrs={'multiple': True}))
+
+    def __init__(self, *args, **kwargs):
+        super(CreateVendorFormStep3, self).__init__(*args, **kwargs)
+        self.fields = self.apply_form_settings(self.fields)
+
+
+class CreateVendorFormStep4(BaseVendorForm, forms.Form):
+    CURRENCY_CHOICES = [
+        (currency, f'{get_currency_name(currency)} - {currency}')
+        for currency in list_currencies()
+    ]
+
+    account_holder_name = forms.CharField(required=False)
+    account_routing_number = forms.CharField(required=False)
+    account_number = forms.CharField(required=False)
+    account_currency = forms.ChoiceField(
+        choices=CURRENCY_CHOICES,
+        required=False,
+        initial='USD'
+    )
+
+    def __init__(self, *args, **kwargs):
+        super(CreateVendorFormStep4, self).__init__(*args, **kwargs)
+        self.fields = self.apply_form_settings(self.fields)
+
+
+class CreateVendorFormStep5(BaseVendorForm, forms.Form):
+    need_extra_info = forms.ChoiceField(
+        choices=((False, 'No'), (True, 'Yes')),
+        widget=forms.RadioSelect
+    )
+
+    def __init__(self, *args, **kwargs):
+        super(CreateVendorFormStep5, self).__init__(*args, **kwargs)
+        self.fields = self.apply_form_settings(self.fields)
+
+
+class CreateVendorFormStep6(BaseVendorForm, forms.Form):
+    CURRENCY_CHOICES = [
+        (currency, f'{get_currency_name(currency)} - {currency}')
+        for currency in list_currencies()
+    ]
+
+    branch_address = AddressField(required=False)
+    ib_account_routing_number = forms.CharField(required=False)
+    ib_account_number = forms.CharField(required=False)
+    ib_account_currency = forms.ChoiceField(
+        choices=CURRENCY_CHOICES,
+        required=False,
+        initial='USD'
+    )
+    ib_branch_address = AddressField(required=False)
+    nid_type = forms.CharField(required=False)
+    nid_number = forms.CharField(required=False)
+    other_info = forms.CharField(required=False)
+
+    def __init__(self, *args, **kwargs):
+        super(CreateVendorFormStep6, self).__init__(*args, **kwargs)
+        self.fields = self.apply_form_settings(self.fields)
diff --git a/hypha/apply/projects/migrations/0036_add_vendor.py b/hypha/apply/projects/migrations/0036_add_vendor.py
new file mode 100644
index 0000000000000000000000000000000000000000..5c168b9ca800b0731ec6e10373c130734f014a89
--- /dev/null
+++ b/hypha/apply/projects/migrations/0036_add_vendor.py
@@ -0,0 +1,124 @@
+# Generated by Django 2.2.23 on 2021-06-09 11:56
+
+from django.conf import settings
+import django.core.files.storage
+from django.db import migrations, models
+import django.db.models.deletion
+import hypha.apply.projects.models.vendor
+import wagtail.core.fields
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
+        ('wagtailcore', '0062_comment_models_and_pagesubscription'),
+        ('application_projects', '0035_add_heading_block_to_form_fields_block'),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name='BankInformation',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('account_holder_name', models.CharField(max_length=150)),
+                ('account_routing_number', models.CharField(max_length=10)),
+                ('account_number', models.CharField(max_length=20)),
+                ('account_currency', models.CharField(max_length=10)),
+                ('need_extra_info', models.BooleanField(default=False)),
+                ('branch_address', models.TextField(blank=True, verbose_name='Address')),
+                ('nid_type', models.CharField(blank=True, max_length=25, verbose_name='National Identity Document Type')),
+                ('nid_number', models.CharField(blank=True, max_length=20, verbose_name='National Identity Document Number')),
+                ('iba_info', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='bank_info', to='application_projects.BankInformation', verbose_name='Intermediary Bank Account Information')),
+            ],
+        ),
+        migrations.RemoveField(
+            model_name='project',
+            name='contact_address',
+        ),
+        migrations.RemoveField(
+            model_name='project',
+            name='contact_email',
+        ),
+        migrations.RemoveField(
+            model_name='project',
+            name='contact_legal_name',
+        ),
+        migrations.RemoveField(
+            model_name='project',
+            name='contact_phone',
+        ),
+        migrations.CreateModel(
+            name='VendorFormSettings',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('name_label', models.TextField(default='1. What is the name of the person/organisation on the contract?', verbose_name='label')),
+                ('name_help_text', wagtail.core.fields.RichTextField(blank=True, default='This is the party name in the contract.', verbose_name='help text')),
+                ('contractor_name_label', models.TextField(default="2. What is the individual's name who is signing the contract?", verbose_name='label')),
+                ('contractor_name_help_text', wagtail.core.fields.RichTextField(blank=True, default='This person is is authorised to sign contract on behalf of the person or organization named above.', verbose_name='help text')),
+                ('type_label', models.TextField(default='3. Is the bank account owned by the person or organisation in the Question 1 above?', verbose_name='label')),
+                ('type_help_text', wagtail.core.fields.RichTextField(default='The name of the bank account must be the same as on the contract.', verbose_name='help_text')),
+                ('required_to_pay_taxes_label', models.TextField(default='Is the organisation required to pay US taxes?', verbose_name='label')),
+                ('required_to_pay_taxes_help_text', wagtail.core.fields.RichTextField(blank=True, default='', verbose_name='help_text')),
+                ('due_diligence_documents_label', models.TextField(default='Due Diligence Documents', verbose_name='label')),
+                ('due_diligence_documents_help_text', wagtail.core.fields.RichTextField(default='Upload Due Diligence Documents. E.g. w8/w9 forms.', verbose_name='help_text')),
+                ('account_holder_name_label', models.TextField(default='Bank Account Holder name', verbose_name='label')),
+                ('account_holder_name_help_text', wagtail.core.fields.RichTextField(default='This name must be same as the person or organisation that signed the contract. This person is authorised to sign contracts on behalf of the person or organisation named above.', verbose_name='help_text')),
+                ('account_routing_number_label', models.TextField(default='Bank Account Routing number', verbose_name='label')),
+                ('account_routing_number_help_text', wagtail.core.fields.RichTextField(default='Depending on your country, this might be called the ACH, SWIFT, BIC or ABA number.', verbose_name='help_text')),
+                ('account_number_label', models.TextField(default='Bank Account Number', verbose_name='label')),
+                ('account_number_help_text', wagtail.core.fields.RichTextField(default='Depending on your country, this might be called the account number, IBAN, or BBAN number.', verbose_name='help_text')),
+                ('account_currency', models.TextField(default='Bank Account Currency', verbose_name='label')),
+                ('account_currency_help_text', wagtail.core.fields.RichTextField(default='This is the currency of this bank account.', verbose_name='label')),
+                ('need_extra_info_label', models.TextField(default='Do you need to provide us with extra information?', verbose_name='label')),
+                ('need_extra_info_help_text', wagtail.core.fields.RichTextField(default='', verbose_name='help_text')),
+                ('branch_address_label', models.TextField(default='Bank Account Branch Address', verbose_name='label')),
+                ('branch_address_help_text', models.TextField(default='The address of the bank branch where you have the bank account located(not the bank account holder address)', verbose_name='help_text')),
+                ('ib_account_routing_number_label', models.TextField(default='Bank Account Routing Number', verbose_name='label')),
+                ('ib_account_routing_number_help_text', wagtail.core.fields.RichTextField(default='Depending on your country, this might be called ACH, SWIFT, BIC or ABA number', verbose_name='help_text')),
+                ('ib_account_number_label', models.TextField(default='Bank Account Number', verbose_name='label')),
+                ('ib_account_number_help_text', wagtail.core.fields.RichTextField(default='Depending on your country, this might be called the account number, IBAN, or BBAN number', verbose_name='help_text')),
+                ('ib_account_currency_label', models.TextField(default='Bank Account Currency', verbose_name='label')),
+                ('ib_account_currency_help_text', wagtail.core.fields.RichTextField(default='This is the currency of this bank account', verbose_name='help_text')),
+                ('ib_branch_address_label', models.TextField(default='Intermediary Bank Branch Address', verbose_name='label')),
+                ('ib_branch_address_help_text', wagtail.core.fields.RichTextField(default='Bank branch address(not the bank account holder address)', verbose_name='help_text')),
+                ('nid_type_label', models.TextField(default='National Identity Document Type', verbose_name='label')),
+                ('nid_type_help_text', wagtail.core.fields.RichTextField(default='This could be a passport, a National Identity number, or other national identity document.', verbose_name='help_text')),
+                ('nid_number_label', models.TextField(default='National Identity Document Number', verbose_name='label')),
+                ('nid_number_help_text', wagtail.core.fields.RichTextField(default='', verbose_name='help_text')),
+                ('other_info_label', models.TextField(default='Other Information', verbose_name='label')),
+                ('other_info_help_text', wagtail.core.fields.RichTextField(default='If you need to include other information not listed above, provide it here.', verbose_name='help_text')),
+                ('site', models.OneToOneField(editable=False, on_delete=django.db.models.deletion.CASCADE, to='wagtailcore.Site')),
+            ],
+            options={
+                'abstract': False,
+            },
+        ),
+        migrations.CreateModel(
+            name='Vendor',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('name', models.CharField(blank=True, max_length=150)),
+                ('contractor_name', models.CharField(blank=True, max_length=150)),
+                ('address', models.TextField(blank=True, verbose_name='Address')),
+                ('type', models.CharField(blank=True, choices=[('organization', 'Yes, the account belongs to the organisation above'), ('personal', 'No, it is a personal bank account')], max_length=15)),
+                ('required_to_pay_taxes', models.BooleanField(default=False)),
+                ('other_info', models.TextField(blank=True)),
+                ('bank_info', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='application_projects.BankInformation')),
+                ('user', models.OneToOneField(on_delete=django.db.models.deletion.PROTECT, related_name='vendor', to=settings.AUTH_USER_MODEL)),
+            ],
+        ),
+        migrations.CreateModel(
+            name='DueDiligenceDocument',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('document', models.FileField(storage=django.core.files.storage.FileSystemStorage(), upload_to=hypha.apply.projects.models.vendor.due_diligence_documents)),
+                ('vendor', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='due_diligence_documents', to='application_projects.Vendor')),
+            ],
+        ),
+        migrations.AddField(
+            model_name='project',
+            name='vendor',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='projects', to='application_projects.Vendor'),
+        ),
+    ]
diff --git a/hypha/apply/projects/models/__init__.py b/hypha/apply/projects/models/__init__.py
index b100248d2dbb8a661b6db9df2ac8ead0312506b0..0ccac178fdd9c603c5fdab69369486357787aceb 100644
--- a/hypha/apply/projects/models/__init__.py
+++ b/hypha/apply/projects/models/__init__.py
@@ -9,7 +9,7 @@ from .project import (
     ProjectSettings,
 )
 from .report import Report, ReportConfig, ReportPrivateFiles, ReportVersion
-from .vendor import Vendor, BankInformation
+from .vendor import Vendor, BankInformation, DueDiligenceDocument
 
 __all__ = [
     'Project',
@@ -28,4 +28,5 @@ __all__ = [
     'ReportConfig',
     'Vendor',
     'BankInformation',
+    'DueDiligenceDocument',
 ]
diff --git a/hypha/apply/projects/models/project.py b/hypha/apply/projects/models/project.py
index 785132fb24e2ec1432804dfb1130a51b98347278..7057702dbc6dda3ae452a6b3660c0fd4d01a1dad 100644
--- a/hypha/apply/projects/models/project.py
+++ b/hypha/apply/projects/models/project.py
@@ -29,6 +29,8 @@ from hypha.apply.stream_forms.files import StreamFieldDataEncoder
 from hypha.apply.stream_forms.models import BaseStreamForm
 from hypha.apply.utils.storage import PrivateStorage
 
+from .vendor import Vendor
+
 logger = logging.getLogger(__name__)
 
 
@@ -131,11 +133,11 @@ class Project(BaseStreamForm, AccessFormData, models.Model):
     user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, null=True, related_name='owned_projects')
 
     title = models.TextField()
-
-    contact_legal_name = models.TextField(_('Person or Organisation name'), default='')
-    contact_email = models.TextField(_('Email'), default='')
-    contact_address = models.TextField(_('Address'), default='')
-    contact_phone = models.TextField(_('Phone'), default='')
+    vendor = models.ForeignKey(
+        "application_projects.Vendor",
+        on_delete=models.SET_NULL,
+        null=True, blank=True, related_name='projects'
+    )
     value = models.DecimalField(
         default=0,
         max_digits=10,
@@ -177,8 +179,8 @@ class Project(BaseStreamForm, AccessFormData, models.Model):
 
     def get_address_display(self):
         try:
-            address = json.loads(self.contact_address)
-        except json.JSONDecodeError:
+            address = json.loads(self.vendor.address)
+        except (json.JSONDecodeError, AttributeError):
             return ''
         else:
             return ', '.join(
@@ -207,14 +209,18 @@ class Project(BaseStreamForm, AccessFormData, models.Model):
 
         # See if there is a form field named "legal name", if not use user name.
         legal_name = submission.get_answer_from_label('legal name') or submission.user.full_name
-
+        # import ipdb; ipdb.set_trace()
+        vendor, _ = Vendor.objects.get_or_create(
+            user=submission.user
+        )
+        vendor.name = legal_name
+        vendor.address = submission.form_data.get('address', '')
+        vendor.save()
         return Project.objects.create(
             submission=submission,
-            title=submission.title,
             user=submission.user,
-            contact_email=submission.user.email,
-            contact_legal_name=legal_name,
-            contact_address=submission.form_data.get('address', ''),
+            title=submission.title,
+            vendor=vendor,
             value=submission.form_data.get('value', 0),
         )
 
diff --git a/hypha/apply/projects/models/vendor.py b/hypha/apply/projects/models/vendor.py
index 45828e1d7d07701ba872cf1649bc8d62f38f3f5a..e93f8036057f30c2074b462b17c86471c4cb0a7a 100644
--- a/hypha/apply/projects/models/vendor.py
+++ b/hypha/apply/projects/models/vendor.py
@@ -1,9 +1,14 @@
 from django.db import models
+from django.conf import settings
+from django.db.models.fields import Field
 from django.utils.translation import gettext_lazy as _
-from babel.numbers import list_currencies, get_currency_name
-
+from wagtail.contrib.settings.models import BaseSetting, register_setting
+from wagtail.core.fields import RichTextField
+from wagtail.admin.edit_handlers import (
+    FieldPanel,
+    MultiFieldPanel,
+)
 from hypha.apply.utils.storage import PrivateStorage
-from hypha.apply.users.models import User
 
 
 def due_diligence_documents(instance, filename):
@@ -11,16 +16,10 @@ def due_diligence_documents(instance, filename):
 
 
 class BankInformation(models.Model):
-    CURRENCY_CHOICES = [
-        (currency, f'{get_currency_name(currency)} - {currency}')
-        for currency in list_currencies()
-    ]
-
     account_holder_name = models.CharField(max_length=150)
     account_routing_number = models.CharField(max_length=10)
     account_number = models.CharField(max_length=20)
     account_currency = models.CharField(
-        choices=CURRENCY_CHOICES,
         max_length=10
     )
     need_extra_info = models.BooleanField(default=False)
@@ -39,20 +38,26 @@ class BankInformation(models.Model):
     )
     nid_number = models.CharField(
         max_length=20,
-        blank=True
+        blank=True,
+        verbose_name='National Identity Document Number'
     )
 
     def __str__(self):
         return self.account_holder_name
 
 
-class Vendor(User):
+class Vendor(models.Model):
 
     TYPE_CHOICES = [
-        ('organization', 'Organization'),
-        ('personal', 'Personal'),
+        ('organization', 'Yes, the account belongs to the organisation above'),
+        ('personal', 'No, it is a personal bank account'),
     ]
 
+    user = models.OneToOneField(
+        settings.AUTH_USER_MODEL, on_delete=models.PROTECT,
+        related_name='vendor'
+    )
+    name = models.CharField(max_length=150, blank=True)
     contractor_name = models.CharField(max_length=150, blank=True)
     address = models.TextField(_('Address'), blank=True)
     type = models.CharField(max_length=15, choices=TYPE_CHOICES, blank=True)
@@ -65,7 +70,7 @@ class Vendor(User):
     other_info = models.TextField(blank=True)
 
     def __str__(self):
-        return self.full_name
+        return self.name
 
 
 class DueDiligenceDocument(models.Model):
@@ -74,8 +79,235 @@ class DueDiligenceDocument(models.Model):
     )
     vendor = models.ForeignKey(
         Vendor,
-        on_delete=models.CASCADE
+        on_delete=models.CASCADE,
+        related_name='due_diligence_documents',
     )
 
     def __str__(self):
         return self.vendor.full_name + ' -> ' + self.document.name
+
+
+@register_setting
+class VendorFormSettings(BaseSetting):
+    name_label = models.TextField(
+        'label',
+        default='1. What is the name of the person/organisation on the contract?'
+    )
+    name_help_text = RichTextField(
+        'help text', blank=True,
+        default='This is the party name in the contract.'
+    )
+    contractor_name_label = models.TextField(
+        'label',
+        default="2. What is the individual's name who is signing the contract?"
+    )
+    contractor_name_help_text = RichTextField(
+        'help text', blank=True,
+        default="This person is is authorised to sign contract on behalf of the person or organization named above."
+    )
+    type_label = models.TextField(
+        'label',
+        default='3. Is the bank account owned by the person or organisation in the Question 1 above?'
+    )
+    type_help_text = RichTextField(
+        'help_text',
+        default='The name of the bank account must be the same as on the contract.'
+    )
+    required_to_pay_taxes_label = models.TextField(
+        'label',
+        default='Is the organisation required to pay US taxes?'
+    )
+    required_to_pay_taxes_help_text = RichTextField(
+        'help_text',
+        default='', blank=True,
+    )
+    due_diligence_documents_label = models.TextField(
+        'label',
+        default='Due Diligence Documents'
+    )
+    due_diligence_documents_help_text = RichTextField(
+        'help_text',
+        default='Upload Due Diligence Documents. E.g. w8/w9 forms.'
+    )
+    account_holder_name_label = models.TextField(
+        'label',
+        default='Bank Account Holder name'
+    )
+    account_holder_name_help_text = RichTextField(
+        'help_text',
+        default='This name must be same as the person or organisation that signed the contract. '
+        'This person is authorised to sign contracts on behalf of the person or organisation named above.'
+    )
+    account_routing_number_label = models.TextField(
+        'label',
+        default='Bank Account Routing number'
+    )
+    account_routing_number_help_text = RichTextField(
+        'help_text',
+        default='Depending on your country, this might be called the ACH, SWIFT, BIC or ABA number.'
+    )
+    account_number_label = models.TextField(
+        'label',
+        default='Bank Account Number'
+    )
+    account_number_help_text = RichTextField(
+        'help_text',
+        default='Depending on your country, this might be called the account number, IBAN, or BBAN number.'
+    )
+    account_currency = models.TextField(
+        'label',
+        default='Bank Account Currency'
+    )
+    account_currency_help_text = RichTextField(
+        'label',
+        default='This is the currency of this bank account.'
+    )
+    need_extra_info_label = models.TextField(
+        'label',
+        default='Do you need to provide us with extra information?'
+    )
+    need_extra_info_help_text = RichTextField(
+        'help_text',
+        default=''
+    )
+    branch_address_label = models.TextField(
+        'label',
+        default='Bank Account Branch Address'
+    )
+    branch_address_help_text = models.TextField(
+        'help_text',
+        default='The address of the bank branch where you have the bank account '
+        'located(not the bank account holder address)'
+    )
+    ib_account_routing_number_label = models.TextField(
+        'label',
+        default='Bank Account Routing Number'
+    )
+    ib_account_routing_number_help_text = RichTextField(
+        'help_text',
+        default='Depending on your country, this might be called ACH, SWIFT, BIC or ABA number'
+    )
+    ib_account_number_label = models.TextField(
+        'label',
+        default='Bank Account Number'
+    )
+    ib_account_number_help_text = RichTextField(
+        'help_text',
+        default='Depending on your country, this might be called the account number, IBAN, or BBAN number'
+    )
+    ib_account_currency_label = models.TextField(
+        'label',
+        default='Bank Account Currency'
+    )
+    ib_account_currency_help_text = RichTextField(
+        'help_text',
+        default='This is the currency of this bank account'
+    )
+    ib_branch_address_label = models.TextField(
+        'label',
+        default='Intermediary Bank Branch Address'
+    )
+    ib_branch_address_help_text = RichTextField(
+        'help_text',
+        default='Bank branch address(not the bank account holder address)'
+    )
+    nid_type_label = models.TextField(
+        'label',
+        default='National Identity Document Type'
+    )
+    nid_type_help_text = RichTextField(
+        'help_text',
+        default='This could be a passport, a National Identity number, '
+        'or other national identity document.'
+    )
+    nid_number_label = models.TextField(
+        'label',
+        default='National Identity Document Number'
+    )
+    nid_number_help_text = RichTextField(
+        'help_text',
+        default=''
+    )
+    other_info_label = models.TextField(
+        'label',
+        default='Other Information'
+    )
+    other_info_help_text = RichTextField(
+        'help_text',
+        default='If you need to include other information not listed above, provide it here.'
+    )
+
+    panels = [
+        MultiFieldPanel([
+            FieldPanel('full_name_label'),
+            FieldPanel('full_name_help_text'),
+        ], 'Name'),
+        MultiFieldPanel([
+            FieldPanel('full_name_label'),
+            FieldPanel('full_name_help_text'),
+        ], 'Contractor Name'),
+        MultiFieldPanel([
+            FieldPanel('type_label'),
+            FieldPanel('type_help_text'),
+        ], 'Type'),
+        MultiFieldPanel([
+            FieldPanel('required_to_pay_taxes_label'),
+            FieldPanel('required_to_pay_taxes_help_text'),
+        ], 'Required to pay taxes'),
+        MultiFieldPanel([
+            FieldPanel('due_diligence_documents_label'),
+            FieldPanel('due_diligence_documents_help_text'),
+        ], 'Due Diligence Documents'),
+        MultiFieldPanel([
+            FieldPanel('account_holder_name_label'),
+            FieldPanel('account_holder_name_help_text'),
+        ], 'Account Holder Name'),
+        MultiFieldPanel([
+            FieldPanel('account_routing_number_label'),
+            FieldPanel('account_routing_number_help_text'),
+        ], 'Account Routing Number'),
+        MultiFieldPanel([
+            FieldPanel('account_number_label'),
+            FieldPanel('account_number_help_text'),
+        ], 'Account Number'),
+        MultiFieldPanel([
+            FieldPanel('account_currency_label'),
+            FieldPanel('account_currency_label'),
+        ], 'Account Currency'),
+        MultiFieldPanel([
+            FieldPanel('need_extra_info_label'),
+            FieldPanel('need_extra_info_help_text'),
+        ], 'Need Extra Info'),
+        MultiFieldPanel([
+            FieldPanel('branch_address_label'),
+            FieldPanel('branch_address_help_text'),
+        ], 'Account Branch Address'),
+        MultiFieldPanel([
+            FieldPanel('ib_account_routing_number_label'),
+            FieldPanel('ib_account_routing_number_help_text'),
+        ], 'Intermediary Account Routing Number'),
+        MultiFieldPanel([
+            FieldPanel('ib_account_number_label'),
+            FieldPanel('ib_account_number_help_text'),
+        ], 'Intermediary Account Number'),
+        MultiFieldPanel([
+            FieldPanel('ib_account_currency_label'),
+            FieldPanel('ib_account_currency_help_text'),
+        ], 'Intermediary Account Currency'),
+        MultiFieldPanel([
+            FieldPanel('ib_branch_address_label'),
+            FieldPanel('ib_branch_address_help_text'),
+        ], 'Intermediary Account Branch Address'),
+        MultiFieldPanel([
+            FieldPanel('nid_type_label'),
+            FieldPanel('nid_type_help_text'),
+        ], 'National Identity Document Type'),
+        MultiFieldPanel([
+            FieldPanel('nid_number_label'),
+            FieldPanel('nid_number_help_text'),
+        ], 'National Identity Document Number'),
+        MultiFieldPanel([
+            FieldPanel('other_info_label'),
+            FieldPanel('other_info_help_text'),
+        ], 'Other Information'),
+    ]
diff --git a/hypha/apply/projects/templates/application_projects/vendor_form.html b/hypha/apply/projects/templates/application_projects/vendor_form.html
new file mode 100644
index 0000000000000000000000000000000000000000..42913439fc11cf4180057c13356d6c52daea0ff2
--- /dev/null
+++ b/hypha/apply/projects/templates/application_projects/vendor_form.html
@@ -0,0 +1,42 @@
+{% extends "base-apply.html" %}
+{% load static %}
+
+{% block title %}{% if object %}Edit{% else %}Create{% endif %} Payment Request: {% if object %}{{ object.project.title }}{% else %}{{ project.title }}{% endif %}{% endblock %}
+{% block content %}
+<div class="admin-bar">
+    <div class="admin-bar__inner">
+        <h2 class="heading heading--no-margin">{% if object %}Editing{% else %}Create{% endif %} Payment Request</h2>
+        <h5 class="heading heading--no-margin">{% if object %}{{ object.project.title }}{% else %}{{ project.title }}{% endif %}</h5>
+    </div>
+</div>
+
+{% include "forms/includes/form_errors.html" with form=form %}
+
+<div class="wrapper wrapper--light-grey-bg wrapper--form wrapper--sidebar">
+    <div class="wrapper--sidebar--inner">
+        <form class="form" id="multi-step-vendor" action="" method="post" enctype="multipart/form-data">
+            {{ wizard.management_form }}
+            {% csrf_token %}
+            {{ form.media }}
+
+            {% for field in form %}
+                {% if field.field %}
+                    {% include "forms/includes/field.html" %}
+                {% else %}
+                    {{ field }}
+                {% endif %}
+            {% endfor %}
+            <button class="button button--submit button--top-space button--primary" type="submit" name="save">Save</button>
+        </form>
+    </div>
+</div>
+{% endblock %}
+
+{% block extra_css %}
+    {{ form.media.css }}
+{% endblock %}
+
+{% block extra_js %}
+    {{ form.media.js }}
+    <script src="{% static 'js/apply/list-input-files.js' %}"></script>
+{% endblock %}
diff --git a/hypha/apply/projects/templates/application_projects/vendor_success.html b/hypha/apply/projects/templates/application_projects/vendor_success.html
new file mode 100644
index 0000000000000000000000000000000000000000..b080f97e825387a7c2550463977884d6b0112a93
--- /dev/null
+++ b/hypha/apply/projects/templates/application_projects/vendor_success.html
@@ -0,0 +1,24 @@
+{% extends "base-apply.html" %}
+{% load static %}
+
+{% block title %}{% if object %}Edit{% else %}Create{% endif %} Payment Request: {% if object %}{{ object.project.title }}{% else %}{{ project.title }}{% endif %}{% endblock %}
+{% block content %}
+<div class="admin-bar">
+    <div class="admin-bar__inner">
+        <h2 class="heading heading--no-margin">Contractor Setup Completed</h2>
+        <!-- <h5 class="heading heading--no-margin">{% if object %}{{ object.project.title }}{% else %}{{ project.title }}{% endif %}</h5> -->
+    </div>
+</div>
+<div class="wrapper wrapper--small">
+    <h3>Thank you for submitting your information.</h3>
+    <p>Your OTF Programme Manager will be in touch with you if there are any issues.</p>
+    <h3>What will happen next?</h3>
+    <p>We will use this information to create the contract for your project.</p>
+    <p>Once this has happened, we will send you a message with your contract.</p>
+    <p>We'll ask you to read it, and if everything is OK, you can sign it.</p>
+</div>
+{% endblock %}
+
+{% block extra_js %}
+<script src="{% static 'js/apply/list-input-files.js' %}"></script>
+{% endblock %}
diff --git a/hypha/apply/projects/urls.py b/hypha/apply/projects/urls.py
index d6b311773922811161a4a53d8b4e3d4286acb22c..e23499768958187d0098bd1c9cc74255983eeaa2 100644
--- a/hypha/apply/projects/urls.py
+++ b/hypha/apply/projects/urls.py
@@ -21,7 +21,8 @@ from .views import (
     ReportPrivateMedia,
     ReportSkipView,
     ReportUpdateView,
-    # CreateVendorView,
+    CreateVendorView,
+    VendorFormSuccess,
 )
 
 app_name = 'projects'
@@ -37,7 +38,8 @@ urlpatterns = [
         path('download/', ProjectDetailPDFView.as_view(), name='download'),
         path('simplified/', ProjectDetailSimplifiedView.as_view(), name='simplified'),
         path('request/', CreatePaymentRequestView.as_view(), name='request'),
-        # path('vendor/', CreateVendorView.as_view(), name='vendor'),
+        path('vendor/', CreateVendorView.as_view(), name='vendor'),
+        path('vendor/success/', VendorFormSuccess.as_view(), name='vendor-success'),
     ])),
     path('payment-requests/', include(([
         path('', PaymentRequestListView.as_view(), name='all'),
diff --git a/hypha/apply/projects/views/__init__.py b/hypha/apply/projects/views/__init__.py
index 940f89395e695b1bb720a89a1430f497e9257bf9..1d920db3d2dcff181d0add1ce8400671d8a7b5d5 100644
--- a/hypha/apply/projects/views/__init__.py
+++ b/hypha/apply/projects/views/__init__.py
@@ -1,3 +1,89 @@
-from .payment import *  # NOQA
-from .project import *  # NOQA
-from .report import *  # NOQA
+from .payment import (
+    ChangePaymentRequestStatusView,
+    DeletePaymentRequestView,
+    PaymentRequestAdminView,
+    PaymentRequestApplicantView,
+    PaymentRequestView,
+    CreatePaymentRequestView,
+    EditPaymentRequestView,
+    PaymentRequestPrivateMedia,
+    PaymentRequestListView,
+)
+from .project import (
+    SendForApprovalView,
+    CreateApprovalView,
+    RejectionView,
+    UploadDocumentView,
+    RemoveDocumentView,
+    SelectDocumentView,
+    UpdateLeadView,
+    ApproveContractView,
+    UploadContractView,
+    BaseProjectDetailView,
+    AdminProjectDetailView,
+    ApplicantProjectDetailView,
+    ProjectDetailView,
+    ProjectPrivateMediaView,
+    ContractPrivateMediaView,
+    ProjectDetailSimplifiedView,
+    ProjectDetailPDFView,
+    ProjectApprovalEditView,
+    ApplicantProjectEditView,
+    ProjectEditView,
+    ProjectListView,
+    ProjectOverviewView,
+)
+from .report import (
+    ReportDetailView,
+    ReportUpdateView,
+    ReportPrivateMedia,
+    ReportSkipView,
+    ReportFrequencyUpdate,
+    ReportListView,
+)
+from .vendor import (
+    CreateVendorView,
+    VendorFormSuccess,
+)
+
+__all__ = [
+    'ChangePaymentRequestStatusView',
+    'DeletePaymentRequestView',
+    'PaymentRequestAdminView',
+    'PaymentRequestApplicantView',
+    'PaymentRequestView',
+    'CreatePaymentRequestView',
+    'EditPaymentRequestView',
+    'PaymentRequestPrivateMedia',
+    'PaymentRequestListView',
+    'SendForApprovalView',
+    'CreateApprovalView',
+    'RejectionView',
+    'UploadDocumentView',
+    'RemoveDocumentView',
+    'SelectDocumentView',
+    'UpdateLeadView',
+    'ApproveContractView',
+    'UploadContractView',
+    'BaseProjectDetailView',
+    'AdminProjectDetailView',
+    'ApplicantProjectDetailView',
+    'ProjectDetailView',
+    'ProjectPrivateMediaView',
+    'ContractPrivateMediaView',
+    'ProjectDetailSimplifiedView',
+    'ProjectDetailPDFView',
+    'ProjectApprovalEditView',
+    'ApplicantProjectEditView',
+    'ProjectEditView',
+    'ProjectListView',
+    'ProjectOverviewView',
+    'ReportDetailView',
+    'ReportUpdateView',
+    'ReportPrivateMedia',
+    'ReportSkipView',
+    'ReportFrequencyUpdate',
+    'ReportListView',
+    'CreateVendorView',
+    'VendorFormSuccess',
+]
diff --git a/hypha/apply/projects/views/vendor.py b/hypha/apply/projects/views/vendor.py
new file mode 100644
index 0000000000000000000000000000000000000000..8ed4ecacbb0e9fa28b2668e97e721792cc32090d
--- /dev/null
+++ b/hypha/apply/projects/views/vendor.py
@@ -0,0 +1,69 @@
+from hypha.apply.projects.models.vendor import BankInformation
+from django.views.generic import CreateView, TemplateView
+from django.shortcuts import redirect
+from django.urls import reverse
+from django.shortcuts import get_object_or_404
+
+from wagtail.core.models import Site
+from formtools.wizard.views import SessionWizardView
+from hypha.apply.utils.storage import PrivateStorage
+
+from ..models import Project, Vendor, DueDiligenceDocument, BankInformation
+from ..forms import (
+    CreateVendorFormStep1,
+    CreateVendorFormStep2,
+    CreateVendorFormStep3,
+    CreateVendorFormStep4,
+    CreateVendorFormStep5,
+    CreateVendorFormStep6,
+)
+
+
+class CreateVendorView(SessionWizardView):
+    model = Vendor
+    file_storage = PrivateStorage()
+    form_list = [
+        CreateVendorFormStep1,
+        CreateVendorFormStep2,
+        CreateVendorFormStep3,
+        CreateVendorFormStep4,
+        CreateVendorFormStep5,
+        CreateVendorFormStep6,
+    ]
+    template_name = 'application_projects/vendor_form.html'
+
+    def done(self, form_list, **kwargs):
+        project = get_object_or_404(Project, pk=self.kwargs['pk'])
+        cleaned_data = self.get_all_cleaned_data()
+        vendor = project.vendor
+        intermediary_bank_information = BankInformation.objects.create(
+            account_routing_number=cleaned_data['ib_account_routing_number'],
+            account_number=cleaned_data['ib_account_number'],
+            account_currency=cleaned_data['ib_account_currency'],
+            branch_address=cleaned_data['ib_branch_address']
+        )
+        bank_information = BankInformation.objects.create(
+            account_holder_name=cleaned_data['account_holder_name'],
+            account_routing_number=cleaned_data['account_routing_number'],
+            account_number=cleaned_data['account_number'],
+            account_currency=cleaned_data['account_currency'],
+            need_extra_info=cleaned_data['need_extra_info'],
+            branch_address=cleaned_data['branch_address'],
+            iba_info=intermediary_bank_information
+        )
+        vendor.bank_info = bank_information
+        vendor.full_name = cleaned_data['name']
+        vendor.contractor_name = cleaned_data['contractor_name']
+        vendor.type = cleaned_data['type']
+        vendor.required_to_pay_taxes = cleaned_data['required_to_pay_taxes']
+        vendor.save()
+        return redirect(reverse('/vendor/success/', args=[project.id]))
+
+    def get_form_kwargs(self, step):
+        kwargs = super(CreateVendorView, self).get_form_kwargs(step)
+        kwargs['site'] = Site.find_for_request(self.request)
+        return kwargs
+
+
+class VendorFormSuccess(TemplateView):
+    template_name = "application_projects/vendor_success.html"
diff --git a/hypha/apply/templates/forms/includes/field.html b/hypha/apply/templates/forms/includes/field.html
index 905df0394ea3b35e176afa9d63795829bc36daf9..77b96d800d8a210f5c53a671c9c625030f73943c 100644
--- a/hypha/apply/templates/forms/includes/field.html
+++ b/hypha/apply/templates/forms/includes/field.html
@@ -1,5 +1,4 @@
-{% load util_tags %}
-
+{% load util_tags wagtailadmin_tags %}
 {% with widget_type=field|widget_type field_type=field|field_type %}
 
 <div class="form__group {% if widget_type == 'checkbox_input' %} form__group--checkbox{% endif %}{% if widget_type == 'clearable_file_input' or widget_type == 'multi_file_input' or widget_type == 'single_file_field_widget' or widget_type == 'multi_file_field_widget' %} form__group--file{% endif %}{% if field.help_text %} form__group--wrap{% endif %}{% if field.errors %} form__error{% endif %}{% if is_application and field.field.group_number > 1 %} field-group field-group-{{ field.field.group_number }}{% endif %}{% if is_application and field.field.grouper_for %} form-fields-grouper{% endif %}"{% if is_application and field.field.grouper_for %}data-grouper-for="{{ field.field.grouper_for }}" data-toggle-on="{{ field.field.choices.0.0 }}" data-toggle-off="{{ field.field.choices.1.0 }}"{% endif %}{% if is_application and field.field.group_number > 1 %} data-hidden="{% if not show_all_group_fields and not field.field.visible %}true{% else %}false{% endif %}" data-required="{{ field.field.required_when_visible }}"{% endif %}{% if field.field.word_limit %} data-word-limit="{{ field.field.word_limit }}"{% endif %}>
diff --git a/hypha/settings/base.py b/hypha/settings/base.py
index 39444be49185064755704e969bf1fd27216b57f0..167fa237045879cc29808028285f4ba964cf69b9 100644
--- a/hypha/settings/base.py
+++ b/hypha/settings/base.py
@@ -152,6 +152,7 @@ INSTALLED_APPS = [
     'django.contrib.staticfiles',
     'django.contrib.sitemaps',
     'django.forms',
+    'formtools',
 ]
 
 MIDDLEWARE = [