diff --git a/src/main/java/org/tonality/ws/ISubscription.java b/src/main/java/org/tonality/ws/ISubscription.java
new file mode 100644
index 0000000000000000000000000000000000000000..e3fc4daf8b3c2725b89afaf65648d23f5bec4505
--- /dev/null
+++ b/src/main/java/org/tonality/ws/ISubscription.java
@@ -0,0 +1,75 @@
+package org.tonality.ws;
+
+import org.tonality.type.SubscriptionStatus;
+
+import javax.jws.WebMethod;
+import javax.jws.WebParam;
+import javax.jws.WebResult;
+import javax.jws.WebService;
+import java.util.List;
+
+@WebService
+public interface ISubscription {
+    @WebMethod
+    @WebResult(name = "subscription")
+    org.tonality.model.Subscription createSubscription(
+            @WebParam(name = "userId")
+            long userId,
+            @WebParam(name = "albumId")
+            long albumId
+    );
+
+    @WebMethod
+    @WebResult(name = "subscription")
+    org.tonality.model.Subscription updateSubscription(
+            @WebParam(name = "userId")
+            long userId,
+            @WebParam(name = "albumId")
+            long albumId,
+            @WebParam(name = "status")
+            org.tonality.type.SubscriptionStatus status
+    );
+
+    @WebMethod
+    @WebResult(name = "subscription")
+    org.tonality.model.Subscription getSubscription(
+            @WebParam(name = "userId")
+            long userId,
+            @WebParam(name = "albumId")
+            long albumId
+    );
+
+    @WebMethod
+    @WebResult(name = "subscriptions")
+    List<org.tonality.model.Subscription> getSubscriptionsByStatus(
+            @WebParam(name = "status")
+            SubscriptionStatus status
+    );
+
+    @WebMethod
+    @WebResult(name = "subscriptions")
+    List<org.tonality.model.Subscription> getSubscriptionsByUserId(
+            @WebParam(name = "userId")
+            long userId
+    );
+
+    @WebMethod
+    boolean deleteSubscription(
+            @WebParam(name = "userId")
+            long userId,
+            @WebParam(name = "albumId")
+            long albumId
+    );
+
+    @WebMethod
+    boolean deleteSubscriptionsByUserId(
+            @WebParam(name = "userId")
+            long userId
+    );
+
+    @WebMethod
+    boolean deleteSubscriptionsByAlbumId(
+            @WebParam(name = "albumId")
+            long albumId
+    );
+}
diff --git a/src/main/java/org/tonality/ws/Subscription.java b/src/main/java/org/tonality/ws/Subscription.java
index ed7ff89fc846c2165c46f18448abef06472ab116..bd31846ea66c01c71e0322429abbf984602b0dba 100644
--- a/src/main/java/org/tonality/ws/Subscription.java
+++ b/src/main/java/org/tonality/ws/Subscription.java
@@ -1,12 +1,123 @@
 package org.tonality.ws;
 
-import javax.jws.WebMethod;
+import org.tonality.type.SubscriptionStatus;
+
 import javax.jws.WebService;
+import java.util.List;
+
+@WebService(endpointInterface = "org.tonality.ws.ISubscription")
+public class Subscription implements ISubscription {
+    @Override
+    public org.tonality.model.Subscription createSubscription(long userId, long albumId) {
+        try {
+            org.tonality.model.Subscription subscription = new org.tonality.model.Subscription();
+            subscription.setUserId(userId);
+            subscription.setAlbumId(albumId);
+            if (org.tonality.repository.Subscription.getInstance().add(subscription) == null) {
+                throw new Exception("Failed to create subscription");
+            }
+            return subscription;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    @Override
+    public org.tonality.model.Subscription updateSubscription(long userId, long albumId, SubscriptionStatus status) {
+        try {
+            org.tonality.model.Subscription subscription = new org.tonality.model.Subscription();
+            subscription.setUserId(userId);
+            subscription.setAlbumId(albumId);
+            subscription.setStatus(status);
+            if (org.tonality.repository.Subscription.getInstance().update(subscription) == null) {
+                throw new Exception("Failed to update subscription");
+            }
+            return subscription;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    @Override
+    public org.tonality.model.Subscription getSubscription(long userId, long albumId) {
+        try {
+            org.tonality.model.SubscriptionId id = new org.tonality.model.SubscriptionId(userId, albumId);
+            return org.tonality.repository.Subscription.getInstance().getById(id);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    @Override
+    public List<org.tonality.model.Subscription> getSubscriptionsByStatus(SubscriptionStatus status) {
+        try {
+            java.util.Map<String, Object> andConditions = new java.util.HashMap<>();
+            andConditions.put("status", status.toString());
+            java.util.Map<String, Object> orConditions = new java.util.HashMap<>();
+            return org.tonality.repository.Subscription.getInstance().search(andConditions, orConditions);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    @Override
+    public List<org.tonality.model.Subscription> getSubscriptionsByUserId(long userId) {
+        try {
+            java.util.Map<String, Object> andConditions = new java.util.HashMap<>();
+            andConditions.put("userId", userId);
+            java.util.Map<String, Object> orConditions = new java.util.HashMap<>();
+            return org.tonality.repository.Subscription.getInstance().search(andConditions, orConditions);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    @Override
+    public boolean deleteSubscription(long userId, long albumId) {
+        try {
+            org.tonality.model.SubscriptionId id = new org.tonality.model.SubscriptionId(userId, albumId);
+            if (!org.tonality.repository.Subscription.getInstance().deleteById(id)) {
+                throw new Exception("Failed to delete subscription");
+            }
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    @Override
+    public boolean deleteSubscriptionsByUserId(long userId) {
+        try {
+            java.util.Map<String, Object> conditions = new java.util.HashMap<>();
+            conditions.put("userId", userId);
+            if (!org.tonality.repository.Subscription.getInstance().delete(conditions)) {
+                throw new Exception("Failed to delete subscriptions");
+            }
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
 
-@WebService
-public class Subscription {
-    @WebMethod
-    public String test() {
-        return "Hello World!";
+    @Override
+    public boolean deleteSubscriptionsByAlbumId(long albumId) {
+        try {
+            java.util.Map<String, Object> conditions = new java.util.HashMap<>();
+            conditions.put("albumId", albumId);
+            if (!org.tonality.repository.Subscription.getInstance().delete(conditions)) {
+                throw new Exception("Failed to delete subscriptions");
+            }
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
     }
 }