diff --git a/SciPost_v1/settings/base.py b/SciPost_v1/settings/base.py
index 481934e10ee9ec7fc6ac48b4e898a56bc1e8ff6b..3a236b58512d1010200fe03a6e643579614ad7cc 100644
--- a/SciPost_v1/settings/base.py
+++ b/SciPost_v1/settings/base.py
@@ -94,6 +94,7 @@ INSTALLED_APPS = (
     'theses',
     'virtualmeetings',
     'production',
+    'partners',
     'webpack_loader',
 )
 
diff --git a/SciPost_v1/urls.py b/SciPost_v1/urls.py
index 36ab1c7ced277f745ad08e22922ebd4d594c6c21..7b29434e2aae982aa946d1363cfefcf35d4f4d79 100644
--- a/SciPost_v1/urls.py
+++ b/SciPost_v1/urls.py
@@ -43,6 +43,8 @@ urlpatterns = [
     url(r'^meetings/', include('virtualmeetings.urls', namespace="virtualmeetings")),
     url(r'^news/', include('news.urls', namespace="news")),
     url(r'^production/', include('production.urls', namespace="production")),
+    url(r'^partners/', include('partners.urls', namespace="partners")),
+    url(r'^supporting_partners/', include('partners.urls', namespace="partners")), # Keep temporarily for historical reasons
 ]
 
 if settings.DEBUG:
diff --git a/partners/__init__.py b/partners/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/partners/admin.py b/partners/admin.py
new file mode 100644
index 0000000000000000000000000000000000000000..6295519faa26f5bee354818f25a827375b6b3a94
--- /dev/null
+++ b/partners/admin.py
@@ -0,0 +1,23 @@
+from django.contrib import admin
+
+from .models import ContactPerson, Partner, Consortium,\
+    ProspectivePartner, MembershipAgreement
+
+
+admin.site.register(ContactPerson)
+
+
+class PartnerAdmin(admin.ModelAdmin):
+    search_fields = ['institution', 'institution_acronym',
+                     'institution_address', 'contact_person']
+
+admin.site.register(Partner, PartnerAdmin)
+
+
+admin.site.register(Consortium)
+
+
+admin.site.register(ProspectivePartner)
+
+
+admin.site.register(MembershipAgreement)
diff --git a/partners/apps.py b/partners/apps.py
new file mode 100644
index 0000000000000000000000000000000000000000..22e6fe3bc79c57abf3a8a51ccf4f6dc9ca1ff251
--- /dev/null
+++ b/partners/apps.py
@@ -0,0 +1,5 @@
+from django.apps import AppConfig
+
+
+class PartnersConfig(AppConfig):
+    name = 'partners'
diff --git a/partners/constants.py b/partners/constants.py
new file mode 100644
index 0000000000000000000000000000000000000000..ec05c2315596b05013b825e5c27531e75aaca543
--- /dev/null
+++ b/partners/constants.py
@@ -0,0 +1,43 @@
+import datetime
+
+
+PARTNER_TYPES = (
+    ('Int. Fund. Agency', 'International Funding Agency'),
+    ('Nat. Fund. Agency', 'National Funding Agency'),
+    ('Nat. Library', 'National Library'),
+    ('Univ. Library', 'University Library'),
+    ('Res. Library', 'Research Library'),
+    ('Foundation', 'Foundation'),
+    ('Individual', 'Individual'),
+)
+
+PARTNER_STATUS = (
+    ('Prospective', 'Prospective'),
+    ('Negotiating', 'Negotiating'),
+    ('Active', 'Active'),
+    ('Inactive', 'Inactive'),
+)
+
+
+CONSORTIUM_STATUS = (
+    ('Prospective', 'Prospective'),
+    ('Active', 'Active'),
+    ('Inactive', 'Inactive'),
+)
+
+
+MEMBERSHIP_AGREEMENT_STATUS = (
+    ('Submitted', 'Request submitted by Partner'),
+    ('Pending', 'Sent to Partner, response pending'),
+    ('Signed', 'Signed by Partner'),
+    ('Honoured', 'Honoured: payment of Partner received'),
+    ('Completed', 'Completed: agreement has been fulfilled'),
+)
+
+MEMBERSHIP_DURATION = (
+    (datetime.timedelta(days=365), '1 year'),
+    (datetime.timedelta(days=730), '2 years'),
+    (datetime.timedelta(days=1095), '3 years'),
+    (datetime.timedelta(days=1460), '4 years'),
+    (datetime.timedelta(days=1825), '5 years'),
+)
diff --git a/partners/forms.py b/partners/forms.py
new file mode 100644
index 0000000000000000000000000000000000000000..f53c3844c01dddb68c23f2eeef32489bcdb67001
--- /dev/null
+++ b/partners/forms.py
@@ -0,0 +1,46 @@
+from django import forms
+
+from captcha.fields import ReCaptchaField
+from django_countries import countries
+from django_countries.widgets import CountrySelectWidget
+from django_countries.fields import LazyTypedChoiceField
+
+from .constants import PARTNER_TYPES
+from .models import ContactPerson, Partner, ProspectivePartner, MembershipAgreement
+
+from scipost.models import TITLE_CHOICES
+
+
+class PartnerForm(forms.ModelForm):
+    class Meta:
+        model = Partner
+        fields = '__all__'
+
+    def __init__(self, *args, **kwargs):
+        super(PartnerForm, self).__init__(*args, **kwargs)
+        self.fields['institution_address'].widget = forms.Textarea({'rows': 8, })
+
+class ProspectivePartnerForm(forms.ModelForm):
+    class Meta:
+        model = ProspectivePartner
+        exclude = ['date_received', 'date_processed', 'processed']
+
+
+class MembershipQueryForm(forms.Form):
+    """
+    This form is to be used by an agent of the prospective Partner,
+    in order to request more information about potentially joining the SPB.
+    """
+    title = forms.ChoiceField(choices=TITLE_CHOICES, label='* Your title')
+    first_name = forms.CharField(label='* Your first name', max_length=100)
+    last_name = forms.CharField(label='* Your last name', max_length=100)
+    email = forms.EmailField(label='* Your email address')
+    role = forms.CharField(label='* Your role in your organization')
+    partner_type = forms.ChoiceField(choices=PARTNER_TYPES, label='* Partner type')
+    institution_name = forms.CharField(label='* Name of your institution')
+    country = LazyTypedChoiceField(
+        choices=countries, label='* Country', initial='NL',
+        widget=CountrySelectWidget(layout=(
+            '{widget}<img class="country-select-flag" id="{flag_id}"'
+            ' style="margin: 6px 4px 0" src="{country.flag}">')))
+    captcha = ReCaptchaField(attrs={'theme': 'clean'}, label='*Please verify to continue:')
diff --git a/partners/migrations/0001_initial.py b/partners/migrations/0001_initial.py
new file mode 100644
index 0000000000000000000000000000000000000000..9f7fdd7dcfe5882c5057e8d2d8991c996d956abc
--- /dev/null
+++ b/partners/migrations/0001_initial.py
@@ -0,0 +1,74 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.10.3 on 2017-05-19 08:59
+from __future__ import unicode_literals
+
+import datetime
+from django.conf import settings
+from django.db import migrations, models
+import django.db.models.deletion
+import django_countries.fields
+
+
+class Migration(migrations.Migration):
+
+    initial = True
+
+    dependencies = [
+        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name='Consortium',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('name', models.CharField(max_length=128)),
+                ('status', models.CharField(choices=[('Prospective', 'Prospective'), ('Active', 'Active'), ('Inactive', 'Inactive')], max_length=16)),
+            ],
+        ),
+        migrations.CreateModel(
+            name='ContactPerson',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('title', models.CharField(choices=[('PR', 'Prof.'), ('DR', 'Dr'), ('MR', 'Mr'), ('MRS', 'Mrs')], max_length=4)),
+                ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
+            ],
+        ),
+        migrations.CreateModel(
+            name='MembershipAgreement',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('status', models.CharField(choices=[('Submitted', 'Request submitted by Partner'), ('Pending', 'Sent to Partner, response pending'), ('Signed', 'Signed by Partner'), ('Honoured', 'Honoured: payment of Partner received'), ('Completed', 'Completed: agreement has been fulfilled')], max_length=16)),
+                ('date_requested', models.DateField()),
+                ('start_date', models.DateField()),
+                ('duration', models.DurationField(choices=[(datetime.timedelta(365), '1 year'), (datetime.timedelta(730), '2 years'), (datetime.timedelta(1095), '3 years'), (datetime.timedelta(1460), '4 years'), (datetime.timedelta(1825), '5 years')])),
+                ('offered_yearly_contribution', models.SmallIntegerField(default=0)),
+                ('consortium', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='partners.Consortium')),
+            ],
+        ),
+        migrations.CreateModel(
+            name='Partner',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('partner_type', models.CharField(choices=[('Int. Fund. Agency', 'International Funding Agency'), ('Nat. Fund. Agency', 'National Funding Agency'), ('Nat. Library', 'National Library'), ('Univ. Library', 'University Library'), ('Res. Library', 'Research Library'), ('Foundation', 'Foundation'), ('Individual', 'Individual')], max_length=32)),
+                ('status', models.CharField(choices=[('Prospective', 'Prospective'), ('Negotiating', 'Negotiating'), ('Active', 'Active'), ('Inactive', 'Inactive')], max_length=16)),
+                ('institution_name', models.CharField(max_length=256)),
+                ('institution_acronym', models.CharField(max_length=10)),
+                ('institution_address', models.CharField(blank=True, max_length=1000, null=True)),
+                ('country', django_countries.fields.CountryField(max_length=2)),
+                ('financial_contact', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='partner_financial_contact', to='partners.ContactPerson')),
+                ('main_contact', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='partner_main_contact', to='partners.ContactPerson')),
+                ('technical_contact', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='partner_technical_contact', to='partners.ContactPerson')),
+            ],
+        ),
+        migrations.AddField(
+            model_name='membershipagreement',
+            name='partner',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='partners.Partner'),
+        ),
+        migrations.AddField(
+            model_name='consortium',
+            name='partners',
+            field=models.ManyToManyField(blank=True, to='partners.Partner'),
+        ),
+    ]
diff --git a/partners/migrations/0002_auto_20170519_1335.py b/partners/migrations/0002_auto_20170519_1335.py
new file mode 100644
index 0000000000000000000000000000000000000000..8bffe6c9bbe4a80f18c7533550ad3b1ebce65321
--- /dev/null
+++ b/partners/migrations/0002_auto_20170519_1335.py
@@ -0,0 +1,40 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.10.3 on 2017-05-19 11:35
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+import django.utils.timezone
+import django_countries.fields
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('partners', '0001_initial'),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name='MembershipQuery',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('title', models.CharField(choices=[('PR', 'Prof.'), ('DR', 'Dr'), ('MR', 'Mr'), ('MRS', 'Mrs')], max_length=4)),
+                ('first_name', models.CharField(max_length=32)),
+                ('last_name', models.CharField(max_length=32)),
+                ('email', models.EmailField(max_length=254)),
+                ('partner_type', models.CharField(choices=[('Int. Fund. Agency', 'International Funding Agency'), ('Nat. Fund. Agency', 'National Funding Agency'), ('Nat. Library', 'National Library'), ('Univ. Library', 'University Library'), ('Res. Library', 'Research Library'), ('Foundation', 'Foundation'), ('Individual', 'Individual')], max_length=32)),
+                ('institution_name', models.CharField(max_length=256)),
+                ('country', django_countries.fields.CountryField(max_length=2)),
+                ('date_received', models.DateTimeField(default=django.utils.timezone.now)),
+                ('date_processed', models.DateTimeField()),
+                ('processed', models.BooleanField(default=False)),
+            ],
+            options={
+                'verbose_name_plural': 'membership queries',
+            },
+        ),
+        migrations.AlterModelOptions(
+            name='consortium',
+            options={'verbose_name_plural': 'consortia'},
+        ),
+    ]
diff --git a/partners/migrations/0003_auto_20170519_1424.py b/partners/migrations/0003_auto_20170519_1424.py
new file mode 100644
index 0000000000000000000000000000000000000000..c5d9c35d8fcd8f7dc056c421fe2b0b32ceae6339
--- /dev/null
+++ b/partners/migrations/0003_auto_20170519_1424.py
@@ -0,0 +1,37 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.10.3 on 2017-05-19 12:24
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+import django.utils.timezone
+import django_countries.fields
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('partners', '0002_auto_20170519_1335'),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name='ProspectivePartner',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('title', models.CharField(choices=[('PR', 'Prof.'), ('DR', 'Dr'), ('MR', 'Mr'), ('MRS', 'Mrs')], max_length=4)),
+                ('first_name', models.CharField(max_length=32)),
+                ('last_name', models.CharField(max_length=32)),
+                ('email', models.EmailField(max_length=254)),
+                ('role', models.CharField(max_length=128)),
+                ('partner_type', models.CharField(choices=[('Int. Fund. Agency', 'International Funding Agency'), ('Nat. Fund. Agency', 'National Funding Agency'), ('Nat. Library', 'National Library'), ('Univ. Library', 'University Library'), ('Res. Library', 'Research Library'), ('Foundation', 'Foundation'), ('Individual', 'Individual')], max_length=32)),
+                ('institution_name', models.CharField(max_length=256)),
+                ('country', django_countries.fields.CountryField(max_length=2)),
+                ('date_received', models.DateTimeField(default=django.utils.timezone.now)),
+                ('date_processed', models.DateTimeField()),
+                ('processed', models.BooleanField(default=False)),
+            ],
+        ),
+        migrations.DeleteModel(
+            name='MembershipQuery',
+        ),
+    ]
diff --git a/partners/migrations/0004_auto_20170519_1425.py b/partners/migrations/0004_auto_20170519_1425.py
new file mode 100644
index 0000000000000000000000000000000000000000..f44c307494246de26b93ad9a8dc869f5a9d3a8a2
--- /dev/null
+++ b/partners/migrations/0004_auto_20170519_1425.py
@@ -0,0 +1,20 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.10.3 on 2017-05-19 12:25
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('partners', '0003_auto_20170519_1424'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='prospectivepartner',
+            name='date_processed',
+            field=models.DateTimeField(blank=True, null=True),
+        ),
+    ]
diff --git a/partners/migrations/__init__.py b/partners/migrations/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/partners/models.py b/partners/models.py
new file mode 100644
index 0000000000000000000000000000000000000000..123b99d4cd07a9975a0fc80964068f4264e85fe3
--- /dev/null
+++ b/partners/models.py
@@ -0,0 +1,107 @@
+from django.contrib.auth.models import User
+from django.db import models
+from django.utils import timezone
+
+from django_countries.fields import CountryField
+
+from .constants import PARTNER_TYPES, PARTNER_STATUS, CONSORTIUM_STATUS,\
+    MEMBERSHIP_AGREEMENT_STATUS, MEMBERSHIP_DURATION
+
+from scipost.constants import TITLE_CHOICES
+from scipost.models import Contributor
+
+
+class ContactPerson(models.Model):
+    """
+    A ContactPerson is a simple form of User which is meant
+    to be associated to Partner objects
+    (main contact, financial/technical contact etc).
+    ContactPersons and Contributors have different rights.
+    """
+    user = models.OneToOneField(User, on_delete=models.CASCADE, unique=True)
+    title = models.CharField(max_length=4, choices=TITLE_CHOICES)
+
+    def __str__(self):
+        return '%s %s, %s' % (self.get_title_display(), self.user.last_name, self.user.first_name)
+
+
+class Partner(models.Model):
+    """
+    Supporting Partners.
+    These are the official Partner objects created by SciPost Admin.
+    """
+    partner_type = models.CharField(max_length=32, choices=PARTNER_TYPES)
+    status = models.CharField(max_length=16, choices=PARTNER_STATUS)
+    institution_name = models.CharField(max_length=256)
+    institution_acronym = models.CharField(max_length=10)
+    institution_address = models.CharField(max_length=1000, blank=True, null=True)
+    country = CountryField()
+    main_contact = models.ForeignKey(ContactPerson, on_delete=models.CASCADE,
+                                     blank=True, null=True,
+                                     related_name='partner_main_contact')
+    financial_contact = models.ForeignKey(ContactPerson, on_delete=models.CASCADE,
+                                          blank=True, null=True,
+                                          related_name='partner_financial_contact')
+    technical_contact = models.ForeignKey(ContactPerson, on_delete=models.CASCADE,
+                                          blank=True, null=True,
+                                          related_name='partner_technical_contact')
+
+    def __str__(self):
+        return self.institution_acronym + ' (' + self.get_status_display() + ')'
+
+
+class Consortium(models.Model):
+    """
+    Collection of Partners.
+    """
+    name = models.CharField(max_length=128)
+    partners = models.ManyToManyField(Partner, blank=True)
+    status = models.CharField(max_length=16, choices=CONSORTIUM_STATUS)
+
+    class Meta:
+        verbose_name_plural = 'consortia'
+
+
+
+class ProspectivePartner(models.Model):
+    """
+    Created from the membership_request page, after submitting a query form.
+    """
+    title = models.CharField(max_length=4, choices=TITLE_CHOICES)
+    first_name = models.CharField(max_length=32)
+    last_name = models.CharField(max_length=32)
+    email = models.EmailField()
+    role = models.CharField(max_length=128)
+    partner_type = models.CharField(max_length=32, choices=PARTNER_TYPES)
+    institution_name = models.CharField(max_length=256)
+    country = CountryField()
+    date_received = models.DateTimeField(default=timezone.now)
+    date_processed = models.DateTimeField(blank=True, null=True)
+    processed = models.BooleanField(default=False)
+
+    def __str__(self):
+        resp = "processed"
+        if not self.processed:
+            resp = "unprocessed"
+        return '%s (received %s), %s' % (self.institution_name,
+                                         self.date_received.strftime("%Y-%m-%d"),
+                                         resp)
+
+
+class MembershipAgreement(models.Model):
+    """
+    Agreement for membership of the Supporting Partners Board.
+    A new instance is created each time an Agreement is made or renewed.
+    """
+    partner = models.ForeignKey(Partner, on_delete=models.CASCADE, blank=True, null=True)
+    consortium = models.ForeignKey(Consortium, on_delete=models.CASCADE, blank=True, null=True)
+    status = models.CharField(max_length=16, choices=MEMBERSHIP_AGREEMENT_STATUS)
+    date_requested = models.DateField()
+    start_date = models.DateField()
+    duration = models.DurationField(choices=MEMBERSHIP_DURATION)
+    offered_yearly_contribution = models.SmallIntegerField(default=0)
+
+    def __str__(self):
+        return (str(self.partner) +
+                ' [' + self.get_duration_display() +
+                ' from ' + self.start_date.strftime('%Y-%m-%d') + ']')
diff --git a/partners/templates/partners/_partner_card.html b/partners/templates/partners/_partner_card.html
new file mode 100644
index 0000000000000000000000000000000000000000..31175dccfad720d674489d66f3165abe4803c9af
--- /dev/null
+++ b/partners/templates/partners/_partner_card.html
@@ -0,0 +1,31 @@
+{% load bootstrap %}
+
+<div class="card-block">
+  <div class="row">
+    <div class="col-1">
+      <p>{{ partner.country }}</p>
+    </div>
+    <div class="col-4">
+      <h3>{{ partner.institution_name }}</h3>
+      <p>{{ partner.institution_acronym }}</p>
+      <p>({{ pp.get_partner_type_display }})</p>
+    </div>
+    <div class="col-4">
+      {% if partner.main_contact %}
+      <p>Main contact: {{ partner.main_contact..get_title_display }} {{ partner.main_contact.user.first_name }} {{ partner.main_contact.user.last_name }}</p>
+      <p>{{ partner.main_contact.user.email }}</p>
+      {% endif %}
+      {% if partner.financial_contact %}
+      <p>Financial contact: {{ partner.financial_contact..get_title_display }} {{ partner.financial_contact.user.first_name }} {{ partner.financial_contact.user.last_name }}</p>
+      <p>{{ partner.financial_contact.user.email }}</p>
+      {% endif %}
+      {% if partner.technical_contact %}
+      <p>Technical contact: {{ partner.technical_contact..get_title_display }} {{ partner.technical_contact.user.first_name }} {{ partner.technical_contact.user.last_name }}</p>
+      <p>{{ partner.technical_contact.user.email }}</p>
+      {% endif %}
+    </div>
+    <div class="col-3">
+      <p>Edit</p>
+    </div>
+  </div>
+</div>
diff --git a/partners/templates/partners/_prospective_partner_card.html b/partners/templates/partners/_prospective_partner_card.html
new file mode 100644
index 0000000000000000000000000000000000000000..fe2624c247b05a878622743b0c213a80467220cc
--- /dev/null
+++ b/partners/templates/partners/_prospective_partner_card.html
@@ -0,0 +1,22 @@
+{% load bootstrap %}
+
+<div class="card-block">
+  <div class="row">
+    <div class="col-1">
+      <p>{{ pp.country }}</p>
+    </div>
+    <div class="col-4">
+      <h3>{{ pp.institution_name }}</h3>
+      <p>({{ pp.get_partner_type_display }})</p>
+      <p>Received {{ pp.date_received }}</p>
+    </div>
+    <div class="col-4">
+      <p>Contact: {{ pp.get_title_display }} {{ pp.first_name }} {{ pp.last_name }}</p>
+      <p>(role: {{ pp.role }})</p>
+      <p>{{ pp.email }}</p>
+    </div>
+    <div class="col-3">
+      <p>Edit</p>
+    </div>
+  </div>
+</div>
diff --git a/partners/templates/partners/add_prospective_partner.html b/partners/templates/partners/add_prospective_partner.html
new file mode 100644
index 0000000000000000000000000000000000000000..737780443f5c8da12d23699d2845e666fbf1ce14
--- /dev/null
+++ b/partners/templates/partners/add_prospective_partner.html
@@ -0,0 +1,29 @@
+{% extends 'scipost/base.html' %}
+
+{% block pagetitle %}: Supporting Partners: add{% endblock pagetitle %}
+
+{% load bootstrap %}
+
+{% block content %}
+
+<section>
+  <div class="flex-container">
+    <div class="flex-greybox">
+      <h1>Add a Prospective Partner</h1>
+    </div>
+  </div>
+  <p>Please provide contact details of an appropriate representative, and details about the potential Partner.</p>
+
+    <form action="{% url 'partners:add_prospective_partner' %}" method="post">
+      {% csrf_token %}
+      {{ form|bootstrap }}
+      <input class="btn btn-primary" type="submit" value="Submit"/>
+    </form>
+
+    {% if errormessage %}
+    <p class="text-danger">{{ errormessage }}</p>
+    {% endif %}
+
+</section>
+
+{% endblock content %}
diff --git a/partners/templates/partners/manage_partners.html b/partners/templates/partners/manage_partners.html
new file mode 100644
index 0000000000000000000000000000000000000000..95fb172639561b9c03f3d03c7a97711b0ccdf18a
--- /dev/null
+++ b/partners/templates/partners/manage_partners.html
@@ -0,0 +1,55 @@
+{% extends 'scipost/base.html' %}
+
+{% block pagetitle %}: Supporting Partners: manage{% endblock pagetitle %}
+
+
+{% block content %}
+
+<div class="flex-container">
+  <div class="flex-greybox">
+    <h1>Partners Management Page</h1>
+  </div>
+</div>
+
+<section>
+  <div class="flex-container">
+    <div class="flex-greybox">
+      <h2>Partners</h2>
+    </div>
+  </div>
+  <ul class="list-group list-group-flush">
+    {% for partner in partners %}
+    <li class="list-group-item">{% include 'partners/_partner_card.html' with partner=partner %}</li>
+    {% endfor %}
+  </ul>
+</section>
+
+<section>
+  <div class="flex-container">
+    <div class="flex-greybox">
+      <h2>Prospective Partners (not yet processed)</h2>
+    </div>
+  </div>
+  <h3><a href="{% url 'partners:add_prospective_partner' %}">Add a prospective partner</a></h3>
+  <br/>
+  <ul class="list-group list-group-flush">
+    {% for partner in prospective_partners %}
+    <li class="list-group-item">{% include 'partners/_prospective_partner_card.html' with pp=partner %}</li>
+    {% endfor %}
+  </ul>
+</section>
+
+<section>
+  <div class="flex-container">
+    <div class="flex-greybox">
+      <h2>Agreements</h2>
+    </div>
+  </div>
+  <ul>
+    {% for agreement in agreements %}
+    <li>{{ agreement }}</li>
+    {% endfor %}
+  </ul>
+</section>
+
+{% endblock content %}
diff --git a/scipost/templates/scipost/SPB_membership_request.html b/partners/templates/partners/membership_request.html
similarity index 74%
rename from scipost/templates/scipost/SPB_membership_request.html
rename to partners/templates/partners/membership_request.html
index 2048761d33e9e9e89f7d71d9ba4181d756e24c01..13e312907df28f848d1eeb15705c45a45ed33cb9 100644
--- a/scipost/templates/scipost/SPB_membership_request.html
+++ b/partners/templates/partners/membership_request.html
@@ -37,27 +37,27 @@ $(document).ready(function(){
 
   <div class="flex-container">
     <div class="flex-whitebox">
-      <p>You can hereby initiate the process to become one of our Supporting Partners.</p>
+      <p>You can hereby request further details on the process to become one
+	of our Supporting Partners.</p>
       <p>Filling in this form does not yet constitute a binding agreement.</p>
       <p>It simply expresses your interest in considering joining our Supporting Partners Board.</p>
-      <p>After filling this form, SciPost Administration will contact you with a Partnership
-	Agreement offer.</p>
+      <p>After filling this form, SciPost Administration will contact you with more details on Partnership.</p>
       <p><em>Note: you will automatically be considered as the contact person for this Partner.</em></p>
 
       {% if errormessage %}
       <p style="color: red;">{{ errormessage }}</p>
       {% endif %}
 
-      <form action="{% url 'scipost:SPB_membership_request' %}" method="post">
+      <form action="{% url 'partners:membership_request' %}" method="post">
 	{% csrf_token %}
-	<h3>Partner details:</h3>
-	
-	{{ SP_form|bootstrap }}
-	<h3>Agreement terms:</h3>
-	{{ membership_form|bootstrap }}
-	<input class="btn btn-secondary" type="submit" value="Submit"/>
+	<h3>Please provide us the following relevant details:</h3>
+	{{ query_form|bootstrap }}
+	<input class="btn btn-primary" type="submit" value="Submit"/>
       </form>
 
+      {% if errormessage %}
+          <p class="text-danger">{{ errormessage }}</p>
+      {% endif %}
     </div>
   </div>
 
diff --git a/scipost/templates/scipost/supporting_partners.html b/partners/templates/partners/supporting_partners.html
similarity index 93%
rename from scipost/templates/scipost/supporting_partners.html
rename to partners/templates/partners/supporting_partners.html
index f5ced193e5cf7364cf6501cbbdf892a32e365e58..b1434fb8c75e7465993224ad3118362e8ac9b45b 100644
--- a/scipost/templates/scipost/supporting_partners.html
+++ b/partners/templates/partners/supporting_partners.html
@@ -8,7 +8,6 @@
 
 {% block bodysup %}
 
-
 <section>
   <div class="flex-container">
     <div class="flex-greybox">
@@ -16,6 +15,10 @@
     </div>
   </div>
 
+  {% if perms.scipost.can_manage_SPB %}
+  <a href="{% url 'partners:manage' %}">Manage Partners</a>
+  {% endif %}
+
   <div class="flex-container">
     <div class="flex-whitebox">
 
@@ -41,7 +44,7 @@
 
   <p>We hereby cordially invite interested parties who are supportive of SciPost's mission to join the SciPost Supporting Partners Board by signing a <a href="{% static 'scipost/SPB/SciPost_Supporting_Partner_Agreement.pdf' %}">Partner Agreement</a>.</p>
 
-  <p>Prospective partners can initiate the process leading to Membership by filling the <a href="{% url 'scipost:SPB_membership_request' %}">online request form</a>.</p>
+  <p>Prospective partners can query for more information about Membership by filling the <a href="{% url 'partners:membership_request' %}">online query form</a>.</p>
 
   <br/>
   <p>The <a href="{% static 'scipost/SPB/SciPost_Supporting_Partner_Agreement.pdf' %}">Partner Agreement</a> itself contains a detailed presentation of the Foundation, its activities and financial aspects. What follows is a summary of the most important points.</p>
@@ -107,7 +110,7 @@
   <h3>Activation procedure</h3>
   <p>In order to become a Supporting Partner, one must:
     <ul>
-      <li>Fill in the online <a href="{% url 'scipost:SPB_membership_request' %}">membership request form</a> (the form must be filled in by a registered Contributor, employed by or associated to the prospective Partner and acting as an authorized agent for the latter; personal contact details of this person will be treated confidentially).</li>
+      <li>Fill in the online <a href="{% url 'partners:membership_request' %}">membership request form</a> (the form must be filled in by an authorized agent employed by or associated to the prospective Partner; personal contact details of this person will be treated confidentially).</li>
       <li>Wait for the email response from the SciPost administration, containing a Partnership Agreement offer including detailed terms (start date, duration, financial contribution).</li>
       <li>Email a scan of the signed copy of the Partnership Agreement to SciPost.</li>
       <li>Proceed with the payment of the financial contribution, following invoicing from the SciPost Foundation.</li>
diff --git a/partners/tests.py b/partners/tests.py
new file mode 100644
index 0000000000000000000000000000000000000000..7ce503c2dd97ba78597f6ff6e4393132753573f6
--- /dev/null
+++ b/partners/tests.py
@@ -0,0 +1,3 @@
+from django.test import TestCase
+
+# Create your tests here.
diff --git a/partners/urls.py b/partners/urls.py
new file mode 100644
index 0000000000000000000000000000000000000000..3c3dd7ebb828f446978d61c6ef781ae3a84b273f
--- /dev/null
+++ b/partners/urls.py
@@ -0,0 +1,14 @@
+from django.conf.urls import include, url
+
+from . import views
+
+urlpatterns = [
+
+    url(r'^$', views.supporting_partners,
+        name='partners'),
+    url(r'^membership_request$', views.membership_request,
+        name='membership_request'),
+    url(r'^manage$', views.manage, name='manage'),
+    url(r'^add_prospective_partner$', views.add_prospective_partner,
+        name='add_prospective_partner'),
+]
diff --git a/partners/views.py b/partners/views.py
new file mode 100644
index 0000000000000000000000000000000000000000..dd338e2325feb3b488c6a96c8f94d608eccd5704
--- /dev/null
+++ b/partners/views.py
@@ -0,0 +1,64 @@
+from django.contrib.auth.decorators import login_required
+from django.contrib import messages
+from django.shortcuts import render, reverse, redirect
+from django.utils import timezone
+
+from guardian.decorators import permission_required
+
+from .models import Partner, Consortium, ProspectivePartner, MembershipAgreement
+from .forms import PartnerForm, ProspectivePartnerForm, MembershipQueryForm
+
+def supporting_partners(request):
+    prospective_agreements = MembershipAgreement.objects.filter(
+        status='Submitted').order_by('date_requested')
+    context = {'prospective_partners': prospective_agreements, }
+    return render(request, 'partners/supporting_partners.html', context)
+
+
+def membership_request(request):
+    query_form = MembershipQueryForm(request.POST or None)
+    if query_form.is_valid():
+        query = ProspectivePartner(
+            title=query_form.cleaned_data['title'],
+            first_name=query_form.cleaned_data['first_name'],
+            last_name=query_form.cleaned_data['last_name'],
+            email=query_form.cleaned_data['email'],
+            partner_type=query_form.cleaned_data['partner_type'],
+            institution_name=query_form.cleaned_data['institution_hame'],
+            country=query_form.cleaned_data['country'],
+            date_received=timezone.now(),
+        )
+        query.save()
+        ack_message = ('Thank you for your SPB Membership query. '
+                       'We will get back to you in the very near future '
+                       'with further details.')
+        context = {'ack_message': ack_message, }
+        return render(request, 'scipost/acknowledgement.html', context)
+    context = {'query_form': query_form,}
+    return render(request, 'partners/membership_request.html', context)
+
+
+@permission_required('scipost.can_manage_SPB', return_403=True)
+def manage(request):
+    """
+    Lists relevant info regarding management of Supporting Partners Board.
+    """
+    partners = Partner.objects.all().order_by('country', 'institution_name')
+    prospective_partners = ProspectivePartner.objects.filter(
+        processed=False).order_by('date_received')
+    agreements = MembershipAgreement.objects.all().order_by('date_requested')
+    context = {'partners': partners,
+               'prospective_partners': prospective_partners,
+               'agreements': agreements, }
+    return render(request, 'partners/manage_partners.html', context)
+
+
+@permission_required('scipost.can_manage_SPB', return_403=True)
+def add_prospective_partner(request):
+    form = ProspectivePartnerForm(request.POST or None)
+    if form.is_valid():
+        pros_partner = form.save()
+        messages.success(request, 'Prospective Partners successfully added')
+        return redirect(reverse('partners:manage'))
+    context = {'form': form,}
+    return render(request, 'partners/add_prospective_partner.html', context)
diff --git a/scipost/admin.py b/scipost/admin.py
index af7ea2f7840bc90c5f207a131569457c6694055d..2f137a42295438e82e056a70de4a15d600104ca4 100644
--- a/scipost/admin.py
+++ b/scipost/admin.py
@@ -8,7 +8,7 @@ from django.contrib.auth.models import User, Permission
 from scipost.models import Contributor, Remark,\
                            DraftInvitation,\
                            AffiliationObject,\
-                           SupportingPartner, SPBMembershipAgreement, RegistrationInvitation,\
+                           RegistrationInvitation,\
                            AuthorshipClaim, PrecookedEmail,\
                            EditorialCollege, EditorialCollegeFellowship
 
@@ -126,20 +126,6 @@ class AffiliationObjectAdmin(admin.ModelAdmin):
 admin.site.register(AffiliationObject, AffiliationObjectAdmin)
 
 
-class SPBMembershipAgreementInline(admin.StackedInline):
-    model = SPBMembershipAgreement
-
-
-class SupportingPartnerAdmin(admin.ModelAdmin):
-    search_fields = ['institution', 'institution_acronym',
-                     'institution_address', 'contact_person']
-    inlines = [
-        SPBMembershipAgreementInline,
-    ]
-
-
-admin.site.register(SupportingPartner, SupportingPartnerAdmin)
-
 
 class EditorialCollegeAdmin(admin.ModelAdmin):
     search_fields = ['discipline', 'member']
diff --git a/scipost/constants.py b/scipost/constants.py
index 790f06d6669469d03a4d664a8a4d0a865a6d0095..aa19e9b476d151d4400e2a14037b60c24b4a17b9 100644
--- a/scipost/constants.py
+++ b/scipost/constants.py
@@ -1,4 +1,3 @@
-import datetime
 
 
 DISCIPLINE_PHYSICS = 'physics'
@@ -186,39 +185,3 @@ SCIPOST_FROM_ADDRESSES = (
     ('J. van Wezel', 'J. van Wezel <vanwezel@scipost.org>'),
 )
 SciPost_from_addresses_dict = dict(SCIPOST_FROM_ADDRESSES)
-
-#
-# Supporting partner models
-#
-PARTNER_TYPES = (
-    ('Int. Fund. Agency', 'International Funding Agency'),
-    ('Nat. Fund. Agency', 'National Funding Agency'),
-    ('Nat. Library', 'National Library'),
-    ('Univ. Library', 'University Library'),
-    ('Res. Library', 'Research Library'),
-    ('Consortium', 'Consortium'),
-    ('Foundation', 'Foundation'),
-    ('Individual', 'Individual'),
-)
-
-PARTNER_STATUS = (
-    ('Prospective', 'Prospective'),
-    ('Active', 'Active'),
-    ('Inactive', 'Inactive'),
-)
-
-
-SPB_MEMBERSHIP_AGREEMENT_STATUS = (
-    ('Submitted', 'Request submitted by Partner'),
-    ('Pending', 'Sent to Partner, response pending'),
-    ('Signed', 'Signed by Partner'),
-    ('Honoured', 'Honoured: payment of Partner received'),
-)
-
-SPB_MEMBERSHIP_DURATION = (
-    (datetime.timedelta(days=365), '1 year'),
-    (datetime.timedelta(days=730), '2 years'),
-    (datetime.timedelta(days=1095), '3 years'),
-    (datetime.timedelta(days=1460), '4 years'),
-    (datetime.timedelta(days=1825), '5 years'),
-)
diff --git a/scipost/forms.py b/scipost/forms.py
index e1508ded5f231432cd2cb86afe3ff354c3b84cd1..7d830980a558b50c03ae13a09758c4875e4a4852 100644
--- a/scipost/forms.py
+++ b/scipost/forms.py
@@ -16,7 +16,6 @@ from crispy_forms.layout import Layout, Div, Field, HTML
 
 from .constants import SCIPOST_DISCIPLINES, TITLE_CHOICES, SCIPOST_FROM_ADDRESSES
 from .models import Contributor, DraftInvitation, RegistrationInvitation,\
-                    SupportingPartner, SPBMembershipAgreement,\
                     UnavailabilityPeriod, PrecookedEmail
 
 from journals.models import Publication
@@ -311,62 +310,3 @@ class SendPrecookedEmailForm(forms.Form):
         required=False, initial=False,
         label='Include SciPost summary at end of message')
     from_address = forms.ChoiceField(choices=SCIPOST_FROM_ADDRESSES)
-
-
-#############################
-# Supporting Partners Board #
-#############################
-
-class SupportingPartnerForm(forms.ModelForm):
-    class Meta:
-        model = SupportingPartner
-        fields = ['partner_type', 'institution',
-                  'institution_acronym', 'institution_address',
-                  'consortium_members'
-                  ]
-
-    def __init__(self, *args, **kwargs):
-        super(SupportingPartnerForm, self).__init__(*args, **kwargs)
-        self.fields['institution_address'].widget = forms.Textarea({'rows': 8, })
-        self.fields['consortium_members'].widget.attrs.update(
-            {'placeholder': 'Please list the names of the institutions within the consortium', })
-        self.helper = FormHelper()
-        self.helper.layout = Layout(
-            Div(
-                Div(
-                    Field('institution'),
-                    Field('institution_acronym'),
-                    Field('institution_address'),
-                    css_class='col-6'),
-                Div(
-                    Field('partner_type'),
-                    Field('consortium_members'),
-                    css_class='col-6'),
-                css_class='row')
-        )
-
-
-class SPBMembershipForm(forms.ModelForm):
-    class Meta:
-        model = SPBMembershipAgreement
-        fields = ['start_date', 'duration', 'offered_yearly_contribution']
-
-    def __init__(self, *args, **kwargs):
-        super(SPBMembershipForm, self).__init__(*args, **kwargs)
-        self.fields['start_date'].widget.attrs.update({'placeholder': 'YYYY-MM-DD'})
-        self.fields['offered_yearly_contribution'].initial = 1000
-        self.helper = FormHelper()
-        self.helper.layout = Layout(
-            Div(
-                Div(
-                    Field('start_date'),
-                    css_class="col-4"),
-                Div(
-                    Field('duration'),
-                    css_class="col-2"),
-                Div(
-                    Field('offered_yearly_contribution'),
-                    HTML('(euros)'),
-                    css_class="col-4"),
-                css_class="row"),
-        )
diff --git a/scipost/management/commands/add_groups_and_permissions.py b/scipost/management/commands/add_groups_and_permissions.py
index f353c60f855feef314a1e4037d91d97f15432629..5a40c6b13b941194b8c15f819a3fe884b16150b2 100644
--- a/scipost/management/commands/add_groups_and_permissions.py
+++ b/scipost/management/commands/add_groups_and_permissions.py
@@ -14,6 +14,7 @@ class Command(BaseCommand):
 
         # Create Groups
         SciPostAdmin, created = Group.objects.get_or_create(name='SciPost Administrators')
+        FinancialAdmin, created = Group.objects.get_or_create(name='Financial Administrators')
         AdvisoryBoard, created = Group.objects.get_or_create(name='Advisory Board')
         EditorialAdmin, created = Group.objects.get_or_create(name='Editorial Administrators')
         EditorialCollege, created = Group.objects.get_or_create(name='Editorial College')
@@ -29,6 +30,12 @@ class Command(BaseCommand):
         # Create Permissions
         content_type = ContentType.objects.get_for_model(Contributor)
 
+        # Supporting Partners
+        can_manage_SPB, created = Permission.objects.get_or_create(
+            codename='can_manage_SPB',
+            name='Can manage Supporting Partners Board',
+            content_type=content_type)
+
         # Registration and invitations
         can_vet_registration_requests, created = Permission.objects.get_or_create(
             codename='can_vet_registration_requests',
diff --git a/scipost/migrations/0055_auto_20170519_0937.py b/scipost/migrations/0055_auto_20170519_0937.py
new file mode 100644
index 0000000000000000000000000000000000000000..a3818779c198cd915fc642c64d90918024b12a9a
--- /dev/null
+++ b/scipost/migrations/0055_auto_20170519_0937.py
@@ -0,0 +1,29 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.10.3 on 2017-05-19 07:37
+from __future__ import unicode_literals
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('scipost', '0054_delete_newsitem'),
+    ]
+
+    operations = [
+        migrations.RemoveField(
+            model_name='spbmembershipagreement',
+            name='partner',
+        ),
+        migrations.RemoveField(
+            model_name='supportingpartner',
+            name='contact_person',
+        ),
+        migrations.DeleteModel(
+            name='SPBMembershipAgreement',
+        ),
+        migrations.DeleteModel(
+            name='SupportingPartner',
+        ),
+    ]
diff --git a/scipost/models.py b/scipost/models.py
index de7a46a6bb231ca3f5c51ec2d037524fb3b37631..1b2fa091fee75a4422c4f6186913904e4c3a48a8 100644
--- a/scipost/models.py
+++ b/scipost/models.py
@@ -17,9 +17,7 @@ from .constants import SCIPOST_DISCIPLINES, SCIPOST_SUBJECT_AREAS,\
                        subject_areas_dict, CONTRIBUTOR_STATUS, TITLE_CHOICES,\
                        INVITATION_STYLE, INVITATION_TYPE,\
                        INVITATION_CONTRIBUTOR, INVITATION_FORMAL,\
-                       AUTHORSHIP_CLAIM_PENDING, AUTHORSHIP_CLAIM_STATUS,\
-                       PARTNER_TYPES, PARTNER_STATUS,\
-                       SPB_MEMBERSHIP_AGREEMENT_STATUS, SPB_MEMBERSHIP_DURATION
+                       AUTHORSHIP_CLAIM_PENDING, AUTHORSHIP_CLAIM_STATUS
 from .fields import ChoiceArrayField
 from .managers import FellowManager, ContributorManager
 
@@ -334,43 +332,6 @@ class AffiliationObject(models.Model):
     subunit = models.CharField(max_length=128)
 
 
-#############################
-# Supporting Partners Board #
-#############################
-
-class SupportingPartner(models.Model):
-    """
-    Supporting Partners.
-    """
-    partner_type = models.CharField(max_length=32, choices=PARTNER_TYPES)
-    status = models.CharField(max_length=16, choices=PARTNER_STATUS)
-    institution = models.CharField(max_length=256)
-    institution_acronym = models.CharField(max_length=10)
-    institution_address = models.CharField(max_length=1000)
-    consortium_members = models.TextField(blank=True, null=True)
-    contact_person = models.ForeignKey(Contributor, on_delete=models.CASCADE)
-
-    def __str__(self):
-        return self.institution_acronym + ' (' + self.get_status_display() + ')'
-
-
-class SPBMembershipAgreement(models.Model):
-    """
-    Agreement for membership of the Supporting Partners Board.
-    A new instance is created each time an Agreement is made or renewed.
-    """
-    partner = models.ForeignKey(SupportingPartner, on_delete=models.CASCADE)
-    status = models.CharField(max_length=16, choices=SPB_MEMBERSHIP_AGREEMENT_STATUS)
-    date_requested = models.DateField()
-    start_date = models.DateField()
-    duration = models.DurationField(choices=SPB_MEMBERSHIP_DURATION)
-    offered_yearly_contribution = models.SmallIntegerField(default=0)
-
-    def __str__(self):
-        return (str(self.partner) +
-                ' [' + self.get_duration_display() +
-                ' from ' + self.start_date.strftime('%Y-%m-%d') + ']')
-
 
 ######################
 # Static info models #
diff --git a/scipost/urls.py b/scipost/urls.py
index d12d2fc75c8e25a73214656aff7faab8e44f8238..5b8809d94c62da572e14e96c9f00ed5d6e11769a 100644
--- a/scipost/urls.py
+++ b/scipost/urls.py
@@ -209,14 +209,4 @@ urlpatterns = [
         TemplateView.as_view(template_name='scipost/howto_production.html'),
         name='howto_production'),
 
-
-    #############################
-    # Supporting Partners Board #
-    #############################
-
-    url(r'^supporting_partners$', views.supporting_partners,
-        name='supporting_partners'),
-    url(r'^SPB_membership_request$', views.SPB_membership_request,
-        name='SPB_membership_request'),
-
 ]
diff --git a/scipost/views.py b/scipost/views.py
index babdffec078b6a3bf8f27e6cc5902acdd632425d..c13ccccca2e268574f51284ef006b40221501ee3 100644
--- a/scipost/views.py
+++ b/scipost/views.py
@@ -25,14 +25,12 @@ from guardian.decorators import permission_required
 from .constants import SCIPOST_SUBJECT_AREAS, subject_areas_raw_dict, SciPost_from_addresses_dict
 from .models import Contributor, CitationNotification, UnavailabilityPeriod,\
                     DraftInvitation, RegistrationInvitation,\
-                    AuthorshipClaim, SupportingPartner, SPBMembershipAgreement,\
-                    EditorialCollege, EditorialCollegeFellowship
+                    AuthorshipClaim, EditorialCollege, EditorialCollegeFellowship
 from .forms import AuthenticationForm, DraftInvitationForm, UnavailabilityPeriodForm,\
                    RegistrationForm, RegistrationInvitationForm, AuthorshipClaimForm,\
                    ModifyPersonalMessageForm, SearchForm, VetRegistrationForm, reg_ref_dict,\
                    UpdatePersonalDataForm, UpdateUserDataForm, PasswordChangeForm,\
-                   EmailGroupMembersForm, EmailParticularForm, SendPrecookedEmailForm,\
-                   SupportingPartnerForm, SPBMembershipForm
+                   EmailGroupMembersForm, EmailParticularForm, SendPrecookedEmailForm
 from .utils import Utils, EMAIL_FOOTER, SCIPOST_SUMMARY_FOOTER, SCIPOST_SUMMARY_FOOTER_HTML
 
 from commentaries.models import Commentary
@@ -1272,58 +1270,6 @@ def Fellow_activity_overview(request, Fellow_id=None):
     return render(request, 'scipost/Fellow_activity_overview.html', context)
 
 
-#############################
-# Supporting Partners Board #
-#############################
-
-def supporting_partners(request):
-    prospective_agreements = SPBMembershipAgreement.objects.filter(
-        status='Submitted').order_by('date_requested')
-    context = {'prospective_partners': prospective_agreements, }
-    return render(request, 'scipost/supporting_partners.html', context)
-
-
-@login_required
-def SPB_membership_request(request):
-    errormessage = ''
-    if request.method == 'POST':
-        SP_form = SupportingPartnerForm(request.POST)
-        membership_form = SPBMembershipForm(request.POST)
-        if SP_form.is_valid() and membership_form.is_valid():
-            partner = SupportingPartner(
-                partner_type=SP_form.cleaned_data['partner_type'],
-                status='Prospective',
-                institution=SP_form.cleaned_data['institution'],
-                institution_acronym=SP_form.cleaned_data['institution_acronym'],
-                institution_address=SP_form.cleaned_data['institution_address'],
-                contact_person=request.user.contributor,
-            )
-            partner.save()
-            agreement = SPBMembershipAgreement(
-                partner=partner,
-                status='Submitted',
-                date_requested=timezone.now().date(),
-                start_date=membership_form.cleaned_data['start_date'],
-                duration=membership_form.cleaned_data['duration'],
-                offered_yearly_contribution=membership_form.cleaned_data['offered_yearly_contribution'],
-            )
-            agreement.save()
-            ack_message = ('Thank you for your SPB Membership request. '
-                           'We will get back to you in the very near future '
-                           'with details of the proposed agreement.')
-            context = {'ack_message': ack_message, }
-            return render(request, 'scipost/acknowledgement.html', context)
-        else:
-            errormessage = 'The form was not filled properly.'
-
-    else:
-        SP_form = SupportingPartnerForm()
-        membership_form = SPBMembershipForm()
-    context = {'errormessage': errormessage,
-               'SP_form': SP_form,
-               'membership_form': membership_form, }
-    return render(request, 'scipost/SPB_membership_request.html', context)
-
 
 class AboutView(ListView):
     model = EditorialCollege