>() {}));
     }
diff --git a/src/main/java/org/gitlab4j/api/LicenseApi.java b/src/main/java/org/gitlab4j/api/LicenseApi.java
index 7b738a717..0134dbf28 100644
--- a/src/main/java/org/gitlab4j/api/LicenseApi.java
+++ b/src/main/java/org/gitlab4j/api/LicenseApi.java
@@ -4,7 +4,7 @@
 import java.util.Optional;
 import java.util.stream.Stream;
 
-import javax.ws.rs.core.Response;
+import jakarta.ws.rs.core.Response;
 
 import org.gitlab4j.api.models.License;
 
diff --git a/src/main/java/org/gitlab4j/api/LicenseTemplatesApi.java b/src/main/java/org/gitlab4j/api/LicenseTemplatesApi.java
index 85438b133..c90574a24 100644
--- a/src/main/java/org/gitlab4j/api/LicenseTemplatesApi.java
+++ b/src/main/java/org/gitlab4j/api/LicenseTemplatesApi.java
@@ -4,7 +4,7 @@
 import java.util.Optional;
 import java.util.stream.Stream;
 
-import javax.ws.rs.core.Response;
+import jakarta.ws.rs.core.Response;
 
 import org.gitlab4j.api.models.LicenseTemplate;
 
diff --git a/src/main/java/org/gitlab4j/api/MarkdownApi.java b/src/main/java/org/gitlab4j/api/MarkdownApi.java
index bdbd4e221..3d45e1a0e 100644
--- a/src/main/java/org/gitlab4j/api/MarkdownApi.java
+++ b/src/main/java/org/gitlab4j/api/MarkdownApi.java
@@ -4,7 +4,7 @@
 import org.gitlab4j.api.models.Markdown;
 import org.gitlab4j.api.models.MarkdownRequest;
 
-import javax.ws.rs.core.Response;
+import jakarta.ws.rs.core.Response;
 
 /**
  * This class provides an entry point to all the GitLab API markdown calls.
diff --git a/src/main/java/org/gitlab4j/api/MergeRequestApi.java b/src/main/java/org/gitlab4j/api/MergeRequestApi.java
index fd3a4c681..12596237e 100644
--- a/src/main/java/org/gitlab4j/api/MergeRequestApi.java
+++ b/src/main/java/org/gitlab4j/api/MergeRequestApi.java
@@ -4,10 +4,10 @@
 import java.util.Optional;
 import java.util.stream.Stream;
 
-import javax.ws.rs.core.Form;
-import javax.ws.rs.core.GenericType;
-import javax.ws.rs.core.MultivaluedMap;
-import javax.ws.rs.core.Response;
+import jakarta.ws.rs.core.Form;
+import jakarta.ws.rs.core.GenericType;
+import jakarta.ws.rs.core.MultivaluedMap;
+import jakarta.ws.rs.core.Response;
 
 import org.gitlab4j.api.GitLabApi.ApiVersion;
 import org.gitlab4j.api.models.AcceptMergeRequestParams;
@@ -804,7 +804,7 @@ public MergeRequest acceptMergeRequest(Object projectIdOrPath, Long mergeRequest
      *
      * NOTE: GitLab API V4 uses IID (internal ID), V3 uses ID to identify the merge request.
      *
-     * GitLab Endpoint: PUT /projects/:id/merge_requests/:merge_request_iid/cancel_merge_when_pipeline_succeeds
+     * GitLab Endpoint: POST /projects/:id/merge_requests/:merge_request_iid/cancel_merge_when_pipeline_succeeds
      *
      * @param projectIdOrPath the project in the form of an Long(ID), String(path), or Project instance
      * @param mergeRequestIid the internal ID of the merge request
@@ -817,7 +817,7 @@ public MergeRequest cancelMergeRequest(Object projectIdOrPath, Long mergeRequest
             throw new RuntimeException("mergeRequestIid cannot be null");
         }
 
-        Response response = put(Response.Status.OK, null, "projects", getProjectIdOrPath(projectIdOrPath), "merge_requests", mergeRequestIid, "cancel_merge_when_pipeline_succeeds");
+        Response response = post(Response.Status.OK, (Form)null, "projects", getProjectIdOrPath(projectIdOrPath), "merge_requests", mergeRequestIid, "cancel_merge_when_pipeline_succeeds");
         return (response.readEntity(MergeRequest.class));
     }
 
diff --git a/src/main/java/org/gitlab4j/api/MilestonesApi.java b/src/main/java/org/gitlab4j/api/MilestonesApi.java
index 8204f204c..bff190121 100644
--- a/src/main/java/org/gitlab4j/api/MilestonesApi.java
+++ b/src/main/java/org/gitlab4j/api/MilestonesApi.java
@@ -4,9 +4,9 @@
 import java.util.List;
 import java.util.stream.Stream;
 
-import javax.ws.rs.core.Form;
-import javax.ws.rs.core.GenericType;
-import javax.ws.rs.core.Response;
+import jakarta.ws.rs.core.Form;
+import jakarta.ws.rs.core.GenericType;
+import jakarta.ws.rs.core.Response;
 
 import org.gitlab4j.api.models.Issue;
 import org.gitlab4j.api.models.MergeRequest;
diff --git a/src/main/java/org/gitlab4j/api/NamespaceApi.java b/src/main/java/org/gitlab4j/api/NamespaceApi.java
index ad6ed2db7..18d584c1c 100644
--- a/src/main/java/org/gitlab4j/api/NamespaceApi.java
+++ b/src/main/java/org/gitlab4j/api/NamespaceApi.java
@@ -3,8 +3,8 @@
 import java.util.List;
 import java.util.stream.Stream;
 
-import javax.ws.rs.core.GenericType;
-import javax.ws.rs.core.Response;
+import jakarta.ws.rs.core.GenericType;
+import jakarta.ws.rs.core.Response;
 
 import org.gitlab4j.api.models.Namespace;
 
diff --git a/src/main/java/org/gitlab4j/api/NotesApi.java b/src/main/java/org/gitlab4j/api/NotesApi.java
index 4b122de67..4b5256cde 100644
--- a/src/main/java/org/gitlab4j/api/NotesApi.java
+++ b/src/main/java/org/gitlab4j/api/NotesApi.java
@@ -4,8 +4,8 @@
 import java.util.List;
 import java.util.stream.Stream;
 
-import javax.ws.rs.core.GenericType;
-import javax.ws.rs.core.Response;
+import jakarta.ws.rs.core.GenericType;
+import jakarta.ws.rs.core.Response;
 
 import org.gitlab4j.api.models.Note;
 
diff --git a/src/main/java/org/gitlab4j/api/NotificationSettingsApi.java b/src/main/java/org/gitlab4j/api/NotificationSettingsApi.java
index 1339daf67..095b3cbcd 100644
--- a/src/main/java/org/gitlab4j/api/NotificationSettingsApi.java
+++ b/src/main/java/org/gitlab4j/api/NotificationSettingsApi.java
@@ -1,6 +1,6 @@
 package org.gitlab4j.api;
 
-import javax.ws.rs.core.Response;
+import jakarta.ws.rs.core.Response;
 
 import org.gitlab4j.api.models.NotificationSettings;
 import org.gitlab4j.api.models.NotificationSettings.Events;
diff --git a/src/main/java/org/gitlab4j/api/PackagesApi.java b/src/main/java/org/gitlab4j/api/PackagesApi.java
index 49f6c2649..9a64ac265 100644
--- a/src/main/java/org/gitlab4j/api/PackagesApi.java
+++ b/src/main/java/org/gitlab4j/api/PackagesApi.java
@@ -26,9 +26,9 @@
 import java.util.List;
 import java.util.stream.Stream;
 
-import javax.ws.rs.core.GenericType;
-import javax.ws.rs.core.MultivaluedMap;
-import javax.ws.rs.core.Response;
+import jakarta.ws.rs.core.GenericType;
+import jakarta.ws.rs.core.MultivaluedMap;
+import jakarta.ws.rs.core.Response;
 
 import org.gitlab4j.api.models.Package;
 import org.gitlab4j.api.models.PackageFile;
diff --git a/src/main/java/org/gitlab4j/api/Pager.java b/src/main/java/org/gitlab4j/api/Pager.java
index 30164de5b..66c1b1ec0 100644
--- a/src/main/java/org/gitlab4j/api/Pager.java
+++ b/src/main/java/org/gitlab4j/api/Pager.java
@@ -9,8 +9,8 @@
 import java.util.stream.Stream;
 import java.util.stream.StreamSupport;
 
-import javax.ws.rs.core.MultivaluedMap;
-import javax.ws.rs.core.Response;
+import jakarta.ws.rs.core.MultivaluedMap;
+import jakarta.ws.rs.core.Response;
 
 import org.gitlab4j.api.utils.JacksonJson;
 
diff --git a/src/main/java/org/gitlab4j/api/PipelineApi.java b/src/main/java/org/gitlab4j/api/PipelineApi.java
index 15e2019dd..cf6a29668 100644
--- a/src/main/java/org/gitlab4j/api/PipelineApi.java
+++ b/src/main/java/org/gitlab4j/api/PipelineApi.java
@@ -5,9 +5,9 @@
 import java.util.Optional;
 import java.util.stream.Stream;
 
-import javax.ws.rs.core.Form;
-import javax.ws.rs.core.GenericType;
-import javax.ws.rs.core.Response;
+import jakarta.ws.rs.core.Form;
+import jakarta.ws.rs.core.GenericType;
+import jakarta.ws.rs.core.Response;
 
 import org.gitlab4j.api.models.Pipeline;
 import org.gitlab4j.api.models.PipelineFilter;
diff --git a/src/main/java/org/gitlab4j/api/ProjectApi.java b/src/main/java/org/gitlab4j/api/ProjectApi.java
index 848f6bdca..3dff0e76f 100644
--- a/src/main/java/org/gitlab4j/api/ProjectApi.java
+++ b/src/main/java/org/gitlab4j/api/ProjectApi.java
@@ -33,10 +33,10 @@
 import java.util.Objects;
 import java.util.Optional;
 import java.util.stream.Stream;
-import javax.ws.rs.core.Form;
-import javax.ws.rs.core.GenericType;
-import javax.ws.rs.core.MultivaluedMap;
-import javax.ws.rs.core.Response;
+import jakarta.ws.rs.core.Form;
+import jakarta.ws.rs.core.GenericType;
+import jakarta.ws.rs.core.MultivaluedMap;
+import jakarta.ws.rs.core.Response;
 import org.gitlab4j.api.GitLabApi.ApiVersion;
 import org.gitlab4j.api.models.AccessLevel;
 import org.gitlab4j.api.models.AccessRequest;
diff --git a/src/main/java/org/gitlab4j/api/ProtectedBranchesApi.java b/src/main/java/org/gitlab4j/api/ProtectedBranchesApi.java
index c018ff7a6..9336fc223 100644
--- a/src/main/java/org/gitlab4j/api/ProtectedBranchesApi.java
+++ b/src/main/java/org/gitlab4j/api/ProtectedBranchesApi.java
@@ -4,8 +4,8 @@
 import java.util.Optional;
 import java.util.stream.Stream;
 
-import javax.ws.rs.core.Form;
-import javax.ws.rs.core.Response;
+import jakarta.ws.rs.core.Form;
+import jakarta.ws.rs.core.Response;
 
 import org.gitlab4j.api.models.AccessLevel;
 import org.gitlab4j.api.models.AllowedTo;
diff --git a/src/main/java/org/gitlab4j/api/ReleaseLinksApi.java b/src/main/java/org/gitlab4j/api/ReleaseLinksApi.java
new file mode 100644
index 000000000..c221bb69a
--- /dev/null
+++ b/src/main/java/org/gitlab4j/api/ReleaseLinksApi.java
@@ -0,0 +1,170 @@
+package org.gitlab4j.api;
+
+import org.gitlab4j.api.models.Link;
+import org.gitlab4j.api.models.ReleaseLinkParams;
+
+import jakarta.ws.rs.core.Response;
+import java.util.List;
+import java.util.Optional;
+import java.util.stream.Stream;
+
+
+/**
+ * This class provides an entry point to all the GitLab ReleaseLinks API calls.
+ * @see ReleaseLinks API at GitLab
+ */
+public class ReleaseLinksApi extends AbstractApi {
+
+    public ReleaseLinksApi(GitLabApi gitLabApi) {
+        super(gitLabApi);
+    }
+
+    /**
+     * Get assets as Links from a Release.
+     *
+     * GitLab Endpoint: GET /projects/:id/releases/:tagName/assets/links
+     *
+     * @param projectIdOrPath id, path of the project, or a Project instance holding the project ID or path
+     * @param tagName the tag name that the release was created from
+     * @return the list of assets for the specified release
+     * @throws GitLabApiException if any exception occurs
+     */
+    public List getLinks(Object projectIdOrPath, String tagName) throws GitLabApiException {
+        return (getLinks(projectIdOrPath, tagName, getDefaultPerPage()).all());
+    }
+
+    /**
+     * Get assets as Links from a Release.
+     *
+     * GitLab Endpoint: GET /projects/:id/releases/:tagName/assets/links
+     *
+     * @param projectIdOrPath id, path of the project, or a Project instance holding the project ID or path
+     * @param tagName the tag name that the release was created from
+     * @param itemsPerPage the number of Link instances that will be fetched per page
+     * @return the Pager of Link instances for the specified project ID
+     * @throws GitLabApiException if any exception occurs
+     */
+    public Pager getLinks(Object projectIdOrPath, String tagName, int itemsPerPage) throws GitLabApiException {
+        return (new Pager(this, Link.class, itemsPerPage, null, "projects", getProjectIdOrPath(projectIdOrPath), "releases", urlEncode(tagName), "assets", "links"));
+    }
+
+    /**
+     * Get a Stream of assets as Links from a Release.
+     *
+     * GitLab Endpoint: GET /projects/:id/releases/:tagName/assets/links
+     *
+     * @param projectIdOrPath id, path of the project, or a Project instance holding the project ID or path
+     * @param tagName the tag name that the release was created from
+     * @return a Stream of Link instances for the specified project ID
+     * @throws GitLabApiException if any exception occurs
+     */
+    public Stream getLinksStream(Object projectIdOrPath, String tagName) throws GitLabApiException {
+        return (getLinks(projectIdOrPath, tagName, getDefaultPerPage()).stream());
+    }
+
+    /**
+     * Get a Link for the given tag name and link id.
+     *
+     * GitLab Endpoint: GET /projects/:id/releases/:tagName/assets/links/:linkId
+     *
+     * @param projectIdOrPath id, path of the project, or a Project instance holding the project ID or path
+     * @param tagName the name of the tag to fetch the Link for
+     * @param linkId the id of the Link to fetch for
+     * @return a Link instance with info on the specified tag and id
+     * @throws GitLabApiException if any exception occurs
+     */
+    public Link getLink(Object projectIdOrPath, String tagName, Integer linkId) throws GitLabApiException {
+        Response response = get(Response.Status.OK, null, "projects", getProjectIdOrPath(projectIdOrPath), "releases", urlEncode(tagName), "assets", "links", linkId);
+        return (response.readEntity(Link.class));
+    }
+
+    /**
+     * Get an Optional instance holding a Link instance for the specific tag name and link id.
+     *
+     * GitLab Endpoint: GET /projects/:id/releases/:tagName/assets/links/:linkId
+     *
+     * @param projectIdOrPath id, path of the project, or a Project instance holding the project ID or path
+     * @param tagName the name of the tag to fetch the Link for
+     * @param linkId the id of the Link to fetch for
+     * @return an Optional instance with the specified Link as the value
+     * @throws GitLabApiException if any exception occurs
+     */
+    public Optional getOptionalLink(Object projectIdOrPath, String tagName, Integer linkId) throws GitLabApiException {
+        try {
+            return (Optional.ofNullable(getLink(projectIdOrPath, tagName, linkId)));
+        } catch (GitLabApiException glae) {
+            return (GitLabApi.createOptionalFromException(glae));
+        }
+    }
+
+    /**
+     * Create a Link. You need push access to the repository to create a Link.
+     *
+     * GitLab Endpoint: POST /projects/:id/releases/:tagName/assets/links
+     *
+     * @param projectIdOrPath id, path of the project, or a Project instance holding the project ID or path
+     * @param params a ReleaseLinksParams instance holding the parameters for the link
+     * @return a Link instance containing the newly created Link info
+     * @throws GitLabApiException if any exception occurs
+     */
+    public Link createLink(Object projectIdOrPath, ReleaseLinkParams params) throws GitLabApiException {
+        String tagName = params.getTagName();
+        if (tagName == null || tagName.trim().isEmpty()) {
+            throw new RuntimeException("params.tagName cannot be null or empty");
+        }
+
+        String name = params.getName();
+        if (name == null || name.trim().isEmpty()) {
+            throw new RuntimeException("params.name cannot be null or empty");
+        }
+
+        String url = params.getUrl();
+        if (url == null || url.trim().isEmpty()) {
+            throw new RuntimeException("params.url cannot be null or empty");
+        }
+
+        Response response = post(Response.Status.CREATED, params,
+            "projects", getProjectIdOrPath(projectIdOrPath), "releases", urlEncode(tagName), "assets", "links");
+        return (response.readEntity(Link.class));
+    }
+
+    /**
+     * Updates the attributes of a given Link.
+     *
+     * GitLab Endpoint: PUT /projects/:id/releases/:tagName/assets/links/:linkId
+     *
+     * @param projectIdOrPath id, path of the project, or a Project instance holding the project ID or path
+     * @param linkId          the id of the Link to fetch for
+     * @param params          a ReleaseLinksParams instance holding the parameters for the Link
+     * @return a Link instance containing info on the updated Link
+     * @throws GitLabApiException if any exception occurs
+     */
+    public Link updateLink(Object projectIdOrPath, Integer linkId, ReleaseLinkParams params) throws GitLabApiException {
+        String tagName = params.getTagName();
+        if (tagName == null || tagName.trim().isEmpty()) {
+            throw new RuntimeException("params.tagName cannot be null or empty");
+        }
+
+        if (linkId == null) {
+            throw new RuntimeException("linkId cannot be null");
+        }
+
+        Response response = put(Response.Status.OK, params,
+            "projects", getProjectIdOrPath(projectIdOrPath), "releases", urlEncode(tagName), "assets", "links", linkId);
+        return (response.readEntity(Link.class));
+    }
+
+    /**
+     * Delete a Link.
+     *
+     * GitLab Endpoint: DELETE /projects/:id/releases/:tagName/assets/links/:linkId
+     *
+     * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance
+     * @param tagName         the tag name that the link was created from
+     * @param linkId          the id of the Link to delete
+     * @throws GitLabApiException if any exception occurs
+     */
+    public void deleteLink(Object projectIdOrPath, String tagName, Integer linkId) throws GitLabApiException {
+        delete(Response.Status.OK, null, "projects", getProjectIdOrPath(projectIdOrPath), "releases", urlEncode(tagName), "assets", "links", linkId);
+    }
+}
diff --git a/src/main/java/org/gitlab4j/api/ReleasesApi.java b/src/main/java/org/gitlab4j/api/ReleasesApi.java
index 44b06cd9a..b3ccd1db1 100644
--- a/src/main/java/org/gitlab4j/api/ReleasesApi.java
+++ b/src/main/java/org/gitlab4j/api/ReleasesApi.java
@@ -4,7 +4,7 @@
 import java.util.Optional;
 import java.util.stream.Stream;
 
-import javax.ws.rs.core.Response;
+import jakarta.ws.rs.core.Response;
 
 import org.gitlab4j.api.models.Release;
 import org.gitlab4j.api.models.ReleaseParams;
diff --git a/src/main/java/org/gitlab4j/api/RepositoryApi.java b/src/main/java/org/gitlab4j/api/RepositoryApi.java
index e2aa3d3ed..65d037798 100644
--- a/src/main/java/org/gitlab4j/api/RepositoryApi.java
+++ b/src/main/java/org/gitlab4j/api/RepositoryApi.java
@@ -10,11 +10,11 @@
 import java.util.Optional;
 import java.util.stream.Stream;
 
-import javax.ws.rs.core.Form;
-import javax.ws.rs.core.GenericType;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.MultivaluedMap;
-import javax.ws.rs.core.Response;
+import jakarta.ws.rs.core.Form;
+import jakarta.ws.rs.core.GenericType;
+import jakarta.ws.rs.core.MediaType;
+import jakarta.ws.rs.core.MultivaluedMap;
+import jakarta.ws.rs.core.Response;
 
 import org.gitlab4j.api.GitLabApi.ApiVersion;
 import org.gitlab4j.api.models.Branch;
diff --git a/src/main/java/org/gitlab4j/api/RepositoryFileApi.java b/src/main/java/org/gitlab4j/api/RepositoryFileApi.java
index fdb117672..f6fc35756 100644
--- a/src/main/java/org/gitlab4j/api/RepositoryFileApi.java
+++ b/src/main/java/org/gitlab4j/api/RepositoryFileApi.java
@@ -9,9 +9,9 @@
 import java.util.Optional;
 import java.util.stream.Stream;
 
-import javax.ws.rs.core.Form;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
+import jakarta.ws.rs.core.Form;
+import jakarta.ws.rs.core.MediaType;
+import jakarta.ws.rs.core.Response;
 
 import org.gitlab4j.api.GitLabApi.ApiVersion;
 import org.gitlab4j.api.models.Blame;
diff --git a/src/main/java/org/gitlab4j/api/ResourceLabelEventsApi.java b/src/main/java/org/gitlab4j/api/ResourceLabelEventsApi.java
index 469c0baa3..adc678b43 100644
--- a/src/main/java/org/gitlab4j/api/ResourceLabelEventsApi.java
+++ b/src/main/java/org/gitlab4j/api/ResourceLabelEventsApi.java
@@ -4,7 +4,7 @@
 import java.util.Optional;
 import java.util.stream.Stream;
 
-import javax.ws.rs.core.Response;
+import jakarta.ws.rs.core.Response;
 
 import org.gitlab4j.api.models.LabelEvent;
 
diff --git a/src/main/java/org/gitlab4j/api/RunnersApi.java b/src/main/java/org/gitlab4j/api/RunnersApi.java
index 0f0903d0a..c90f08e22 100644
--- a/src/main/java/org/gitlab4j/api/RunnersApi.java
+++ b/src/main/java/org/gitlab4j/api/RunnersApi.java
@@ -3,8 +3,8 @@
 import java.util.List;
 import java.util.stream.Stream;
 
-import javax.ws.rs.core.GenericType;
-import javax.ws.rs.core.Response;
+import jakarta.ws.rs.core.GenericType;
+import jakarta.ws.rs.core.Response;
 
 import org.gitlab4j.api.models.Job;
 import org.gitlab4j.api.models.JobStatus;
diff --git a/src/main/java/org/gitlab4j/api/ServicesApi.java b/src/main/java/org/gitlab4j/api/ServicesApi.java
index 490a7b34e..4ddbe6341 100644
--- a/src/main/java/org/gitlab4j/api/ServicesApi.java
+++ b/src/main/java/org/gitlab4j/api/ServicesApi.java
@@ -10,8 +10,8 @@
 import org.gitlab4j.api.services.MattermostService;
 import org.gitlab4j.api.services.SlackService;
 
-import javax.ws.rs.core.Form;
-import javax.ws.rs.core.Response;
+import jakarta.ws.rs.core.Form;
+import jakarta.ws.rs.core.Response;
 
 /**
  * Access for the services API.  Currently only the gitlab-ci, HipChatService, Slack, and JIRA service are supported.
diff --git a/src/main/java/org/gitlab4j/api/SnippetsApi.java b/src/main/java/org/gitlab4j/api/SnippetsApi.java
index 706e68677..86eb0c06d 100644
--- a/src/main/java/org/gitlab4j/api/SnippetsApi.java
+++ b/src/main/java/org/gitlab4j/api/SnippetsApi.java
@@ -4,8 +4,8 @@
 import java.util.Optional;
 import java.util.stream.Stream;
 
-import javax.ws.rs.core.GenericType;
-import javax.ws.rs.core.Response;
+import jakarta.ws.rs.core.GenericType;
+import jakarta.ws.rs.core.Response;
 
 import org.gitlab4j.api.models.Snippet;
 import org.gitlab4j.api.models.Visibility;
diff --git a/src/main/java/org/gitlab4j/api/SystemHooksApi.java b/src/main/java/org/gitlab4j/api/SystemHooksApi.java
index b6f41f9dd..da3e95675 100644
--- a/src/main/java/org/gitlab4j/api/SystemHooksApi.java
+++ b/src/main/java/org/gitlab4j/api/SystemHooksApi.java
@@ -3,8 +3,8 @@
 import java.util.List;
 import java.util.stream.Stream;
 
-import javax.ws.rs.core.GenericType;
-import javax.ws.rs.core.Response;
+import jakarta.ws.rs.core.GenericType;
+import jakarta.ws.rs.core.Response;
 
 import org.gitlab4j.api.GitLabApi.ApiVersion;
 import org.gitlab4j.api.models.SystemHook;
diff --git a/src/main/java/org/gitlab4j/api/TagsApi.java b/src/main/java/org/gitlab4j/api/TagsApi.java
index 1d0ef611f..fa2799cb3 100644
--- a/src/main/java/org/gitlab4j/api/TagsApi.java
+++ b/src/main/java/org/gitlab4j/api/TagsApi.java
@@ -6,9 +6,9 @@
 import java.util.Optional;
 import java.util.stream.Stream;
 
-import javax.ws.rs.core.Form;
-import javax.ws.rs.core.GenericType;
-import javax.ws.rs.core.Response;
+import jakarta.ws.rs.core.Form;
+import jakarta.ws.rs.core.GenericType;
+import jakarta.ws.rs.core.Response;
 
 import org.gitlab4j.api.GitLabApi.ApiVersion;
 import org.gitlab4j.api.models.AccessLevel;
diff --git a/src/main/java/org/gitlab4j/api/TodosApi.java b/src/main/java/org/gitlab4j/api/TodosApi.java
index 204b66cc8..3a9dadd7e 100644
--- a/src/main/java/org/gitlab4j/api/TodosApi.java
+++ b/src/main/java/org/gitlab4j/api/TodosApi.java
@@ -3,7 +3,7 @@
 import java.util.List;
 import java.util.stream.Stream;
 
-import javax.ws.rs.core.Response;
+import jakarta.ws.rs.core.Response;
 
 import org.gitlab4j.api.models.Todo;
 
diff --git a/src/main/java/org/gitlab4j/api/UserApi.java b/src/main/java/org/gitlab4j/api/UserApi.java
index ce52527c8..10d2e52ea 100644
--- a/src/main/java/org/gitlab4j/api/UserApi.java
+++ b/src/main/java/org/gitlab4j/api/UserApi.java
@@ -7,9 +7,9 @@
 import java.util.Optional;
 import java.util.stream.Stream;
 
-import javax.ws.rs.core.Form;
-import javax.ws.rs.core.GenericType;
-import javax.ws.rs.core.Response;
+import jakarta.ws.rs.core.Form;
+import jakarta.ws.rs.core.GenericType;
+import jakarta.ws.rs.core.Response;
 
 import org.gitlab4j.api.GitLabApi.ApiVersion;
 import org.gitlab4j.api.models.CustomAttribute;
diff --git a/src/main/java/org/gitlab4j/api/WikisApi.java b/src/main/java/org/gitlab4j/api/WikisApi.java
index df2309352..22b5b8d74 100644
--- a/src/main/java/org/gitlab4j/api/WikisApi.java
+++ b/src/main/java/org/gitlab4j/api/WikisApi.java
@@ -30,8 +30,8 @@
 import java.util.Optional;
 import java.util.stream.Stream;
 
-import javax.ws.rs.core.GenericType;
-import javax.ws.rs.core.Response;
+import jakarta.ws.rs.core.GenericType;
+import jakarta.ws.rs.core.Response;
 
 import org.gitlab4j.api.models.WikiAttachment;
 import org.gitlab4j.api.models.WikiPage;
diff --git a/src/main/java/org/gitlab4j/api/models/Job.java b/src/main/java/org/gitlab4j/api/models/Job.java
index ecaee41c9..c22759de0 100644
--- a/src/main/java/org/gitlab4j/api/models/Job.java
+++ b/src/main/java/org/gitlab4j/api/models/Job.java
@@ -29,6 +29,7 @@ public class Job {
     private Boolean manual;
     private Boolean allowFailure;
     private Float duration;
+    private Float queuedDuration;
     private Project project;
 
     public Long getId() {
@@ -206,11 +207,18 @@ public Float getDuration() {
     public void setDuration(Float duration) {
         this.duration = duration;
     }
-    
+
+    public Float getQueuedDuration() {
+        return queuedDuration;
+    }
+
+    public void setQueuedDuration(Float queuedDuration) {
+        this.queuedDuration = queuedDuration;
+    }
+
     public Project getProject() {
         return project;
     }
-    
     public void setProject(Project project) {
         this.project = project;
     }
@@ -304,12 +312,16 @@ public Job withAllowFailure(Boolean allowFailure) {
         this.allowFailure = allowFailure;
         return this;
     }
-    
     public Job withDuration(Float duration) {
         this.duration = duration;
         return this;
     }
-    
+
+    public Job withQueuedDuration(Float queuedDuration) {
+        this.queuedDuration = queuedDuration;
+        return this;
+    }
+
     public Job withProject(Project project) {
         this.project = project;
         return this;
diff --git a/src/main/java/org/gitlab4j/api/models/Link.java b/src/main/java/org/gitlab4j/api/models/Link.java
new file mode 100644
index 000000000..f222a8cee
--- /dev/null
+++ b/src/main/java/org/gitlab4j/api/models/Link.java
@@ -0,0 +1,72 @@
+package org.gitlab4j.api.models;
+
+import org.gitlab4j.api.utils.JacksonJson;
+
+import java.util.Date;
+import java.util.List;
+
+public class Link {
+
+    private Integer id;
+    private String name;
+    private String url;
+    /**
+     * @deprecated deprecated in GitLab 15.9, will be removed in GitLab 16.0.
+     */
+    @Deprecated
+    private Boolean external;
+    private String linkType;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+
+    /**
+     * @deprecated deprecated in GitLab 15.9, will be removed in GitLab 16.0.
+     */
+    @Deprecated
+    public Boolean getExternal() {
+        return external;
+    }
+
+    /**
+     * @deprecated deprecated in GitLab 15.9, will be removed in GitLab 16.0.
+     */
+    @Deprecated
+    public void setExternal(Boolean external) {
+        this.external = external;
+    }
+
+    public String getLinkType() {
+        return linkType;
+    }
+
+    public void setLinkType(String linkType) {
+        this.linkType = linkType;
+    }
+
+    @Override
+    public String toString() {
+        return (JacksonJson.toJsonString(this));
+    }
+}
diff --git a/src/main/java/org/gitlab4j/api/models/Pipeline.java b/src/main/java/org/gitlab4j/api/models/Pipeline.java
index f3789323e..75ec03edb 100644
--- a/src/main/java/org/gitlab4j/api/models/Pipeline.java
+++ b/src/main/java/org/gitlab4j/api/models/Pipeline.java
@@ -22,6 +22,7 @@ public class Pipeline {
     private Date committedAt;
     private String coverage;
     private Integer duration;
+    private Float queuedDuration;
     private String webUrl;
     private DetailedStatus detailedStatus;
 
@@ -225,6 +226,14 @@ public void setDuration(Integer duration) {
         this.duration = duration;
     }
 
+    public Float getQueuedDuration() {
+        return queuedDuration;
+    }
+
+    public void setQueuedDuration(Float queuedDuration) {
+        this.queuedDuration = queuedDuration;
+    }
+
     public String getWebUrl() {
         return webUrl;
     }
diff --git a/src/main/java/org/gitlab4j/api/models/ReleaseLinkParams.java b/src/main/java/org/gitlab4j/api/models/ReleaseLinkParams.java
new file mode 100644
index 000000000..0689dbe5b
--- /dev/null
+++ b/src/main/java/org/gitlab4j/api/models/ReleaseLinkParams.java
@@ -0,0 +1,85 @@
+package org.gitlab4j.api.models;
+
+import org.gitlab4j.api.utils.JacksonJson;
+
+import java.util.Date;
+import java.util.List;
+
+public class ReleaseLinkParams {
+
+    private String name;
+    private String tagName;
+    private String url;
+    private String filepath;
+    private String linkType;
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public ReleaseLinkParams withName(String name) {
+        this.name = name;
+        return (this);
+    }
+
+    public String getTagName() {
+        return tagName;
+    }
+
+    public void setTagName(String tagName) {
+        this.tagName = tagName;
+    }
+
+    public ReleaseLinkParams withTagName(String tagName) {
+        this.tagName = tagName;
+        return (this);
+    }
+
+    public String getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+
+    public ReleaseLinkParams withUrl(String url) {
+        this.url = url;
+        return (this);
+    }
+
+    public String getFilepath() {
+        return filepath;
+    }
+
+    public void setFilepath(String filepath) {
+        this.filepath = filepath;
+    }
+
+    public ReleaseLinkParams withFilepath(String filepath) {
+        this.filepath = filepath;
+        return (this);
+    }
+
+    public String getLinkType() {
+        return linkType;
+    }
+
+    public void setLinkType(String linkType) {
+        this.linkType = linkType;
+    }
+
+    public ReleaseLinkParams withLinkType(String linkType) {
+        this.linkType = linkType;
+        return (this);
+    }
+
+    @Override
+    public String toString() {
+        return (JacksonJson.toJsonString(this));
+    }
+}
diff --git a/src/main/java/org/gitlab4j/api/systemhooks/SystemHookManager.java b/src/main/java/org/gitlab4j/api/systemhooks/SystemHookManager.java
index 680eaadfb..84e7f9fcf 100644
--- a/src/main/java/org/gitlab4j/api/systemhooks/SystemHookManager.java
+++ b/src/main/java/org/gitlab4j/api/systemhooks/SystemHookManager.java
@@ -7,7 +7,7 @@
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
-import javax.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletRequest;
 
 import org.gitlab4j.api.GitLabApiException;
 import org.gitlab4j.api.HookManager;
diff --git a/src/main/java/org/gitlab4j/api/utils/FileUtils.java b/src/main/java/org/gitlab4j/api/utils/FileUtils.java
index 1316f72c4..9d54f8605 100644
--- a/src/main/java/org/gitlab4j/api/utils/FileUtils.java
+++ b/src/main/java/org/gitlab4j/api/utils/FileUtils.java
@@ -8,7 +8,7 @@
 import java.util.Base64;
 import java.util.Scanner;
 
-import javax.ws.rs.core.Response;
+import jakarta.ws.rs.core.Response;
 
 import org.gitlab4j.api.Constants.Encoding;
 
diff --git a/src/main/java/org/gitlab4j/api/utils/HttpRequestUtils.java b/src/main/java/org/gitlab4j/api/utils/HttpRequestUtils.java
index acf9365a0..f6a70aa14 100644
--- a/src/main/java/org/gitlab4j/api/utils/HttpRequestUtils.java
+++ b/src/main/java/org/gitlab4j/api/utils/HttpRequestUtils.java
@@ -5,8 +5,8 @@
 import java.io.Reader;
 import java.util.Enumeration;
 
-import javax.servlet.http.Cookie;
-import javax.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.Cookie;
+import jakarta.servlet.http.HttpServletRequest;
 
 public class HttpRequestUtils {
 
diff --git a/src/main/java/org/gitlab4j/api/utils/JacksonJson.java b/src/main/java/org/gitlab4j/api/utils/JacksonJson.java
index 264824af4..e30463bb7 100644
--- a/src/main/java/org/gitlab4j/api/utils/JacksonJson.java
+++ b/src/main/java/org/gitlab4j/api/utils/JacksonJson.java
@@ -11,9 +11,9 @@
 import java.util.Map;
 import java.util.TimeZone;
 
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.ext.ContextResolver;
+import jakarta.ws.rs.Produces;
+import jakarta.ws.rs.core.MediaType;
+import jakarta.ws.rs.ext.ContextResolver;
 
 import org.gitlab4j.api.models.User;
 import org.glassfish.jersey.jackson.internal.jackson.jaxrs.json.JacksonJaxbJsonProvider;
diff --git a/src/main/java/org/gitlab4j/api/utils/MaskingLoggingFilter.java b/src/main/java/org/gitlab4j/api/utils/MaskingLoggingFilter.java
index b6c067b4b..3f25b12c6 100644
--- a/src/main/java/org/gitlab4j/api/utils/MaskingLoggingFilter.java
+++ b/src/main/java/org/gitlab4j/api/utils/MaskingLoggingFilter.java
@@ -19,16 +19,16 @@
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
-import javax.annotation.Priority;
-import javax.ws.rs.WebApplicationException;
-import javax.ws.rs.client.ClientRequestContext;
-import javax.ws.rs.client.ClientRequestFilter;
-import javax.ws.rs.client.ClientResponseContext;
-import javax.ws.rs.client.ClientResponseFilter;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.MultivaluedMap;
-import javax.ws.rs.ext.WriterInterceptor;
-import javax.ws.rs.ext.WriterInterceptorContext;
+import jakarta.annotation.Priority;
+import jakarta.ws.rs.WebApplicationException;
+import jakarta.ws.rs.client.ClientRequestContext;
+import jakarta.ws.rs.client.ClientRequestFilter;
+import jakarta.ws.rs.client.ClientResponseContext;
+import jakarta.ws.rs.client.ClientResponseFilter;
+import jakarta.ws.rs.core.MediaType;
+import jakarta.ws.rs.core.MultivaluedMap;
+import jakarta.ws.rs.ext.WriterInterceptor;
+import jakarta.ws.rs.ext.WriterInterceptorContext;
 
 import org.glassfish.jersey.message.MessageUtils;
 
diff --git a/src/main/java/org/gitlab4j/api/utils/Oauth2LoginStreamingOutput.java b/src/main/java/org/gitlab4j/api/utils/Oauth2LoginStreamingOutput.java
index 7472983ce..3e4b2bf55 100644
--- a/src/main/java/org/gitlab4j/api/utils/Oauth2LoginStreamingOutput.java
+++ b/src/main/java/org/gitlab4j/api/utils/Oauth2LoginStreamingOutput.java
@@ -7,8 +7,8 @@
 import java.io.Writer;
 import java.nio.charset.StandardCharsets;
 
-import javax.ws.rs.WebApplicationException;
-import javax.ws.rs.core.StreamingOutput;
+import jakarta.ws.rs.WebApplicationException;
+import jakarta.ws.rs.core.StreamingOutput;
 
 /**
  * This StreamingOutput implementation is utilized to send a OAuth2 token request
diff --git a/src/main/java/org/gitlab4j/api/webhook/EventMergeRequest.java b/src/main/java/org/gitlab4j/api/webhook/EventMergeRequest.java
index 7a5eefd42..970df4ef1 100644
--- a/src/main/java/org/gitlab4j/api/webhook/EventMergeRequest.java
+++ b/src/main/java/org/gitlab4j/api/webhook/EventMergeRequest.java
@@ -19,6 +19,7 @@ public class EventMergeRequest {
     private Long iid;
     private String mergeCommitSha;
     private String mergeStatus;
+    private String detailedMergeStatus;
     private Long milestoneId;
     private Integer position;
     private Date lockedAt;
@@ -36,8 +37,11 @@ public class EventMergeRequest {
     private EventProject source;
     private EventProject target;
     private EventCommit lastCommit;
+    private Boolean blockingDiscussionsResolved;
     private Boolean workInProgress;
+    private Boolean firstContribution;
     private String url;
+    private List labels;
     private String action;
     private Assignee assignee;
 
@@ -134,6 +138,14 @@ public void setMergeStatus(String mergeStatus) {
         this.mergeStatus = mergeStatus;
     }
 
+    public String getDetailedMergeStatus() {
+        return detailedMergeStatus;
+    }
+
+    public void setDetailedMergeStatus(String detailedMergeStatus) {
+        this.detailedMergeStatus = detailedMergeStatus;
+    }
+
     public Long getMilestoneId() {
         return this.milestoneId;
     }
@@ -262,6 +274,14 @@ public void setLastCommit(EventCommit lastCommit) {
         this.lastCommit = lastCommit;
     }
 
+    public Boolean getBlockingDiscussionsResolved() {
+        return blockingDiscussionsResolved;
+    }
+
+    public void setBlockingDiscussionsResolved(Boolean blockingDiscussionsResolved) {
+        this.blockingDiscussionsResolved = blockingDiscussionsResolved;
+    }
+
     public Boolean getWorkInProgress() {
         return workInProgress;
     }
@@ -270,6 +290,14 @@ public void setWorkInProgress(Boolean workInProgress) {
         this.workInProgress = workInProgress;
     }
 
+    public Boolean getFirstContribution() {
+        return firstContribution;
+    }
+
+    public void setFirstContribution(Boolean firstContribution) {
+        this.firstContribution = firstContribution;
+    }
+
     public String getUrl() {
         return url;
     }
@@ -278,6 +306,14 @@ public void setUrl(String url) {
         this.url = url;
     }
 
+    public List getLabels() {
+        return labels;
+    }
+
+    public void setLabels(List labels) {
+        this.labels = labels;
+    }
+
     public String getAction() {
         return action;
     }
diff --git a/src/main/java/org/gitlab4j/api/webhook/PipelineEvent.java b/src/main/java/org/gitlab4j/api/webhook/PipelineEvent.java
index b70432dc5..1e819100e 100644
--- a/src/main/java/org/gitlab4j/api/webhook/PipelineEvent.java
+++ b/src/main/java/org/gitlab4j/api/webhook/PipelineEvent.java
@@ -81,6 +81,7 @@ public static class ObjectAttributes {
         private Date createdAt;
         private Date finishedAt;
         private Integer duration;
+        private Float queuedDuration;
         private List variables;
 
         public Long getId() {
@@ -171,6 +172,14 @@ public void setDuration(Integer duration) {
             this.duration = duration;
         }
 
+        public Float getQueuedDuration() {
+            return queuedDuration;
+        }
+
+        public void setQueuedDuration(Float queuedDuration) {
+            this.queuedDuration = queuedDuration;
+        }
+
         public List getVariables() {
             return variables;
         }
diff --git a/src/main/java/org/gitlab4j/api/webhook/WebHookManager.java b/src/main/java/org/gitlab4j/api/webhook/WebHookManager.java
index 000f95fc4..2324ddf97 100644
--- a/src/main/java/org/gitlab4j/api/webhook/WebHookManager.java
+++ b/src/main/java/org/gitlab4j/api/webhook/WebHookManager.java
@@ -7,7 +7,7 @@
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
-import javax.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletRequest;
 
 import org.gitlab4j.api.GitLabApiException;
 import org.gitlab4j.api.HookManager;
diff --git a/src/test/java/org/gitlab4j/api/MockResponse.java b/src/test/java/org/gitlab4j/api/MockResponse.java
index 35cf3477b..1d162a785 100644
--- a/src/test/java/org/gitlab4j/api/MockResponse.java
+++ b/src/test/java/org/gitlab4j/api/MockResponse.java
@@ -9,14 +9,14 @@
 import java.util.Map;
 import java.util.Set;
 
-import javax.ws.rs.core.EntityTag;
-import javax.ws.rs.core.GenericType;
-import javax.ws.rs.core.Link;
-import javax.ws.rs.core.Link.Builder;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.MultivaluedMap;
-import javax.ws.rs.core.NewCookie;
-import javax.ws.rs.core.Response;
+import jakarta.ws.rs.core.EntityTag;
+import jakarta.ws.rs.core.GenericType;
+import jakarta.ws.rs.core.Link;
+import jakarta.ws.rs.core.Link.Builder;
+import jakarta.ws.rs.core.MediaType;
+import jakarta.ws.rs.core.MultivaluedMap;
+import jakarta.ws.rs.core.NewCookie;
+import jakarta.ws.rs.core.Response;
 
 /**
  * This class can be used as a concrete mock to test the individual APIs
diff --git a/src/test/java/org/gitlab4j/api/MockServletInputStream.java b/src/test/java/org/gitlab4j/api/MockServletInputStream.java
index 0a8e597f7..9e2c2c4d4 100644
--- a/src/test/java/org/gitlab4j/api/MockServletInputStream.java
+++ b/src/test/java/org/gitlab4j/api/MockServletInputStream.java
@@ -2,8 +2,8 @@
 
 import java.io.IOException;
 
-import javax.servlet.ReadListener;
-import javax.servlet.ServletInputStream;
+import jakarta.servlet.ReadListener;
+import jakarta.servlet.ServletInputStream;
 
 public class MockServletInputStream extends ServletInputStream {
 
diff --git a/src/test/java/org/gitlab4j/api/TestCommitDiscussionsApi.java b/src/test/java/org/gitlab4j/api/TestCommitDiscussionsApi.java
index e46315186..e6c083aca 100644
--- a/src/test/java/org/gitlab4j/api/TestCommitDiscussionsApi.java
+++ b/src/test/java/org/gitlab4j/api/TestCommitDiscussionsApi.java
@@ -11,7 +11,7 @@
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
-import javax.ws.rs.core.MultivaluedMap;
+import jakarta.ws.rs.core.MultivaluedMap;
 
 import org.gitlab4j.api.models.Discussion;
 import org.junit.jupiter.api.BeforeEach;
diff --git a/src/test/java/org/gitlab4j/api/TestCommitsApi.java b/src/test/java/org/gitlab4j/api/TestCommitsApi.java
index 0b1fc5624..d03d5c74b 100644
--- a/src/test/java/org/gitlab4j/api/TestCommitsApi.java
+++ b/src/test/java/org/gitlab4j/api/TestCommitsApi.java
@@ -15,7 +15,7 @@
 import java.util.Optional;
 import java.util.stream.Stream;
 
-import javax.ws.rs.core.Response;
+import jakarta.ws.rs.core.Response;
 
 import org.gitlab4j.api.models.Branch;
 import org.gitlab4j.api.models.Comment;
diff --git a/src/test/java/org/gitlab4j/api/TestEpicDiscussionsApi.java b/src/test/java/org/gitlab4j/api/TestEpicDiscussionsApi.java
index f8127ead0..47f9d5312 100644
--- a/src/test/java/org/gitlab4j/api/TestEpicDiscussionsApi.java
+++ b/src/test/java/org/gitlab4j/api/TestEpicDiscussionsApi.java
@@ -11,7 +11,7 @@
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
-import javax.ws.rs.core.MultivaluedMap;
+import jakarta.ws.rs.core.MultivaluedMap;
 
 import org.gitlab4j.api.models.Discussion;
 import org.junit.jupiter.api.BeforeEach;
diff --git a/src/test/java/org/gitlab4j/api/TestExternalStatusCheckApi.java b/src/test/java/org/gitlab4j/api/TestExternalStatusCheckApi.java
index 7b118e22a..fd5010936 100644
--- a/src/test/java/org/gitlab4j/api/TestExternalStatusCheckApi.java
+++ b/src/test/java/org/gitlab4j/api/TestExternalStatusCheckApi.java
@@ -12,7 +12,7 @@
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
-import javax.ws.rs.core.MultivaluedMap;
+import jakarta.ws.rs.core.MultivaluedMap;
 
 import org.gitlab4j.api.models.ExternalStatusCheck;
 import org.gitlab4j.api.models.ExternalStatusCheckStatus;
diff --git a/src/test/java/org/gitlab4j/api/TestGitLabApiBeans.java b/src/test/java/org/gitlab4j/api/TestGitLabApiBeans.java
index 0afb446e5..5afc24a75 100644
--- a/src/test/java/org/gitlab4j/api/TestGitLabApiBeans.java
+++ b/src/test/java/org/gitlab4j/api/TestGitLabApiBeans.java
@@ -78,6 +78,7 @@
 import org.gitlab4j.api.models.Key;
 import org.gitlab4j.api.models.Label;
 import org.gitlab4j.api.models.LabelEvent;
+import org.gitlab4j.api.models.Link;
 import org.gitlab4j.api.models.Member;
 import org.gitlab4j.api.models.MergeRequest;
 import org.gitlab4j.api.models.MergeRequestDiff;
@@ -373,6 +374,12 @@ public void testLinkedIssues() throws Exception {
         assertTrue(compareJson(linkedIssues, "linked-issues.json"));
     }
 
+    @Test
+    public void testLinks() throws Exception {
+        List links = unmarshalResourceList(Link.class, "links.json");
+        assertTrue(compareJson(links, "links.json"));
+    }
+
     @Test
     public void testCommitDiscussions() throws Exception {
         List discussions = unmarshalResourceList(Discussion.class, "commit-discussions.json");
diff --git a/src/test/java/org/gitlab4j/api/TestGitLabApiEvents.java b/src/test/java/org/gitlab4j/api/TestGitLabApiEvents.java
index 535c15a28..a35952910 100644
--- a/src/test/java/org/gitlab4j/api/TestGitLabApiEvents.java
+++ b/src/test/java/org/gitlab4j/api/TestGitLabApiEvents.java
@@ -14,8 +14,8 @@
 
 import java.util.logging.Level;
 
-import javax.servlet.ServletInputStream;
-import javax.servlet.http.HttpServletRequest;
+import jakarta.servlet.ServletInputStream;
+import jakarta.servlet.http.HttpServletRequest;
 
 import org.gitlab4j.api.systemhooks.MergeRequestSystemHookEvent;
 import org.gitlab4j.api.systemhooks.ProjectSystemHookEvent;
diff --git a/src/test/java/org/gitlab4j/api/TestGitLabApiException.java b/src/test/java/org/gitlab4j/api/TestGitLabApiException.java
index bbf17d63e..eeea08d98 100644
--- a/src/test/java/org/gitlab4j/api/TestGitLabApiException.java
+++ b/src/test/java/org/gitlab4j/api/TestGitLabApiException.java
@@ -10,7 +10,7 @@
 import java.util.List;
 import java.util.Map;
 
-import javax.ws.rs.core.Response.Status;
+import jakarta.ws.rs.core.Response.Status;
 
 import org.gitlab4j.api.models.Project;
 import org.gitlab4j.api.models.Visibility;
diff --git a/src/test/java/org/gitlab4j/api/TestGroupApi.java b/src/test/java/org/gitlab4j/api/TestGroupApi.java
index 0b1f023da..bfd8adbbe 100644
--- a/src/test/java/org/gitlab4j/api/TestGroupApi.java
+++ b/src/test/java/org/gitlab4j/api/TestGroupApi.java
@@ -10,7 +10,7 @@
 import java.util.Optional;
 import java.util.stream.Stream;
 
-import javax.ws.rs.core.Response;
+import jakarta.ws.rs.core.Response;
 
 import org.gitlab4j.api.models.AccessLevel;
 import org.gitlab4j.api.models.AccessRequest;
diff --git a/src/test/java/org/gitlab4j/api/TestIssueDiscussionsApi.java b/src/test/java/org/gitlab4j/api/TestIssueDiscussionsApi.java
index e8598cad7..f78e907a3 100644
--- a/src/test/java/org/gitlab4j/api/TestIssueDiscussionsApi.java
+++ b/src/test/java/org/gitlab4j/api/TestIssueDiscussionsApi.java
@@ -11,7 +11,7 @@
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
-import javax.ws.rs.core.MultivaluedMap;
+import jakarta.ws.rs.core.MultivaluedMap;
 
 import org.gitlab4j.api.models.Discussion;
 import org.junit.jupiter.api.BeforeEach;
diff --git a/src/test/java/org/gitlab4j/api/TestIssuesApi.java b/src/test/java/org/gitlab4j/api/TestIssuesApi.java
index 7158fa5ae..15dbe249c 100644
--- a/src/test/java/org/gitlab4j/api/TestIssuesApi.java
+++ b/src/test/java/org/gitlab4j/api/TestIssuesApi.java
@@ -35,7 +35,7 @@
 import java.util.Optional;
 import java.util.Random;
 
-import javax.ws.rs.core.Response;
+import jakarta.ws.rs.core.Response;
 
 import org.gitlab4j.api.Constants.IssueState;
 import org.gitlab4j.api.models.Duration;
diff --git a/src/test/java/org/gitlab4j/api/TestMergeRequestDiscussionsApi.java b/src/test/java/org/gitlab4j/api/TestMergeRequestDiscussionsApi.java
index 1874692c4..26a51ed71 100644
--- a/src/test/java/org/gitlab4j/api/TestMergeRequestDiscussionsApi.java
+++ b/src/test/java/org/gitlab4j/api/TestMergeRequestDiscussionsApi.java
@@ -11,7 +11,7 @@
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
-import javax.ws.rs.core.MultivaluedMap;
+import jakarta.ws.rs.core.MultivaluedMap;
 
 import org.gitlab4j.api.models.Discussion;
 import org.junit.jupiter.api.BeforeEach;
diff --git a/src/test/java/org/gitlab4j/api/TestProjectApi.java b/src/test/java/org/gitlab4j/api/TestProjectApi.java
index 43dfcc3a5..68069041a 100644
--- a/src/test/java/org/gitlab4j/api/TestProjectApi.java
+++ b/src/test/java/org/gitlab4j/api/TestProjectApi.java
@@ -36,7 +36,7 @@
 import java.util.Optional;
 import java.util.stream.Stream;
 
-import javax.ws.rs.core.Response;
+import jakarta.ws.rs.core.Response;
 
 import org.gitlab4j.api.models.AccessLevel;
 import org.gitlab4j.api.models.AccessRequest;
diff --git a/src/test/java/org/gitlab4j/api/TestReleaseLinksApi.java b/src/test/java/org/gitlab4j/api/TestReleaseLinksApi.java
new file mode 100644
index 000000000..cf7cf691e
--- /dev/null
+++ b/src/test/java/org/gitlab4j/api/TestReleaseLinksApi.java
@@ -0,0 +1,68 @@
+package org.gitlab4j.api;
+
+import static org.gitlab4j.api.JsonUtils.compareJson;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.when;
+import static org.mockito.MockitoAnnotations.openMocks;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import jakarta.ws.rs.core.MultivaluedMap;
+
+import org.gitlab4j.api.models.Link;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Captor;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+
+public class TestReleaseLinksApi implements Constants {
+
+    @Mock private GitLabApi gitLabApi;
+    @Mock private GitLabApiClient gitLabApiClient;
+    @Captor private ArgumentCaptor> attributeCaptor;
+    private MockResponse response;
+
+    @BeforeEach
+    public void setUp() throws Exception {
+        openMocks(this);
+    }
+
+    @Test
+    public void testGetLinks() throws Exception {
+        initGetLinks();
+        List result = new ReleaseLinksApi(gitLabApi).getLinks(6L, "v1.0");
+        assertNotNull(result);
+        assertTrue(compareJson(result, "links.json"));
+    }
+
+    @Test
+    public void testGetLinksByPager() throws Exception {
+        initGetLinks();
+        Pager pager = new ReleaseLinksApi(gitLabApi).getLinks(6L, "v1.0", 20);
+        assertNotNull(pager);
+        assertTrue(compareJson(pager.all(), "links.json"));
+    }
+
+    @Test
+    public void testGetLinksByStream() throws Exception {
+        initGetLinks();
+        Stream stream = new ReleaseLinksApi(gitLabApi).getLinksStream(6L, "v1.0");
+        assertNotNull(stream);
+        List list = stream.collect(Collectors.toList());
+        assertTrue(compareJson(list, "links.json"));
+    }
+
+    private void initGetLinks() throws Exception, IOException {
+        response = new MockResponse(Link.class, null, "links.json");
+        when(gitLabApi.getApiClient()).thenReturn(gitLabApiClient);
+        when(gitLabApiClient.validateSecretToken(any())).thenReturn(true);
+        when(gitLabApiClient.get(attributeCaptor.capture(), Mockito.