diff --git a/Vagrantfile b/Vagrantfile
index 32c3ce579aaf8af7c0ed8a4de29307620e07b0ce..1e90a99e7ab84cacdccde0cee4cf8b96e9de499a 100644
--- a/Vagrantfile
+++ b/Vagrantfile
@@ -52,9 +52,9 @@ Vagrant.configure(2) do |config|
   # end
   #
    config.vm.provision "shell", inline: <<-SHELL
-   yum install -y python-virtualenv vim git gcc libevent-devel libxml2-devel libxslt-devel mariadb-server mysql-devel patch
    rpm -Uh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
-   yum install -y beanstalkd
+   yum -q -y install python36 python36-setuptools python36-virtualenv vim git gcc libevent-devel libxml2-devel libxslt-devel mariadb-server mysql-devel patch
+   yum -q -y install beanstalkd
    systemctl enable beanstalkd.service
    service beanstalkd start
    systemctl enable mariadb.service
@@ -63,7 +63,7 @@ Vagrant.configure(2) do |config|
       create database fod;
 SCRIPT
    mkdir -p /var/log/fod /srv
-   virtualenv /srv/venv
+   virtualenv-3 /srv/venv
    (
       source /srv/venv/bin/activate
       cp -r /vagrant/ /srv/flowspy
@@ -75,8 +75,6 @@ SCRIPT
       )
       pip install -r requirements.txt
 
-      ./patch-dependencies.sh
-
       touch flowspy/settings_local.py
 
       ./manage.py syncdb --noinput
diff --git a/_version.py b/_version.py
index ef517bccb0d01cf8b42ca2d552b1fef08b1a6117..f99707043ac53a59914e7086095a68e980afa71c 100644
--- a/_version.py
+++ b/_version.py
@@ -2,4 +2,4 @@
 VERSION = '1.5'
 
 if __name__ == "__main__":
-    print VERSION
+    print(VERSION)
diff --git a/accounts/admin.py b/accounts/admin.py
index 453be75ffcb61963c1f50db5c1f4cd66239f4adc..7ef1ef3363d517b32991effd86686095b2725f59 100644
--- a/accounts/admin.py
+++ b/accounts/admin.py
@@ -19,7 +19,7 @@
 
 from django.contrib import admin
 from django import forms
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 from django.contrib.flatpages.admin import FlatPageAdmin
 from django.contrib.flatpages.models import FlatPage
 
diff --git a/accounts/migrations.backup/0001_initial.py b/accounts/migrations.backup/0001_initial.py
new file mode 100644
index 0000000000000000000000000000000000000000..b67885be8bc49563d13807c5650635cbd5f13564
--- /dev/null
+++ b/accounts/migrations.backup/0001_initial.py
@@ -0,0 +1,91 @@
+# encoding: utf-8
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+class Migration(SchemaMigration):
+    
+    def forwards(self, orm):
+        
+        # Adding model 'UserProfile'
+        db.create_table('accounts_userprofile', (
+            ('peer', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['peers.Peer'])),
+            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+            ('user', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['auth.User'], unique=True)),
+        ))
+        db.send_create_signal('accounts', ['UserProfile'])
+    
+    
+    def backwards(self, orm):
+        
+        # Deleting model 'UserProfile'
+        db.delete_table('accounts_userprofile')
+    
+    
+    models = {
+        'accounts.userprofile': {
+            'Meta': {'object_name': 'UserProfile'},
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'peer': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['peers.Peer']"}),
+            'user': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['auth.User']", 'unique': 'True'})
+        },
+        'auth.group': {
+            'Meta': {'object_name': 'Group'},
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
+            'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
+        },
+        'auth.permission': {
+            'Meta': {'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
+            'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+            'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+        },
+        'auth.user': {
+            'Meta': {'object_name': 'User'},
+            'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
+            'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+            'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}),
+            'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
+            'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
+            'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+            'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+            'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+            'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
+            'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'})
+        },
+        'contenttypes.contenttype': {
+            'Meta': {'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
+            'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
+        },
+        'peers.peer': {
+            'Meta': {'object_name': 'Peer', 'db_table': "u'peer'"},
+            'domain_name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True', 'blank': 'True'}),
+            'networks': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['peers.PeerRange']", 'null': 'True', 'blank': 'True'}),
+            'peer_as': ('django.db.models.fields.IntegerField', [], {}),
+            'peer_id': ('django.db.models.fields.IntegerField', [], {'primary_key': 'True'}),
+            'peer_name': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+            'peer_tag': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
+            'techc_emails': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['peers.TechcEmail']", 'null': 'True', 'blank': 'True'})
+        },
+        'peers.peerrange': {
+            'Meta': {'object_name': 'PeerRange', 'db_table': "u'peer_range'"},
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'network': ('django.db.models.fields.CharField', [], {'max_length': '128'})
+        },
+        'peers.techcemail': {
+            'Meta': {'object_name': 'TechcEmail', 'db_table': "'techc_email'"},
+            'email': ('django.db.models.fields.CharField', [], {'max_length': '352', 'db_column': "'email'"}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
+        }
+    }
+    
+    complete_apps = ['accounts']
diff --git a/accounts/migrations/0002_add_overview.py b/accounts/migrations.backup/0002_add_overview.py
similarity index 100%
rename from accounts/migrations/0002_add_overview.py
rename to accounts/migrations.backup/0002_add_overview.py
diff --git a/accounts/migrations/0003_auto.py b/accounts/migrations.backup/0003_auto.py
similarity index 100%
rename from accounts/migrations/0003_auto.py
rename to accounts/migrations.backup/0003_auto.py
diff --git a/accounts/migrations/0004_peers.py b/accounts/migrations.backup/0004_peers.py
similarity index 100%
rename from accounts/migrations/0004_peers.py
rename to accounts/migrations.backup/0004_peers.py
diff --git a/accounts/migrations/0005_auto__chg_field_userprofile_peer.py b/accounts/migrations.backup/0005_auto__chg_field_userprofile_peer.py
similarity index 100%
rename from accounts/migrations/0005_auto__chg_field_userprofile_peer.py
rename to accounts/migrations.backup/0005_auto__chg_field_userprofile_peer.py
diff --git a/accounts/migrations/0006_auto__del_field_userprofile_peer.py b/accounts/migrations.backup/0006_auto__del_field_userprofile_peer.py
similarity index 100%
rename from accounts/migrations/0006_auto__del_field_userprofile_peer.py
rename to accounts/migrations.backup/0006_auto__del_field_userprofile_peer.py
diff --git a/longerusername/migrations/__init__.py b/accounts/migrations.backup/__init__.py
similarity index 100%
rename from longerusername/migrations/__init__.py
rename to accounts/migrations.backup/__init__.py
diff --git a/accounts/migrations/0001_initial.py b/accounts/migrations/0001_initial.py
index b67885be8bc49563d13807c5650635cbd5f13564..ae0f8fd14eadb79b99a710153fa72b37f083fa9e 100644
--- a/accounts/migrations/0001_initial.py
+++ b/accounts/migrations/0001_initial.py
@@ -1,91 +1,29 @@
-# encoding: utf-8
-import datetime
-from south.db import db
-from south.v2 import SchemaMigration
-from django.db import models
+# Generated by Django 2.1 on 2019-07-25 08:12
 
-class Migration(SchemaMigration):
-    
-    def forwards(self, orm):
-        
-        # Adding model 'UserProfile'
-        db.create_table('accounts_userprofile', (
-            ('peer', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['peers.Peer'])),
-            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
-            ('user', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['auth.User'], unique=True)),
-        ))
-        db.send_create_signal('accounts', ['UserProfile'])
-    
-    
-    def backwards(self, orm):
-        
-        # Deleting model 'UserProfile'
-        db.delete_table('accounts_userprofile')
-    
-    
-    models = {
-        'accounts.userprofile': {
-            'Meta': {'object_name': 'UserProfile'},
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'peer': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['peers.Peer']"}),
-            'user': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['auth.User']", 'unique': 'True'})
-        },
-        'auth.group': {
-            'Meta': {'object_name': 'Group'},
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
-            'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
-        },
-        'auth.permission': {
-            'Meta': {'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
-            'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
-            'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
-        },
-        'auth.user': {
-            'Meta': {'object_name': 'User'},
-            'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
-            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
-            'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
-            'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}),
-            'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
-            'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
-            'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
-            'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
-            'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
-            'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
-            'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'})
-        },
-        'contenttypes.contenttype': {
-            'Meta': {'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
-            'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
-            'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
-        },
-        'peers.peer': {
-            'Meta': {'object_name': 'Peer', 'db_table': "u'peer'"},
-            'domain_name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True', 'blank': 'True'}),
-            'networks': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['peers.PeerRange']", 'null': 'True', 'blank': 'True'}),
-            'peer_as': ('django.db.models.fields.IntegerField', [], {}),
-            'peer_id': ('django.db.models.fields.IntegerField', [], {'primary_key': 'True'}),
-            'peer_name': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
-            'peer_tag': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
-            'techc_emails': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['peers.TechcEmail']", 'null': 'True', 'blank': 'True'})
-        },
-        'peers.peerrange': {
-            'Meta': {'object_name': 'PeerRange', 'db_table': "u'peer_range'"},
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'network': ('django.db.models.fields.CharField', [], {'max_length': '128'})
-        },
-        'peers.techcemail': {
-            'Meta': {'object_name': 'TechcEmail', 'db_table': "'techc_email'"},
-            'email': ('django.db.models.fields.CharField', [], {'max_length': '352', 'db_column': "'email'"}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
-        }
-    }
-    
-    complete_apps = ['accounts']
+from django.conf import settings
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+    initial = True
+
+    dependencies = [
+        ('peers', '__first__'),
+        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name='UserProfile',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('peers', models.ManyToManyField(related_name='user_profile', to='peers.Peer')),
+                ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
+            ],
+            options={
+                'permissions': (('overview', 'Can see registered users and rules'),),
+            },
+        ),
+    ]
diff --git a/accounts/models.py b/accounts/models.py
index 5b9a7f7ca3881245f4aef7abee1542b45382c1ef..e906953f88fe9bb3d6c2db6597d350a9c54b5e36 100644
--- a/accounts/models.py
+++ b/accounts/models.py
@@ -23,7 +23,7 @@ from peers.models import Peer
 
 
 class UserProfile(models.Model):
-    user = models.OneToOneField(User)
+    user = models.OneToOneField(User, on_delete=models.CASCADE)
     peers = models.ManyToManyField(Peer, related_name='user_profile')
 
     class Meta:
diff --git a/accounts/views.py b/accounts/views.py
index ada4eb7c0c8f92ebb86e78706eb7851abf37531d..8a93d0f6aec4a25b5191be9450bbb8ff87d65de3 100644
--- a/accounts/views.py
+++ b/accounts/views.py
@@ -30,7 +30,7 @@ from rest_framework.authtoken.models import Token
 from accounts.models import UserProfile
 from peers.models import Peer
 from flowspec.forms import UserProfileForm
-from registration.models import RegistrationProfile
+# TODO from registration.models import RegistrationProfile
 
 
 def generate_token(request):
@@ -45,98 +45,99 @@ def generate_token(request):
 @never_cache
 def activate(request, activation_key):
     account = None
-    if request.method == "GET":
-        activation_key = activation_key.lower()  # Normalize before trying anything with it.
-        try:
-            rp = RegistrationProfile.objects.get(activation_key=activation_key)
+    # TODO
+    #if request.method == "GET":
+    #    activation_key = activation_key.lower()  # Normalize before trying anything with it.
+    #    try:
+    #        rp = RegistrationProfile.objects.get(activation_key=activation_key)
 
-        except RegistrationProfile.DoesNotExist:
-            return render(
-                request,
-                'registration/activate.html',
-                {
-                    'account': account,
-                    'expiration_days': settings.ACCOUNT_ACTIVATION_DAYS
-                }
-            )
-        try:
-            userProfile = rp.user.get_profile()
-        except UserProfile.DoesNotExist:
-            return render(
-                request,
-                'registration/activate.html',
-                {
-                    'account': account,
-                    'expiration_days': settings.ACCOUNT_ACTIVATION_DAYS
-                }
-            )
+    #    except RegistrationProfile.DoesNotExist:
+    #        return render(
+    #            request,
+    #            'registration/activate.html',
+    #            {
+    #                'account': account,
+    #                'expiration_days': settings.ACCOUNT_ACTIVATION_DAYS
+    #            }
+    #        )
+    #    try:
+    #        userProfile = rp.user.get_profile()
+    #    except UserProfile.DoesNotExist:
+    #        return render(
+    #            request,
+    #            'registration/activate.html',
+    #            {
+    #                'account': account,
+    #                'expiration_days': settings.ACCOUNT_ACTIVATION_DAYS
+    #            }
+    #        )
 
-        form = UserProfileForm(instance=userProfile)
+    #    form = UserProfileForm(instance=userProfile)
 
-        return render(
-            request,
-            'registration/activate_edit.html',
-            {
-                'account': account,
-                'expiration_days': settings.ACCOUNT_ACTIVATION_DAYS,
-                'form': form
-            },
-        )
+    #    return render(
+    #        request,
+    #        'registration/activate_edit.html',
+    #        {
+    #            'account': account,
+    #            'expiration_days': settings.ACCOUNT_ACTIVATION_DAYS,
+    #            'form': form
+    #        },
+    #    )
 
-    if request.method == "POST":
-        request_data = request.POST.copy()
-	try:
-            user = User.objects.get(pk=request_data['user'])
-            up = user.get_profile()
+    #if request.method == "POST":
+    #    request_data = request.POST.copy()
+    #    try:
+    #        user = User.objects.get(pk=request_data['user'])
+    #        up = user.get_profile()
 
-            # use getlist to get the list of peers (might be multiple)
-            profile_peers = request.POST.getlist('peers')
+    #        # use getlist to get the list of peers (might be multiple)
+    #        profile_peers = request.POST.getlist('peers')
 
-            # remove already assigned peers, as these are selected by
-            # the user, no admin has yet verified those. They will be
-            # replaced by the admin's selection.
-            up.peers.clear()
+    #        # remove already assigned peers, as these are selected by
+    #        # the user, no admin has yet verified those. They will be
+    #        # replaced by the admin's selection.
+    #        up.peers.clear()
 
-            for peer in profile_peers:
-                up.peers.add(Peer.objects.get(pk=peer))
-            up.save()
+    #        for peer in profile_peers:
+    #            up.peers.add(Peer.objects.get(pk=peer))
+    #        up.save()
 
-        except:
-            return render(
-                request,
-                'registration/activate_edit.html',
-                {
-                    'account': account,
-                    'expiration_days': settings.ACCOUNT_ACTIVATION_DAYS
-                },
-            )
-        activation_key = activation_key.lower()  # Normalize before trying anything with it.
-        try:
-            rp = RegistrationProfile.objects.get(activation_key=activation_key)
-            account = RegistrationProfile.objects.activate_user(activation_key)
-        except Exception:
-            pass
+    #    except:
+    #        return render(
+    #            request,
+    #            'registration/activate_edit.html',
+    #            {
+    #                'account': account,
+    #                'expiration_days': settings.ACCOUNT_ACTIVATION_DAYS
+    #            },
+    #        )
+    #    activation_key = activation_key.lower()  # Normalize before trying anything with it.
+    #    try:
+    #        rp = RegistrationProfile.objects.get(activation_key=activation_key)
+    #        account = RegistrationProfile.objects.activate_user(activation_key)
+    #    except Exception:
+    #        pass
 
-        if account:
-            # A user has been activated
-            email = render_to_string(
-                'registration/activation_complete.txt',
-                {
-                    'site': Site.objects.get_current(),
-                    'user': account
-                }
-            )
-            send_mail(
-                _("%sUser account activated") % settings.EMAIL_SUBJECT_PREFIX,
-                email,
-                settings.SERVER_EMAIL,
-                [account.email]
-            )
-        return render(
-            request,
-            'registration/activate.html',
-            {
-                'account': account,
-                'expiration_days': settings.ACCOUNT_ACTIVATION_DAYS
-            },
-        )
+    #    if account:
+    #        # A user has been activated
+    #        email = render_to_string(
+    #            'registration/activation_complete.txt',
+    #            {
+    #                'site': Site.objects.get_current(),
+    #                'user': account
+    #            }
+    #        )
+    #        send_mail(
+    #            _("%sUser account activated") % settings.EMAIL_SUBJECT_PREFIX,
+    #            email,
+    #            settings.SERVER_EMAIL,
+    #            [account.email]
+    #        )
+    #    return render(
+    #        request,
+    #        'registration/activate.html',
+    #        {
+    #            'account': account,
+    #            'expiration_days': settings.ACCOUNT_ACTIVATION_DAYS
+    #        },
+    #    )
diff --git a/beanstalkc.py b/beanstalkc.py
index 5128a9c3f2e618eddefc466d1cbb702b466b704e..63661fdf6a55b32f6e222142d0692cbd325edc66 100755
--- a/beanstalkc.py
+++ b/beanstalkc.py
@@ -39,7 +39,7 @@ class SocketError(BeanstalkcException):
     def wrap(wrapped_function, *args, **kwargs):
         try:
             return wrapped_function(*args, **kwargs)
-        except socket.error, err:
+        except socket.error as err:
             raise SocketError(err)
 
 
@@ -122,7 +122,7 @@ class Connection(object):
     def _interact_peek(self, command):
         try:
             return self._interact_job(command, ['FOUND'], ['NOT_FOUND'], False)
-        except CommandFailed, (_, _status, _results):
+        except CommandFailed:
             return None
 
     # -- public interface --
@@ -147,7 +147,7 @@ class Connection(object):
             return self._interact_job(command,
                                       ['RESERVED'],
                                       ['DEADLINE_SOON', 'TIMED_OUT'])
-        except CommandFailed, (_, status, results):
+        except CommandFailed:
             if status == 'TIMED_OUT':
                 return None
             elif status == 'DEADLINE_SOON':
diff --git a/flowspec/admin.py b/flowspec/admin.py
index 18c9a5193d5f009b288a46388832d3ac5d02a394..e3f61e6eb1d1b3c4932f8eb26dd82ff8e560a43f 100644
--- a/flowspec/admin.py
+++ b/flowspec/admin.py
@@ -19,13 +19,13 @@
 
 from django.contrib import admin
 from flowspec.models import MatchPort, MatchDscp, MatchProtocol, FragmentType, ThenAction, Route
+from flowspec.tasks import *
+from flowspec.forms import *
 from accounts.models import UserProfile
 from utils import proxy as PR
-from tasks import *
 from django.contrib.auth.models import User
 from django.contrib.auth.admin import UserAdmin
 from peers.models import *
-from flowspec.forms import *
 from longerusername.forms import UserCreationForm, UserChangeForm
 
 
diff --git a/flowspec/forms.py b/flowspec/forms.py
index afb99cc1d4907cafdba32766e40c62fc971bf535..d2cbc48cce4fa8325dcea830f600b715977b3b56 100644
--- a/flowspec/forms.py
+++ b/flowspec/forms.py
@@ -25,14 +25,13 @@ from django.template.defaultfilters import filesizeformat
 from flowspec.models import *
 from peers.models import *
 from accounts.models import *
-from ipaddr import *
 from flowspec.validators import (
     clean_source,
     clean_destination,
     clean_expires,
     clean_route_form
 )
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 from django.contrib.auth.models import User
 from django.conf import settings
 import datetime
@@ -84,6 +83,7 @@ class UserProfileForm(forms.ModelForm):
 
     class Meta:
         model = UserProfile
+        fields = "__all__"
 
 
 class RouteForm(forms.ModelForm):
@@ -92,6 +92,7 @@ class RouteForm(forms.ModelForm):
     port = PortRangeForm()
     class Meta:
         model = Route
+        fields = "__all__"
 
     def clean_applier(self):
         applier = self.cleaned_data['applier']
@@ -155,7 +156,7 @@ class RouteForm(forms.ModelForm):
         user = self.cleaned_data.get('applier', None)
 
         if source:
-            source = IPNetwork(source).compressed
+            source = ip_network(source).compressed
             existing_routes = existing_routes.filter(source=source)
         else:
             existing_routes = existing_routes.filter(source=None)
@@ -191,7 +192,7 @@ class RouteForm(forms.ModelForm):
         for route in existing_routes:
             if name != route.name:
                 existing_url = reverse('edit-route', args=[route.name])
-                if IPNetwork(destination) in IPNetwork(route.destination) or IPNetwork(route.destination) in IPNetwork(destination):
+                if ip_network(destination) in ip_network(route.destination) or ip_network(route.destination) in ip_network(destination):
                     raise forms.ValidationError('Found an exact %s rule, %s with destination prefix %s<br>To avoid overlapping try editing rule <a href=\'%s\'>%s</a>' % (route.status, route.name, route.destination, existing_url, route.name))
         return self.cleaned_data
 
@@ -200,6 +201,7 @@ class ThenPlainForm(forms.ModelForm):
 #    action = forms.CharField(initial='rate-limit')
     class Meta:
         model = ThenAction
+        fields = "__all__"
 
     def clean_action_value(self):
         action_value = self.cleaned_data['action_value']
@@ -226,6 +228,7 @@ class PortPlainForm(forms.ModelForm):
 #    action = forms.CharField(initial='rate-limit')
     class Meta:
         model = MatchPort
+        fields = "__all__"
 
     def clean_port(self):
         port = self.cleaned_data['port']
diff --git a/flowspec/helpers.py b/flowspec/helpers.py
index 20c90183c59dd732c4e2c83b68df3a42ab4d1e0a..f2e4898727ea1e5dc2fb87ba5a23f77e7b2a1203 100644
--- a/flowspec/helpers.py
+++ b/flowspec/helpers.py
@@ -13,7 +13,7 @@ def send_new_mail(subject, message, from_email, recipient_list, bcc_list):
   try:
     logger.info("helpers::send_new_mail(): send mail: from_email="+str(from_email)+", recipient_list="+str(recipient_list)+", bcc_list="+str(bcc_list)) 
     return EmailMessage(subject, message, from_email, recipient_list, bcc_list).send()
-  except Exception, e:
+  except Exception as e:
     #os.write(3, "send_new_mail() failed: exc="+str(e)+"\n") 
     logger.error("helpers::send_new_mail() failed: exc="+str(e)) 
 
diff --git a/flowspec/migrations.backup/0001_initial.py b/flowspec/migrations.backup/0001_initial.py
new file mode 100644
index 0000000000000000000000000000000000000000..28c51363bbe1147faa053398984bf50c5f59abf9
--- /dev/null
+++ b/flowspec/migrations.backup/0001_initial.py
@@ -0,0 +1,212 @@
+# encoding: utf-8
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+class Migration(SchemaMigration):
+    
+    def forwards(self, orm):
+        
+        # Adding model 'MatchPort'
+        db.create_table(u'match_port', (
+            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+            ('port', self.gf('django.db.models.fields.CharField')(unique=True, max_length=24)),
+        ))
+        db.send_create_signal('flowspec', ['MatchPort'])
+
+        # Adding model 'MatchDscp'
+        db.create_table(u'match_dscp', (
+            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+            ('dscp', self.gf('django.db.models.fields.CharField')(max_length=24)),
+        ))
+        db.send_create_signal('flowspec', ['MatchDscp'])
+
+        # Adding model 'ThenAction'
+        db.create_table(u'then_action', (
+            ('action', self.gf('django.db.models.fields.CharField')(max_length=60)),
+            ('action_value', self.gf('django.db.models.fields.CharField')(max_length=255, null=True, blank=True)),
+            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+        ))
+        db.send_create_signal('flowspec', ['ThenAction'])
+
+        # Adding unique constraint on 'ThenAction', fields ['action', 'action_value']
+        db.create_unique(u'then_action', ['action', 'action_value'])
+
+        # Adding model 'Route'
+        db.create_table(u'route', (
+            ('packetlength', self.gf('django.db.models.fields.IntegerField')(null=True, blank=True)),
+            ('status', self.gf('django.db.models.fields.CharField')(default='PENDING', max_length=20, null=True, blank=True)),
+            ('last_updated', self.gf('django.db.models.fields.DateTimeField')(auto_now=True, blank=True)),
+            ('expires', self.gf('django.db.models.fields.DateField')(default=datetime.date(2012, 2, 22))),
+            ('protocol', self.gf('django.db.models.fields.CharField')(max_length=32, null=True, blank=True)),
+            ('name', self.gf('django.db.models.fields.SlugField')(max_length=128, db_index=True)),
+            ('destination', self.gf('django.db.models.fields.CharField')(max_length=32)),
+            ('comments', self.gf('django.db.models.fields.TextField')(null=True, blank=True)),
+            ('icmptype', self.gf('django.db.models.fields.CharField')(max_length=32, null=True, blank=True)),
+            ('source', self.gf('django.db.models.fields.CharField')(max_length=32)),
+            ('fragmenttype', self.gf('django.db.models.fields.CharField')(max_length=20, null=True, blank=True)),
+            ('applier', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'], null=True, blank=True)),
+            ('filed', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)),
+            ('tcpflag', self.gf('django.db.models.fields.CharField')(max_length=128, null=True, blank=True)),
+            ('response', self.gf('django.db.models.fields.CharField')(max_length=512, null=True, blank=True)),
+            ('icmpcode', self.gf('django.db.models.fields.CharField')(max_length=32, null=True, blank=True)),
+            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+        ))
+        db.send_create_signal('flowspec', ['Route'])
+
+        # Adding M2M table for field sourceport on 'Route'
+        db.create_table(u'route_sourceport', (
+            ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+            ('route', models.ForeignKey(orm['flowspec.route'], null=False)),
+            ('matchport', models.ForeignKey(orm['flowspec.matchport'], null=False))
+        ))
+        db.create_unique(u'route_sourceport', ['route_id', 'matchport_id'])
+
+        # Adding M2M table for field then on 'Route'
+        db.create_table(u'route_then', (
+            ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+            ('route', models.ForeignKey(orm['flowspec.route'], null=False)),
+            ('thenaction', models.ForeignKey(orm['flowspec.thenaction'], null=False))
+        ))
+        db.create_unique(u'route_then', ['route_id', 'thenaction_id'])
+
+        # Adding M2M table for field dscp on 'Route'
+        db.create_table(u'route_dscp', (
+            ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+            ('route', models.ForeignKey(orm['flowspec.route'], null=False)),
+            ('matchdscp', models.ForeignKey(orm['flowspec.matchdscp'], null=False))
+        ))
+        db.create_unique(u'route_dscp', ['route_id', 'matchdscp_id'])
+
+        # Adding M2M table for field port on 'Route'
+        db.create_table(u'route_port', (
+            ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+            ('route', models.ForeignKey(orm['flowspec.route'], null=False)),
+            ('matchport', models.ForeignKey(orm['flowspec.matchport'], null=False))
+        ))
+        db.create_unique(u'route_port', ['route_id', 'matchport_id'])
+
+        # Adding M2M table for field destinationport on 'Route'
+        db.create_table(u'route_destinationport', (
+            ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+            ('route', models.ForeignKey(orm['flowspec.route'], null=False)),
+            ('matchport', models.ForeignKey(orm['flowspec.matchport'], null=False))
+        ))
+        db.create_unique(u'route_destinationport', ['route_id', 'matchport_id'])
+    
+    
+    def backwards(self, orm):
+        
+        # Deleting model 'MatchPort'
+        db.delete_table(u'match_port')
+
+        # Deleting model 'MatchDscp'
+        db.delete_table(u'match_dscp')
+
+        # Deleting model 'ThenAction'
+        db.delete_table(u'then_action')
+
+        # Removing unique constraint on 'ThenAction', fields ['action', 'action_value']
+        db.delete_unique(u'then_action', ['action', 'action_value'])
+
+        # Deleting model 'Route'
+        db.delete_table(u'route')
+
+        # Removing M2M table for field sourceport on 'Route'
+        db.delete_table('route_sourceport')
+
+        # Removing M2M table for field then on 'Route'
+        db.delete_table('route_then')
+
+        # Removing M2M table for field dscp on 'Route'
+        db.delete_table('route_dscp')
+
+        # Removing M2M table for field port on 'Route'
+        db.delete_table('route_port')
+
+        # Removing M2M table for field destinationport on 'Route'
+        db.delete_table('route_destinationport')
+    
+    
+    models = {
+        'auth.group': {
+            'Meta': {'object_name': 'Group'},
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
+            'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
+        },
+        'auth.permission': {
+            'Meta': {'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
+            'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+            'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+        },
+        'auth.user': {
+            'Meta': {'object_name': 'User'},
+            'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
+            'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+            'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}),
+            'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
+            'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
+            'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+            'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+            'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+            'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
+            'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'})
+        },
+        'contenttypes.contenttype': {
+            'Meta': {'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
+            'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
+        },
+        'flowspec.matchdscp': {
+            'Meta': {'object_name': 'MatchDscp', 'db_table': "u'match_dscp'"},
+            'dscp': ('django.db.models.fields.CharField', [], {'max_length': '24'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
+        },
+        'flowspec.matchport': {
+            'Meta': {'object_name': 'MatchPort', 'db_table': "u'match_port'"},
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'port': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '24'})
+        },
+        'flowspec.route': {
+            'Meta': {'object_name': 'Route', 'db_table': "u'route'"},
+            'applier': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'}),
+            'comments': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+            'destination': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
+            'destinationport': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'matchDestinationPort'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['flowspec.MatchPort']"}),
+            'dscp': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['flowspec.MatchDscp']", 'null': 'True', 'blank': 'True'}),
+            'expires': ('django.db.models.fields.DateField', [], {'default': 'datetime.date(2012, 2, 22)'}),
+            'filed': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+            'fragmenttype': ('django.db.models.fields.CharField', [], {'max_length': '20', 'null': 'True', 'blank': 'True'}),
+            'icmpcode': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True', 'blank': 'True'}),
+            'icmptype': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'last_updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
+            'name': ('django.db.models.fields.SlugField', [], {'max_length': '128', 'db_index': 'True'}),
+            'packetlength': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+            'port': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'matchPort'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['flowspec.MatchPort']"}),
+            'protocol': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True', 'blank': 'True'}),
+            'response': ('django.db.models.fields.CharField', [], {'max_length': '512', 'null': 'True', 'blank': 'True'}),
+            'source': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
+            'sourceport': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'matchSourcePort'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['flowspec.MatchPort']"}),
+            'status': ('django.db.models.fields.CharField', [], {'default': "'PENDING'", 'max_length': '20', 'null': 'True', 'blank': 'True'}),
+            'tcpflag': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True', 'blank': 'True'}),
+            'then': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['flowspec.ThenAction']", 'symmetrical': 'False'})
+        },
+        'flowspec.thenaction': {
+            'Meta': {'unique_together': "(('action', 'action_value'),)", 'object_name': 'ThenAction', 'db_table': "u'then_action'"},
+            'action': ('django.db.models.fields.CharField', [], {'max_length': '60'}),
+            'action_value': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
+        }
+    }
+    
+    complete_apps = ['flowspec']
diff --git a/flowspec/migrations/0002_auto__add_matchprotocol__del_field_route_protocol.py b/flowspec/migrations.backup/0002_auto__add_matchprotocol__del_field_route_protocol.py
similarity index 100%
rename from flowspec/migrations/0002_auto__add_matchprotocol__del_field_route_protocol.py
rename to flowspec/migrations.backup/0002_auto__add_matchprotocol__del_field_route_protocol.py
diff --git a/flowspec/migrations/0003_auto__add_fragmenttype.py b/flowspec/migrations.backup/0003_auto__add_fragmenttype.py
similarity index 100%
rename from flowspec/migrations/0003_auto__add_fragmenttype.py
rename to flowspec/migrations.backup/0003_auto__add_fragmenttype.py
diff --git a/flowspec/migrations/0004_auto__chg_field_fragmenttype_fragmenttype.py b/flowspec/migrations.backup/0004_auto__chg_field_fragmenttype_fragmenttype.py
similarity index 100%
rename from flowspec/migrations/0004_auto__chg_field_fragmenttype_fragmenttype.py
rename to flowspec/migrations.backup/0004_auto__chg_field_fragmenttype_fragmenttype.py
diff --git a/flowspec/migrations/0005_auto__del_field_route_fragmenttype.py b/flowspec/migrations.backup/0005_auto__del_field_route_fragmenttype.py
similarity index 100%
rename from flowspec/migrations/0005_auto__del_field_route_fragmenttype.py
rename to flowspec/migrations.backup/0005_auto__del_field_route_fragmenttype.py
diff --git a/flowspec/migrations/0006_auto__add_field_route_requesters_address.py b/flowspec/migrations.backup/0006_auto__add_field_route_requesters_address.py
similarity index 100%
rename from flowspec/migrations/0006_auto__add_field_route_requesters_address.py
rename to flowspec/migrations.backup/0006_auto__add_field_route_requesters_address.py
diff --git a/flowspec/migrations/0007_replace_matchport.py b/flowspec/migrations.backup/0007_replace_matchport.py
similarity index 100%
rename from flowspec/migrations/0007_replace_matchport.py
rename to flowspec/migrations.backup/0007_replace_matchport.py
diff --git a/flowspec/migrations.backup/__init__.py b/flowspec/migrations.backup/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/flowspec/migrations/0001_initial.py b/flowspec/migrations/0001_initial.py
index 28c51363bbe1147faa053398984bf50c5f59abf9..09627ca00f3ccacd7accbf5124888950db7fa549 100644
--- a/flowspec/migrations/0001_initial.py
+++ b/flowspec/migrations/0001_initial.py
@@ -1,212 +1,108 @@
-# encoding: utf-8
-import datetime
-from south.db import db
-from south.v2 import SchemaMigration
-from django.db import models
-
-class Migration(SchemaMigration):
-    
-    def forwards(self, orm):
-        
-        # Adding model 'MatchPort'
-        db.create_table(u'match_port', (
-            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
-            ('port', self.gf('django.db.models.fields.CharField')(unique=True, max_length=24)),
-        ))
-        db.send_create_signal('flowspec', ['MatchPort'])
-
-        # Adding model 'MatchDscp'
-        db.create_table(u'match_dscp', (
-            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
-            ('dscp', self.gf('django.db.models.fields.CharField')(max_length=24)),
-        ))
-        db.send_create_signal('flowspec', ['MatchDscp'])
-
-        # Adding model 'ThenAction'
-        db.create_table(u'then_action', (
-            ('action', self.gf('django.db.models.fields.CharField')(max_length=60)),
-            ('action_value', self.gf('django.db.models.fields.CharField')(max_length=255, null=True, blank=True)),
-            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
-        ))
-        db.send_create_signal('flowspec', ['ThenAction'])
-
-        # Adding unique constraint on 'ThenAction', fields ['action', 'action_value']
-        db.create_unique(u'then_action', ['action', 'action_value'])
-
-        # Adding model 'Route'
-        db.create_table(u'route', (
-            ('packetlength', self.gf('django.db.models.fields.IntegerField')(null=True, blank=True)),
-            ('status', self.gf('django.db.models.fields.CharField')(default='PENDING', max_length=20, null=True, blank=True)),
-            ('last_updated', self.gf('django.db.models.fields.DateTimeField')(auto_now=True, blank=True)),
-            ('expires', self.gf('django.db.models.fields.DateField')(default=datetime.date(2012, 2, 22))),
-            ('protocol', self.gf('django.db.models.fields.CharField')(max_length=32, null=True, blank=True)),
-            ('name', self.gf('django.db.models.fields.SlugField')(max_length=128, db_index=True)),
-            ('destination', self.gf('django.db.models.fields.CharField')(max_length=32)),
-            ('comments', self.gf('django.db.models.fields.TextField')(null=True, blank=True)),
-            ('icmptype', self.gf('django.db.models.fields.CharField')(max_length=32, null=True, blank=True)),
-            ('source', self.gf('django.db.models.fields.CharField')(max_length=32)),
-            ('fragmenttype', self.gf('django.db.models.fields.CharField')(max_length=20, null=True, blank=True)),
-            ('applier', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'], null=True, blank=True)),
-            ('filed', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)),
-            ('tcpflag', self.gf('django.db.models.fields.CharField')(max_length=128, null=True, blank=True)),
-            ('response', self.gf('django.db.models.fields.CharField')(max_length=512, null=True, blank=True)),
-            ('icmpcode', self.gf('django.db.models.fields.CharField')(max_length=32, null=True, blank=True)),
-            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
-        ))
-        db.send_create_signal('flowspec', ['Route'])
-
-        # Adding M2M table for field sourceport on 'Route'
-        db.create_table(u'route_sourceport', (
-            ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
-            ('route', models.ForeignKey(orm['flowspec.route'], null=False)),
-            ('matchport', models.ForeignKey(orm['flowspec.matchport'], null=False))
-        ))
-        db.create_unique(u'route_sourceport', ['route_id', 'matchport_id'])
-
-        # Adding M2M table for field then on 'Route'
-        db.create_table(u'route_then', (
-            ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
-            ('route', models.ForeignKey(orm['flowspec.route'], null=False)),
-            ('thenaction', models.ForeignKey(orm['flowspec.thenaction'], null=False))
-        ))
-        db.create_unique(u'route_then', ['route_id', 'thenaction_id'])
-
-        # Adding M2M table for field dscp on 'Route'
-        db.create_table(u'route_dscp', (
-            ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
-            ('route', models.ForeignKey(orm['flowspec.route'], null=False)),
-            ('matchdscp', models.ForeignKey(orm['flowspec.matchdscp'], null=False))
-        ))
-        db.create_unique(u'route_dscp', ['route_id', 'matchdscp_id'])
-
-        # Adding M2M table for field port on 'Route'
-        db.create_table(u'route_port', (
-            ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
-            ('route', models.ForeignKey(orm['flowspec.route'], null=False)),
-            ('matchport', models.ForeignKey(orm['flowspec.matchport'], null=False))
-        ))
-        db.create_unique(u'route_port', ['route_id', 'matchport_id'])
-
-        # Adding M2M table for field destinationport on 'Route'
-        db.create_table(u'route_destinationport', (
-            ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
-            ('route', models.ForeignKey(orm['flowspec.route'], null=False)),
-            ('matchport', models.ForeignKey(orm['flowspec.matchport'], null=False))
-        ))
-        db.create_unique(u'route_destinationport', ['route_id', 'matchport_id'])
-    
-    
-    def backwards(self, orm):
-        
-        # Deleting model 'MatchPort'
-        db.delete_table(u'match_port')
-
-        # Deleting model 'MatchDscp'
-        db.delete_table(u'match_dscp')
-
-        # Deleting model 'ThenAction'
-        db.delete_table(u'then_action')
-
-        # Removing unique constraint on 'ThenAction', fields ['action', 'action_value']
-        db.delete_unique(u'then_action', ['action', 'action_value'])
-
-        # Deleting model 'Route'
-        db.delete_table(u'route')
-
-        # Removing M2M table for field sourceport on 'Route'
-        db.delete_table('route_sourceport')
-
-        # Removing M2M table for field then on 'Route'
-        db.delete_table('route_then')
-
-        # Removing M2M table for field dscp on 'Route'
-        db.delete_table('route_dscp')
-
-        # Removing M2M table for field port on 'Route'
-        db.delete_table('route_port')
-
-        # Removing M2M table for field destinationport on 'Route'
-        db.delete_table('route_destinationport')
-    
-    
-    models = {
-        'auth.group': {
-            'Meta': {'object_name': 'Group'},
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
-            'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
-        },
-        'auth.permission': {
-            'Meta': {'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
-            'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
-            'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
-        },
-        'auth.user': {
-            'Meta': {'object_name': 'User'},
-            'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
-            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
-            'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
-            'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}),
-            'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
-            'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
-            'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
-            'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
-            'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
-            'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
-            'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'})
-        },
-        'contenttypes.contenttype': {
-            'Meta': {'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
-            'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
-            'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
-        },
-        'flowspec.matchdscp': {
-            'Meta': {'object_name': 'MatchDscp', 'db_table': "u'match_dscp'"},
-            'dscp': ('django.db.models.fields.CharField', [], {'max_length': '24'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
-        },
-        'flowspec.matchport': {
-            'Meta': {'object_name': 'MatchPort', 'db_table': "u'match_port'"},
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'port': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '24'})
-        },
-        'flowspec.route': {
-            'Meta': {'object_name': 'Route', 'db_table': "u'route'"},
-            'applier': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'}),
-            'comments': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
-            'destination': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
-            'destinationport': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'matchDestinationPort'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['flowspec.MatchPort']"}),
-            'dscp': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['flowspec.MatchDscp']", 'null': 'True', 'blank': 'True'}),
-            'expires': ('django.db.models.fields.DateField', [], {'default': 'datetime.date(2012, 2, 22)'}),
-            'filed': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
-            'fragmenttype': ('django.db.models.fields.CharField', [], {'max_length': '20', 'null': 'True', 'blank': 'True'}),
-            'icmpcode': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True', 'blank': 'True'}),
-            'icmptype': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True', 'blank': 'True'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'last_updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
-            'name': ('django.db.models.fields.SlugField', [], {'max_length': '128', 'db_index': 'True'}),
-            'packetlength': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
-            'port': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'matchPort'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['flowspec.MatchPort']"}),
-            'protocol': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True', 'blank': 'True'}),
-            'response': ('django.db.models.fields.CharField', [], {'max_length': '512', 'null': 'True', 'blank': 'True'}),
-            'source': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
-            'sourceport': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'matchSourcePort'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['flowspec.MatchPort']"}),
-            'status': ('django.db.models.fields.CharField', [], {'default': "'PENDING'", 'max_length': '20', 'null': 'True', 'blank': 'True'}),
-            'tcpflag': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True', 'blank': 'True'}),
-            'then': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['flowspec.ThenAction']", 'symmetrical': 'False'})
-        },
-        'flowspec.thenaction': {
-            'Meta': {'unique_together': "(('action', 'action_value'),)", 'object_name': 'ThenAction', 'db_table': "u'then_action'"},
-            'action': ('django.db.models.fields.CharField', [], {'max_length': '60'}),
-            'action_value': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
-        }
-    }
-    
-    complete_apps = ['flowspec']
+# Generated by Django 2.1 on 2019-07-25 08:11
+
+from django.conf import settings
+from django.db import migrations, models
+import django.db.models.deletion
+import flowspec.models
+
+
+class Migration(migrations.Migration):
+
+    initial = True
+
+    dependencies = [
+        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name='FragmentType',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('fragmenttype', models.CharField(choices=[('dont-fragment', "Don't fragment"), ('first-fragment', 'First fragment'), ('is-fragment', 'Is fragment'), ('last-fragment', 'Last fragment'), ('not-a-fragment', 'Not a fragment')], max_length=20, verbose_name='Fragment Type')),
+            ],
+        ),
+        migrations.CreateModel(
+            name='MatchDscp',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('dscp', models.CharField(max_length=24)),
+            ],
+            options={
+                'db_table': 'match_dscp',
+            },
+        ),
+        migrations.CreateModel(
+            name='MatchPort',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('port', models.CharField(max_length=24, unique=True)),
+            ],
+            options={
+                'db_table': 'match_port',
+            },
+        ),
+        migrations.CreateModel(
+            name='MatchProtocol',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('protocol', models.CharField(max_length=24, unique=True)),
+            ],
+            options={
+                'db_table': 'match_protocol',
+            },
+        ),
+        migrations.CreateModel(
+            name='Route',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('name', models.SlugField(max_length=128, verbose_name='Name')),
+                ('source', models.CharField(help_text='Network address. Use address/CIDR notation', max_length=32, verbose_name='Source Address')),
+                ('sourceport', models.CharField(blank=True, max_length=65535, null=True, verbose_name='Source Port')),
+                ('destination', models.CharField(help_text='Network address. Use address/CIDR notation', max_length=32, verbose_name='Destination Address')),
+                ('destinationport', models.CharField(blank=True, max_length=65535, null=True, verbose_name='Destination Port')),
+                ('port', models.CharField(blank=True, max_length=65535, null=True, verbose_name='Port')),
+                ('icmpcode', models.CharField(blank=True, max_length=32, null=True, verbose_name='ICMP Code')),
+                ('icmptype', models.CharField(blank=True, max_length=32, null=True, verbose_name='ICMP Type')),
+                ('packetlength', models.IntegerField(blank=True, null=True, verbose_name='Packet Length')),
+                ('tcpflag', models.CharField(blank=True, max_length=128, null=True, verbose_name='TCP flag')),
+                ('filed', models.DateTimeField(auto_now_add=True)),
+                ('last_updated', models.DateTimeField(auto_now=True)),
+                ('status', models.CharField(blank=True, choices=[('ACTIVE', 'ACTIVE'), ('ERROR', 'ERROR'), ('EXPIRED', 'EXPIRED'), ('PENDING', 'PENDING'), ('OUTOFSYNC', 'OUTOFSYNC'), ('INACTIVE', 'INACTIVE'), ('ADMININACTIVE', 'ADMININACTIVE')], default='PENDING', max_length=20, null=True, verbose_name='Status')),
+                ('expires', models.DateField(default=flowspec.models.days_offset, verbose_name='Expires')),
+                ('response', models.CharField(blank=True, max_length=512, null=True, verbose_name='Response')),
+                ('comments', models.TextField(blank=True, null=True, verbose_name='Comments')),
+                ('requesters_address', models.CharField(blank=True, max_length=255, null=True)),
+                ('applier', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
+                ('dscp', models.ManyToManyField(blank=True, to='flowspec.MatchDscp', verbose_name='DSCP')),
+                ('fragmenttype', models.ManyToManyField(blank=True, to='flowspec.FragmentType', verbose_name='Fragment Type')),
+                ('protocol', models.ManyToManyField(blank=True, to='flowspec.MatchProtocol', verbose_name='Protocol')),
+            ],
+            options={
+                'verbose_name': 'Rule',
+                'verbose_name_plural': 'Rules',
+                'db_table': 'route',
+            },
+        ),
+        migrations.CreateModel(
+            name='ThenAction',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('action', models.CharField(choices=[('accept', 'Accept'), ('discard', 'Discard'), ('community', 'Community'), ('next-term', 'Next term'), ('routing-instance', 'Routing Instance'), ('rate-limit', 'Rate limit'), ('sample', 'Sample')], max_length=60, verbose_name='Action')),
+                ('action_value', models.CharField(blank=True, max_length=255, null=True, verbose_name='Action Value')),
+            ],
+            options={
+                'db_table': 'then_action',
+                'ordering': ['action', 'action_value'],
+            },
+        ),
+        migrations.AlterUniqueTogether(
+            name='thenaction',
+            unique_together={('action', 'action_value')},
+        ),
+        migrations.AddField(
+            model_name='route',
+            name='then',
+            field=models.ManyToManyField(to='flowspec.ThenAction', verbose_name='Then'),
+        ),
+    ]
diff --git a/flowspec/models.py b/flowspec/models.py
index e65791adb28ec497773bf89216ffe977c03a1568..e2666d3eb077a4679c080b8261a2d4c5e7ab2cf4 100644
--- a/flowspec/models.py
+++ b/flowspec/models.py
@@ -22,21 +22,21 @@ from django.conf import settings
 from django.contrib.auth.models import User
 from django.contrib.sites.models import Site
 from django.utils.translation import ugettext_lazy as _
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 
 from flowspec.helpers import send_new_mail, get_peer_techc_mails
 from utils import proxy as PR
-from ipaddr import *
+from ipaddress import *
 import datetime
 import logging
 
-from junos import create_junos_name
+from flowspec.junos import create_junos_name
 
 
 import beanstalkc
 from utils.randomizer import id_generator as id_gen
 
-from tasks import *
+from flowspec.tasks import *
 
 
 FORMAT = '%(asctime)s %(levelname)s: %(message)s'
@@ -138,18 +138,18 @@ class ThenAction(models.Model):
 
 class Route(models.Model):
     name = models.SlugField(max_length=128, verbose_name=_("Name"))
-    applier = models.ForeignKey(User, blank=True, null=True)
+    applier = models.ForeignKey(User, blank=True, null=True, on_delete=models.CASCADE)
     source = models.CharField(max_length=32, help_text=_("Network address. Use address/CIDR notation"), verbose_name=_("Source Address"))
     sourceport = models.CharField(max_length=65535, blank=True, null=True, verbose_name=_("Source Port"))
     destination = models.CharField(max_length=32, help_text=_("Network address. Use address/CIDR notation"), verbose_name=_("Destination Address"))
     destinationport = models.CharField(max_length=65535, blank=True, null=True, verbose_name=_("Destination Port"))
     port = models.CharField(max_length=65535, blank=True, null=True, verbose_name=_("Port"))
-    dscp = models.ManyToManyField(MatchDscp, blank=True, null=True, verbose_name="DSCP")
-    fragmenttype = models.ManyToManyField(FragmentType, blank=True, null=True, verbose_name="Fragment Type")
+    dscp = models.ManyToManyField(MatchDscp, blank=True, verbose_name="DSCP")
+    fragmenttype = models.ManyToManyField(FragmentType, blank=True, verbose_name="Fragment Type")
     icmpcode = models.CharField(max_length=32, blank=True, null=True, verbose_name="ICMP Code")
     icmptype = models.CharField(max_length=32, blank=True, null=True, verbose_name="ICMP Type")
     packetlength = models.IntegerField(blank=True, null=True, verbose_name="Packet Length")
-    protocol = models.ManyToManyField(MatchProtocol, blank=True, null=True, verbose_name=_("Protocol"))
+    protocol = models.ManyToManyField(MatchProtocol, blank=True, verbose_name=_("Protocol"))
     tcpflag = models.CharField(max_length=128, blank=True, null=True, verbose_name="TCP flag")
     then = models.ManyToManyField(ThenAction, verbose_name=_("Then"))
     filed = models.DateTimeField(auto_now_add=True)
@@ -203,7 +203,7 @@ class Route(models.Model):
         from django.core.exceptions import ValidationError
         if self.destination:
             try:
-                address = IPNetwork(self.destination)
+                address = ipaddress.ip_network(self.destination)
                 self.destination = address.exploded
             except Exception:
                 raise ValidationError(_('Invalid network address format at Destination Field'))
@@ -642,3 +642,4 @@ def send_message(msg, user):
     tube_message = json.dumps({'message': str(msg), 'username': peer})
     b.put(tube_message)
     b.close()
+
diff --git a/flowspec/tasks.py b/flowspec/tasks.py
index 69d0b99995748dcf91fb2a18f3da5cd8f631b98b..00a7d41d562294b744e1d0fffd1e261e9c98d7f5 100644
--- a/flowspec/tasks.py
+++ b/flowspec/tasks.py
@@ -1,368 +1,368 @@
-# -*- coding: utf-8 -*- vim:fileencoding=utf-8:
-# vim: tabstop=4:shiftwidth=4:softtabstop=4:expandtab
-
-# Copyright (C) 2010-2014 GRNET S.A.
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
-#
-
-from utils import proxy as PR
-from celery.task import task
-from celery.task.sets import subtask
-import logging
-import json
-from celery.task.http import *
-import beanstalkc
-from django.conf import settings
-import datetime
-from django.core.mail import send_mail
-from django.template.loader import render_to_string
-import os
-from celery.exceptions import TimeLimitExceeded, SoftTimeLimitExceeded
-from ipaddr import *
-from os import fork,_exit
-from sys import exit
-import time
-
-LOG_FILENAME = os.path.join(settings.LOG_FILE_LOCATION, 'celery_jobs.log')
-
-
-# FORMAT = '%(asctime)s %(levelname)s: %(message)s'
-# logging.basicConfig(format=FORMAT)
-formatter = logging.Formatter('%(asctime)s %(levelname)s: %(message)s')
-
-logger = logging.getLogger(__name__)
-logger.setLevel(logging.DEBUG)
-handler = logging.FileHandler(LOG_FILENAME)
-handler.setFormatter(formatter)
-logger.addHandler(handler)
-
-
-@task(ignore_result=True)
-def add(route, callback=None):
-    try:
-        applier = PR.Applier(route_object=route)
-        commit, response = applier.apply()
-        if commit:
-            status = "ACTIVE"
-        else:
-            status = "ERROR"
-        route.status = status
-        route.response = response
-        route.save()
-        announce("[%s] Rule add: %s - Result: %s" % (route.applier_username_nice, route.name, response), route.applier, route)
-    except TimeLimitExceeded:
-        route.status = "ERROR"
-        route.response = "Task timeout"
-        route.save()
-        announce("[%s] Rule add: %s - Result: %s" % (route.applier_username_nice, route.name, route.response), route.applier, route)
-    except SoftTimeLimitExceeded:
-        route.status = "ERROR"
-        route.response = "Task timeout"
-        route.save()
-        announce("[%s] Rule add: %s - Result: %s" % (route.applier_username_nice, route.name, route.response), route.applier, route)
-    except Exception:
-        route.status = "ERROR"
-        route.response = "Error"
-        route.save()
-        announce("[%s] Rule add: %s - Result: %s" % (route.applier_username_nice, route.name, route.response), route.applier, route)
-
-
-@task(ignore_result=True)
-def edit(route, callback=None):
-    try:
-        applier = PR.Applier(route_object=route)
-        commit, response = applier.apply(operation="replace")
-        if commit:
-            status = "ACTIVE"
-            try:
-              snmp_add_initial_zero_value.delay(str(route.id), True)
-            except Exception as e:
-              logger.error("edit(): route="+str(route)+", ACTIVE, add_initial_zero_value failed: "+str(e))
-        else:
-            status = "ERROR"
-        route.status = status
-        route.response = response
-        route.save()
-        announce("[%s] Rule edit: %s - Result: %s" % (route.applier_username_nice, route.name, response), route.applier, route)
-    except TimeLimitExceeded:
-        route.status = "ERROR"
-        route.response = "Task timeout"
-        route.save()
-        announce("[%s] Rule edit: %s - Result: %s" % (route.applier_username_nice, route.name, route.response), route.applier, route)
-    except SoftTimeLimitExceeded:
-        route.status = "ERROR"
-        route.response = "Task timeout"
-        route.save()
-        announce("[%s] Rule edit: %s - Result: %s" % (route.applier_username_nice, route.name, route.response), route.applier, route)
-    except Exception:
-        route.status = "ERROR"
-        route.response = "Error"
-        route.save()
-        announce("[%s] Rule edit: %s - Result: %s" % (route.applier_username_nice, route.name, route.response), route.applier, route)
-
-
-@task(ignore_result=True)
-def delete(route, **kwargs):
-    try:
-        applier = PR.Applier(route_object=route)
-        commit, response = applier.apply(operation="delete")
-        reason_text = ''
-        if commit:
-            status = "INACTIVE"
-            if "reason" in kwargs and kwargs['reason'] == 'EXPIRED':
-                status = 'EXPIRED'
-                reason_text = " Reason: %s " % status
-            try:
-              snmp_add_initial_zero_value.delay(str(route.id), False)
-            except Exception as e:
-              logger.error("edit(): route="+str(route)+", INACTIVE, add_null_value failed: "+str(e))
-        else:
-            status = "ERROR"
-        route.status = status
-        route.response = response
-        route.save()
-        announce("[%s] Suspending rule : %s%s- Result %s" % (route.applier_username_nice, route.name, reason_text, response), route.applier, route)
-    except TimeLimitExceeded:
-        route.status = "ERROR"
-        route.response = "Task timeout"
-        route.save()
-        announce("[%s] Suspending rule : %s - Result: %s" % (route.applier_username_nice, route.name, route.response), route.applier, route)
-    except SoftTimeLimitExceeded:
-        route.status = "ERROR"
-        route.response = "Task timeout"
-        route.save()
-        announce("[%s] Suspending rule : %s - Result: %s" % (route.applier_username_nice, route.name, route.response), route.applier, route)
-    except Exception:
-        route.status = "ERROR"
-        route.response = "Error"
-        route.save()
-        announce("[%s] Suspending rule : %s - Result: %s" % (route.applier_username_nice, route.name, route.response), route.applier, route)
-
-
-# May not work in the first place... proxy is not aware of Route models
-@task
-def batch_delete(routes, **kwargs):
-    if routes:
-        for route in routes:
-            route.status = 'PENDING';route.save()
-        applier = PR.Applier(route_objects=routes)
-        conf = applier.delete_routes()
-        commit, response = applier.apply(configuration=conf)
-        reason_text = ''
-        if commit:
-            status = "INACTIVE"
-            if "reason" in kwargs and kwargs['reason'] == 'EXPIRED':
-                status = 'EXPIRED'
-                reason_text = " Reason: %s " % status
-            elif "reason" in kwargs and kwargs['reason'] != 'EXPIRED':
-                status = kwargs['reason']
-                reason_text = " Reason: %s " % status
-        else:
-            status = "ERROR"
-        for route in routes:
-            route.status = status
-            route.response = response
-            route.expires = datetime.date.today()
-            route.save()
-            announce("[%s] Rule removal: %s%s- Result %s" % (route.applier_username_nice, route.name, reason_text, response), route.applier, route)
-    else:
-        return False
-
-
+## -*- coding: utf-8 -*- vim:fileencoding=utf-8:
+## vim: tabstop=4:shiftwidth=4:softtabstop=4:expandtab
+#
+## Copyright (C) 2010-2014 GRNET S.A.
+##
+## This program is free software: you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation, either version 3 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program.  If not, see <http://www.gnu.org/licenses/>.
+##
+#
+#from utils import proxy as PR
+#from celery.task import task
+##from celery.task.sets import subtask
+#import logging
+#import json
+##from celery.task.http import *
+#import beanstalkc
+#from django.conf import settings
+#import datetime
+#from django.core.mail import send_mail
+#from django.template.loader import render_to_string
+#import os
+#from celery.exceptions import TimeLimitExceeded, SoftTimeLimitExceeded
+#from ipaddress import *
+#from os import fork,_exit
+#from sys import exit
+#import time
+#
+#LOG_FILENAME = os.path.join(settings.LOG_FILE_LOCATION, 'celery_jobs.log')
+#
+#
+## FORMAT = '%(asctime)s %(levelname)s: %(message)s'
+## logging.basicConfig(format=FORMAT)
+#formatter = logging.Formatter('%(asctime)s %(levelname)s: %(message)s')
+#
+#logger = logging.getLogger(__name__)
+#logger.setLevel(logging.DEBUG)
+#handler = logging.FileHandler(LOG_FILENAME)
+#handler.setFormatter(formatter)
+#logger.addHandler(handler)
+#
+#
+#@task(ignore_result=True)
+#def add(route, callback=None):
+#    try:
+#        applier = PR.Applier(route_object=route)
+#        commit, response = applier.apply()
+#        if commit:
+#            status = "ACTIVE"
+#        else:
+#            status = "ERROR"
+#        route.status = status
+#        route.response = response
+#        route.save()
+#        announce("[%s] Rule add: %s - Result: %s" % (route.applier_username_nice, route.name, response), route.applier, route)
+#    except TimeLimitExceeded:
+#        route.status = "ERROR"
+#        route.response = "Task timeout"
+#        route.save()
+#        announce("[%s] Rule add: %s - Result: %s" % (route.applier_username_nice, route.name, route.response), route.applier, route)
+#    except SoftTimeLimitExceeded:
+#        route.status = "ERROR"
+#        route.response = "Task timeout"
+#        route.save()
+#        announce("[%s] Rule add: %s - Result: %s" % (route.applier_username_nice, route.name, route.response), route.applier, route)
+#    except Exception:
+#        route.status = "ERROR"
+#        route.response = "Error"
+#        route.save()
+#        announce("[%s] Rule add: %s - Result: %s" % (route.applier_username_nice, route.name, route.response), route.applier, route)
+#
+#
+#@task(ignore_result=True)
+#def edit(route, callback=None):
+#    try:
+#        applier = PR.Applier(route_object=route)
+#        commit, response = applier.apply(operation="replace")
+#        if commit:
+#            status = "ACTIVE"
+#            try:
+#              snmp_add_initial_zero_value.delay(str(route.id), True)
+#            except Exception as e:
+#              logger.error("edit(): route="+str(route)+", ACTIVE, add_initial_zero_value failed: "+str(e))
+#        else:
+#            status = "ERROR"
+#        route.status = status
+#        route.response = response
+#        route.save()
+#        announce("[%s] Rule edit: %s - Result: %s" % (route.applier_username_nice, route.name, response), route.applier, route)
+#    except TimeLimitExceeded:
+#        route.status = "ERROR"
+#        route.response = "Task timeout"
+#        route.save()
+#        announce("[%s] Rule edit: %s - Result: %s" % (route.applier_username_nice, route.name, route.response), route.applier, route)
+#    except SoftTimeLimitExceeded:
+#        route.status = "ERROR"
+#        route.response = "Task timeout"
+#        route.save()
+#        announce("[%s] Rule edit: %s - Result: %s" % (route.applier_username_nice, route.name, route.response), route.applier, route)
+#    except Exception:
+#        route.status = "ERROR"
+#        route.response = "Error"
+#        route.save()
+#        announce("[%s] Rule edit: %s - Result: %s" % (route.applier_username_nice, route.name, route.response), route.applier, route)
+#
+#
+#@task(ignore_result=True)
+#def delete(route, **kwargs):
+#    try:
+#        applier = PR.Applier(route_object=route)
+#        commit, response = applier.apply(operation="delete")
+#        reason_text = ''
+#        if commit:
+#            status = "INACTIVE"
+#            if "reason" in kwargs and kwargs['reason'] == 'EXPIRED':
+#                status = 'EXPIRED'
+#                reason_text = " Reason: %s " % status
+#            try:
+#              snmp_add_initial_zero_value.delay(str(route.id), False)
+#            except Exception as e:
+#              logger.error("edit(): route="+str(route)+", INACTIVE, add_null_value failed: "+str(e))
+#        else:
+#            status = "ERROR"
+#        route.status = status
+#        route.response = response
+#        route.save()
+#        announce("[%s] Suspending rule : %s%s- Result %s" % (route.applier_username_nice, route.name, reason_text, response), route.applier, route)
+#    except TimeLimitExceeded:
+#        route.status = "ERROR"
+#        route.response = "Task timeout"
+#        route.save()
+#        announce("[%s] Suspending rule : %s - Result: %s" % (route.applier_username_nice, route.name, route.response), route.applier, route)
+#    except SoftTimeLimitExceeded:
+#        route.status = "ERROR"
+#        route.response = "Task timeout"
+#        route.save()
+#        announce("[%s] Suspending rule : %s - Result: %s" % (route.applier_username_nice, route.name, route.response), route.applier, route)
+#    except Exception:
+#        route.status = "ERROR"
+#        route.response = "Error"
+#        route.save()
+#        announce("[%s] Suspending rule : %s - Result: %s" % (route.applier_username_nice, route.name, route.response), route.applier, route)
+#
+#
+## May not work in the first place... proxy is not aware of Route models
+#@task
+#def batch_delete(routes, **kwargs):
+#    if routes:
+#        for route in routes:
+#            route.status = 'PENDING';route.save()
+#        applier = PR.Applier(route_objects=routes)
+#        conf = applier.delete_routes()
+#        commit, response = applier.apply(configuration=conf)
+#        reason_text = ''
+#        if commit:
+#            status = "INACTIVE"
+#            if "reason" in kwargs and kwargs['reason'] == 'EXPIRED':
+#                status = 'EXPIRED'
+#                reason_text = " Reason: %s " % status
+#            elif "reason" in kwargs and kwargs['reason'] != 'EXPIRED':
+#                status = kwargs['reason']
+#                reason_text = " Reason: %s " % status
+#        else:
+#            status = "ERROR"
+#        for route in routes:
+#            route.status = status
+#            route.response = response
+#            route.expires = datetime.date.today()
+#            route.save()
+#            announce("[%s] Rule removal: %s%s- Result %s" % (route.applier_username_nice, route.name, reason_text, response), route.applier, route)
+#    else:
+#        return False
+#
+#
+##@task(ignore_result=True)
+#def announce(messg, user, route):
+#    peers = user.get_profile().peers.all()
+#    username = None
+#    for peer in peers:
+#        if username:
+#            break
+#        for network in peer.networks.all():
+#            net = IPNetwork(network)
+#            if IPNetwork(route.destination) in net:
+#                username = peer.peer_tag
+#                break
+#    messg = str(messg)
+#    b = beanstalkc.Connection()
+#    b.use(settings.POLLS_TUBE)
+#    tube_message = json.dumps({'message': messg, 'username': username})
+#    b.put(tube_message)
+#    b.close()
+#
+#
+#@task
+#def check_sync(route_name=None, selected_routes=[]):
+#    from flowspec.models import Route, MatchPort, MatchDscp, ThenAction
+#    if not selected_routes:
+#        routes = Route.objects.all()
+#    else:
+#        routes = selected_routes
+#    if route_name:
+#        routes = routes.filter(name=route_name)
+#    for route in routes:
+#        if route.has_expired() and (route.status != 'EXPIRED' and route.status != 'ADMININACTIVE' and route.status != 'INACTIVE'):
+#            if route.status != 'ERROR':
+#                logger.info('Expiring %s route %s' %(route.status, route.name))
+#                subtask(delete).delay(route, reason="EXPIRED")
+#        else:
+#            if route.status != 'EXPIRED':
+#                route.check_sync()
+#
+#
 #@task(ignore_result=True)
-def announce(messg, user, route):
-    peers = user.get_profile().peers.all()
-    username = None
-    for peer in peers:
-        if username:
-            break
-        for network in peer.networks.all():
-            net = IPNetwork(network)
-            if IPNetwork(route.destination) in net:
-                username = peer.peer_tag
-                break
-    messg = str(messg)
-    b = beanstalkc.Connection()
-    b.use(settings.POLLS_TUBE)
-    tube_message = json.dumps({'message': messg, 'username': username})
-    b.put(tube_message)
-    b.close()
-
-
-@task
-def check_sync(route_name=None, selected_routes=[]):
-    from flowspec.models import Route, MatchPort, MatchDscp, ThenAction
-    if not selected_routes:
-        routes = Route.objects.all()
-    else:
-        routes = selected_routes
-    if route_name:
-        routes = routes.filter(name=route_name)
-    for route in routes:
-        if route.has_expired() and (route.status != 'EXPIRED' and route.status != 'ADMININACTIVE' and route.status != 'INACTIVE'):
-            if route.status != 'ERROR':
-                logger.info('Expiring %s route %s' %(route.status, route.name))
-                subtask(delete).delay(route, reason="EXPIRED")
-        else:
-            if route.status != 'EXPIRED':
-                route.check_sync()
-
-
-@task(ignore_result=True)
-def notify_expired():
-    from flowspec.models import *
-    from django.contrib.sites.models import Site
-    logger.info('Initializing expiration notification')
-    routes = Route.objects.all()
-    for route in routes:
-        if route.status not in ['EXPIRED', 'ADMININACTIVE', 'INACTIVE', 'ERROR']:
-            expiration_days = (route.expires - datetime.date.today()).days
-            if expiration_days < settings.EXPIRATION_NOTIFY_DAYS:
-                try:
-                    fqdn = Site.objects.get_current().domain
-                    admin_url = "https://%s%s" % \
-                    (fqdn,
-                     "/edit/%s"%route.name)
-                    mail_body = render_to_string("rule_action.txt",
-                                             {"route": route, 'expiration_days':expiration_days, 'action':'expires', 'url':admin_url})
-                    days_num = ' days'
-                    expiration_days_text = "%s %s" %('in',expiration_days)
-                    if expiration_days == 0:
-                        days_num = ' today'
-                        expiration_days_text = ''
-                    if expiration_days == 1:
-                        days_num = ' day'
-                    logger.info('Route %s expires %s%s. Notifying %s (%s)' %(route.name, expiration_days_text, days_num, route.applier.username, route.applier.email))
-                    send_mail(settings.EMAIL_SUBJECT_PREFIX + "Rule %s expires %s%s" %
-                              (route.name,expiration_days_text, days_num),
-                              mail_body, settings.SERVER_EMAIL,
-                              [route.applier.email])
-                except Exception as e:
-                    logger.info("Exception: %s"%e)
-                    pass
-    logger.info('Expiration notification process finished')
-
-##############################################################################
-##############################################################################
-# snmp task handling (including helper functions)
-
-import os
-import signal
-
-def handleSIGCHLD(signal, frame):
-  logger.info("handleSIGCHLD(): reaping childs")
-  os.waitpid(-1, os.WNOHANG)
-
-def snmp_lock_create(wait=0):
-    first=1
-    success=0
-    while first or wait:
-      first=0
-      try:
-          os.mkdir(settings.SNMP_POLL_LOCK)
-          logger.error("snmp_lock_create(): creating lock dir succeeded")
-          success=1
-          return success
-      except OSError, e:
-          logger.error("snmp_lock_create(): creating lock dir failed: OSError: "+str(e))
-          success=0
-      except Exception as e:
-          logger.error("snmp_lock_create(): Lock already exists")
-          logger.error("snmp_lock_create(): creating lock dir failed: "+str(e))
-          success=0
-      if not success and wait:
-        time.sleep(1)
-    return success;
-
-def snmp_lock_remove():
-    try:
-      os.rmdir(settings.SNMP_POLL_LOCK)
-    except Exception as e:
-      logger.info("snmp_lock_remove(): failed "+str(e))
-
-def exit_process():
-      logger.info("exit_process(): before exit in child process (pid="+str(pid)+", npid="+str(npid)+")")
-      exit()
-      logger.info("exit_process(): before exit in child process (pid="+str(pid)+", npid="+str(npid)+"), after exit")
-      sys.exit()
-      logger.info("exit_process(): before exit in child process (pid="+str(pid)+", npid="+str(npid)+"), after sys.exit")
-      os._exit()
-      logger.info("exit_process(): before exit in child process (pid="+str(pid)+", npid="+str(npid)+"), after os._exit")
-
-#@task(ignore_result=True, time_limit=580, soft_time_limit=550)
-@task(ignore_result=True, max_retries=0)
-def poll_snmp_statistics():
-    from flowspec import snmpstats
-
-    if not snmp_lock_create(0):
-      return
-
-    signal.signal(signal.SIGCHLD, handleSIGCHLD)
-
-    pid = os.getpid()
-    logger.info("poll_snmp_statistics(): before fork (pid="+str(pid)+")")
-    npid = os.fork()
-    if npid == -1:
-      pass
-    elif npid > 0:
-      logger.info("poll_snmp_statistics(): returning in parent process (pid="+str(pid)+", npid="+str(npid)+")")
-    else:
-      logger.info("poll_snmp_statistics(): in child process (pid="+str(pid)+", npid="+str(npid)+")")
-      try:
-        snmpstats.poll_snmp_statistics()        
-      except e:
-        logger.error("poll_snmp_statistics(): exception occured in snmp poll (pid="+str(pid)+", npid="+str(npid)+"): "+str(e))
-      snmp_lock_remove()
-      #exit_process()
-      logger.info("exit_process(): before exit in child process (pid="+str(pid)+", npid="+str(npid)+")")
-      exit()
-      logger.info("exit_process(): before exit in child process (pid="+str(pid)+", npid="+str(npid)+"), after exit")
-      sys.exit()
-      logger.info("exit_process(): before exit in child process (pid="+str(pid)+", npid="+str(npid)+"), after sys.exit")
-      os._exit()
-      logger.info("exit_process(): before exit in child process (pid="+str(pid)+", npid="+str(npid)+"), after os._exit")
-
-@task(ignore_result=True, max_retries=0)
-def snmp_add_initial_zero_value(rule_id, zero_or_null=True):
-    from flowspec import snmpstats
-
-    signal.signal(signal.SIGCHLD, handleSIGCHLD)
-
-    pid = os.getpid()
-    logger.info("snmp_add_initial_zero_value(): before fork (pid="+str(pid)+")")
-    npid = os.fork()
-    if npid == -1:
-      pass
-    elif npid > 0:
-      logger.info("snmp_add_initial_zero_value(): returning in parent process (pid="+str(pid)+", npid="+str(npid)+")")
-    else:
-      logger.info("snmp_add_initial_zero_value(): in child process (pid="+str(pid)+", npid="+str(npid)+")")
-
-      try:
-        snmpstats.add_initial_zero_value(rule_id, zero_or_null)
-        logger.info("snmp_add_initial_zero_value(): rule_id="+str(rule_id)+" sucesss")
-      except Exception as e:
-        logger.error("snmp_add_initial_zero_value(): rule_id="+str(rule_id)+" failed: "+str(e))
-
-      #exit_process()
-      logger.info("exit_process(): before exit in child process (pid="+str(pid)+", npid="+str(npid)+")")
-      exit()
-      logger.info("exit_process(): before exit in child process (pid="+str(pid)+", npid="+str(npid)+"), after exit")
-      sys.exit()
-      logger.info("exit_process(): before exit in child process (pid="+str(pid)+", npid="+str(npid)+"), after sys.exit")
-      os._exit()
-      logger.info("exit_process(): before exit in child process (pid="+str(pid)+", npid="+str(npid)+"), after os._exit")
-
-
+#def notify_expired():
+#    from flowspec.models import *
+#    from django.contrib.sites.models import Site
+#    logger.info('Initializing expiration notification')
+#    routes = Route.objects.all()
+#    for route in routes:
+#        if route.status not in ['EXPIRED', 'ADMININACTIVE', 'INACTIVE', 'ERROR']:
+#            expiration_days = (route.expires - datetime.date.today()).days
+#            if expiration_days < settings.EXPIRATION_NOTIFY_DAYS:
+#                try:
+#                    fqdn = Site.objects.get_current().domain
+#                    admin_url = "https://%s%s" % \
+#                    (fqdn,
+#                     "/edit/%s"%route.name)
+#                    mail_body = render_to_string("rule_action.txt",
+#                                             {"route": route, 'expiration_days':expiration_days, 'action':'expires', 'url':admin_url})
+#                    days_num = ' days'
+#                    expiration_days_text = "%s %s" %('in',expiration_days)
+#                    if expiration_days == 0:
+#                        days_num = ' today'
+#                        expiration_days_text = ''
+#                    if expiration_days == 1:
+#                        days_num = ' day'
+#                    logger.info('Route %s expires %s%s. Notifying %s (%s)' %(route.name, expiration_days_text, days_num, route.applier.username, route.applier.email))
+#                    send_mail(settings.EMAIL_SUBJECT_PREFIX + "Rule %s expires %s%s" %
+#                              (route.name,expiration_days_text, days_num),
+#                              mail_body, settings.SERVER_EMAIL,
+#                              [route.applier.email])
+#                except Exception as e:
+#                    logger.info("Exception: %s"%e)
+#                    pass
+#    logger.info('Expiration notification process finished')
+#
+###############################################################################
+###############################################################################
+## snmp task handling (including helper functions)
+#
+#import os
+#import signal
+#
+#def handleSIGCHLD(signal, frame):
+#  logger.info("handleSIGCHLD(): reaping childs")
+#  os.waitpid(-1, os.WNOHANG)
+#
+#def snmp_lock_create(wait=0):
+#    first=1
+#    success=0
+#    while first or wait:
+#      first=0
+#      try:
+#          os.mkdir(settings.SNMP_POLL_LOCK)
+#          logger.error("snmp_lock_create(): creating lock dir succeeded")
+#          success=1
+#          return success
+#      except OSError as e:
+#          logger.error("snmp_lock_create(): creating lock dir failed: OSError: "+str(e))
+#          success=0
+#      except Exception as e:
+#          logger.error("snmp_lock_create(): Lock already exists")
+#          logger.error("snmp_lock_create(): creating lock dir failed: "+str(e))
+#          success=0
+#      if not success and wait:
+#        time.sleep(1)
+#    return success;
+#
+#def snmp_lock_remove():
+#    try:
+#      os.rmdir(settings.SNMP_POLL_LOCK)
+#    except Exception as e:
+#      logger.info("snmp_lock_remove(): failed "+str(e))
+#
+#def exit_process():
+#      logger.info("exit_process(): before exit in child process (pid="+str(pid)+", npid="+str(npid)+")")
+#      exit()
+#      logger.info("exit_process(): before exit in child process (pid="+str(pid)+", npid="+str(npid)+"), after exit")
+#      sys.exit()
+#      logger.info("exit_process(): before exit in child process (pid="+str(pid)+", npid="+str(npid)+"), after sys.exit")
+#      os._exit()
+#      logger.info("exit_process(): before exit in child process (pid="+str(pid)+", npid="+str(npid)+"), after os._exit")
+#
+##@task(ignore_result=True, time_limit=580, soft_time_limit=550)
+#@task(ignore_result=True, max_retries=0)
+#def poll_snmp_statistics():
+#    from flowspec import snmpstats
+#
+#    if not snmp_lock_create(0):
+#      return
+#
+#    signal.signal(signal.SIGCHLD, handleSIGCHLD)
+#
+#    pid = os.getpid()
+#    logger.info("poll_snmp_statistics(): before fork (pid="+str(pid)+")")
+#    npid = os.fork()
+#    if npid == -1:
+#      pass
+#    elif npid > 0:
+#      logger.info("poll_snmp_statistics(): returning in parent process (pid="+str(pid)+", npid="+str(npid)+")")
+#    else:
+#      logger.info("poll_snmp_statistics(): in child process (pid="+str(pid)+", npid="+str(npid)+")")
+#      try:
+#        snmpstats.poll_snmp_statistics()        
+#      except e:
+#        logger.error("poll_snmp_statistics(): exception occured in snmp poll (pid="+str(pid)+", npid="+str(npid)+"): "+str(e))
+#      snmp_lock_remove()
+#      #exit_process()
+#      logger.info("exit_process(): before exit in child process (pid="+str(pid)+", npid="+str(npid)+")")
+#      exit()
+#      logger.info("exit_process(): before exit in child process (pid="+str(pid)+", npid="+str(npid)+"), after exit")
+#      sys.exit()
+#      logger.info("exit_process(): before exit in child process (pid="+str(pid)+", npid="+str(npid)+"), after sys.exit")
+#      os._exit()
+#      logger.info("exit_process(): before exit in child process (pid="+str(pid)+", npid="+str(npid)+"), after os._exit")
+#
+#@task(ignore_result=True, max_retries=0)
+#def snmp_add_initial_zero_value(rule_id, zero_or_null=True):
+#    from flowspec import snmpstats
+#
+#    signal.signal(signal.SIGCHLD, handleSIGCHLD)
+#
+#    pid = os.getpid()
+#    logger.info("snmp_add_initial_zero_value(): before fork (pid="+str(pid)+")")
+#    npid = os.fork()
+#    if npid == -1:
+#      pass
+#    elif npid > 0:
+#      logger.info("snmp_add_initial_zero_value(): returning in parent process (pid="+str(pid)+", npid="+str(npid)+")")
+#    else:
+#      logger.info("snmp_add_initial_zero_value(): in child process (pid="+str(pid)+", npid="+str(npid)+")")
+#
+#      try:
+#        snmpstats.add_initial_zero_value(rule_id, zero_or_null)
+#        logger.info("snmp_add_initial_zero_value(): rule_id="+str(rule_id)+" sucesss")
+#      except Exception as e:
+#        logger.error("snmp_add_initial_zero_value(): rule_id="+str(rule_id)+" failed: "+str(e))
+#
+#      #exit_process()
+#      logger.info("exit_process(): before exit in child process (pid="+str(pid)+", npid="+str(npid)+")")
+#      exit()
+#      logger.info("exit_process(): before exit in child process (pid="+str(pid)+", npid="+str(npid)+"), after exit")
+#      sys.exit()
+#      logger.info("exit_process(): before exit in child process (pid="+str(pid)+", npid="+str(npid)+"), after sys.exit")
+#      os._exit()
+#      logger.info("exit_process(): before exit in child process (pid="+str(pid)+", npid="+str(npid)+"), after os._exit")
+#
+#
diff --git a/flowspec/templatetags/unescape.py b/flowspec/templatetags/unescape.py
index 9194e4dca80c59066bd2dd76244d82a00cb6a936..0cf4ce16b4a46137cd65820f1253479c8a9e7851 100644
--- a/flowspec/templatetags/unescape.py
+++ b/flowspec/templatetags/unescape.py
@@ -1,9 +1,9 @@
 from django import template
 from django.utils.safestring import mark_safe
-from django.utils.encoding import force_unicode
+from django.utils.encoding import force_text
 
 register = template.Library()
 
 @register.filter
 def unescape(value):
-    return mark_safe(force_unicode(value).replace('&lt;', '<').replace('&gt;', '>').replace('&quot;', '"').replace('&#39;', "'").replace('&amp;', '&'))
+    return mark_safe(force_text(value).replace('&lt;', '<').replace('&gt;', '>').replace('&quot;', '"').replace('&#39;', "'").replace('&amp;', '&'))
diff --git a/flowspec/validators.py b/flowspec/validators.py
index efa55b2ae827870a0029ebb90bdc80b9b9c83413..a9929bb1bbfbc20e93db57bf1ee2dc9a006633cd 100644
--- a/flowspec/validators.py
+++ b/flowspec/validators.py
@@ -1,16 +1,16 @@
-from ipaddr import IPNetwork
+from ipaddress import ip_network
 import datetime
 from django.conf import settings
 from django.core.mail import send_mail
 from django.utils.translation import ugettext as _
 from peers.models import PeerRange, Peer
 from flowspec.models import Route
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 
 
 def get_network(ip):
     try:
-        address = IPNetwork(ip)
+        address = ip_network(ip)
     except Exception:
         return (False, _('Invalid network address format'))
     else:
@@ -54,7 +54,7 @@ def clean_source(user, source):
     if not success:
         return address
     for net in settings.PROTECTED_SUBNETS:
-        if address in IPNetwork(net):
+        if address in ip_network(net):
             mail_body = "User %s %s attempted to set %s as the source address in a firewall rule" % (user.username, user.email, source)
             send_mail(
                 settings.EMAIL_SUBJECT_PREFIX + "Caught an attempt to set a protected IP/network as a source address",
@@ -72,7 +72,7 @@ def clean_destination(user, destination):
     if not success:
         return address
     for net in settings.PROTECTED_SUBNETS:
-        if address in IPNetwork(net):
+        if address in ip_network(net):
             mail_body = "User %s %s attempted to set %s as the destination address in a firewall rule" % (user.username, user.email, destination)
             send_mail(
                 settings.EMAIL_SUBJECT_PREFIX + "Caught an attempt to set a protected IP/network as the destination address",
@@ -98,8 +98,8 @@ def clean_destination(user, destination):
         networks = PeerRange.objects.filter(peer__in=Peer.objects.all()).distinct()
     network_is_mine = False
     for network in networks:
-        net = IPNetwork(network.network)
-        if IPNetwork(destination) in net:
+        net = ip_network(network.network)
+        if ip_network(destination) in net:
             network_is_mine = True
     if not network_is_mine:
         return (_('Destination address/network should belong to your administrative address space. Check My Profile to review your networks'))
@@ -185,7 +185,7 @@ def check_if_rule_exists(fields, queryset):
 
     routes = queryset.filter(
         source=fields.get('source'),
-        destination=IPNetwork(fields.get('destination')).compressed,
+        destination=ip_network(fields.get('destination')).compressed,
     )
     if routes:
         ids = [str(item[0]) for item in routes.values_list('pk')]
@@ -195,7 +195,7 @@ def check_if_rule_exists(fields, queryset):
 
     routes = Route.objects.filter(
         source=fields.get('source'),
-        destination=IPNetwork(fields.get('destination')).compressed,
+        destination=ip_network(fields.get('destination')).compressed,
     )
     for route in routes:
         return (
diff --git a/flowspec/views.py b/flowspec/views.py
index b95855336ae5bbecb2c32c7105b345d9588e9188..dcdd994bd74a6ccf65a959defb2ff8e2d3f2dfca 100644
--- a/flowspec/views.py
+++ b/flowspec/views.py
@@ -24,14 +24,14 @@ from django.contrib.auth import logout
 from django.contrib.sites.models import Site
 from django.contrib.auth.models import User
 from django.http import HttpResponseRedirect, HttpResponse
-from django.shortcuts import get_object_or_404, render_to_response, render
+from django.shortcuts import get_object_or_404, render
 from django.template.context import RequestContext
 from django.template.loader import render_to_string
 from django.utils.translation import ugettext as _
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 from django.contrib import messages
 from accounts.models import *
-from ipaddr import *
+from ipaddress import *
 from django.db.models import Q
 from django.contrib.auth import authenticate, login
 
@@ -41,7 +41,8 @@ from flowspec.forms import *
 from flowspec.models import *
 from peers.models import *
 
-from registration.models import RegistrationProfile
+#TODO re-enable
+#from django_registration.models import RegistrationProfile
 
 from copy import deepcopy
 
@@ -82,7 +83,6 @@ def welcome(request):
     return render(
         request,
         'welcome.html',
-        {}
     )
 
 
@@ -93,7 +93,7 @@ def dashboard(request):
     message = ''
     #message = eee.aa
     try:
-        peers = request.user.get_profile().peers.select_related('user_profile')
+        peers = request.user.userprofile.peers.select_related()
     except UserProfile.DoesNotExist:
         error = "User <strong>%s</strong> does not belong to any peer or organization. It is not possible to create new firewall rules.<br>Please contact Helpdesk to resolve this issue" % request.user.username
         return render(
@@ -142,7 +142,7 @@ def dashboard(request):
 @never_cache
 def group_routes(request):
     try:
-        request.user.get_profile().peers.all()
+        request.user.userprofile.peers.select_related()
     except UserProfile.DoesNotExist:
         error = "User <strong>%s</strong> does not belong to any peer or organization. It is not possible to create new firewall rules.<br>Please contact Helpdesk to resolve this issue" % request.user.username
         return render(
@@ -164,7 +164,7 @@ def group_routes(request):
 def group_routes_ajax(request):
     all_group_routes = []
     try:
-        peers = request.user.get_profile().peers.prefetch_related('networks')
+        peers = request.user.userprofile.peers.prefetch_related('networks')
     except UserProfile.DoesNotExist:
         error = "User <strong>%s</strong> does not belong to any peer or organization. It is not possible to create new firewall rules.<br>Please contact Helpdesk to resolve this issue" % request.user.username
         return render(
@@ -182,7 +182,7 @@ def group_routes_ajax(request):
     jresp = {}
     routes = build_routes_json(all_group_routes, request.user.is_superuser)
     jresp['aaData'] = routes
-    return HttpResponse(json.dumps(jresp), mimetype='application/json')
+    return HttpResponse(json.dumps(jresp), content_type='application/json')
 
 
 @login_required
@@ -190,10 +190,11 @@ def group_routes_ajax(request):
 def overview_routes_ajax(request):
     all_group_routes = []
     try:
-        peers = request.user.get_profile().peers.all().select_related()
+        # TODO all()?
+        peers = request.user.userprofile.peers.all().select_related()
     except UserProfile.DoesNotExist:
         error = "User <strong>%s</strong> does not belong to any peer or organization. It is not possible to create new firewall rules.<br>Please contact Helpdesk to resolve this issue" % request.user.username
-        return render_to_response('error.html', {'error': error}, context_instance=RequestContext(request))
+        return render(request, 'error.html', {'error': error})
     query = Q()
     for peer in peers:
         query |= Q(applier__userprofile__in=peer.user_profile.all())
@@ -203,7 +204,7 @@ def overview_routes_ajax(request):
     jresp = {}
     routes = build_routes_json(all_group_routes, request.user.is_superuser)
     jresp['aaData'] = routes
-    return HttpResponse(json.dumps(jresp), mimetype='application/json')
+    return HttpResponse(json.dumps(jresp), content_type='application/json')
 
 
 def build_routes_json(groutes, is_superuser):
@@ -242,14 +243,14 @@ def build_routes_json(groutes, is_superuser):
             rd['applier'] = 'unknown'
             rd['peer'] = ''
         else:
-            peers = r.applier.get_profile().peers.select_related('networks')
+            peers = r.applier.userprofile.peers.select_related('networks')
             username = None
             for peer in peers:
                 if username:
                     break
                 for network in peer.networks.all():
-                    net = IPNetwork(network)
-                    if IPNetwork(r.destination) in net:
+                    net = ip_network(network)
+                    if ip_network(r.destination) in net:
                         username = peer.peer_name
                         break
             try:
@@ -271,7 +272,8 @@ def add_route(request):
     if request.user.is_superuser:
         applier_peer_networks = PeerRange.objects.all()
     else:
-        user_peers = request.user.get_profile().peers.all()
+        # TODO all()?
+        user_peers = request.user.userprofile.peers.all()
         for peer in user_peers:
             applier_peer_networks.extend(peer.networks.all())
     if not applier_peer_networks:
@@ -286,10 +288,9 @@ def add_route(request):
         if not request.user.is_superuser:
             form.fields['then'] = forms.ModelMultipleChoiceField(queryset=ThenAction.objects.filter(action__in=settings.UI_USER_THEN_ACTIONS).order_by('action'), required=True)
             form.fields['protocol'] = forms.ModelMultipleChoiceField(queryset=MatchProtocol.objects.filter(protocol__in=settings.UI_USER_PROTOCOLS).order_by('protocol'), required=False)
-        return render_to_response('apply.html', {'form': form,
+        return render(request, 'apply.html', {'form': form,
             'applier': applier,
-            'maxexpires': settings.MAX_RULE_EXPIRE_DAYS },
-            context_instance=RequestContext(request))
+            'maxexpires': settings.MAX_RULE_EXPIRE_DAYS })
 
     else:
         request_data = request.POST.copy()
@@ -308,8 +309,8 @@ def add_route(request):
                 route.applier = request.user
             route.status = "PENDING"
             route.response = "Applying"
-            route.source = IPNetwork('%s/%s' % (IPNetwork(route.source).network.compressed, IPNetwork(route.source).prefixlen)).compressed
-            route.destination = IPNetwork('%s/%s' % (IPNetwork(route.destination).network.compressed, IPNetwork(route.destination).prefixlen)).compressed
+            route.source = ip_network('%s/%s' % (ip_network(route.source).network.compressed, ip_network(route.source).prefixlen)).compressed
+            route.destination = ip_network('%s/%s' % (ip_network(route.destination).network.compressed, ip_network(route.destination).prefixlen)).compressed
             try:
                 route.requesters_address = request.META['HTTP_X_FORWARDED_FOR']
             except:
@@ -346,7 +347,7 @@ def edit_route(request, route_slug):
     if request.user.is_superuser:
         applier_peer_networks = PeerRange.objects.all()
     else:
-        user_peers = request.user.get_profile().peers.all()
+        user_peers = request.user.userprofile.peers.all()
         for peer in user_peers:
             applier_peer_networks.extend(peer.networks.all())
     if not applier_peer_networks:
@@ -390,8 +391,8 @@ def edit_route(request, route_slug):
             if bool(set(changed_data) & set(critical_changed_values)) or (not route_original.status == 'ACTIVE'):
                 route.status = "PENDING"
                 route.response = "Applying"
-                route.source = IPNetwork('%s/%s' % (IPNetwork(route.source).network.compressed, IPNetwork(route.source).prefixlen)).compressed
-                route.destination = IPNetwork('%s/%s' % (IPNetwork(route.destination).network.compressed, IPNetwork(route.destination).prefixlen)).compressed
+                route.source = ip_network('%s/%s' % (ip_network(route.source).network.compressed, ip_network(route.source).prefixlen)).compressed
+                route.destination = ip_network('%s/%s' % (ip_network(route.destination).network.compressed, ip_network(route.destination).prefixlen)).compressed
                 try:
                     route.requesters_address = request.META['HTTP_X_FORWARDED_FOR']
                 except:
@@ -407,16 +408,13 @@ def edit_route(request, route_slug):
             if not request.user.is_superuser:
                 form.fields['then'] = forms.ModelMultipleChoiceField(queryset=ThenAction.objects.filter(action__in=settings.UI_USER_THEN_ACTIONS).order_by('action'), required=True)
                 form.fields['protocol'] = forms.ModelMultipleChoiceField(queryset=MatchProtocol.objects.filter(protocol__in=settings.UI_USER_PROTOCOLS).order_by('protocol'), required=False)
-            return render_to_response(
-                'apply.html',
+            return render(request, 'apply.html',
                 {
                     'form': form,
                     'edit': True,
                     'applier': applier,
                     'maxexpires': settings.MAX_RULE_EXPIRE_DAYS
-                },
-                context_instance=RequestContext(request)
-            )
+                })
     else:
         if (not route_original.status == 'ACTIVE'):
             route_edit.expires = datetime.date.today() + datetime.timedelta(days=settings.EXPIRATION_DAYS_OFFSET-1)
@@ -432,16 +430,13 @@ def edit_route(request, route_slug):
         if not request.user.is_superuser:
             form.fields['then'] = forms.ModelMultipleChoiceField(queryset=ThenAction.objects.filter(action__in=settings.UI_USER_THEN_ACTIONS).order_by('action'), required=True)
             form.fields['protocol'] = forms.ModelMultipleChoiceField(queryset=MatchProtocol.objects.filter(protocol__in=settings.UI_USER_PROTOCOLS).order_by('protocol'), required=False)
-        return render_to_response(
-            'apply.html',
+        return render(request, 'apply.html',
             {
                 'form': form,
                 'edit': True,
                 'applier': applier,
                 'maxexpires': settings.MAX_RULE_EXPIRE_DAYS
-            },
-            context_instance=RequestContext(request)
-        )
+            })
 
 
 @login_required
@@ -449,25 +444,25 @@ def edit_route(request, route_slug):
 def delete_route(request, route_slug):
     if request.is_ajax():
         route = get_object_or_404(Route, name=route_slug)
-        peers = route.applier.get_profile().peers.all()
+        peers = route.applier.userprofile.peers.all()
         username = None
         for peer in peers:
             if username:
                 break
             for network in peer.networks.all():
-                net = IPNetwork(network)
-                if IPNetwork(route.destination) in net:
+                net = ip_network(network)
+                if ip_network(route.destination) in net:
                     username = peer
                     break
         applier_peer = username
-        peers = request.user.get_profile().peers.all()
+        peers = request.user.userprofile.peers.all()
         username = None
         for peer in peers:
             if username:
                 break
             for network in peer.networks.all():
-                net = IPNetwork(network)
-                if IPNetwork(route.destination) in net:
+                net = ip_network(network)
+                if ip_network(route.destination) in net:
                     username = peer
                     break
         requester_peer = username
@@ -495,7 +490,7 @@ def delete_route(request, route_slug):
 def user_profile(request):
     user = request.user
     try:
-        peers = request.user.get_profile().peers.all()
+        peers = request.user.userprofile.peers.all()
         if user.is_superuser:
             peers = Peer.objects.all()
     except UserProfile.DoesNotExist:
@@ -617,12 +612,12 @@ def user_login(request):
 
         if user is not None:
             try:
-                user.get_profile().peers.all()
+                user.userprofile.peers.all()
             except:
                 form = UserProfileForm()
                 form.fields['user'] = forms.ModelChoiceField(queryset=User.objects.filter(pk=user.pk), empty_label=None)
                 form.fields['peer'] = forms.ModelChoiceField(queryset=Peer.objects.all(), empty_label=None)
-                return render_to_response('registration/select_institution.html', {'form': form}, context_instance=RequestContext(request))
+                return render(request, 'registration/select_institution.html', {'form': form})
             if not user_exists:
                 user_activation_notify(user)
             if user.is_active:
@@ -659,7 +654,7 @@ def user_login(request):
 def user_activation_notify(user):
     if not settings.DISABLE_EMAIL_NOTIFICATION:
         current_site = Site.objects.get_current()
-        peers = user.get_profile().peers.all()
+        peers = user.userprofile.peers.all()
 
         # Email subject *must not* contain newlines
         # TechCs will be notified about new users.
@@ -671,11 +666,12 @@ def user_activation_notify(user):
             }
         )
         subject = ''.join(subject.splitlines())
-        registration_profile = RegistrationProfile.objects.create_profile(user)
+        #TODO registration_profile = RegistrationProfile.objects.create_profile(user)
+        registration_profile="TODO - key"
         message = render_to_string(
             'registration/activation_email.txt',
             {
-                'activation_key': registration_profile.activation_key,
+                'activation_key': registration_profile, #TODO registration_profile.activation_key,
                 'expiration_days': settings.ACCOUNT_ACTIVATION_DAYS,
                 'site': current_site,
                 'user': user
@@ -742,7 +738,7 @@ def add_rate_limit(request):
             response_data['value'] = "%s:%s" % (then.action, then.action_value)
             return HttpResponse(
                 json.dumps(response_data),
-                mimetype='application/json'
+                content_type='application/json'
             )
         else:
             return render(
@@ -775,7 +771,7 @@ def add_port(request):
             response_data['text'] = "%s" % port.port
             return HttpResponse(
                 json.dumps(response_data),
-                mimetype='application/json'
+                content_type='application/json'
             )
         else:
             return render(
@@ -832,7 +828,7 @@ def selectinst(request):
 @never_cache
 def overview(request):
     user = request.user
-    if user.is_authenticated():
+    if user.is_authenticated:
         if user.has_perm('accounts.overview'):
             users = User.objects.all()
             return render(
@@ -865,7 +861,7 @@ def user_logout(request):
 @never_cache
 def load_jscript(request, file):
     long_polling_timeout = int(settings.POLL_SESSION_UPDATE) * 1000 + 10000
-    return render_to_response('%s.js' % file, {'timeout': long_polling_timeout}, context_instance=RequestContext(request), mimetype="text/javascript")
+    return render(request, '%s.js' % file, {'timeout': long_polling_timeout}, content_type="text/javascript")
 
 
 def lookupShibAttr(attrmap, requestMeta):
@@ -907,18 +903,18 @@ def routestats(request, route_slug):
             raise Exception("No data stored in the existing file.")
         if settings.STATISTICS_PER_RULE==False:
             if routename in res:
-              return HttpResponse(json.dumps({"name": routename, "data": res[routename]}), mimetype="application/json")
+              return HttpResponse(json.dumps({"name": routename, "data": res[routename]}), content_type="application/json")
             else:
-              return HttpResponse(json.dumps({"error": "Route '{}' was not found in statistics.".format(routename)}), mimetype="application/json", status=404)
+              return HttpResponse(json.dumps({"error": "Route '{}' was not found in statistics.".format(routename)}), content_type="application/json", status=404)
         else:
             if route_id in res['_per_rule']:
-              return HttpResponse(json.dumps({"name": routename, "data": res['_per_rule'][route_id]}), mimetype="application/json")
+              return HttpResponse(json.dumps({"name": routename, "data": res['_per_rule'][route_id]}), content_type="application/json")
             else:
-              return HttpResponse(json.dumps({"error": "Route '{}' was not found in statistics.".format(route_id)}), mimetype="application/json", status=404)
+              return HttpResponse(json.dumps({"error": "Route '{}' was not found in statistics.".format(route_id)}), content_type="application/json", status=404)
 
     except Exception as e:
         logger.error('routestats failed: %s' % e)
-        return HttpResponse(json.dumps({"error": "No data available. %s" % e}), mimetype="application/json", status=404)
+        return HttpResponse(json.dumps({"error": "No data available. %s" % e}), content_type="application/json", status=404)
 
 def setup(request):
     if User.objects.count() == 0:
diff --git a/flowspy/__init__.py b/flowspy/__init__.py
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..c7cbc1bd0f8c1c440255ef24488e213d3e2141e5 100644
--- a/flowspy/__init__.py
+++ b/flowspy/__init__.py
@@ -0,0 +1,8 @@
+#from __future__ import absolute_import, unicode_literals
+
+# This will make sure the app is always imported when
+# Django starts so that shared_task will use this app.
+from .celery import app as celery_app
+
+__all__ = ('celery_app',)
+
diff --git a/flowspy/celery.py b/flowspy/celery.py
new file mode 100644
index 0000000000000000000000000000000000000000..6e4f3cdfd60d301d5d3854e9ff529cf1afef5bfb
--- /dev/null
+++ b/flowspy/celery.py
@@ -0,0 +1,22 @@
+from __future__ import absolute_import, unicode_literals
+import os
+from celery import Celery
+
+# set the default Django settings module for the 'celery' program.
+os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'flowspy.settings')
+
+app = Celery('flowspy')
+
+# Using a string here means the worker doesn't have to serialize
+# the configuration object to child processes.
+# - namespace='CELERY' means all celery-related configuration keys
+#   should have a `CELERY_` prefix.
+app.config_from_object('django.conf:settings', namespace='CELERY')
+
+# Load task modules from all registered Django app configs.
+app.autodiscover_tasks()
+
+
+@app.task(bind=True)
+def debug_task(self):
+    print('Request: {0!r}'.format(self.request))
diff --git a/flowspy/settings.py.dist b/flowspy/settings.py.dist
index be062610e22ac9c4e635bb4043c87167697a042b..594b18a938a4a73b07bf15f6ca2188c2f144cbe3 100644
--- a/flowspy/settings.py.dist
+++ b/flowspy/settings.py.dist
@@ -1,9 +1,9 @@
 # -*- coding: utf-8 -*- vim:fileencoding=utf-8:
 # vim: tabstop=4:shiftwidth=4:softtabstop=4:expandtab
 # Django settings for flowspy project.
-# Copyright © 2011-2015 Greek Research and Technology Network (GRNET S.A.)
-# Copyright © 2011-2014 Leonidas Poulopoulos (@leopoul)
-# Copyright © 2014-2015 Stavros Kroustouris (@kroustou)
+# Copyright © 2011-2015 Greek Research and Technology Network (GRNET S.A.)
+# Copyright © 2011-2014 Leonidas Poulopoulos (@leopoul)
+# Copyright © 2014-2015 Stavros Kroustouris (@kroustou)
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -28,8 +28,6 @@ except ImportError:
     _uuid_generate_random = None
 
 import os
-import djcelery
-djcelery.setup_loader()
 from celery.schedules import crontab
 
 DEBUG = False
@@ -97,7 +95,9 @@ USE_L10N = True
 # If you set this to False, Django will not use timezone-aware datetimes.
 USE_TZ = True
 
-STATIC_ROOT = os.path.join(BASE_DIR, 'static')
+PROJECT_PATH = os.path.abspath(os.path.dirname(__file__))
+STATIC_ROOT = os.path.join(BASE_DIR)
+STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'static'), ]
 STATIC_URL = '/static/'
 STATICFILES_FINDERS = (
     'django.contrib.staticfiles.finders.FileSystemFinder',
@@ -105,8 +105,25 @@ STATICFILES_FINDERS = (
 )
 
 # Templates
+
+TEMPLATES = [
+    {
+        'BACKEND': 'django.template.backends.django.DjangoTemplates',
+        'DIRS': [
+             os.path.join(BASE_DIR, 'templates'),
+             os.path.join('/srv/venv/django/contrib/admin/templates/'),
+        ],
+        'APP_DIRS': True,
+        'OPTIONS': {
+            'context_processors': [
+                "django.contrib.auth.context_processors.auth",
+                'django_settings_export.settings_export',
+            ]
+        },
+    },
+]
 TEMPLATE_DIRS = (
-    os.path.join(BASE_DIR, 'templates'),
+    
 )
 
 TEMPLATE_LOADERS = (
@@ -124,14 +141,16 @@ TEMPLATE_CONTEXT_PROCESSORS = (
     "context.global_vars.settings_vars",
 )
 
-MIDDLEWARE_CLASSES = (
-    'django.middleware.cache.UpdateCacheMiddleware',
-    'django.middleware.common.CommonMiddleware',
+MIDDLEWARE = (
+    'django.middleware.security.SecurityMiddleware',
     'django.contrib.sessions.middleware.SessionMiddleware',
-    'django.middleware.locale.LocaleMiddleware',
+    'django.middleware.common.CommonMiddleware',
     'django.middleware.csrf.CsrfViewMiddleware',
     'django.contrib.auth.middleware.AuthenticationMiddleware',
     'django.contrib.messages.middleware.MessageMiddleware',
+    'django.middleware.clickjacking.XFrameOptionsMiddleware',
+    'django.middleware.cache.UpdateCacheMiddleware',
+    'django.middleware.locale.LocaleMiddleware',
     'django.middleware.cache.FetchFromCacheMiddleware',
     'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware',
 )
@@ -155,11 +174,9 @@ INSTALLED_APPS = (
     'django.contrib.staticfiles',
     'flowspec',
     'poller',
-    'south',
     'django.contrib.admin',
-    'djcelery',
     'peers',
-    'registration',
+    #'registration',
     'accounts',
     'tinymce',
     'widget_tweaks',
@@ -258,12 +275,12 @@ POLL_SESSION_UPDATE = 60.0
 CELERYBEAT_SCHEDULE = {
     "every-day-sync": {
         "task": "flowspec.tasks.check_sync",
-        "schedule": crontab(minute=01, hour=01),
+        "schedule": crontab(minute="01", hour="01"),
         "args": (),
     },
     "notify-expired": {
         "task": "flowspec.tasks.notify_expired",
-        "schedule": crontab(minute=01, hour=02),
+        "schedule": crontab(minute="01", hour="02"),
         "args": (),
     },
     "snmp-stats-poll": {
@@ -469,3 +486,7 @@ STATISTICS_PER_RULE__ADD_INITIAL_ZERO = True
 ##############################################################################
 ##############################################################################
 
+SETTINGS_EXPORT = [
+    'BRANDING',
+]
+
diff --git a/flowspy/urls.py b/flowspy/urls.py
index 71c80a72d11a5344ba2dc1d63a7319489bfa8cc9..7681a7c14ab2fa5afb5b43a31c4dfa74d268b8d1 100644
--- a/flowspy/urls.py
+++ b/flowspy/urls.py
@@ -1,8 +1,12 @@
-from django.conf.urls import patterns, include, url
-from django.views.generic.simple import direct_to_template
+from django.conf.urls import include, url
+from django.urls import path
+from django.views.generic import TemplateView
 from django.conf import settings
 from django.contrib import admin
+from django.contrib.auth.views import LoginView
 from rest_framework import routers
+from flowspec import views as flowspec_views
+from accounts import views as accounts_views
 from flowspec.viewsets import (
     RouteViewSet,
     PortViewSet,
@@ -24,51 +28,40 @@ router.register(r'matchprotocol', MatchProtocolViewSet)
 router.register(r'matchdscp', MatchDscpViewSet)
 
 
-urlpatterns = patterns(
-    '',
-    (r'^poll/', include('poller.urls')),
-    url(r'^/?$', 'flowspec.views.group_routes', name="group-routes"),
-    url(r'^routes_ajax/?$', 'flowspec.views.group_routes_ajax', name="group-routes-ajax"),
-    url(r'^overview_ajax/?$', 'flowspec.views.overview_routes_ajax', name="overview-ajax"),
-    url(r'^dashboard/$', 'flowspec.views.dashboard', name="dashboard"),
-    url(r'^profile/?$', 'flowspec.views.user_profile', name="user-profile"),
-    url(r'^profile/token/$', 'accounts.views.generate_token', name="user-profile-token"),
-    url(r'^add/?$', 'flowspec.views.add_route', name="add-route"),
-    url(r'^addport/?$', 'flowspec.views.add_port', name="add-port"),
-    url(r'^edit/(?P<route_slug>[\w\-]+)/$', 'flowspec.views.edit_route', name="edit-route"),
-    url(r'^delete/(?P<route_slug>[\w\-]+)/$', 'flowspec.views.delete_route', name="delete-route"),
-    url(r'^login/?', 'flowspec.views.user_login', name="login"),
-    url(r'^welcome/?', 'flowspec.views.welcome', name="welcome"),
-    url(r'^logout/?', 'flowspec.views.user_logout', name="logout"),
-    (r'^setlang/?$', 'django.views.i18n.set_language'),
-    url(r'^selectinst/?$', 'flowspec.views.selectinst', name="selectinst"),
-    url(r'^accounts/activate/(?P<activation_key>\w+)/$', 'accounts.views.activate', name='activate_account'),
-    url(r'^load_js/(?P<file>[\w\s\d_-]+)/$', 'flowspec.views.load_jscript', name="load-js"),
-    url(
-        r'^activate/complete/$',
-        direct_to_template,
-        {'template': 'registration/activation_complete.html'},
-        name='registration_activation_complete'
-    ),
-    (r'^admin/', include(admin.site.urls)),
-    (r'^tinymce/', include('tinymce.urls')),
-    url(
-        r'^altlogin/?',
-        'django.contrib.auth.views.login',
-        {'template_name': 'overview/login.html'}, name="altlogin"
-    ),
-    url(r'^overview/?$', 'flowspec.views.overview', name="overview"),
+urlpatterns = [
+    path('poll/', include('poller.urls')),
+    path('', flowspec_views.group_routes, name="group-routes"),
+    url(r'^routes_ajax/?$', flowspec_views.group_routes_ajax, name="group-routes-ajax"),
+    url(r'^overview_ajax/?$', flowspec_views.overview_routes_ajax, name="overview-ajax"),
+    path('dashboard/', flowspec_views.dashboard, name="dashboard"),
+    url(r'^profile/?$', flowspec_views.user_profile, name="user-profile"),
+    url(r'^add/?$', flowspec_views.add_route, name="add-route"),
+    url(r'^addport/?$', flowspec_views.add_port, name="add-port"),
+    url(r'^edit/(?P<route_slug>[\w\-]+)/$', flowspec_views.edit_route, name="edit-route"),
+    url(r'^delete/(?P<route_slug>[\w\-]+)/$', flowspec_views.delete_route, name="delete-route"),
+    url(r'^login/?', flowspec_views.user_login, name="login"),
+    path('welcome/', flowspec_views.welcome, name="welcome"),
+    url(r'^logout/?', flowspec_views.user_logout, name="logout"),
+    # TODO (r'^setlang/?$', django.views.i18n.set_language),
+    path('/', include('django.conf.urls.i18n')),
+    url(r'^selectinst/?$', flowspec_views.selectinst, name="selectinst"),
+    url(r'^profile/token/$', accounts_views.generate_token, name="user-profile-token"),
+    url(r'^accounts/activate/(?P<activation_key>\w+)/$', accounts_views.activate, name='activate_account'),
+    url(r'^load_js/(?P<file>[\w\s\d_-]+)/$', flowspec_views.load_jscript, name="load-js"),
+    url(r'^activate/complete/$', TemplateView.as_view(template_name='templates/registration/activation_complete.html'), name='registration_activation_complete'),
+    path('altlogin/', LoginView.as_view(template_name='overview/login.html'), name="altlogin"),
+    path('admin/', admin.site.urls),
+    path('tinymce/', include('tinymce.urls')),
+    url(r'^overview/?$', flowspec_views.overview, name="overview"),
     url(r'^api/', include(router.urls)),
-    url(r'^details/(?P<route_slug>[\w\-]+)/$', 'flowspec.views.routedetails', name="route-details"),
-    url(r'^routestats/(?P<route_slug>[\w\-]+)/$', 'flowspec.views.routestats', name="routestats"),
-    url(r'^admin/', include(admin.site.urls)),
-    url(r'^setup/', 'flowspec.views.setup', name='setup'),
-)
+    url(r'^details/(?P<route_slug>[\w\-]+)/$', flowspec_views.routedetails, name="route-details"),
+    url(r'^routestats/(?P<route_slug>[\w\-]+)/$', flowspec_views.routestats, name="routestats"),
+    url(r'^setup/', flowspec_views.setup, name='setup'),
+]
 
 if 'graphs' in settings.INSTALLED_APPS:
     from graphs import urls as graphs_urls
-    urlpatterns += (
-        '', url(r'^graphs/', include(graphs_urls)),)
+    urlpatterns += ('', url(r'^graphs/', include('graphs.urls')),)
 
 
 try:
diff --git a/longerusername/migrations/0001_initial.py b/longerusername/migrations.backup/0001_initial.py
similarity index 100%
rename from longerusername/migrations/0001_initial.py
rename to longerusername/migrations.backup/0001_initial.py
diff --git a/longerusername/migrations.backup/__init__.py b/longerusername/migrations.backup/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/peers/admin.py b/peers/admin.py
index 1f85466e824d8547789565341174df197df725e6..49a3795af96182fa6a8dc5cd250da2bfba2a1378 100644
--- a/peers/admin.py
+++ b/peers/admin.py
@@ -40,6 +40,7 @@ class PeerAdminForm(ModelForm):
 
     class Meta:
         model = Peer
+        fields = "__all__"
 
 
 class PeerAdmin(admin.ModelAdmin):
diff --git a/peers/migrations.backup/0001_initial.py b/peers/migrations.backup/0001_initial.py
new file mode 100644
index 0000000000000000000000000000000000000000..f5c7d8007016084f850d6227a2c4cd89f0513259
--- /dev/null
+++ b/peers/migrations.backup/0001_initial.py
@@ -0,0 +1,101 @@
+# -*- coding: utf-8 -*-
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+from django.conf import settings
+
+
+class Migration(SchemaMigration):
+
+    def forwards(self, orm):
+        # Adding model 'PeerRange'
+        if settings.PEER_RANGE_MANAGED_TABLE:
+            db.create_table(u'peer_range', (
+                ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+                ('network', self.gf('django.db.models.fields.CharField')(max_length=128)),
+            ))
+            db.send_create_signal('peers', ['PeerRange'])
+
+        # Adding model 'TechcEmail'
+        if settings.PEER_TECHC_MANAGED_TABLE:
+            db.create_table('techc_email', (
+                ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+                ('email', self.gf('django.db.models.fields.CharField')(max_length=352, db_column='email')),
+            ))
+            db.send_create_signal('peers', ['TechcEmail'])
+
+        # Adding model 'Peer'
+        if settings.PEER_MANAGED_TABLE:
+            db.create_table(u'peer', (
+                ('peer_id', self.gf('django.db.models.fields.IntegerField')(primary_key=True)),
+                ('peer_name', self.gf('django.db.models.fields.CharField')(max_length=128)),
+                ('peer_as', self.gf('django.db.models.fields.IntegerField')()),
+                ('peer_tag', self.gf('django.db.models.fields.CharField')(max_length=64)),
+                ('domain_name', self.gf('django.db.models.fields.CharField')(max_length=128, null=True, blank=True)),
+            ))
+            db.send_create_signal('peers', ['Peer'])
+
+        # Adding M2M table for field networks on 'Peer'
+        if settings.PEER_MANAGED_TABLE and settings.PEER_RANGE_MANAGED_TABLE:
+            db.create_table(u'peer_networks', (
+                ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+                ('peer', models.ForeignKey(orm['peers.peer'], null=False)),
+                ('peerrange', models.ForeignKey(orm['peers.peerrange'], null=False))
+            ))
+            db.create_unique(u'peer_networks', ['peer_id', 'peerrange_id'])
+
+        # Adding M2M table for field techc_emails on 'Peer'
+        if settings.PEER_MANAGED_TABLE and settings.PEER_TECHC_MANAGED_TABLE:
+            db.create_table(u'peer_techc_emails', (
+                ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+                ('peer', models.ForeignKey(orm['peers.peer'], null=False)),
+                ('techcemail', models.ForeignKey(orm['peers.techcemail'], null=False))
+            ))
+            db.create_unique(u'peer_techc_emails', ['peer_id', 'techcemail_id'])
+
+    def backwards(self, orm):
+        # Deleting model 'PeerRange'
+        if settings.PEER_RANGE_MANAGED_TABLE:
+            db.delete_table(u'peer_range')
+
+        # Deleting model 'TechcEmail'
+        if settings.PEER_TECHC_MANAGED_TABLE:
+            db.delete_table('techc_email')
+
+        # Deleting model 'Peer'
+        if settings.PEER_MANAGED_TABLE:
+            db.delete_table(u'peer')
+
+        # Removing M2M table for field networks on 'Peer'
+        if settings.PEER_MANAGED_TABLE and settings.PEER_RANGE_MANAGED_TABLE:
+            db.delete_table('peer_networks')
+
+        # Removing M2M table for field techc_emails on 'Peer'
+        if settings.PEER_MANAGED_TABLE and settings.PEER_TECHC_MANAGED_TABLE:
+            db.delete_table('peer_techc_emails')
+
+    models = {
+        'peers.peer': {
+            'Meta': {'ordering': "['peer_name']", 'object_name': 'Peer', 'db_table': "u'peer'"},
+            'domain_name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True', 'blank': 'True'}),
+            'networks': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['peers.PeerRange']", 'null': 'True', 'blank': 'True'}),
+            'peer_as': ('django.db.models.fields.IntegerField', [], {}),
+            'peer_id': ('django.db.models.fields.IntegerField', [], {'primary_key': 'True'}),
+            'peer_name': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+            'peer_tag': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
+            'techc_emails': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['peers.TechcEmail']", 'null': 'True', 'blank': 'True'})
+        },
+        'peers.peerrange': {
+            'Meta': {'ordering': "['network']", 'object_name': 'PeerRange', 'db_table': "u'peer_range'"},
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'network': ('django.db.models.fields.CharField', [], {'max_length': '128'})
+        },
+        'peers.techcemail': {
+            'Meta': {'object_name': 'TechcEmail', 'db_table': "'techc_email'"},
+            'email': ('django.db.models.fields.CharField', [], {'max_length': '352', 'db_column': "'email'"}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
+        }
+    }
+
+    complete_apps = ['peers']
diff --git a/peers/migrations/0002_auto__chg_field_peer_peer_id.py b/peers/migrations.backup/0002_auto__chg_field_peer_peer_id.py
similarity index 100%
rename from peers/migrations/0002_auto__chg_field_peer_peer_id.py
rename to peers/migrations.backup/0002_auto__chg_field_peer_peer_id.py
diff --git a/peers/migrations/0003_auto__add_peernotify__chg_field_peer_peer_as.py b/peers/migrations.backup/0003_auto__add_peernotify__chg_field_peer_peer_as.py
similarity index 100%
rename from peers/migrations/0003_auto__add_peernotify__chg_field_peer_peer_as.py
rename to peers/migrations.backup/0003_auto__add_peernotify__chg_field_peer_peer_as.py
diff --git a/peers/migrations/0004_fill_peernotify_table.py b/peers/migrations.backup/0004_fill_peernotify_table.py
similarity index 100%
rename from peers/migrations/0004_fill_peernotify_table.py
rename to peers/migrations.backup/0004_fill_peernotify_table.py
diff --git a/peers/migrations.backup/__init__.py b/peers/migrations.backup/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/peers/migrations/0001_initial.py b/peers/migrations/0001_initial.py
index f5c7d8007016084f850d6227a2c4cd89f0513259..0b7662f76641a81063a90df789d8994f5455b45a 100644
--- a/peers/migrations/0001_initial.py
+++ b/peers/migrations/0001_initial.py
@@ -1,101 +1,74 @@
-# -*- coding: utf-8 -*-
-import datetime
-from south.db import db
-from south.v2 import SchemaMigration
-from django.db import models
-from django.conf import settings
-
-
-class Migration(SchemaMigration):
-
-    def forwards(self, orm):
-        # Adding model 'PeerRange'
-        if settings.PEER_RANGE_MANAGED_TABLE:
-            db.create_table(u'peer_range', (
-                ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
-                ('network', self.gf('django.db.models.fields.CharField')(max_length=128)),
-            ))
-            db.send_create_signal('peers', ['PeerRange'])
-
-        # Adding model 'TechcEmail'
-        if settings.PEER_TECHC_MANAGED_TABLE:
-            db.create_table('techc_email', (
-                ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
-                ('email', self.gf('django.db.models.fields.CharField')(max_length=352, db_column='email')),
-            ))
-            db.send_create_signal('peers', ['TechcEmail'])
+# Generated by Django 2.1 on 2019-07-25 08:12
 
-        # Adding model 'Peer'
-        if settings.PEER_MANAGED_TABLE:
-            db.create_table(u'peer', (
-                ('peer_id', self.gf('django.db.models.fields.IntegerField')(primary_key=True)),
-                ('peer_name', self.gf('django.db.models.fields.CharField')(max_length=128)),
-                ('peer_as', self.gf('django.db.models.fields.IntegerField')()),
-                ('peer_tag', self.gf('django.db.models.fields.CharField')(max_length=64)),
-                ('domain_name', self.gf('django.db.models.fields.CharField')(max_length=128, null=True, blank=True)),
-            ))
-            db.send_create_signal('peers', ['Peer'])
-
-        # Adding M2M table for field networks on 'Peer'
-        if settings.PEER_MANAGED_TABLE and settings.PEER_RANGE_MANAGED_TABLE:
-            db.create_table(u'peer_networks', (
-                ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
-                ('peer', models.ForeignKey(orm['peers.peer'], null=False)),
-                ('peerrange', models.ForeignKey(orm['peers.peerrange'], null=False))
-            ))
-            db.create_unique(u'peer_networks', ['peer_id', 'peerrange_id'])
-
-        # Adding M2M table for field techc_emails on 'Peer'
-        if settings.PEER_MANAGED_TABLE and settings.PEER_TECHC_MANAGED_TABLE:
-            db.create_table(u'peer_techc_emails', (
-                ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
-                ('peer', models.ForeignKey(orm['peers.peer'], null=False)),
-                ('techcemail', models.ForeignKey(orm['peers.techcemail'], null=False))
-            ))
-            db.create_unique(u'peer_techc_emails', ['peer_id', 'techcemail_id'])
-
-    def backwards(self, orm):
-        # Deleting model 'PeerRange'
-        if settings.PEER_RANGE_MANAGED_TABLE:
-            db.delete_table(u'peer_range')
-
-        # Deleting model 'TechcEmail'
-        if settings.PEER_TECHC_MANAGED_TABLE:
-            db.delete_table('techc_email')
+from django.conf import settings
+from django.db import migrations, models
+import django.db.models.deletion
 
-        # Deleting model 'Peer'
-        if settings.PEER_MANAGED_TABLE:
-            db.delete_table(u'peer')
 
-        # Removing M2M table for field networks on 'Peer'
-        if settings.PEER_MANAGED_TABLE and settings.PEER_RANGE_MANAGED_TABLE:
-            db.delete_table('peer_networks')
+class Migration(migrations.Migration):
 
-        # Removing M2M table for field techc_emails on 'Peer'
-        if settings.PEER_MANAGED_TABLE and settings.PEER_TECHC_MANAGED_TABLE:
-            db.delete_table('peer_techc_emails')
+    initial = True
 
-    models = {
-        'peers.peer': {
-            'Meta': {'ordering': "['peer_name']", 'object_name': 'Peer', 'db_table': "u'peer'"},
-            'domain_name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True', 'blank': 'True'}),
-            'networks': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['peers.PeerRange']", 'null': 'True', 'blank': 'True'}),
-            'peer_as': ('django.db.models.fields.IntegerField', [], {}),
-            'peer_id': ('django.db.models.fields.IntegerField', [], {'primary_key': 'True'}),
-            'peer_name': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
-            'peer_tag': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
-            'techc_emails': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['peers.TechcEmail']", 'null': 'True', 'blank': 'True'})
-        },
-        'peers.peerrange': {
-            'Meta': {'ordering': "['network']", 'object_name': 'PeerRange', 'db_table': "u'peer_range'"},
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'network': ('django.db.models.fields.CharField', [], {'max_length': '128'})
-        },
-        'peers.techcemail': {
-            'Meta': {'object_name': 'TechcEmail', 'db_table': "'techc_email'"},
-            'email': ('django.db.models.fields.CharField', [], {'max_length': '352', 'db_column': "'email'"}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
-        }
-    }
+    dependencies = [
+        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
+    ]
 
-    complete_apps = ['peers']
+    operations = [
+        migrations.CreateModel(
+            name='Peer',
+            fields=[
+                ('peer_id', models.AutoField(primary_key=True, serialize=False)),
+                ('peer_name', models.CharField(max_length=128)),
+                ('peer_as', models.IntegerField(blank=True, null=True)),
+                ('peer_tag', models.CharField(max_length=64)),
+                ('domain_name', models.CharField(blank=True, max_length=128, null=True)),
+            ],
+            options={
+                'db_table': 'peer',
+                'ordering': ['peer_name'],
+                'managed': True,
+            },
+        ),
+        migrations.CreateModel(
+            name='PeerNotify',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('peer_activation_notified', models.BooleanField(default=True)),
+                ('peer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='peers.Peer')),
+                ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
+            ],
+        ),
+        migrations.CreateModel(
+            name='PeerRange',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('network', models.CharField(max_length=128)),
+            ],
+            options={
+                'db_table': 'peer_range',
+                'ordering': ['network'],
+                'managed': True,
+            },
+        ),
+        migrations.CreateModel(
+            name='TechcEmail',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('email', models.CharField(db_column='email', max_length=352)),
+            ],
+            options={
+                'db_table': 'techc_email',
+                'managed': True,
+            },
+        ),
+        migrations.AddField(
+            model_name='peer',
+            name='networks',
+            field=models.ManyToManyField(blank=True, to='peers.PeerRange'),
+        ),
+        migrations.AddField(
+            model_name='peer',
+            name='techc_emails',
+            field=models.ManyToManyField(blank=True, to='peers.TechcEmail'),
+        ),
+    ]
diff --git a/peers/models.py b/peers/models.py
index b46a4d3e01c4cb30cd5b5ea36078f6baba53ed75..256404b0ef27b11c54526caca3c0b668c8713af9 100644
--- a/peers/models.py
+++ b/peers/models.py
@@ -53,8 +53,8 @@ class Peer(models.Model):
     # This needs to be converted to slug and an info message needs to be added.
     peer_tag = models.CharField(max_length=64)
     domain_name = models.CharField(max_length=128, null=True, blank=True)
-    networks = models.ManyToManyField(PeerRange, null=True, blank=True)
-    techc_emails = models.ManyToManyField(TechcEmail, null=True, blank=True)
+    networks = models.ManyToManyField(PeerRange, blank=True)
+    techc_emails = models.ManyToManyField(TechcEmail, blank=True)
 
     def __unicode__(self):
         return self.peer_name
@@ -78,6 +78,7 @@ class Peer(models.Model):
 
 
 class PeerNotify(models.Model):
-    peer = models.ForeignKey(Peer)
-    user = models.ForeignKey(User)
+    peer = models.ForeignKey(Peer, on_delete=models.CASCADE)
+    user = models.ForeignKey(User, on_delete=models.CASCADE)
     peer_activation_notified = models.BooleanField(default=True)
+
diff --git a/poller/urls.py b/poller/urls.py
index e5ef6a078c23e05f7a5f85bee280e3da99080062..34554b096f30554adf0fed0a79b2d3675095eede 100644
--- a/poller/urls.py
+++ b/poller/urls.py
@@ -16,19 +16,12 @@
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #
-from django.conf.urls.defaults import patterns, url
+from django.conf.urls import url
 
-urlpatterns = patterns(
-    'poller.views',
-    ('^$', 'main'),
-    url(
-        '^message/existing/(?P<peer_id>[\w\-]+)/$',
-        'message_existing',
-        name='fetch-existing'
-    ),
-    url(
-        '^message/updates/(?P<peer_id>[\w\-]+)/$',
-        'message_updates',
-        name='fetch-updates'
-    )
-)
+from poller import views
+urlpatterns = [
+    #'poller.views',
+    url('^$', views.main),
+    url('^message/existing/(?P<peer_id>[\w\-]+)/$', views.message_existing, name='fetch-existing'),
+    url('^message/updates/(?P<peer_id>[\w\-]+)/$', views.message_updates, name='fetch-updates')
+]
diff --git a/poller/views.py b/poller/views.py
index 97402a0eededcdc3166861ed5b04fb0cd24f4558..5230a4bf5b480062ee787dba30edf641da43cbd9 100644
--- a/poller/views.py
+++ b/poller/views.py
@@ -22,13 +22,13 @@ import json
 
 import uuid
 import datetime
-from django.shortcuts import render_to_response
+from django.shortcuts import render
 from django.template.loader import render_to_string
 from django.http import HttpResponse
 from gevent.event import Event
 from django.conf import settings
 from django.http import HttpResponseRedirect
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 from peers.models import Peer
 
 import beanstalkc
@@ -78,7 +78,7 @@ class Msgs(object):
     def main(self, request):
         if self.user_cache:
             request.session['cursor'] = self.user_cache[-1]['id']
-        return render_to_response('poll.html', {'messages': self.user_cache})
+        return render(request, 'poll.html', {'messages': self.user_cache})
 
     def message_existing(self, request, peer_id):
         if request.is_ajax():
@@ -137,7 +137,7 @@ class Msgs(object):
             try:
                 cursor[user] = self.user_cursor[user]
             except:
-                return HttpResponse(content='', mimetype=None, status=400)
+                return HttpResponse(content='', content_type=None, status=400)
 
             try:
                 if not isinstance(self.user_cache[user], list):
diff --git a/requirements.txt b/requirements.txt
index 5c47517c8e1ec9eb2757d69bc5b3b5607d447f8c..6a5f18293ea18925d16ef6fb190aa6a82760f6e6 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,32 +1,30 @@
-amqplib==1.0.2
-argparse==1.2.1
-celery==2.5.3
-cl==0.0.3
-django-celery==2.5.5
-django-admin==1.0.2
-django-picklefield==0.2.1
-django-registration==0.8
-djangorestframework==2.3.14
-django-tinymce==2.6.0
-Django==1.4.5
-gevent==0.13.6
-greenlet==0.3.1
-gunicorn==0.14.5
-ipaddr==2.1.10
-kombu==2.1.8
-lxml==3.4.2
-mailer==0.7
-MySQL-python==1.2.3
-ncclient==0.4.3
-paramiko==1.7.7.1
-pycrypto==2.6
-pyparsing
-python-dateutil==1.5
-python-memcached==1.48
-PyYAML==3.10
-South==0.7.5
-wsgiref==0.1.2
+amqplib
+argparse
+cl
+celery
+django-admin
+django-picklefield
+django-registration
+djangorestframework
+django-tinymce
 django-form-utils
+django-settings-export
+Django==2.1
+gevent
+greenlet
+gunicorn
+kombu
+lxml
+mailer
+mysqlclient
+ncclient
+paramiko
+pycrypto
+pyparsing
+python-dateutil
+python-memcached
+PyYAML
+#wsgiref
 six
 requests
 pysnmp
diff --git a/templates/add_port.html b/templates/add_port.html
index 223bfdbfa1565399eb06cfe8cc3a1581d0a5f379..886807d96c0a142c0d5ca8ccc1b28a960cdbd0d6 100644
--- a/templates/add_port.html
+++ b/templates/add_port.html
@@ -21,7 +21,7 @@
 $(document).ready( function(){
 	$('#addportbtn').click(function(){
 		$.ajax({
-		url:"{% url add-port %}", 
+		url:"{% url 'add-port' %}", 
 		data:$("#add_port_form").serialize(),
 		type: "POST",
 		cache: false,
diff --git a/templates/apply.html b/templates/apply.html
index 3a5647d6a182c79cb4d68e59bc9cb9919cf76279..9a6aa29a54ca40b3b7ee4e29dc24a7a10392ec96 100644
--- a/templates/apply.html
+++ b/templates/apply.html
@@ -1,4 +1,5 @@
 {% extends "base.html" %}
+{% load staticfiles %}
 {% load widget_tweaks %}
 {% load i18n %}
 
@@ -20,9 +21,9 @@
 </li>
 {% endblock %}
 {% block extrahead %}
-    <link href="{{STATIC_URL}}css/plugins/morris/morris-0.4.3.min.css" rel="stylesheet">
-    <link href="{{STATIC_URL}}css/plugins/timeline/timeline.css" rel="stylesheet">
-    <link href="{{STATIC_URL}}datepicker/css/datepicker.css" rel="stylesheet">
+    <link href="{% static 'b3theme/css/plugins/morris/morris-0.4.3.min.css' %}" rel="stylesheet">
+    <link href="{% static 'b3theme/css/plugins/timeline/timeline.css' %}" rel="stylesheet">
+    <link href="{% static 'datepicker/css/datepicker.css' %}" rel="stylesheet">
 
 {% endblock %}
 
@@ -75,13 +76,13 @@
 }
 
 </style>
- <link href="{{STATIC_URL}}js/select2/select2.css" rel="stylesheet">
- <link href="{{STATIC_URL}}js/select2/select2-bootstrap.css" rel="stylesheet">
+ <link href="{% static 'js/select2/select2.css' %}" rel="stylesheet">
+ <link href="{% static 'js/select2/select2-bootstrap.css' %}" rel="stylesheet">
 {% endblock %}
 
 {% block pagejsbottom %}
-<script type="text/javascript" src="{{STATIC_URL}}datepicker/js/bootstrap-datepicker.js"></script>
-<script type="text/javascript" src="{{STATIC_URL}}js/select2/select2.js"></script>
+<script type="text/javascript" src="{% static 'datepicker/js/bootstrap-datepicker.js' %}"></script>
+<script type="text/javascript" src="{% static 'js/select2/select2.js' %}"></script>
 <script>
 	$(document).ready( function(){
 		$('#id_then').removeAttr("multiple");
@@ -115,7 +116,7 @@
 			buttons: {
 		'{% trans "Add" %}': function() {
 			$.ajax({
-			url:"{% url add-rate-limit %}",
+			url:"{% url 'add-rate-limit' %}",
 			data:$("#add_rl_form").serialize(),
 			type: "POST",
 			cache: false,
@@ -147,7 +148,7 @@
 			})
 			.click(function(){
 				$.ajax({
-					url: "{% url add-rate-limit %}",
+					url: "{% url 'add-rate-limit' %}",
 					cache: false,
 					success: function(data){
 						$("#then_diag").html(data);
@@ -232,7 +233,7 @@
 		            {% endif %}
 		        </div>
 		        <div class="col-md-2">
-		            <img src="{{STATIC_URL}}threat_source.png" style="height: 30px;"/> &nbsp;&nbsp;<button type="button" class="btn btn-md btn-info btn-outline" id="setFromAll">Any</button>
+		            <img src="{% static 'threat_source.png' %}" style="height: 30px;"/> &nbsp;&nbsp;<button type="button" class="btn btn-md btn-info btn-outline" id="setFromAll">Any</button>
 		        </div>
 		        </div>
 
@@ -244,7 +245,7 @@
 		            {% endif %}
 		        </div>
 		        <div class="col-md-2">
-		            <img src="{{STATIC_URL}}secure_destination.png" style="height: 30px;"/>
+		            <img src="{% static 'secure_destination.png' %}" style="height: 30px;"/>
 		        </div>
 		        </div>
 
diff --git a/templates/base.html b/templates/base.html
index fe0358fd4b619992594a78d261cc1a7762a347ce..552c6a565ecac5f78e442e9f71c91f4c447ff189 100644
--- a/templates/base.html
+++ b/templates/base.html
@@ -1,14 +1,15 @@
 {% load i18n %}
-{% load staticfiles %}
+{% load static %}
+
 <!DOCTYPE html>
 <html>
 <head>
     <meta charset="utf-8">
     <meta name="viewport" content="width=device-width, initial-scale=1.0">
-    <title>{{ BRANDING.name }} FoD :: {% block title %}{% endblock %}</title>
+    <title>{{ settings.BRANDING.name }} FoD :: {% block title %}{% endblock %}</title>
 	<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
 	<META HTTP-EQUIV="expires" CONTENT="Wed, 26 Feb 1997 08:21:57 GMT">
-	<link REL="SHORTCUT ICON" HREF="{% static BRANDING.favicon %}">
+	<link REL="SHORTCUT ICON" HREF="{% get_static_prefix %}/{{ settings.BRANDING.favicon }}">
     <!-- Core CSS - Include with every page -->
     <link href="{% static 'b3theme/css/bootstrap.min.css' %}" rel="stylesheet">
     <link href="{% static 'b3theme/font-awesome/css/font-awesome.css' %}" rel="stylesheet">
@@ -16,7 +17,7 @@
     {% block extrahead %}{% endblock %}
 
     <!-- SB Admin CSS - Include with every page -->
-    <link href="{{STATIC_URL}}b3theme/css/sb-admin.css" rel="stylesheet">
+    <link href="{% static 'b3theme/css/sb-admin.css' %}" rel="stylesheet">
     {% block extraheadbottom %}{% endblock %}
 </head>
 
@@ -31,7 +32,7 @@
                     <span class="icon-bar"></span>
                     <span class="icon-bar"></span>
                 </button>
-                <a class="navbar-brand" href="{% url dashboard %}"><img src="{% static BRANDING.logo %}">&nbsp;</a>
+                <a class="navbar-brand" href="{% url 'dashboard' %}"><img src="{% get_static_prefix %}/{{ settings.BRANDING.logo }}">&nbsp;</a>
             </div>
             <!-- /.navbar-header -->
 
@@ -39,7 +40,7 @@
             	<li class="dropdown">
 				            <a href="#" class="dropdown-toggle" data-toggle="dropdown">{% trans "Language" %}: {% for lang in LANGUAGES %}{% ifequal LANGUAGE_CODE lang.0 %}{% trans lang.1 %}{% endifequal %}{% endfor %}<b class="caret"></b></a>
 				            <ul class="dropdown-menu">
-				            <form action="{% url django.views.i18n.set_language %}" method="post" style="display:inline;" id="langform">
+				            <form action="{% url 'set_language' %}" method="post" style="display:inline;" id="langform">
 												{% csrf_token %}
 												<input name="next" type="hidden" value="{{ next }}" />
 												<input id="langsel" name="language" type="hidden" value="" />
@@ -64,23 +65,23 @@
                     	<li class="divider"></li>
                     {% if user.get_profile.peers.all %}
 				        <li>
-				            <a href="{% url user-profile %}"><i class="fa fa-user fa-fw"></i>{% trans "My profile" %}</a>
+				            <a href="{% url 'user-profile' %}"><i class="fa fa-user fa-fw"></i>{% trans "My profile" %}</a>
 				        </li>
 				    {% endif %}
 				    	{% if user.is_superuser %}
 						<li class="divider"></li>
-                        <li><a href="{% url admin:index %}"><i class="fa fa-cogs"></i> {% trans "Admin" %}</a>
+                        <li><a href="{% url 'admin:index' %}"><i class="fa fa-cogs"></i> {% trans "Admin" %}</a>
                         </li>
 						{% endif %}
                         <li class="divider"></li>
-                        <li><a href="{% url logout %}"><i class="fa fa-sign-out fa-fw"></i> {% trans "Logout" %}</a>
+                        <li><a href="{% url 'logout' %}"><i class="fa fa-sign-out fa-fw"></i> {% trans "Logout" %}</a>
                         </li>
 
                     </ul>
                     <!-- /.dropdown-user -->
                 </li>
                 {% else %}
-				        <li><a href="{% url login %}">{% trans "Shibboleth Login" %}</a></li>
+				        <li><a href="{% url 'login' %}">{% trans "Shibboleth Login" %}</a></li>
 				        {% endif %}
                 <!-- /.dropdown -->
             </ul>
@@ -94,24 +95,24 @@
             <div class="sidebar-collapse">
                 <ul class="nav" id="side-menu">
                     <li>
-                        <a href="{% url dashboard %}"><i class="fa fa-dashboard fa-fw"></i> {% trans "Dashboard" %}</a>
+                        <a href="{% url 'dashboard' %}"><i class="fa fa-dashboard fa-fw"></i> {% trans "Dashboard" %}</a>
                     </li>
                     <li>
-                        <a href="{% url group-routes %}"><i class="fa fa-shield fa-fw"></i> {% trans "Rules" %}</a>
+                        <a href="{% url 'group-routes' %}"><i class="fa fa-shield fa-fw"></i> {% trans "Rules" %}</a>
                     </li>
                     <li>
-                        <a href="{% url add-route %}"><i class="fa fa-plus-circle fa-fw"></i> {% trans "Add Rule" %}</a>
+                        <a href="{% url 'add-route' %}"><i class="fa fa-plus-circle fa-fw"></i> {% trans "Add Rule" %}</a>
                     </li>
                     {% if perms.accounts.overview %}<li>
-                            <a href="{% url overview %}"><i class="fa fa-desktop fa-fw"></i> {% trans "Overview" %}</a>
+                            <a href="{% url 'overview' %}"><i class="fa fa-desktop fa-fw"></i> {% trans "Overview" %}</a>
                         </li>{% endif %}
                     {% if user.is_superuser %}
-                        <li><a href="{% url admin:index %}"><i class="fa fa-cogs fa-fw"></i> {% trans "Admin" %}</a>
+                        <li><a href="{% url 'admin:index' %}"><i class="fa fa-cogs fa-fw"></i> {% trans "Admin" %}</a>
                         </li>
 						{% endif %}
                     {% if user.get_profile.peers.all %}
 				        <li>
-				            <a href="{% url user-profile %}"><i class="fa fa-user fa-fw"></i> {% trans "My profile" %}</a>
+				            <a href="{% url 'user-profile' %}"><i class="fa fa-user fa-fw"></i> {% trans "My profile" %}</a>
 				        </li>
 				    {% endif %}
                 </ul>
@@ -149,16 +150,16 @@
 				{% include "footer.html" %}
 			{% endblock %}
     <!-- Core Scripts - Include with every page -->
-    <script src="{{STATIC_URL}}b3theme/js/jquery-1.10.2.js"></script>
-    <script src="{{STATIC_URL}}js/jquery_csrf_protect.js" type="text/javascript"></script>
-    <script src="{{STATIC_URL}}b3theme/js/bootstrap.min.js"></script>
-    <script src="{{STATIC_URL}}b3theme/js/plugins/metisMenu/jquery.metisMenu.js"></script>
-    <script type="text/javascript" src="{{STATIC_URL}}js/jquery.cookie.js"></script>
+    <script src="{% static 'b3theme/js/jquery-1.10.2.js' %}"></script>
+    <script src="{% static 'js/jquery_csrf_protect.js' %}" type="text/javascript"></script>
+    <script src="{% static 'b3theme/js/bootstrap.min.js' %}"></script>
+    <script src="{% static 'b3theme/js/plugins/metisMenu/jquery.metisMenu.js' %}"></script>
+    <script type="text/javascript" src="{% static 'js/jquery.cookie.js' %}"></script>
 
 	{% block pagejs %}{% endblock %}
 
     <!-- SB Admin Scripts - Include with every page -->
-    <script src="{{STATIC_URL}}b3theme/js/sb-admin.js"></script>
+    <script src="{% static 'b3theme/js/sb-admin.js' %}"></script>
     <!-- Page-Level Scripts  - Use for reference -->
     {% block pagejsbottom %}{% endblock %}
     <script type="text/javascript">
diff --git a/templates/dashboard.html b/templates/dashboard.html
index cc0ac6e560669a33e9a05c8ed3cd58af8b3b6059..1e50c2810f695a1eb0c347338f0f291b66af355e 100644
--- a/templates/dashboard.html
+++ b/templates/dashboard.html
@@ -107,17 +107,17 @@
 										</small>
 										<div>
 										{% ifequal route.status 'ACTIVE' %}
-											<a href="{% url edit-route route.name %}" class="btn-info btn btn-xs btn-outline" id="edit_button_{{route.pk}}">{% trans "Edit" %}</a>
+											<a href="{% url 'edit-route' route.name %}" class="btn-info btn btn-xs btn-outline" id="edit_button_{{route.pk}}">{% trans "Edit" %}</a>
 											<button class="del_buttonpre btn-outline btn btn-xs btn-warning" id="{{route.name}}" data-routename="{{route.name}}">{% trans "Deactivate" %}</button>
 										{% else %}
 											{% if route.status == 'EXPIRED' or route.status == 'ADMININACTIVE' or route.status == 'INACTIVE' %}
-												<a href="{% url edit-route route.name %}" class="btn-info btn btn-xs btn-outline" id="edit_button_{{route.pk}}" type="button">{% trans "Reactivate" %}</a>
+												<a href="{% url 'edit-route' route.name %}" class="btn-info btn btn-xs btn-outline" id="edit_button_{{route.pk}}" type="button">{% trans "Reactivate" %}</a>
 											{% else %}
 												{% ifequal route.status 'OUTOFSYNC' %}
-													<a href="{% url edit-route route.name %}" class="btn-info btn btn-xs btn-outline" id="edit_button_{{route.pk}}">{% trans "ReSync" %}</a>
+													<a href="{% url 'edit-route' route.name %}" class="btn-info btn btn-xs btn-outline" id="edit_button_{{route.pk}}">{% trans "ReSync" %}</a>
 												{% else %}
 													{% ifequal route.status 'ERROR' %}
-														<a href="{% url edit-route route.name %}" class="btn-info btn btn-xs btn-outline" id="edit_button_{{route.pk}}">{% trans "Fix it!" %}</a>
+														<a href="{% url 'edit-route' route.name %}" class="btn-info btn btn-xs btn-outline" id="edit_button_{{route.pk}}">{% trans "Fix it!" %}</a>
 													{% else %}
 													-
 													{% endifequal %}
@@ -143,9 +143,9 @@
                         </div>
                         <!-- /.panel-heading -->
 <div class="panel-body">
-				<a class="btn btn-sm btn-outline btn-success" id="routebutton" href="{% url add-route %}"><i class="fa fa-plus-circle"></i> {% trans "Add Rule" %}</a>
-				<a class="btn btn-sm btn-outline btn-primary"  href="{% url group-routes %}"><i class="fa fa-shield fa-fw"></i> {% trans "My Rules" %}</a>
-				<a class="btn btn-sm btn-outline btn-info"  href="{% url user-profile %}"><i class="fa fa-user"></i> {% trans "My Profile" %}</a>
+				<a class="btn btn-sm btn-outline btn-success" id="routebutton" href="{% url 'add-route' %}"><i class="fa fa-plus-circle"></i> {% trans "Add Rule" %}</a>
+				<a class="btn btn-sm btn-outline btn-primary"  href="{% url 'group-routes' %}"><i class="fa fa-shield fa-fw"></i> {% trans "My Rules" %}</a>
+				<a class="btn btn-sm btn-outline btn-info"  href="{% url 'user-profile' %}"><i class="fa fa-user"></i> {% trans "My Profile" %}</a>
                         </div>
                         <!-- /.panel-body -->
                     </div>
@@ -171,14 +171,14 @@
 {% endblock %}
 {% block pagejsbottom %}
 {% if user.is_authenticated %}
-<script type="text/javascript" src="{% url load-js 'pollerdash' %}"></script>
+<script type="text/javascript" src="{% url 'load-js' 'pollerdash' %}"></script>
 {% endif %}
-<script type="text/javascript" src="{{STATIC_URL}}js/jquery.dataTables.js"></script>
-<script type="text/javascript" src="{{STATIC_URL}}js/datatables_bootstrap.js"></script>
+<script type="text/javascript" src="{% static 'js/jquery.dataTables.js' %}"></script>
+<script type="text/javascript" src="{% static 'js/datatables_bootstrap.js' %}"></script>
 <script>
 var oldhtml;
 var last_element = false;
-var refreshUrl = "{% url group-routes-ajax %}";
+var refreshUrl = "{% url 'group-routes-ajax' %}";
 	$(document).ready( function(){
 		$('body').on('click', ".del_buttonpre", function(){
             	var my = $(this);
@@ -199,7 +199,7 @@ var refreshUrl = "{% url group-routes-ajax %}";
             	var my = $(this);
             	my.html('Deactivating...')
 				var routename = $(this).data("routename");
-				var delurl = "{% url delete-route 'route_placeholder'%}".replace('route_placeholder', routename.toString());
+				var delurl = "{% url 'delete-route' 'route_placeholder'%}".replace('route_placeholder', routename.toString());
 				$.ajax({
         			type: 'POST',
         			url: delurl,
diff --git a/templates/flowspy/route_details.html b/templates/flowspy/route_details.html
index 076f497f86da6996b90e41e3c71e2f6dafccd507..4272355fa423f94bba8d00686438d5c00fa83677 100644
--- a/templates/flowspy/route_details.html
+++ b/templates/flowspy/route_details.html
@@ -68,7 +68,7 @@ function myreloadPage() {
              {% endif %}
              {% if route.status != 'PENDING'  %}
 
-                 <a href="{% url edit-route route.name  %}" class="btn-info btn btn-sm btn-outline">{% trans "Edit" %}</a>
+                 <a href="{% url 'edit-route' route.name  %}" class="btn-info btn btn-sm btn-outline">{% trans "Edit" %}</a>
                  {% if route.status = 'ACTIVE' %}
                  <button class="del_button btn-warning btn btn-sm btn-outline" id="{{ route.name }}" data-routename="{{ route.name }}">{% trans "Deactivate" %}</button>
                  {% endif %}
@@ -97,7 +97,7 @@ function myreloadPage() {
             <h3>Number of bytes (relative)</h3>
             <div><canvas id="traffic-plot-bytes-rel" width=200 height=200></canvas></div>
         </div>
-        <div><a href="{% url routestats route.name %}">Download raw data in JSON</a></div>
+        <div><a href="{% url 'routestats' route.name %}">Download raw data in JSON</a></div>
     </div>
     {% comment %}check if graphs plugin in installed apps{% endcomment %}
     {% if 'graphs' in INSTALLED_APPS %}
@@ -111,7 +111,7 @@ function myreloadPage() {
                 <span></span> <b class="caret"></b>
             </div>
         </div>
-        <div class="graphs col-md-12" data-url="{% url graphs route.name %}" >
+        <div class="graphs col-md-12" data-url="{% url 'graphs' route.name %}" >
         loading...
         </div>
     </div>
@@ -127,12 +127,12 @@ function myreloadPage() {
 
 {% block pagejsbottom %}
 
-<script src="{{STATIC_URL}}js/Chart.min.js" type="text/javascript"></script>
+<script src="{% static 'js/Chart.min.js' %}" type="text/javascript"></script>
 
 
-<script src="{{STATIC_URL}}js/moment.min.js"></script>
-<!--<script src="{{STATIC_URL}}js/hammer.min.js"></script>-->
-<script src="{{STATIC_URL}}js/chartjs-plugin-zoom.min.js"></script>
+<script src="{% static 'js/moment.min.js' %}"></script>
+<!--<script src="{% static 'js/hammer.min.js' %}"></script>-->
+<script src="{% static 'js/chartjs-plugin-zoom.min.js' %}"></script>
 
 <script type="text/javascript">
 function plotGraph(data)
@@ -293,7 +293,7 @@ function plotGraph(data)
 }
 
 $(document).ready(function() {
-   var statsurl = "{% url routestats route.name %}";
+   var statsurl = "{% url 'routestats' route.name %}";
    $.get(statsurl).done(function(data) {
       if (data["error"]) {
           $("#traffic-plot-loading").text("No data, try later");
@@ -358,7 +358,7 @@ $(document).ready(function() {
             var my = $(this);
             my.html('Deactivating...')
             var routename = $(this).data("routename");
-            var delurl = "{% url delete-route 'route_placeholder'%}".replace('route_placeholder', routename.toString());
+            var delurl = "{% url 'delete-route' 'route_placeholder'%}".replace('route_placeholder', routename.toString());
             $.ajax({
                 type: 'POST',
                 url: delurl,
diff --git a/templates/flowspy/setup.html b/templates/flowspy/setup.html
index 7bed56838beb617d8dd54926ffc4d4872cb08950..63ecf9ac60b32dbd1a7df40ce5b46640c76992a5 100644
--- a/templates/flowspy/setup.html
+++ b/templates/flowspy/setup.html
@@ -4,7 +4,7 @@
 {% block contentplaceholder %}
 <div>
 	Set the password of admin user:
-	<form action="{% url setup %}" method="post">
+	<form action="{% url 'setup' %}" method="post">
 	{% csrf_token %}
 	<table>
 	{{ form }}
diff --git a/templates/overview/index.html b/templates/overview/index.html
index 97f2eabac260cbb3fbff00d5774ec42fa2c24b36..fb592966af8efa9a64865d1ca2a8ba8841458134 100644
--- a/templates/overview/index.html
+++ b/templates/overview/index.html
@@ -1,8 +1,9 @@
 {% extends "base.html" %}
 {% load i18n %}
+{% load static %}
 
 {% block extrahead %}
-<link href="{{STATIC_URL}}css/plugins/dataTables/dataTables.bootstrap.css" rel="stylesheet">
+<link href="{% static 'css/plugins/dataTables/dataTables.bootstrap.css' %}" rel="stylesheet">
 <style type="text/css">
 
 
@@ -21,8 +22,8 @@ th{
 {% endblock %}
 {% block pagejsbottom %}
 
-    <script src="{{STATIC_URL}}js/dataTableslatest/jquery.dataTables.min.js"></script>
-    <script src="{{STATIC_URL}}js/dataTableslatest/dataTables.bootstrap.js"></script>
+    <script src="{% static 'js/dataTableslatest/jquery.dataTables.min.js' %}"></script>
+    <script src="{% static 'js/dataTableslatest/dataTables.bootstrap.js' %}"></script>
 
 	<script type="text/javascript">
 $(document).ready(function(){
@@ -156,7 +157,7 @@ var start;
 var end;
 var oldhtml;
 var last_element = false;
-var refreshUrl = "{% url overview-ajax %}";
+var refreshUrl = "{% url 'overview-ajax' %}";
 
 
 
@@ -261,7 +262,7 @@ var refreshUrl = "{% url overview-ajax %}";
 	                     		return toolt+" title=\""+title+"\">"+"<small>{% trans 'Rule expired' %}</small>"+"</a>";
 	                     	}
                      		if (status == "PENDING"){
-                     				return '<img src="{{STATIC_URL}}dots.gif">';
+                     				return '<img src="{% static 'dots.gif' %}">';
                      			}
                      		return "<small>"+full.response+"</small>";
 
diff --git a/templates/overview/login.html b/templates/overview/login.html
index 3c83fc13a25088b4c4d950d924144a3ef203a927..09617b005afeb9bc12f0d329f45eb603371e0f36 100644
--- a/templates/overview/login.html
+++ b/templates/overview/login.html
@@ -40,7 +40,7 @@
                         </div>
                         <!-- /.panel-heading -->
                         <div class="panel-body">
-    <form class="form-horizontal" method="post" action="{% url altlogin %}" role="form">
+    <form class="form-horizontal" method="post" action="{% url 'altlogin' %}" role="form">
 
             {% csrf_token %}
             {% load unescape %}
@@ -72,7 +72,7 @@
 			<button type="submit" id="applybutton" value="{% trans 'Login' %}" class="btn btn-md btn-primary">Login</button>
 				</div>
 			</div>
-        	<input name="next" id="next" type="hidden" value="{% url group-routes %}">
+        	<input name="next" id="next" type="hidden" value="{% url 'group-routes' %}">
             </form>
             </div>
             </div>
diff --git a/templates/poller.js b/templates/poller.js
index d4be131bc1c92f7600b85577e917afd3b7a615fe..2672b8b5d64d172c45f8b0b5a3b6187a6dacb9bb 100644
--- a/templates/poller.js
+++ b/templates/poller.js
@@ -56,7 +56,7 @@ var updater = {
     	    var date = new Date();
 			var timestamp = date.getTime();
         {% for peer in user.userprofile.peers.all %}
-        $.ajax({url: "{% url fetch-existing  peer.pk %}?="+timestamp, type: "POST", dataType: "json", cache:false,
+        $.ajax({url: "{% url 'fetch-existing'  peer.pk %}?="+timestamp, type: "POST", dataType: "json", cache:false,
     		success: updater.onFetchExisting,
     		error: updater.onError});
         {% endfor %}
@@ -70,7 +70,7 @@ var updater = {
     	    var date = new Date();
 			var timestamp = date.getTime();
         {% for peer in user.userprofile.peers.all %}
-        $.ajax({url: "{% url fetch-updates  peer.pk %}?="+timestamp, type: "POST", dataType: "json", cache:false,
+        $.ajax({url: "{% url 'fetch-updates'  peer.pk %}?="+timestamp, type: "POST", dataType: "json", cache:false,
     		success: updater.onSuccess,
     		timeout: timeout,
     		error: updater.onError});
diff --git a/templates/pollerdash.js b/templates/pollerdash.js
index 241b8d966a5fc6381dcf994bce632a56547e6d1d..aa7508d6240f1bd34e6ab779e4d73d7a9ace5258 100644
--- a/templates/pollerdash.js
+++ b/templates/pollerdash.js
@@ -58,7 +58,7 @@ var updater = {
     	var date = new Date();
 	var timestamp = date.getTime();
         {% for peer in user.userprofile.peers.all %}
-        $.ajax({url: "{% url fetch-existing peer.pk %}?="+timestamp, type: "POST", dataType: "json", cache: false,
+        $.ajax({url: "{% url 'fetch-existing' peer.pk %}?="+timestamp, type: "POST", dataType: "json", cache: false,
     		success: updater.onFetchExisting,
     		error: updater.onError});
         {% endfor %}
@@ -75,7 +75,7 @@ var updater = {
 
 
         {% for peer in user.userprofile.peers.all %}
-        $.ajax({url: "{% url fetch-updates peer.pk %}?="+timestamp, type: "POST", dataType: "json", cache: false,
+        $.ajax({url: "{% url 'fetch-updates' peer.pk %}?="+timestamp, type: "POST", dataType: "json", cache: false,
     		success: updater.onSuccess,
     		timeout: timeout,
     		error: updater.onError});
diff --git a/templates/profile.html b/templates/profile.html
index 8d2adf2769a01ac52f6c84dde7df7fa2462b6ea3..1ac5a7dcdd71f9884c5c32a391a0a7d717bf3540 100644
--- a/templates/profile.html
+++ b/templates/profile.html
@@ -48,9 +48,9 @@
             </div>
             <!-- /.panel-heading -->
             <div class="panel-body">
-				<a class="btn btn-sm btn-outline btn-success" id="routebutton" href="{% url add-route %}"><i class="fa fa-plus-circle"></i> {% trans "Add Rule" %}</a>
-				<a class="btn btn-sm btn-outline btn-primary"  href="{% url group-routes %}"><i class="fa fa-shield fa-fw"></i> {% trans "My Rules" %}</a>
-				<a class="btn btn-sm btn-outline btn-info"  href="{% url dashboard %}"><i class="fa fa-dashboard"></i> {% trans "Dashboard" %}</a>
+				<a class="btn btn-sm btn-outline btn-success" id="routebutton" href="{% url 'add-route' %}"><i class="fa fa-plus-circle"></i> {% trans "Add Rule" %}</a>
+				<a class="btn btn-sm btn-outline btn-primary"  href="{% url 'group-routes' %}"><i class="fa fa-shield fa-fw"></i> {% trans "My Rules" %}</a>
+				<a class="btn btn-sm btn-outline btn-info"  href="{% url 'dashboard' %}"><i class="fa fa-dashboard"></i> {% trans "Dashboard" %}</a>
             </div>
         <!-- /.panel-body -->
         </div>
@@ -78,7 +78,7 @@
                     {% if user.auth_token %}
                         {{ user.auth_token }}
                     {% else %}
-                        <a id="generate_token" href="{% url user-profile-token %}">{% trans "Generate One" %}</a>
+                        <a id="generate_token" href="{% url 'user-profile-token' %}">{% trans "Generate One" %}</a>
                     {% endif %}
                     </dd>
                 </dl>
diff --git a/templates/registration/activate_edit.html b/templates/registration/activate_edit.html
index 7b342013e8649df74b60351b961304d03ba4a263..e8b820fb478c8b6fbdcc2bec33f2ce5a625af166 100644
--- a/templates/registration/activate_edit.html
+++ b/templates/registration/activate_edit.html
@@ -12,8 +12,8 @@
 		}
 }
 </style>
-<link href="{{STATIC_URL}}js/select2/select2.css" rel="stylesheet">
-<link href="{{STATIC_URL}}js/select2/select2-bootstrap.css" rel="stylesheet">
+<link href="{% static 'js/select2/select2.css' %}" rel="stylesheet">
+<link href="{% static 'js/select2/select2-bootstrap.css' %}" rel="stylesheet">
 {% endblock %}
 
        {% block contentplaceholder %}
@@ -70,7 +70,7 @@
 	{% endblock %}
 
 {% block pagejsbottom %}
-	<script type="text/javascript" src="{{STATIC_URL}}js/select2/select2.js"></script>
+	<script type="text/javascript" src="{% static 'js/select2/select2.js' %}"></script>
 	<script>
 		$(document).ready( function(){
 			$('#id_peers').select2();
diff --git a/templates/registration/activation_complete.txt b/templates/registration/activation_complete.txt
index dfc168819c0b70d90bfb3c6a32367509cec6d166..daa361eb7b5f524f65689be4fc1a3fecc57eb076 100644
--- a/templates/registration/activation_complete.txt
+++ b/templates/registration/activation_complete.txt
@@ -2,4 +2,4 @@ Your account with username {{ user.username }} has been activated.
 
 You may login to FoD using the following URL:
 
-http://{{ site.domain }}{% url login %}
+http://{{ site.domain }}{% url 'login' %}
diff --git a/templates/registration/activation_email.txt b/templates/registration/activation_email.txt
index 57a2c5b07b13f44d873a33fb90c4e665457b1825..e4e49a8f136c57c217ed67202ba4296eb2b1524e 100644
--- a/templates/registration/activation_email.txt
+++ b/templates/registration/activation_email.txt
@@ -6,6 +6,6 @@ E-mail: {{user.email}}
 To activate the user's account and allow them to access the service, click on
 the following link:
 
-http://{{ site.domain }}{% url activate_account activation_key %}
+http://{{ site.domain }}{% url 'activate_account' activation_key %}
 
 The user will be notified via mail about the account activation
diff --git a/templates/registration/select_institution.html b/templates/registration/select_institution.html
index bc1e292aa39f0b92ba90c76e81f8512cf9f3f74a..17b764b9828a69c7bb1c0c64409434e5163cde30 100644
--- a/templates/registration/select_institution.html
+++ b/templates/registration/select_institution.html
@@ -12,8 +12,8 @@
 		}
 }
 </style>
-<link href="{{STATIC_URL}}js/select2/select2.css" rel="stylesheet">
-<link href="{{STATIC_URL}}js/select2/select2-bootstrap.css" rel="stylesheet">
+<link href="{% static 'js/select2/select2.css' %}" rel="stylesheet">
+<link href="{% static 'js/select2/select2-bootstrap.css' %}" rel="stylesheet">
 {% endblock %}
 
        {% block contentplaceholder %}
@@ -35,7 +35,7 @@
                         <div class="panel-body">
 
                         	<div class="alert alert-info">Excellent! You are a step away from joining the service. Select your institution from the dropdown list.</div>
-						<form method="POST" class="form-horizontal"	action="{% url selectinst %}">
+						<form method="POST" class="form-horizontal"	action="{% url 'selectinst' %}">
 							{% csrf_token %} {% if form.non_field_errors %}
 							<p class="error">{{ form.non_field_errors}}</p>
 							{% endif %}
@@ -68,7 +68,7 @@
 
 
 {% block pagejsbottom %}
-	<script type="text/javascript" src="{{STATIC_URL}}js/select2/select2.js"></script>
+	<script type="text/javascript" src="{% static 'js/select2/select2.js' %}"></script>
 	<script>
 		$(document).ready( function(){
 			$('#id_peers').select2();
diff --git a/templates/user_routes.html b/templates/user_routes.html
index 5f66fb2a3b43fad4ab58271b8062302fdea0d7d1..fb25001d198eb28df2e951db718a7b5627c497ca 100644
--- a/templates/user_routes.html
+++ b/templates/user_routes.html
@@ -1,12 +1,13 @@
 {% extends "base.html" %}
+{% load staticfiles %}
 {% load i18n %}
 {% block extrahead %}
-<link href="{{STATIC_URL}}b3theme/css/plugins/dataTables/dataTables.bootstrap.css" rel="stylesheet">
+<link href="{% static 'b3theme/css/plugins/dataTables/dataTables.bootstrap.css' %}" rel="stylesheet">
 {% endblock %}
 {% block pagejsbodttom %}
 
-<script type="text/javascript" src="{{STATIC_URL}}js/jquery.dataTables.js"></script>
-<script type="text/javascript" src="{{STATIC_URL}}js/datatables_bootstrap.js"></script>
+<script type="text/javascript" src="{% static 'js/jquery.dataTables.js' %}"></script>
+<script type="text/javascript" src="{% static 'js/datatables_bootstrap.js' %}"></script>
 
 
 {% endblock %}
@@ -60,8 +61,8 @@
                         </div>
                         <!-- /.panel-heading -->
 <div class="panel-body">
-				<a class="btn btn-sm btn-outline btn-success" id="routebutton" href="{% url add-route %}"><i class="fa fa-plus-circle"></i> {% trans "Add Rule" %}</a>
-				<a class="btn btn-sm btn-outline btn-info"  href="{% url user-profile %}"><i class="fa fa-user"></i> {% trans "My Profile" %}</a>
+				<a class="btn btn-sm btn-outline btn-success" id="routebutton" href="{% url 'add-route' %}"><i class="fa fa-plus-circle"></i> {% trans "Add Rule" %}</a>
+				<a class="btn btn-sm btn-outline btn-info"  href="{% url 'user-profile' %}"><i class="fa fa-user"></i> {% trans "My Profile" %}</a>
                         </div>
                         <!-- /.panel-body -->
                     </div>
@@ -85,10 +86,10 @@
 {% endblock %}
 
 {% block pagejsbottom %}
-    <script src="{{STATIC_URL}}js/dataTableslatest/jquery.dataTables.min.js"></script>
-    <script src="{{STATIC_URL}}js/dataTableslatest/dataTables.bootstrap.js"></script>
+    <script src="{% static 'js/dataTableslatest/jquery.dataTables.min.js' %}"></script>
+    <script src="{% static 'js/dataTableslatest/dataTables.bootstrap.js' %}"></script>
     {% if user.is_authenticated %}
-<script type="text/javascript" src="{% url load-js 'poller' %}"></script>
+<script type="text/javascript" src="{% url 'load-js' 'poller' %}"></script>
 {% endif %}
 
 <script type="text/javascript">
@@ -172,7 +173,7 @@ var start;
 var end;
 var oldhtml;
 var last_element = false;
-var refreshUrl = "{% url group-routes-ajax %}";
+var refreshUrl = "{% url 'group-routes-ajax' %}";
 $(document).ready( function(){
 
 
@@ -219,7 +220,7 @@ $(document).ready( function(){
             	var my = $(this);
             	my.html('Deactivating...')
 				var routename = $(this).data("routename");
-				var delurl = "{% url delete-route 'route_placeholder'%}".replace('route_placeholder', routename.toString());
+				var delurl = "{% url 'delete-route' 'route_placeholder'%}".replace('route_placeholder', routename.toString());
 				$.ajax({
         			type: 'POST',
         			url: delurl,
@@ -316,7 +317,7 @@ $(document).ready( function(){
 	                     		return toolt+" title=\""+title+"\">"+"<small>{% trans 'Rule expired' %}</small>"+"</a>";
 	                     	}
                      		if (status == "PENDING"){
-                     				return '<img src="{{STATIC_URL}}dots.gif">';
+                     				return '<img src="{% static 'dots.gif' %}">';
                      			}
                      		return "<small>"+full.response+"</small>";
 
@@ -326,7 +327,7 @@ $(document).ready( function(){
                       "mRender": function (data, type, full) {
                      status = full.status;
                      btn = '';
-                     editurl = "{% url edit-route 'routename'  %}".replace('routename', full.name.toString());
+                     editurl = "{% url 'edit-route' 'routename'  %}".replace('routename', full.name.toString());
                      if (status == "ACTIVE" ){
                      	btn = '<a href="'+editurl+'" class="btn-info btn btn-sm btn-outline">{% trans "Edit" %}</a>';
         				btn = btn + ' <button class="del_buttonpre btn-warning btn btn-sm btn-outline" id="'+full.name+'" data-routename="'+full.name+'">{% trans "Deactivate" %}</button>';
diff --git a/templates/welcome.html b/templates/welcome.html
index a1399b84807d556fe8c426da6874350f59c928cf..cfe461f1e62c6c25005c4a9d2619fdb5151ef1e8 100644
--- a/templates/welcome.html
+++ b/templates/welcome.html
@@ -34,7 +34,7 @@
 							<h2>{{ BRANDING.name }} - Firewall on Demand</h2>
 							<h4>Protect your network, protect the network</h4>
 							<p>
-								<a href="{% url login %}" type="button" class="btn btn-lg btn-outline btn-primary">{% trans "Join Now" %}</a>
+								<a href="{% url 'login' %}" type="button" class="btn btn-lg btn-outline btn-primary">{% trans "Join Now" %}</a>
 							</p>
 						</div>
 					</div>
@@ -78,7 +78,7 @@
 						<img src="{% static 'shib_login.png' %}" style="border:none;">
 					</p>
 					<p>
-						<a href="{% url login %}" type="button" class="btn btn-outline btn-primary">{% trans "Shibboleth Login" %}</a>
+						<a href="{% url 'login' %}" type="button" class="btn btn-outline btn-primary">{% trans "Shibboleth Login" %}</a>
 					</p>
 				</div>
 			</div>
diff --git a/utils/decorators.py b/utils/decorators.py
index 8bc6d1eb0b37d8104f8f819a0b0f9fc2d85470fc..3a0ae2095ddbf483d3cffe16dc967bbe5a7f4aa9 100644
--- a/utils/decorators.py
+++ b/utils/decorators.py
@@ -18,7 +18,7 @@
 #
 
 from django.http import HttpResponseRedirect
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 
 
 def shib_required(f):
diff --git a/utils/proxy.py b/utils/proxy.py
index c16d2c89ddf7d34d8163a4609223d3ceb0cb729a..92b52af0597f58a79be5a5162a52a093cb95e537 100644
--- a/utils/proxy.py
+++ b/utils/proxy.py
@@ -17,7 +17,7 @@
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #
 
-import jncdevice as np
+from . import jncdevice as np
 from ncclient import manager
 from ncclient.transport.errors import AuthenticationError, SSHError
 from lxml import etree as ET
@@ -26,7 +26,7 @@ import logging
 from django.core.cache import cache
 import os
 from celery.exceptions import TimeLimitExceeded, SoftTimeLimitExceeded
-from portrange import parse_portrange
+from .portrange import parse_portrange
 
 cwd = os.getcwd()
 
diff --git a/utils/whois.py b/utils/whois.py
index 55e42e467c2e6e85543fd59488b3a6a303c80dee..97245cbe0324bc3a95912ab7ba3fe305db9f3f67 100644
--- a/utils/whois.py
+++ b/utils/whois.py
@@ -18,7 +18,7 @@
 #
 
 import socket
-from ipaddr import *
+from ipaddress import *
 import re
 from django.conf import settings
 
@@ -43,15 +43,16 @@ def query(query, hostname, flags):
     for line in query:
         m = re.match(r"(^route6?\:\s+)(?P<subnets>\S+)", line)
         if m:
-            if IPNetwork(m.group('subnets')).version == 4:
-                routes4.append(IPNetwork(m.group('subnets')))
-            if IPNetwork(m.group('subnets')).version == 6:
-                routes6.append(IPNetwork(m.group('subnets')))
+            i = ipaddress.ip_interface(m.group('subnets'))
+            if i.version == 4:
+                routes4.append(i.network)
+            elif i.version == 6:
+                routes6.append(i.network)
     final_routes = []
     if len(routes4):
-        final_routes4 = collapse_address_list(routes4)
+        final_routes4 = collapse_address(routes4)
     if len(routes6):
-        final_routes6 = collapse_address_list(routes6)
+        final_routes6 = collapse_address(routes6)
     final_routes = final_routes4 + final_routes6
     return final_routes