diff --git a/impl/src/main/java/jakarta/faces/convert/UUIDConverter.java b/impl/src/main/java/jakarta/faces/convert/UUIDConverter.java
new file mode 100644
index 0000000000..b25cd645ab
--- /dev/null
+++ b/impl/src/main/java/jakarta/faces/convert/UUIDConverter.java
@@ -0,0 +1,111 @@
+/*
+ * Copyright (c) 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.faces.convert;
+
+import java.util.UUID;
+
+import jakarta.faces.component.UIComponent;
+import jakarta.faces.context.FacesContext;
+
+/**
+ *
+ * {@link Converter} implementation for java.util.UUID
values.
+ *
+ * @since 4.1
+ */
+public class UUIDConverter implements Converter {
+
+ // ------------------------------------------------------ Manifest Constants
+
+ /**
+ *
+ * The standard converter id for this converter.
+ *
+ */
+ public static final String CONVERTER_ID = "jakarta.faces.UUID";
+
+ /**
+ *
+ * The message identifier of the {@link jakarta.faces.application.FacesMessage} to be created if the conversion to UUID
fails.
+ * The message format string for this message may optionally include the following placeholders:
+ *
+ * {0}
replaced by the unconverted value.
+ * {1}
replaced by an example value.
+ * {2}
replaced by a String
whose value is the label of the input component that produced this message.
+ *
+ */
+ public static final String UUID_ID = "jakarta.faces.converter.UUIDConverter.UUID";
+
+ /**
+ *
+ * The message identifier of the {@link jakarta.faces.application.FacesMessage} to be created if the conversion of the UUID
value to String
fails.
+ * The message format string for this message may optionally include the following placeholders:
+ *
+ * {0}
relaced by the unconverted value.
+ * {1}
replaced by a String
whose value is the label of the input component that produced this message.
+ *
+ */
+ public static final String STRING_ID = "jakarta.faces.converter.STRING";
+
+ // ------------------------------------------------------- Converter Methods
+
+ /**
+ * @throws ConverterException {@inheritDoc}
+ * @throws NullPointerException {@inheritDoc}
+ */
+ @Override
+ public UUID getAsObject(FacesContext context, UIComponent component, String value) {
+
+ if (context == null || component == null) {
+ throw new NullPointerException();
+ }
+
+ if (value == null || value.isBlank()) {
+ return null;
+ }
+
+ try {
+ return UUID.fromString(value);
+ } catch (IllegalArgumentException e) {
+ throw new ConverterException(MessageFactory.getMessage(context, UUID_ID, value, "29573f55-4254-4afa-9ca6-6b5ae6c7ab6e", MessageFactory.getLabel(context, component)), e);
+ } catch (Exception e) {
+ throw new ConverterException(e);
+ }
+ }
+
+ /**
+ * @throws ConverterException {@inheritDoc}
+ * @throws NullPointerException {@inheritDoc}
+ */
+ @Override
+ public String getAsString(FacesContext context, UIComponent component, UUID value) {
+
+ if (context == null || component == null) {
+ throw new NullPointerException();
+ }
+
+ if (value == null) {
+ return "";
+ }
+
+ try {
+ return value.toString();
+ } catch (Exception e) {
+ throw new ConverterException(MessageFactory.getMessage(context, STRING_ID, value, MessageFactory.getLabel(context, component)), e);
+ }
+ }
+}
diff --git a/impl/src/main/resources/jakarta/faces/Messages.properties b/impl/src/main/resources/jakarta/faces/Messages.properties
index c9e08d372c..b11e41bb78 100644
--- a/impl/src/main/resources/jakarta/faces/Messages.properties
+++ b/impl/src/main/resources/jakarta/faces/Messages.properties
@@ -65,6 +65,8 @@ jakarta.faces.converter.NumberConverter.PATTERN={2}: ''{0}'' is not a number pat
jakarta.faces.converter.NumberConverter.PATTERN_detail={2}: ''{0}'' is not a number pattern. Example: {1}
jakarta.faces.converter.ShortConverter.SHORT={2}: ''{0}'' must be a number consisting of one or more digits.
jakarta.faces.converter.ShortConverter.SHORT_detail={2}: ''{0}'' must be a number between -32768 and 32767 Example: {1}
+jakarta.faces.converter.UUIDConverter.UUID={2}: ''{0}'' must be a UUID.
+jakarta.faces.converter.UUIDConverter.UUID_detail={2}: ''{0}'' must be a UUID. Example: {1}
jakarta.faces.converter.STRING={1}: Could not convert ''{0}'' to a string.
@@ -90,4 +92,3 @@ jakarta.faces.validator.RegexValidator.MATCH_EXCEPTION=Error in regular expressi
jakarta.faces.validator.RegexValidator.MATCH_EXCEPTION_detail=Error in regular expression, ''{0}''
jakarta.faces.validator.BeanValidator.MESSAGE={0}
-