diff --git a/src/main/java/com/bnmoboxd/controllers/SubscriptionController.java b/src/main/java/com/bnmoboxd/controllers/SubscriptionController.java
index b0f349398fe83c322e0e5b926943a91270aa44f9..2b53687e234dd0646e749309486528f1fbda22f4 100644
--- a/src/main/java/com/bnmoboxd/controllers/SubscriptionController.java
+++ b/src/main/java/com/bnmoboxd/controllers/SubscriptionController.java
@@ -4,10 +4,8 @@ import com.bnmoboxd.middlewares.AuthMiddleware;
 import com.bnmoboxd.models.Subscription;
 import com.bnmoboxd.repositories.SubscriptionRepository;
 import com.bnmoboxd.services.SubscriptionService;
-import com.bnmoboxd.struct.ApiResponse;
-import com.bnmoboxd.struct.ResponseStatus;
+import com.bnmoboxd.struct.Pagination;
 import com.bnmoboxd.struct.SubscriptionStatus;
-import com.sun.org.apache.xpath.internal.operations.Bool;
 
 import javax.annotation.Resource;
 import javax.jws.*;
@@ -18,21 +16,26 @@ import java.util.List;
 @WebService
 public class SubscriptionController {
     private final SubscriptionService subscriptionService;
-    private final SubscriptionRepository subscriptionRepository;
     @Resource
     private WebServiceContext serviceContext;
 
     // TODO: Logging
     public SubscriptionController() {
         subscriptionService = new SubscriptionService();
-        subscriptionRepository = new SubscriptionRepository();
     }
 
     @WebMethod(operationName = "getAll")
     @WebResult(name = "response")
-    public List<Subscription> getAll() {
+    public List<Subscription> getAll(
+        @WebParam(name = "page")
+        Integer page,
+
+        @WebParam(name = "take")
+        Integer take
+    ) {
         if(new AuthMiddleware(serviceContext).execute()) {
-            return subscriptionService.getAllSubscriptions();
+            Pagination pagination = page != null && take != null ? new Pagination(page, take) : null;
+            return subscriptionService.getSubscriptions(null, pagination);
         } else {
             return null;
         }
@@ -45,8 +48,12 @@ public class SubscriptionController {
         @XmlElement(required = true)
         String curatorUsername
     ) {
-        if(new AuthMiddleware(serviceContext).execute()) {
-            return subscriptionRepository.getAcceptedSubscriptions(curatorUsername).size();
+        if(new AuthMiddleware(serviceContext).execute() && curatorUsername != null) {
+            return subscriptionService.getSubscriptions(new SubscriptionRepository.Filter(
+                curatorUsername,
+                null,
+                SubscriptionStatus.ACCEPTED
+            )).size();
         } else {
             return null;
         }
@@ -67,8 +74,16 @@ public class SubscriptionController {
         @XmlElement(required = true)
         String status
     ) {
-        if(new AuthMiddleware(serviceContext).execute()) {
-            return subscriptionRepository.addSubscription(new Subscription(curatorUsername, subscriberUsername, SubscriptionStatus.valueOf(status)));
+        if(new AuthMiddleware(serviceContext).execute()
+            && curatorUsername != null
+            && subscriberUsername != null
+            && status != null
+        ) {
+            return subscriptionService.addSubscription(
+                curatorUsername,
+                subscriberUsername,
+                SubscriptionStatus.valueOf(status)
+            );
         } else {
             return null;
         }
@@ -89,8 +104,22 @@ public class SubscriptionController {
         @XmlElement(required = true)
         String status
     ) {
-        if(new AuthMiddleware(serviceContext).execute()) {
-            return subscriptionRepository.updateSubscriptionStatus(new Subscription(curatorUsername, subscriberUsername, SubscriptionStatus.valueOf(status)));
+        if(new AuthMiddleware(serviceContext).execute()
+            && curatorUsername != null
+            && subscriberUsername != null
+            && status != null
+        ) {
+            try {
+                SubscriptionStatus newStatus = SubscriptionStatus.valueOf(status);
+                return subscriptionService.updateSubscription(
+                    curatorUsername,
+                    subscriberUsername,
+                    newStatus
+                );
+            } catch(IllegalArgumentException e) {
+                e.printStackTrace();
+                return null;
+            }
         } else {
             return null;
         }
diff --git a/src/main/java/com/bnmoboxd/repositories/SubscriptionRepository.java b/src/main/java/com/bnmoboxd/repositories/SubscriptionRepository.java
index c548463b8af1b53a5a7af2d493cb85a4ab954949..ca4ab1ded6cb587f31a909c12ecb0b01ced4a1a0 100644
--- a/src/main/java/com/bnmoboxd/repositories/SubscriptionRepository.java
+++ b/src/main/java/com/bnmoboxd/repositories/SubscriptionRepository.java
@@ -2,7 +2,10 @@ package com.bnmoboxd.repositories;
 
 import com.bnmoboxd.database.Database;
 import com.bnmoboxd.models.Subscription;
+import com.bnmoboxd.struct.Pagination;
 import com.bnmoboxd.struct.SubscriptionStatus;
+import lombok.Getter;
+import org.jetbrains.annotations.Nullable;
 
 import java.sql.Connection;
 import java.sql.PreparedStatement;
@@ -12,36 +15,38 @@ import java.util.ArrayList;
 import java.util.List;
 
 public class SubscriptionRepository {
-    public List<Subscription> getAllSubscriptions() {
+    public List<Subscription> getSubscriptions(Filter filter, Pagination pagination) {
         try(Connection connection = Database.getConnection()) {
-            String query = "SELECT * FROM subscriptions";
             List<Subscription> subscriptions = new ArrayList<>();
 
-            try(PreparedStatement statement = connection.prepareStatement(query);
-                ResultSet resultSet = statement.executeQuery()) {
-                while(resultSet.next()) {
-                    String curatorUsername = resultSet.getString("curator_username");
-                    String subscriberUsername = resultSet.getString("subscriber_username");
-                    String status = resultSet.getString("status");
-
-                    Subscription subscription = new Subscription(curatorUsername, subscriberUsername, SubscriptionStatus.valueOf(status));
-                    subscriptions.add(subscription);
+            StringBuilder query = new StringBuilder("SELECT * FROM subscriptions");
+            List<String> params = new ArrayList<>();
+            if(filter != null) {
+                if(filter.getCuratorUsername() != null) {
+                    query.append(String.format(" %s curator_username = ?", "WHERE"));
+                    params.add(filter.getCuratorUsername());
+                }
+                if(filter.getSubscriberUsername() != null) {
+                    query.append(String.format(" %s subscriber_username = ?", params.isEmpty() ? "WHERE" : "AND"));
+                    params.add(filter.getSubscriberUsername());
+                }
+                if(filter.getStatus() != null) {
+                    query.append(String.format(" %s status = ?", params.isEmpty() ? "WHERE" : "AND"));
+                    params.add(filter.getStatus().toString());
                 }
             }
-            return subscriptions;
-        } catch(SQLException e) {
-            e.printStackTrace();
-            return null;
-        }
-    }
+            if(pagination != null) query.append(" LIMIT ? OFFSET ?");
 
-    public List<Subscription> getAcceptedSubscriptions(String subCuratorUsername) {
-        try(Connection connection = Database.getConnection()) {
-            String query = "SELECT * FROM subscriptions WHERE curator_username = ? AND status = 'ACCEPTED'";
-            List<Subscription> subscriptions = new ArrayList<>();
+            try(PreparedStatement statement = connection.prepareStatement(query.toString())) {
+                for(int i = 0; i < params.size(); i++) {
+                    statement.setString(i + 1, params.get(i));
+                }
+                if(pagination != null) {
+                    int skip = pagination.getTake() * (pagination.getPage() - 1);
+                    statement.setInt(params.size() + 1, pagination.getTake());
+                    statement.setInt(params.size() + 2, skip);
+                }
 
-            try(PreparedStatement statement = connection.prepareStatement(query)) {
-                statement.setString(1, subCuratorUsername);
                 try(ResultSet resultSet = statement.executeQuery()) {
                     while(resultSet.next()) {
                         String curatorUsername = resultSet.getString("curator_username");
@@ -79,7 +84,7 @@ public class SubscriptionRepository {
         }
     }
 
-    public boolean updateSubscriptionStatus(Subscription subscription) {
+    public boolean updateSubscription(Subscription subscription) {
         try(Connection connection = Database.getConnection()) {
             String query = "UPDATE subscriptions SET status = ? WHERE curator_username = ? AND subscriber_username = ?";
 
@@ -96,4 +101,23 @@ public class SubscriptionRepository {
             return false;
         }
     }
+
+    @Getter
+    public static class Filter {
+        public Filter(String curatorUsername, String subscriberUsername, String status) {
+            this.curatorUsername = curatorUsername;
+            this.subscriberUsername = subscriberUsername;
+            this.status = status != null ? SubscriptionStatus.valueOf(status) : null;
+        }
+
+        public Filter(String curatorUsername, String subscriberUsername, @Nullable SubscriptionStatus status) {
+            this.curatorUsername = curatorUsername;
+            this.subscriberUsername = subscriberUsername;
+            this.status = status;
+        }
+
+        private final String curatorUsername;
+        private final String subscriberUsername;
+        private final @Nullable SubscriptionStatus status;
+    }
 }
diff --git a/src/main/java/com/bnmoboxd/services/SubscriptionService.java b/src/main/java/com/bnmoboxd/services/SubscriptionService.java
index 28b4dd77d55c6027102d706348bbd23697254712..3e00b5c861bf8df6f80ad00cfb7949cf10b076c3 100644
--- a/src/main/java/com/bnmoboxd/services/SubscriptionService.java
+++ b/src/main/java/com/bnmoboxd/services/SubscriptionService.java
@@ -2,6 +2,8 @@ package com.bnmoboxd.services;
 
 import com.bnmoboxd.models.Subscription;
 import com.bnmoboxd.repositories.SubscriptionRepository;
+import com.bnmoboxd.struct.Pagination;
+import com.bnmoboxd.struct.SubscriptionStatus;
 
 import java.util.List;
 
@@ -12,7 +14,27 @@ public class SubscriptionService {
         subscriptionRepository = new SubscriptionRepository();
     }
 
-    public List<Subscription> getAllSubscriptions() {
-        return subscriptionRepository.getAllSubscriptions();
+    public List<Subscription> getSubscriptions(SubscriptionRepository.Filter filter) {
+        return subscriptionRepository.getSubscriptions(filter, null);
+    }
+
+    public List<Subscription> getSubscriptions(SubscriptionRepository.Filter filter, Pagination pagination) {
+        return subscriptionRepository.getSubscriptions(filter, pagination);
+    }
+
+    public boolean addSubscription(String curatorUsername, String subscriberUsername, SubscriptionStatus status) {
+        return subscriptionRepository.addSubscription(new Subscription(
+            curatorUsername,
+            subscriberUsername,
+            status
+        ));
+    }
+
+    public boolean updateSubscription(String curatorUsername, String subscriberUsername, SubscriptionStatus status) {
+        return subscriptionRepository.updateSubscription(new Subscription(
+            curatorUsername,
+            subscriberUsername,
+            status
+        ));
     }
 }
diff --git a/src/main/java/com/bnmoboxd/struct/ApiResponse.java b/src/main/java/com/bnmoboxd/struct/ApiResponse.java
index ed16907e54a189f55f76a3fd008a26e0bbce8700..456a8c3354fddd7bda97973bfa7740b7d4a7d379 100644
--- a/src/main/java/com/bnmoboxd/struct/ApiResponse.java
+++ b/src/main/java/com/bnmoboxd/struct/ApiResponse.java
@@ -6,6 +6,7 @@ import lombok.NoArgsConstructor;
 
 import javax.xml.bind.annotation.*;
 
+// TODO: Either use or remove ApiResponse
 @Getter
 @AllArgsConstructor
 @NoArgsConstructor
diff --git a/src/main/java/com/bnmoboxd/struct/Pagination.java b/src/main/java/com/bnmoboxd/struct/Pagination.java
new file mode 100644
index 0000000000000000000000000000000000000000..31e79e30d5caade727d96f4365d54965b4b1d59e
--- /dev/null
+++ b/src/main/java/com/bnmoboxd/struct/Pagination.java
@@ -0,0 +1,14 @@
+package com.bnmoboxd.struct;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+import javax.xml.bind.annotation.XmlRootElement;
+
+@Getter
+@AllArgsConstructor
+public class Pagination {
+    private int page;
+    private int take;
+}
diff --git a/src/main/java/com/bnmoboxd/struct/ResponseStatus.java b/src/main/java/com/bnmoboxd/struct/ResponseStatus.java
index bda5b7c85b58cb7a48832ff743f1e846d1005757..66e4d7d516742eca966486ef4d6a0557447ae38e 100644
--- a/src/main/java/com/bnmoboxd/struct/ResponseStatus.java
+++ b/src/main/java/com/bnmoboxd/struct/ResponseStatus.java
@@ -2,6 +2,7 @@ package com.bnmoboxd.struct;
 
 import javax.xml.bind.annotation.XmlEnum;
 
+// TODO: Either use or remove ResponseStatus
 @XmlEnum
 public enum ResponseStatus {
     SUCCESS,