diff --git a/ippisite/ippidb/templates/multiselection_modal.html b/ippisite/ippidb/templates/multiselection_modal.html
index 3471348002b58e1eb1e6289cc0dbd2c401c77850..13286f330a56834b1d615f176cb430b22a547720 100644
--- a/ippisite/ippidb/templates/multiselection_modal.html
+++ b/ippisite/ippidb/templates/multiselection_modal.html
@@ -1,65 +1,72 @@
-<div class="modal fade" id="modal-{{ param_name }}" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
+{% load customtags %}
+<div class="modal fade" id="modal-{{ param_name }}" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel"
+  aria-hidden="true">
   <div class="modal-dialog" role="document">
     <div class="modal-content">
       <div class="modal-header">
         <h5 class="modal-title update_modal_title" id="exampleModalLabel">{{ label }}</h5>
       </div>
       <div class="modal-body">
-    <input id="search-{{ param_name }}" class="typeahead" type="text">
-    <script>
-    var selection{{ param_name }} = [
-        {% for element in unselected_list %}
-        {id:'{{ element.id }}', name:'{{ element.name }}'},
-        {% endfor %}
+        <input id="search-{{ param_name }}" class="typeahead" type="text">
+        <script>
+          var selection{{ param_name }} =[
+            {% for element in unselected_list %}
+          { id: '{{ element.id }}', name: '{{ element.name }}' },
+          {% endfor %}
     ];
-    var onSelect = function(evt, obj){
-        $('[name="{{ param_name }}"][value="'+ obj.id +'"]').prop('checked', true);
-    }
-    multiselectTypeAhead('search-{{ param_name }}', selection{{ param_name }}, onSelect);
-    </script>
-    <div style="max-height: 15em; overflow-y: auto;">
-      {% if on_value == None %}
-        {% for element in selected_list|dictsort:"name.lower"  %}
-        <div class="form-check col-12">
-          <label class="form-check-label">
-            <input id="selected-{{ element.id }}" class="form-check-input text-right" type="checkbox" checked value="{{ element.id }}" name="{{ param_name }}" style="width: auto; margin-right: 1em;">
-            {{ element }}
-          </label>
+          var onSelect = function (evt, obj) {
+            $('[name="{{ param_name }}"][value="' + obj.id + '"]').prop('checked', true);
+          }
+          multiselectTypeAhead('search-{{ param_name }}', selection{{ param_name }}, onSelect);
+        </script>
+        <div style="max-height: 15em; overflow-y: auto;">
+          {% if on_value == None %}
+          {% for element in selected_list|dictsort:"name.lower" %}
+          <div class="form-check col-12">
+            <label class="form-check-label">
+              <input id="selected-{{ element.id }}" class="form-check-input text-right" type="checkbox" checked
+                value="{{ element.id }}" name="{{ param_name }}" style="width: auto; margin-right: 1em;">
+              {{ element }}
+            </label>
+          </div>
+          {% endfor %}
+          {% for element in unselected_list|dictsort:"name.lower" %}
+          <div class="form-check col-12">
+            <label class="form-check-label">
+              <input class="form-check-input text-right" type="checkbox" value="{{ element.id }}"
+                name="{{ param_name }}" style="width: auto; margin-right: 1em;">
+              {{ element }}
+            </label>
+          </div>
+          {% endfor %}
+          {% endif %}
+          {% if on_value != None %}
+          {% for element in selected_list|dictsort:"lower" %}
+          <div class="form-check col-12">
+            <label class="form-check-label">
+              <input id="selected-{{ element.id }}" class="form-check-input text-right" type="checkbox" checked
+                value="{{ element }}" name="{{ param_name }}" style="width: auto; margin-right: 1em;">
+              {{ element.name }} {{ element }}
+            </label>
+          </div>
+          {% endfor %}
+          {% for element in unselected_list|dictsort:"lower" %}
+          <div class="form-check col-12">
+            <label class="form-check-label">
+              <input class="form-check-input text-right" type="checkbox" value="{{ element }}" name="{{ param_name }}"
+                style="width: auto; margin-right: 1em;">
+              {{ element.name }} {{ element }}
+            </label>
+          </div>
+          {% endfor %}
+          {% endif %}
         </div>
-        {% endfor %}
-        {% for element in unselected_list|dictsort:"name.lower" %}
-        <div class="form-check col-12">
-          <label class="form-check-label">
-            <input class="form-check-input text-right" type="checkbox" value="{{ element.id }}" name="{{ param_name }}" style="width: auto; margin-right: 1em;">
-            {{ element }}
-          </label>
-        </div>
-        {% endfor %}
-      {% endif %}
-      {% if on_value != None %}
-        {% for element in selected_list|dictsort:"lower"  %}
-        <div class="form-check col-12">
-          <label class="form-check-label">
-            <input id="selected-{{ element.id }}" class="form-check-input text-right" type="checkbox" checked value="{{ element }}" name="{{ param_name }}" style="width: auto; margin-right: 1em;">
-            {{ element.name }} {{ element }}
-          </label>
-        </div>
-        {% endfor %}
-        {% for element in unselected_list|dictsort:"lower" %}
-        <div class="form-check col-12">
-          <label class="form-check-label">
-            <input class="form-check-input text-right" type="checkbox" value="{{ element }}" name="{{ param_name }}" style="width: auto; margin-right: 1em;">
-            {{ element.name }} {{ element }}
-          </label>
-        </div>
-        {% endfor %}
-      {% endif %}
-      </div>
       </div>
       <div class="modal-footer">
         <button type="button" class="btn btn-secondary close_modal" data-dismiss="modal">x Close</button>
-        <button type="button" class="btn btn-primary" onclick="$('#modal-{{ param_name }}').modal('hide'); queryUrl.unPage(); queryUrl.changeSelection('{{ param_name }}');">Apply</button>
+        <button type="button" class="btn btn-primary"
+          onclick="$('#modal-{{ param_name }}').modal('hide'); queryUrl.unPage(); queryUrl.changeSelection('{{ param_name }}');">Apply</button>
       </div>
     </div>
   </div>
-</div>
+</div>
\ No newline at end of file
diff --git a/ippisite/ippidb/templatetags/customtags.py b/ippisite/ippidb/templatetags/customtags.py
index 6adee6e57158ea2e79139d31c98742edc03df8de..63d1b6c816d6347df59b5ce51efd495f844f8c9a 100644
--- a/ippisite/ippidb/templatetags/customtags.py
+++ b/ippisite/ippidb/templatetags/customtags.py
@@ -3,6 +3,8 @@ import numpy as np
 import colorsys
 from django import forms
 from django import template
+from django.db.models import F, Func
+from django.core.exceptions import FieldError
 from django.contrib.messages.storage.base import Message
 from django.db.models import QuerySet
 from django.forms.utils import ErrorList, ErrorDict
@@ -265,7 +267,7 @@ def get_zscore(distance, avg_std):
     factor = float(avg_std.normalize_factor)
     # mean = float(avg_std.average)
     dist = float(distance)
-    score = np.exp(-((dist ** 2) / (2 * (factor ** 2))))
+    score = np.exp(-((dist**2) / (2 * (factor**2))))
     return score
 
 
@@ -310,3 +312,29 @@ def build_name(cavity):
             cavity.chain.pdb_chain_id,
             cavity.cavity_number,
         )
+
+
+@register.filter
+def dictsort(qs, arg):
+    if isinstance(qs, set):
+        if "lower" in arg:
+            return sorted(qs, key=str.casefold)
+        else:
+            return sorted(qs)
+    if isinstance(qs, QuerySet):
+        if "lower" in arg:
+            filter_param = arg.split(".")[0]
+            try:
+                qs = qs.annotate(lower_property=Func(F(filter_param), function="LOWER"))
+                return qs.order_by("lower_property")
+            except (FieldError, AttributeError):
+                return qs
+
+        else:
+            filter_param = arg
+            try:
+                qs = qs.annotate(property=filter_param)
+                return qs.order_by("property")
+            except (FieldError, AttributeError):
+                return qs
+    return qs
diff --git a/ippisite/ippidb/views/compound_query.py b/ippisite/ippidb/views/compound_query.py
index 0ff5e79be2188737a971c0ca1764bc68f5414c3c..58e411acccd1f8cdb55f56c2eeb66281d58a0a54 100644
--- a/ippisite/ippidb/views/compound_query.py
+++ b/ippisite/ippidb/views/compound_query.py
@@ -1,6 +1,7 @@
 """
 iPPI-DB compound query view and related classes
 """
+
 import csv
 import json
 from collections import OrderedDict
@@ -194,9 +195,9 @@ class CompoundListFilterHandler(FilterHandler):
         # if no value has been set for this filter
         if not self.value:
             # selected objects is an empty queryset
-            self.filter_context[
-                "selected_" + self.parameter_name
-            ] = self.filter_class.objects.none()
+            self.filter_context["selected_" + self.parameter_name] = (
+                self.filter_class.objects.none()
+            )
             objects = self.filter_class.objects
             if self.additional_filter:
                 objects = objects.filter(**self.additional_filter)
@@ -362,7 +363,7 @@ class ExistsFilterHandler(FilterHandler):
         super().__init__(parameter_name, filter_context, request_get)
 
     def process(self, queryset):
-        """ to be called during queryset filtering """
+        """to be called during queryset filtering"""
         # if a value has been set for this filter
         if self.value:
             # filter queryset on the values not being NULL
@@ -372,7 +373,7 @@ class ExistsFilterHandler(FilterHandler):
         return queryset
 
     def post_process(self, compound_ids, queryset):
-        """ to be called after queryset filtering """
+        """to be called after queryset filtering"""
         pass
 
 
@@ -387,7 +388,7 @@ class TrueFilterHandler(FilterHandler):
         super().__init__(parameter_name, filter_context, request_get)
 
     def process(self, queryset):
-        """ to be called during queryset filtering """
+        """to be called during queryset filtering"""
         # if a value has been set for this filter
         if self.value:
             # filter queryset on the values being True
@@ -396,7 +397,7 @@ class TrueFilterHandler(FilterHandler):
         return queryset
 
     def post_process(self, compound_ids, queryset):
-        """ to be called after queryset filtering """
+        """to be called after queryset filtering"""
         pass
 
 
@@ -418,7 +419,7 @@ class TrueListFilterHandler(object):
                 self.filter_context["filter_on"] = True
 
     def process(self, queryset):
-        """ to be called during queryset filtering """
+        """to be called during queryset filtering"""
         # if a value has been set for this filter
 
         if len(self.values) > 0:
@@ -429,7 +430,7 @@ class TrueListFilterHandler(object):
         return queryset
 
     def post_process(self, compound_ids, queryset):
-        """ to be called after queryset filtering """
+        """to be called after queryset filtering"""
         pass
 
 
@@ -573,9 +574,9 @@ class CompoundListView(ListView):
         # get queryset
         qs = super().get_queryset()
         # add filters
-        self.filter_context[
-            "disabled"
-        ] = set()  # list of filters disabled by setting others
+        self.filter_context["disabled"] = (
+            set()
+        )  # list of filters disabled by setting others
         cfhs = [
             CompoundListFilterHandler(
                 PpiFamily,
@@ -760,9 +761,9 @@ class CompoundDetailView(DetailView):
     def get_context_data(self, **kwargs):
         context = super().get_context_data(**kwargs)
         try:
-            context[
-                "le_lle_biplot_data"
-            ] = LeLleBiplotData.objects.get().le_lle_biplot_data
+            context["le_lle_biplot_data"] = (
+                LeLleBiplotData.objects.get().le_lle_biplot_data
+            )
         except LeLleBiplotData.DoesNotExist:
             context["le_lle_biplot_data"] = []
         try: