diff --git a/jaxrs-api/src/main/java/jakarta/ws/rs/core/Form.java b/jaxrs-api/src/main/java/jakarta/ws/rs/core/Form.java
index d4e0e60..0ba06d5 100644
--- a/jaxrs-api/src/main/java/jakarta/ws/rs/core/Form.java
+++ b/jaxrs-api/src/main/java/jakarta/ws/rs/core/Form.java
@@ -93,4 +93,19 @@
     public MultivaluedMap<String, String> asMap() {
         return parameters;
     }
+
+    /**
+     * Compare for equality
+     * 
+     * @param object the object to compare to.
+     * @return {@code true}, if the object is a {@code Form} with the same form parameters, {@code false} otherwise.
+     */
+    @Override
+    public boolean equals(Object object) {
+        if (object == null) return false;
+        if (object == this) return true;
+        if (getClass() != object.getClass()) return false;
+        Form form = (Form) object;
+        return parameters.equals(form.asMap());
+    }
 }
diff --git a/jaxrs-api/src/test/java/jakarta/ws/rs/core/FormTest.java b/jaxrs-api/src/test/java/jakarta/ws/rs/core/FormTest.java
new file mode 100644
index 0000000..503d88f
--- /dev/null
+++ b/jaxrs-api/src/test/java/jakarta/ws/rs/core/FormTest.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright (c) 2010, 2021 Oracle and/or its affiliates. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0, which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * This Source Code may also be made available under the following Secondary
+ * Licenses when the conditions for such availability set forth in the
+ * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
+ * version 2 with the GNU Classpath Exception, which is available at
+ * https://www.gnu.org/software/classpath/license.html.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
+ */
+
+package jakarta.ws.rs.core;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+public class FormTest {
+    
+    @Test
+    public void testNullEquals() {
+        Form form = new Form();
+        assertFalse(form.equals(null));
+    }
+
+    @Test
+    public void testSameObjectEquals() {
+        Form form = new Form();
+        assertTrue(form.equals(form));
+    }
+
+    @Test
+    public void testDifferentObjectTypeEquals() {
+        Form form = new Form("field", "value");
+        Cookie cookie = new Cookie.Builder("field")
+            .value("value")
+            .build();
+        assertFalse(form.equals(cookie));
+    }
+
+    @Test
+    public void testFormContentEquals() {
+        final String NAME_FIELD = "name";
+        final String AGE_FIELD = "age";
+        final String NAME_VALUE = "john";
+        final String AGE_VALUE = "25";
+        Form form1 = new Form(NAME_FIELD,NAME_VALUE).param(AGE_FIELD, AGE_VALUE);
+        Form form2 = new Form(NAME_FIELD,NAME_VALUE).param(AGE_FIELD, AGE_VALUE);
+        assertTrue(form1.equals(form2));
+        form2 = new Form(AGE_FIELD, AGE_VALUE).param(NAME_FIELD,NAME_VALUE);
+        assertTrue(form1.equals(form2));
+        form2 = new Form(AGE_VALUE, AGE_FIELD).param(NAME_VALUE, NAME_FIELD);
+        assertFalse(form1.equals(form2));
+        form2 = new Form(AGE_FIELD, AGE_VALUE).param(NAME_FIELD,NAME_VALUE).param("location", "USA");
+        assertFalse(form1.equals(form2));
+    }
+}
