diff --git a/app/api/network.py b/app/api/network.py
index 104a4cb7847d6f7197c01cf787cfac8884491c52..24be880c364144ccf8bc2717677b64204d8bd13c 100644
--- a/app/api/network.py
+++ b/app/api/network.py
@@ -9,7 +9,7 @@ This module implements the network API.
 :license: BSD 2-Clause, see LICENSE for more details.
 
 """
-from flask import Blueprint
+from flask import Blueprint, request
 from flask_jwt_extended import jwt_required
 from .. import models
 from ..decorators import jwt_groups_accepted
@@ -89,6 +89,14 @@ def get_interfaces():
 
     .. :quickref: Network; Get interfaces
     """
+    domain = request.args.get('domain', None)
+    if domain is not None:
+        query = models.Interface.query
+        query = query.join(models.Interface.network).join(
+            models.Network.domain).filter(
+                models.Domain.name == domain)
+        query = query.order_by(models.Interface.ip)
+        return get_generic_model(model=None, query=query)
     return get_generic_model(models.Interface,
                              order_by=models.Interface.ip)
 
diff --git a/app/api/utils.py b/app/api/utils.py
index 168b2669d7fff43d3fe6d33061816032d2794b7b..f4369e4804c00def9633e03acaa4affdfac2bc8a 100644
--- a/app/api/utils.py
+++ b/app/api/utils.py
@@ -59,20 +59,23 @@ def build_pagination_header(pagination, base_url, **kwargs):
     return header
 
 
-def get_generic_model(model, order_by=None):
+def get_generic_model(model, order_by=None, query=None):
     """Return data from model as json
 
     :param model: model class
     :param order_by: column to order the result by
+    :param query: optional query to use (for more complex queries)
     :returns: data from model as json
     """
     kwargs = request.args.to_dict()
     page = int(kwargs.pop('page', 1))
     per_page = int(kwargs.pop('per_page', 20))
-    query = utils.get_query(model.query, **kwargs)
-    if order_by is None:
-        order_by = getattr(model, 'name')
-    pagination = query.order_by(order_by).paginate(page, per_page)
+    if query is None:
+        query = utils.get_query(model.query, **kwargs)
+        if order_by is None:
+            order_by = getattr(model, 'name')
+        query = query.order_by(order_by)
+    pagination = query.paginate(page, per_page)
     data = [item.to_dict() for item in pagination.items]
     header = build_pagination_header(pagination, request.base_url, **kwargs)
     return jsonify(data), 200, header
diff --git a/tests/functional/test_api.py b/tests/functional/test_api.py
index a74754fe09ead2c3e8b426a738751ab6facfcd63..ecc181385ade27e7a49cc2ea5b0f64b36efcbc94 100644
--- a/tests/functional/test_api.py
+++ b/tests/functional/test_api.py
@@ -598,6 +598,28 @@ def test_get_interfaces(client, network_factory, interface_factory, readonly_tok
     check_input_is_subset_of_response(response, (interface3.to_dict(),))
 
 
+def test_get_interfaces_by_domain(client, domain_factory, network_factory, interface_factory, readonly_token):
+    # Create some interfaces
+    domain1 = domain_factory(name='tn.esss.lu.se')
+    domain2 = domain_factory(name='ics.esss.lu.se')
+    network1 = network_factory(address='192.168.1.0/24', first_ip='192.168.1.10', last_ip='192.168.1.250', domain=domain1)
+    network2 = network_factory(address='192.168.2.0/24', first_ip='192.168.2.10', last_ip='192.168.2.250', domain=domain2)
+    interface1 = interface_factory(network=network1, ip='192.168.1.10')
+    interface2 = interface_factory(network=network1, ip='192.168.1.11', name='interface2')
+    interface3 = interface_factory(network=network2, ip='192.168.2.10')
+
+    # test filtering by domain
+    response = get(client, f'{API_URL}/network/interfaces?domain=tn.esss.lu.se', token=readonly_token)
+    assert response.status_code == 200
+    assert len(response.json) == 2
+    check_input_is_subset_of_response(response, (interface1.to_dict(), interface2.to_dict()))
+
+    response = get(client, f'{API_URL}/network/interfaces?domain=ics.esss.lu.se', token=readonly_token)
+    assert response.status_code == 200
+    assert len(response.json) == 1
+    check_input_is_subset_of_response(response, (interface3.to_dict(),))
+
+
 def test_create_interface(client, network_factory, user_token):
     network = network_factory(address='192.168.1.0/24', first_ip='192.168.1.10', last_ip='192.168.1.250')
     # check that network_id and ip are mandatory