diff --git a/temporal-sdk/src/main/java/io/temporal/client/WorkflowClient.java b/temporal-sdk/src/main/java/io/temporal/client/WorkflowClient.java
index 07cb66530..8e54d367b 100644
--- a/temporal-sdk/src/main/java/io/temporal/client/WorkflowClient.java
+++ b/temporal-sdk/src/main/java/io/temporal/client/WorkflowClient.java
@@ -719,7 +719,6 @@ static <A1, A2, A3, A4, A5, A6> WorkflowUpdateHandle<Void> startUpdate(
    * @param options update options
    * @return WorkflowUpdateHandle that can be used to get the result of the update
    */
-  @Experimental
   static <R> WorkflowUpdateHandle<R> startUpdate(
       Functions.Func<R> updateMethod, @Nonnull UpdateOptions<R> options) {
     return WorkflowClientInternalImpl.startUpdate(updateMethod, options);
@@ -734,7 +733,6 @@ static <R> WorkflowUpdateHandle<R> startUpdate(
    * @param options update options
    * @return WorkflowUpdateHandle that can be used to get the result of the update
    */
-  @Experimental
   static <R, A1> WorkflowUpdateHandle<R> startUpdate(
       Functions.Func1<A1, R> updateMethod, A1 arg1, @Nonnull UpdateOptions<R> options) {
     return WorkflowClientInternalImpl.startUpdate(updateMethod, arg1, options);
@@ -750,7 +748,6 @@ static <R, A1> WorkflowUpdateHandle<R> startUpdate(
    * @param options update options
    * @return WorkflowUpdateHandle that can be used to get the result of the update
    */
-  @Experimental
   static <R, A1, A2> WorkflowUpdateHandle<R> startUpdate(
       Functions.Func2<A1, A2, R> updateMethod,
       A1 arg1,
@@ -770,7 +767,6 @@ static <R, A1, A2> WorkflowUpdateHandle<R> startUpdate(
    * @param options update options
    * @return WorkflowUpdateHandle that can be used to get the result of the update
    */
-  @Experimental
   static <R, A1, A2, A3> WorkflowUpdateHandle<R> startUpdate(
       Functions.Func3<A1, A2, A3, R> updateMethod,
       A1 arg1,
@@ -792,7 +788,6 @@ static <R, A1, A2, A3> WorkflowUpdateHandle<R> startUpdate(
    * @param options update options
    * @return WorkflowUpdateHandle that can be used to get the result of the update
    */
-  @Experimental
   static <R, A1, A2, A3, A4> WorkflowUpdateHandle<R> startUpdate(
       Functions.Func4<A1, A2, A3, A4, R> updateMethod,
       A1 arg1,
@@ -816,7 +811,6 @@ static <R, A1, A2, A3, A4> WorkflowUpdateHandle<R> startUpdate(
    * @param options update options
    * @return WorkflowUpdateHandle that can be used to get the result of the update
    */
-  @Experimental
   static <R, A1, A2, A3, A4, A5> WorkflowUpdateHandle<R> startUpdate(
       Functions.Func5<A1, A2, A3, A4, A5, R> updateMethod,
       A1 arg1,
@@ -843,7 +837,6 @@ static <R, A1, A2, A3, A4, A5> WorkflowUpdateHandle<R> startUpdate(
    * @param options update options
    * @return WorkflowUpdateHandle that can be used to get the result of the update
    */
-  @Experimental
   static <R, A1, A2, A3, A4, A5, A6> WorkflowUpdateHandle<R> startUpdate(
       Functions.Func6<A1, A2, A3, A4, A5, A6, R> updateMethod,
       A1 arg1,
diff --git a/temporal-sdk/src/main/java/io/temporal/client/WorkflowStub.java b/temporal-sdk/src/main/java/io/temporal/client/WorkflowStub.java
index a4d9f2e77..68f16229f 100644
--- a/temporal-sdk/src/main/java/io/temporal/client/WorkflowStub.java
+++ b/temporal-sdk/src/main/java/io/temporal/client/WorkflowStub.java
@@ -90,7 +90,6 @@ static <T> WorkflowStub fromTyped(T typed) {
    * @throws WorkflowServiceException for all other failures including networking and service
    *     availability issues.
    */
-  @Experimental
   <R> R update(String updateName, Class<R> resultClass, Object... args);
 
   /**
@@ -109,7 +108,6 @@ static <T> WorkflowStub fromTyped(T typed) {
    * @throws WorkflowServiceException for all other failures including networking and service
    *     availability issues.
    */
-  @Experimental
   <R> WorkflowUpdateHandle<R> startUpdate(
       String updateName, WorkflowUpdateStage waitForStage, Class<R> resultClass, Object... args);
 
@@ -125,7 +123,6 @@ <R> WorkflowUpdateHandle<R> startUpdate(
    * @throws WorkflowServiceException for all other failures including networking and service
    *     availability issues.
    */
-  @Experimental
   <R> WorkflowUpdateHandle<R> startUpdate(UpdateOptions<R> options, Object... args);
 
   /**
@@ -137,7 +134,6 @@ <R> WorkflowUpdateHandle<R> startUpdate(
    * @param <R> type of the update return value.
    * @return update handle that can be used to get the result of the update.
    */
-  @Experimental
   <R> WorkflowUpdateHandle<R> getUpdateHandle(String updateId, Class<R> resultClass);
 
   /**
@@ -151,7 +147,6 @@ <R> WorkflowUpdateHandle<R> startUpdate(
    * @param resultType type of the update return value. Differs from resultClass for generic types.
    * @return update handle that can be used to get the result of the update.
    */
-  @Experimental
   <R> WorkflowUpdateHandle<R> getUpdateHandle(
       String updateId, Class<R> resultClass, Type resultType);
 
diff --git a/temporal-sdk/src/main/java/io/temporal/client/WorkflowUpdateException.java b/temporal-sdk/src/main/java/io/temporal/client/WorkflowUpdateException.java
index 791381e95..5c8e7a599 100644
--- a/temporal-sdk/src/main/java/io/temporal/client/WorkflowUpdateException.java
+++ b/temporal-sdk/src/main/java/io/temporal/client/WorkflowUpdateException.java
@@ -21,13 +21,8 @@
 package io.temporal.client;
 
 import io.temporal.api.common.v1.WorkflowExecution;
-import io.temporal.common.Experimental;
 
-/**
- * Exception used to communicate failure of an update workflow execution request to an external
- * workflow.
- */
-@Experimental
+/** Exception used to communicate failure of an update workflow execution request. */
 public final class WorkflowUpdateException extends WorkflowException {
 
   private final String updateId;
diff --git a/temporal-sdk/src/main/java/io/temporal/client/WorkflowUpdateHandle.java b/temporal-sdk/src/main/java/io/temporal/client/WorkflowUpdateHandle.java
index f933f4412..92de1341e 100644
--- a/temporal-sdk/src/main/java/io/temporal/client/WorkflowUpdateHandle.java
+++ b/temporal-sdk/src/main/java/io/temporal/client/WorkflowUpdateHandle.java
@@ -21,7 +21,6 @@
 package io.temporal.client;
 
 import io.temporal.api.common.v1.WorkflowExecution;
-import io.temporal.common.Experimental;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.TimeUnit;
 
@@ -29,7 +28,6 @@
  * WorkflowUpdateHandle is a handle to an update workflow execution request that can be used to get
  * the status of that update request.
  */
-@Experimental
 public interface WorkflowUpdateHandle<T> {
   /**
    * Gets the workflow execution this update request was sent to.
diff --git a/temporal-sdk/src/main/java/io/temporal/common/interceptors/WorkflowClientCallsInterceptor.java b/temporal-sdk/src/main/java/io/temporal/common/interceptors/WorkflowClientCallsInterceptor.java
index e089e4194..af2683339 100644
--- a/temporal-sdk/src/main/java/io/temporal/common/interceptors/WorkflowClientCallsInterceptor.java
+++ b/temporal-sdk/src/main/java/io/temporal/common/interceptors/WorkflowClientCallsInterceptor.java
@@ -85,10 +85,8 @@ public interface WorkflowClientCallsInterceptor {
 
   <R> QueryOutput<R> query(QueryInput<R> input);
 
-  @Experimental
   <R> WorkflowUpdateHandle<R> startUpdate(StartUpdateInput<R> input);
 
-  @Experimental
   <R> PollWorkflowUpdateOutput<R> pollWorkflowUpdate(PollWorkflowUpdateInput<R> input);
 
   CancelOutput cancel(CancelInput input);
@@ -428,7 +426,6 @@ public WorkflowExecution getWorkflowExecution() {
     }
   }
 
-  @Experimental
   final class StartUpdateInput<R> {
     private final WorkflowExecution workflowExecution;
     private final Optional<String> workflowType;
@@ -505,7 +502,6 @@ public WaitPolicy getWaitPolicy() {
     }
   }
 
-  @Experimental
   final class PollWorkflowUpdateInput<R> {
     private final WorkflowExecution workflowExecution;
     private long timeout;
@@ -561,7 +557,6 @@ public String getUpdateId() {
     }
   }
 
-  @Experimental
   final class PollWorkflowUpdateOutput<R> {
     private final CompletableFuture<R> result;
 
diff --git a/temporal-sdk/src/main/java/io/temporal/common/interceptors/WorkflowInboundCallsInterceptor.java b/temporal-sdk/src/main/java/io/temporal/common/interceptors/WorkflowInboundCallsInterceptor.java
index b9bf960c2..0db564a14 100644
--- a/temporal-sdk/src/main/java/io/temporal/common/interceptors/WorkflowInboundCallsInterceptor.java
+++ b/temporal-sdk/src/main/java/io/temporal/common/interceptors/WorkflowInboundCallsInterceptor.java
@@ -143,7 +143,6 @@ public Object getResult() {
     }
   }
 
-  @Experimental
   final class UpdateInput {
     private final String updateName;
     private final Header header;
@@ -168,7 +167,6 @@ public Object[] getArguments() {
     }
   }
 
-  @Experimental
   final class UpdateOutput {
     private final Object result;
 
@@ -212,14 +210,12 @@ public Object getResult() {
    * Called when update workflow execution request is delivered to a workflow execution, before the
    * update is executed.
    */
-  @Experimental
   void validateUpdate(UpdateInput input);
 
   /**
    * Called when update workflow execution request is delivered to a workflow execution, after
    * passing the validator.
    */
-  @Experimental
   UpdateOutput executeUpdate(UpdateInput input);
 
   /**
diff --git a/temporal-sdk/src/main/java/io/temporal/common/interceptors/WorkflowOutboundCallsInterceptor.java b/temporal-sdk/src/main/java/io/temporal/common/interceptors/WorkflowOutboundCallsInterceptor.java
index e959b35ca..5645eeebb 100644
--- a/temporal-sdk/src/main/java/io/temporal/common/interceptors/WorkflowOutboundCallsInterceptor.java
+++ b/temporal-sdk/src/main/java/io/temporal/common/interceptors/WorkflowOutboundCallsInterceptor.java
@@ -552,7 +552,6 @@ public List<SignalRegistrationRequest> getRequests() {
     }
   }
 
-  @Experimental
   final class UpdateRegistrationRequest {
     private final String updateName;
     private final String description;
@@ -626,7 +625,6 @@ public Functions.Func1<Object[], Object> getExecuteCallback() {
     }
   }
 
-  @Experimental
   final class RegisterUpdateHandlersInput {
     private final List<UpdateRegistrationRequest> requests;
 
@@ -718,7 +716,6 @@ public DynamicSignalHandler getHandler() {
     }
   }
 
-  @Experimental
   final class RegisterDynamicUpdateHandlerInput {
     private final DynamicUpdateHandler handler;
 
@@ -769,14 +766,12 @@ <R> R mutableSideEffect(
 
   void registerSignalHandlers(RegisterSignalHandlersInput input);
 
-  @Experimental
   void registerUpdateHandlers(RegisterUpdateHandlersInput input);
 
   void registerDynamicSignalHandler(RegisterDynamicSignalHandlerInput handler);
 
   void registerDynamicQueryHandler(RegisterDynamicQueryHandlerInput input);
 
-  @Experimental
   void registerDynamicUpdateHandler(RegisterDynamicUpdateHandlerInput input);
 
   UUID randomUUID();
diff --git a/temporal-sdk/src/main/java/io/temporal/common/metadata/POJOWorkflowImplMetadata.java b/temporal-sdk/src/main/java/io/temporal/common/metadata/POJOWorkflowImplMetadata.java
index ed4775ab6..8a21fc76f 100644
--- a/temporal-sdk/src/main/java/io/temporal/common/metadata/POJOWorkflowImplMetadata.java
+++ b/temporal-sdk/src/main/java/io/temporal/common/metadata/POJOWorkflowImplMetadata.java
@@ -222,13 +222,11 @@ public List<POJOWorkflowMethodMetadata> getQueryMethods() {
   }
 
   /** List of update methods an object implements across all the workflow interfaces. */
-  @Experimental
   public List<POJOWorkflowMethodMetadata> getUpdateMethods() {
     return updateMethods;
   }
 
   /** List of update validator methods an object implements across all the workflow interfaces. */
-  @Experimental
   public List<POJOWorkflowMethodMetadata> getUpdateValidatorMethods() {
     return updateValidatorMethods;
   }
diff --git a/temporal-sdk/src/main/java/io/temporal/internal/client/CompletedWorkflowUpdateHandleImpl.java b/temporal-sdk/src/main/java/io/temporal/internal/client/CompletedWorkflowUpdateHandleImpl.java
index 102341999..64f09c164 100644
--- a/temporal-sdk/src/main/java/io/temporal/internal/client/CompletedWorkflowUpdateHandleImpl.java
+++ b/temporal-sdk/src/main/java/io/temporal/internal/client/CompletedWorkflowUpdateHandleImpl.java
@@ -23,11 +23,9 @@
 import io.temporal.api.common.v1.WorkflowExecution;
 import io.temporal.client.WorkflowUpdateException;
 import io.temporal.client.WorkflowUpdateHandle;
-import io.temporal.common.Experimental;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.TimeUnit;
 
-@Experimental
 public final class CompletedWorkflowUpdateHandleImpl<T> implements WorkflowUpdateHandle<T> {
 
   private final String id;
diff --git a/temporal-sdk/src/main/java/io/temporal/internal/client/LazyWorkflowUpdateHandleImpl.java b/temporal-sdk/src/main/java/io/temporal/internal/client/LazyWorkflowUpdateHandleImpl.java
index 103a91ef0..6193d0c29 100644
--- a/temporal-sdk/src/main/java/io/temporal/internal/client/LazyWorkflowUpdateHandleImpl.java
+++ b/temporal-sdk/src/main/java/io/temporal/internal/client/LazyWorkflowUpdateHandleImpl.java
@@ -25,13 +25,11 @@
 import io.temporal.client.WorkflowException;
 import io.temporal.client.WorkflowServiceException;
 import io.temporal.client.WorkflowUpdateHandle;
-import io.temporal.common.Experimental;
 import io.temporal.common.interceptors.WorkflowClientCallsInterceptor;
 import io.temporal.serviceclient.CheckedExceptionWrapper;
 import java.lang.reflect.Type;
 import java.util.concurrent.*;
 
-@Experimental
 public final class LazyWorkflowUpdateHandleImpl<T> implements WorkflowUpdateHandle<T> {
 
   private final WorkflowClientCallsInterceptor workflowClientInvoker;
diff --git a/temporal-sdk/src/main/java/io/temporal/internal/client/external/GenericWorkflowClient.java b/temporal-sdk/src/main/java/io/temporal/internal/client/external/GenericWorkflowClient.java
index 9f5781d89..dda41152d 100644
--- a/temporal-sdk/src/main/java/io/temporal/internal/client/external/GenericWorkflowClient.java
+++ b/temporal-sdk/src/main/java/io/temporal/internal/client/external/GenericWorkflowClient.java
@@ -39,11 +39,9 @@ SignalWithStartWorkflowExecutionResponse signalWithStart(
 
   QueryWorkflowResponse query(QueryWorkflowRequest queryParameters);
 
-  @Experimental
   UpdateWorkflowExecutionResponse update(
       @Nonnull UpdateWorkflowExecutionRequest updateParameters, @Nonnull Deadline deadline);
 
-  @Experimental
   CompletableFuture<PollWorkflowExecutionUpdateResponse> pollUpdateAsync(
       @Nonnull PollWorkflowExecutionUpdateRequest request, @Nonnull Deadline deadline);
 
diff --git a/temporal-sdk/src/main/java/io/temporal/workflow/UpdateMethod.java b/temporal-sdk/src/main/java/io/temporal/workflow/UpdateMethod.java
index 66e403e0e..5a52be4e1 100644
--- a/temporal-sdk/src/main/java/io/temporal/workflow/UpdateMethod.java
+++ b/temporal-sdk/src/main/java/io/temporal/workflow/UpdateMethod.java
@@ -20,7 +20,6 @@
 
 package io.temporal.workflow;
 
-import io.temporal.common.Experimental;
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
@@ -34,7 +33,6 @@
  */
 @Retention(RetentionPolicy.RUNTIME)
 @Target(ElementType.METHOD)
-@Experimental
 public @interface UpdateMethod {
   /**
    * Name of the update handler. Default is method name.
diff --git a/temporal-sdk/src/main/java/io/temporal/workflow/UpdateValidatorMethod.java b/temporal-sdk/src/main/java/io/temporal/workflow/UpdateValidatorMethod.java
index cbb44b30f..2d30d5d0c 100644
--- a/temporal-sdk/src/main/java/io/temporal/workflow/UpdateValidatorMethod.java
+++ b/temporal-sdk/src/main/java/io/temporal/workflow/UpdateValidatorMethod.java
@@ -20,7 +20,6 @@
 
 package io.temporal.workflow;
 
-import io.temporal.common.Experimental;
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
@@ -36,7 +35,6 @@
  */
 @Retention(RetentionPolicy.RUNTIME)
 @Target(ElementType.METHOD)
-@Experimental
 public @interface UpdateValidatorMethod {
 
   /**