diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/querydef/CriteriaBuilderImpl.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/querydef/CriteriaBuilderImpl.java
index 42049e1..03dec36 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/querydef/CriteriaBuilderImpl.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/querydef/CriteriaBuilderImpl.java
@@ -1430,22 +1430,6 @@
                 buildList(x, internalLiteral(n)), "round");
     }
 
-    // This came with API modifications branch and shall be removed.
-    @Override
-    public Expression<LocalDate> localDate() {
-        return null;
-    }
-
-    @Override
-    public Expression<LocalDateTime> localDateTime() {
-        return null;
-    }
-
-    @Override
-    public Expression<LocalTime> localTime() {
-        return null;
-    }
-
 // typecasts:
     /**
      * Typecast.
@@ -2331,6 +2315,39 @@
     }
 
     /**
+     * Create expression to return current local date.
+     *
+     * @return expression for current date
+     */
+    @Override
+    public Expression<java.time.LocalDate> localDate() {
+        // TODO: Implement
+        throw new UnsupportedOperationException("Local date expression is not implemented yet");
+    }
+
+    /**
+     * Create expression to return current local datetime.
+     *
+     * @return expression for current timestamp
+     */
+    @Override
+    public Expression<java.time.LocalDateTime> localDateTime() {
+        // TODO: Implement
+        throw new UnsupportedOperationException("Local datetime expression is not implemented yet");
+    }
+
+    /**
+     * Create expression to return current local time.
+     *
+     * @return expression for current time
+     */
+    @Override
+    public Expression<java.time.LocalTime> localTime() {
+        // TODO: Implement
+        throw new UnsupportedOperationException("Local time expression is not implemented yet");
+    }
+
+    /**
      * Create predicate to test whether given expression is contained in a list
      * of values.
      *
@@ -2741,6 +2758,49 @@
         }
 
         /**
+         * Add a when/then clause to the case expression.
+         * @param condition  "when" condition
+         * @param result  "then" result value
+         * @return simple case expression
+         */
+        @Override
+        public SimpleCase<C, R> when(Expression<? extends C> condition, R result) {
+            org.eclipse.persistence.expressions.Expression conditionExp = org.eclipse.persistence.expressions.Expression.from(condition, new ExpressionBuilder());
+            ((FunctionExpression)currentNode).addChild(conditionExp);
+            this.expressions.add(condition);
+
+            org.eclipse.persistence.expressions.Expression resultExp = ((InternalSelection)result).getCurrentNode();
+            resultExp = org.eclipse.persistence.expressions.Expression.from(resultExp, currentNode);
+            ((FunctionExpression)currentNode).addChild(resultExp);
+            Expression<R> resultLiteral = internalLiteral(result);
+            this.expressions.add(resultLiteral);
+
+            setJavaType((Class<R>) resultLiteral.getJavaType());
+            return this;
+        }
+
+        /**
+         * Add a when/then clause to the case expression.
+         * @param condition  "when" condition
+         * @param result  "then" result expression
+         * @return simple case expression
+         */
+        @Override
+        public SimpleCase<C, R> when(Expression<? extends C> condition, Expression<? extends R> result) {
+            org.eclipse.persistence.expressions.Expression conditionExp = org.eclipse.persistence.expressions.Expression.from(condition, new ExpressionBuilder());
+            ((FunctionExpression)currentNode).addChild(conditionExp);
+            this.expressions.add(condition);
+
+            org.eclipse.persistence.expressions.Expression resultExp = ((InternalSelection)result).getCurrentNode();
+            resultExp = org.eclipse.persistence.expressions.Expression.from(resultExp, currentNode);
+            ((FunctionExpression)currentNode).addChild(resultExp);
+            this.expressions.add(result);
+
+            setJavaType((Class<R>) result.getJavaType());
+            return this;
+        }
+
+        /**
          * Add an "else" clause to the case expression.
          * @param result  "else" result
          * @return expression
diff --git a/pom.xml b/pom.xml
index a864d28..a245dff 100644
--- a/pom.xml
+++ b/pom.xml
@@ -194,7 +194,7 @@
         <jersey.version>3.1.0-M2</jersey.version>
         <jms.version>3.0.0</jms.version>
         <json.version>2.1.0</json.version>
-        <jpa.api.version>3.1.0-RC2</jpa.api.version>
+        <jpa.api.version>3.1.0</jpa.api.version>
         <mail-api.version>2.1.0</mail-api.version>
         <angus-mail.version>1.0.0</angus-mail.version>
         <oracle.ddlparser.version>3.0.0</oracle.ddlparser.version>
