beam-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "ASF GitHub Bot (JIRA)" <j...@apache.org>
Subject [jira] [Work logged] (BEAM-3966) Move core utilities into a new top-level module
Date Mon, 03 Sep 2018 18:14:01 GMT

     [ https://issues.apache.org/jira/browse/BEAM-3966?focusedWorklogId=140690&page=com.atlassian.jira.plugin.system.issuetabpanels:worklog-tabpanel#worklog-140690 ]

ASF GitHub Bot logged work on BEAM-3966:
----------------------------------------

                Author: ASF GitHub Bot
            Created on: 03/Sep/18 18:14
            Start Date: 03/Sep/18 18:14
    Worklog Time Spent: 10m 
      Work Description: stale[bot] closed pull request #4974: [BEAM-3966] Move `sdks/java/fn-execution` to `util/java/fn-execution`
URL: https://github.com/apache/beam/pull/4974
 
 
   

This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:

As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):

diff --git a/pom.xml b/pom.xml
index 228b593c1d8..c12421a173a 100644
--- a/pom.xml
+++ b/pom.xml
@@ -207,6 +207,7 @@
     <module>model</module>
     <module>sdks</module>
     <module>runners</module>
+    <module>util</module>
     <module>examples</module>
     <!-- sdks/java/javadoc builds project-wide Javadoc. It has to run last. -->
     <module>sdks/java/javadoc</module>
@@ -549,12 +550,6 @@
         <version>${project.version}</version>
       </dependency>
 
-      <dependency>
-        <groupId>org.apache.beam</groupId>
-        <artifactId>beam-sdks-java-fn-execution</artifactId>
-        <version>${project.version}</version>
-      </dependency>
-
       <dependency>
         <groupId>org.apache.beam</groupId>
         <artifactId>beam-sdks-java-harness</artifactId>
@@ -809,6 +804,12 @@
         <version>${project.version}</version>
       </dependency>
 
+      <dependency>
+        <groupId>org.apache.beam</groupId>
+        <artifactId>beam-util-java-fn-execution</artifactId>
+        <version>${project.version}</version>
+      </dependency>
+
       <dependency>
         <groupId>org.apache.beam</groupId>
         <artifactId>beam-examples-java</artifactId>
diff --git a/runners/java-fn-execution/build.gradle b/runners/java-fn-execution/build.gradle
index ac8bece711f..123b96c7a04 100644
--- a/runners/java-fn-execution/build.gradle
+++ b/runners/java-fn-execution/build.gradle
@@ -27,14 +27,14 @@ description = "Apache Beam :: Runners :: Java Fn Execution"
  * TODO: Swap to generating test artifacts which we can then rely on instead of
  * the test outputs directly.
  */
-evaluationDependsOn(":sdks:java:fn-execution")
+evaluationDependsOn(":util:java:fn-execution")
 
 dependencies {
   compile library.java.guava
   shadow project(path: ":model:pipeline", configuration: "shadow")
   shadow project(path: ":model:fn-execution", configuration: "shadow")
   shadow project(path: ":sdks:java:core", configuration: "shadow")
-  shadow project(path: ":sdks:java:fn-execution", configuration: "shadow")
+  shadow project(path: ":util:java:fn-execution", configuration: "shadow")
   shadow project(path: ":runners:core-construction-java", configuration: "shadow")
   shadow library.java.grpc_core
   shadow library.java.grpc_stub
diff --git a/runners/java-fn-execution/pom.xml b/runners/java-fn-execution/pom.xml
index dd82908a2f6..2bf233ebad6 100644
--- a/runners/java-fn-execution/pom.xml
+++ b/runners/java-fn-execution/pom.xml
@@ -45,7 +45,7 @@
 
     <dependency>
       <groupId>org.apache.beam</groupId>
-      <artifactId>beam-sdks-java-fn-execution</artifactId>
+      <artifactId>beam-util-java-fn-execution</artifactId>
     </dependency>
 
     <dependency>
diff --git a/runners/java-fn-execution/src/main/java/org/apache/beam/runners/fnexecution/ServerFactory.java b/runners/java-fn-execution/src/main/java/org/apache/beam/runners/fnexecution/ServerFactory.java
index bb45d082dad..451f82b9a60 100644
--- a/runners/java-fn-execution/src/main/java/org/apache/beam/runners/fnexecution/ServerFactory.java
+++ b/runners/java-fn-execution/src/main/java/org/apache/beam/runners/fnexecution/ServerFactory.java
@@ -29,7 +29,7 @@
 import java.net.InetSocketAddress;
 import java.net.SocketAddress;
 import org.apache.beam.model.pipeline.v1.Endpoints;
-import org.apache.beam.sdk.fn.channel.SocketAddressFactory;
+import org.apache.beam.util.fn.channel.SocketAddressFactory;
 
 /**
  * A {@link Server gRPC server} factory.
diff --git a/runners/java-fn-execution/src/main/java/org/apache/beam/runners/fnexecution/control/FnApiControlClient.java b/runners/java-fn-execution/src/main/java/org/apache/beam/runners/fnexecution/control/FnApiControlClient.java
index 81eb7281b20..a74661a481c 100644
--- a/runners/java-fn-execution/src/main/java/org/apache/beam/runners/fnexecution/control/FnApiControlClient.java
+++ b/runners/java-fn-execution/src/main/java/org/apache/beam/runners/fnexecution/control/FnApiControlClient.java
@@ -28,7 +28,7 @@
 import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.atomic.AtomicBoolean;
 import org.apache.beam.model.fnexecution.v1.BeamFnApi;
-import org.apache.beam.sdk.fn.stream.SynchronizedStreamObserver;
+import org.apache.beam.util.fn.stream.SynchronizedStreamObserver;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/runners/java-fn-execution/src/main/java/org/apache/beam/runners/fnexecution/control/ProcessBundleDescriptors.java b/runners/java-fn-execution/src/main/java/org/apache/beam/runners/fnexecution/control/ProcessBundleDescriptors.java
index 4a88833666c..e90b9035c1d 100644
--- a/runners/java-fn-execution/src/main/java/org/apache/beam/runners/fnexecution/control/ProcessBundleDescriptors.java
+++ b/runners/java-fn-execution/src/main/java/org/apache/beam/runners/fnexecution/control/ProcessBundleDescriptors.java
@@ -49,10 +49,10 @@
 import org.apache.beam.runners.fnexecution.data.RemoteInputDestination;
 import org.apache.beam.runners.fnexecution.graph.LengthPrefixUnknownCoders;
 import org.apache.beam.sdk.coders.Coder;
-import org.apache.beam.sdk.fn.data.RemoteGrpcPortRead;
-import org.apache.beam.sdk.fn.data.RemoteGrpcPortWrite;
 import org.apache.beam.sdk.util.WindowedValue;
 import org.apache.beam.sdk.util.WindowedValue.FullWindowedValueCoder;
+import org.apache.beam.util.fn.data.RemoteGrpcPortRead;
+import org.apache.beam.util.fn.data.RemoteGrpcPortWrite;
 
 /** Utility methods for creating {@link ProcessBundleDescriptor} instances. */
 // TODO: Rename to ExecutableStages?
diff --git a/runners/java-fn-execution/src/main/java/org/apache/beam/runners/fnexecution/control/SdkHarnessClient.java b/runners/java-fn-execution/src/main/java/org/apache/beam/runners/fnexecution/control/SdkHarnessClient.java
index de1aa57fe32..dbc554701d9 100644
--- a/runners/java-fn-execution/src/main/java/org/apache/beam/runners/fnexecution/control/SdkHarnessClient.java
+++ b/runners/java-fn-execution/src/main/java/org/apache/beam/runners/fnexecution/control/SdkHarnessClient.java
@@ -34,12 +34,12 @@
 import org.apache.beam.runners.fnexecution.data.FnDataService;
 import org.apache.beam.runners.fnexecution.data.RemoteInputDestination;
 import org.apache.beam.sdk.coders.Coder;
-import org.apache.beam.sdk.fn.data.CloseableFnDataReceiver;
-import org.apache.beam.sdk.fn.data.FnDataReceiver;
-import org.apache.beam.sdk.fn.data.InboundDataClient;
-import org.apache.beam.sdk.fn.data.LogicalEndpoint;
 import org.apache.beam.sdk.util.MoreFutures;
 import org.apache.beam.sdk.util.WindowedValue;
+import org.apache.beam.util.fn.data.CloseableFnDataReceiver;
+import org.apache.beam.util.fn.data.FnDataReceiver;
+import org.apache.beam.util.fn.data.InboundDataClient;
+import org.apache.beam.util.fn.data.LogicalEndpoint;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/runners/java-fn-execution/src/main/java/org/apache/beam/runners/fnexecution/data/FnDataService.java b/runners/java-fn-execution/src/main/java/org/apache/beam/runners/fnexecution/data/FnDataService.java
index 6c7839fc193..2a56c04984a 100644
--- a/runners/java-fn-execution/src/main/java/org/apache/beam/runners/fnexecution/data/FnDataService.java
+++ b/runners/java-fn-execution/src/main/java/org/apache/beam/runners/fnexecution/data/FnDataService.java
@@ -19,11 +19,11 @@
 package org.apache.beam.runners.fnexecution.data;
 
 import org.apache.beam.sdk.coders.Coder;
-import org.apache.beam.sdk.fn.data.CloseableFnDataReceiver;
-import org.apache.beam.sdk.fn.data.FnDataReceiver;
-import org.apache.beam.sdk.fn.data.InboundDataClient;
-import org.apache.beam.sdk.fn.data.LogicalEndpoint;
 import org.apache.beam.sdk.util.WindowedValue;
+import org.apache.beam.util.fn.data.CloseableFnDataReceiver;
+import org.apache.beam.util.fn.data.FnDataReceiver;
+import org.apache.beam.util.fn.data.InboundDataClient;
+import org.apache.beam.util.fn.data.LogicalEndpoint;
 
 /**
  * The {@link FnDataService} is able to forward inbound elements to a consumer and is also a
diff --git a/runners/java-fn-execution/src/main/java/org/apache/beam/runners/fnexecution/data/GrpcDataService.java b/runners/java-fn-execution/src/main/java/org/apache/beam/runners/fnexecution/data/GrpcDataService.java
index a13d3d7d38c..aefd3739195 100644
--- a/runners/java-fn-execution/src/main/java/org/apache/beam/runners/fnexecution/data/GrpcDataService.java
+++ b/runners/java-fn-execution/src/main/java/org/apache/beam/runners/fnexecution/data/GrpcDataService.java
@@ -30,14 +30,14 @@
 import org.apache.beam.model.fnexecution.v1.BeamFnDataGrpc;
 import org.apache.beam.runners.fnexecution.FnService;
 import org.apache.beam.sdk.coders.Coder;
-import org.apache.beam.sdk.fn.data.BeamFnDataBufferingOutboundObserver;
-import org.apache.beam.sdk.fn.data.BeamFnDataGrpcMultiplexer;
-import org.apache.beam.sdk.fn.data.BeamFnDataInboundObserver;
-import org.apache.beam.sdk.fn.data.CloseableFnDataReceiver;
-import org.apache.beam.sdk.fn.data.FnDataReceiver;
-import org.apache.beam.sdk.fn.data.InboundDataClient;
-import org.apache.beam.sdk.fn.data.LogicalEndpoint;
 import org.apache.beam.sdk.util.WindowedValue;
+import org.apache.beam.util.fn.data.BeamFnDataBufferingOutboundObserver;
+import org.apache.beam.util.fn.data.BeamFnDataGrpcMultiplexer;
+import org.apache.beam.util.fn.data.BeamFnDataInboundObserver;
+import org.apache.beam.util.fn.data.CloseableFnDataReceiver;
+import org.apache.beam.util.fn.data.FnDataReceiver;
+import org.apache.beam.util.fn.data.InboundDataClient;
+import org.apache.beam.util.fn.data.LogicalEndpoint;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/runners/java-fn-execution/src/test/java/org/apache/beam/runners/fnexecution/InProcessSdkHarness.java b/runners/java-fn-execution/src/test/java/org/apache/beam/runners/fnexecution/InProcessSdkHarness.java
index 530b919187a..6729c12d757 100644
--- a/runners/java-fn-execution/src/test/java/org/apache/beam/runners/fnexecution/InProcessSdkHarness.java
+++ b/runners/java-fn-execution/src/test/java/org/apache/beam/runners/fnexecution/InProcessSdkHarness.java
@@ -33,9 +33,9 @@
 import org.apache.beam.runners.fnexecution.data.GrpcDataService;
 import org.apache.beam.runners.fnexecution.logging.GrpcLoggingService;
 import org.apache.beam.runners.fnexecution.logging.Slf4jLogWriter;
-import org.apache.beam.sdk.fn.channel.ManagedChannelFactory;
-import org.apache.beam.sdk.fn.stream.StreamObserverFactory;
 import org.apache.beam.sdk.options.PipelineOptionsFactory;
+import org.apache.beam.util.fn.channel.ManagedChannelFactory;
+import org.apache.beam.util.fn.stream.StreamObserverFactory;
 import org.junit.rules.ExternalResource;
 import org.junit.rules.TestRule;
 
diff --git a/runners/java-fn-execution/src/test/java/org/apache/beam/runners/fnexecution/ServerFactoryTest.java b/runners/java-fn-execution/src/test/java/org/apache/beam/runners/fnexecution/ServerFactoryTest.java
index 6ba9da5ffb9..a9cb75c6ad2 100644
--- a/runners/java-fn-execution/src/test/java/org/apache/beam/runners/fnexecution/ServerFactoryTest.java
+++ b/runners/java-fn-execution/src/test/java/org/apache/beam/runners/fnexecution/ServerFactoryTest.java
@@ -42,8 +42,8 @@
 import org.apache.beam.model.fnexecution.v1.BeamFnApi.Elements;
 import org.apache.beam.model.fnexecution.v1.BeamFnDataGrpc;
 import org.apache.beam.model.pipeline.v1.Endpoints;
-import org.apache.beam.sdk.fn.channel.ManagedChannelFactory;
-import org.apache.beam.sdk.fn.test.TestStreams;
+import org.apache.beam.util.fn.channel.ManagedChannelFactory;
+import org.apache.beam.util.fn.test.TestStreams;
 import org.junit.Test;
 
 /**
diff --git a/runners/java-fn-execution/src/test/java/org/apache/beam/runners/fnexecution/control/RemoteExecutionTest.java b/runners/java-fn-execution/src/test/java/org/apache/beam/runners/fnexecution/control/RemoteExecutionTest.java
index 962cb790b27..df56eb8ff25 100644
--- a/runners/java-fn-execution/src/test/java/org/apache/beam/runners/fnexecution/control/RemoteExecutionTest.java
+++ b/runners/java-fn-execution/src/test/java/org/apache/beam/runners/fnexecution/control/RemoteExecutionTest.java
@@ -63,8 +63,6 @@
 import org.apache.beam.sdk.coders.CoderException;
 import org.apache.beam.sdk.coders.KvCoder;
 import org.apache.beam.sdk.coders.StringUtf8Coder;
-import org.apache.beam.sdk.fn.channel.ManagedChannelFactory;
-import org.apache.beam.sdk.fn.stream.StreamObserverFactory;
 import org.apache.beam.sdk.options.PipelineOptionsFactory;
 import org.apache.beam.sdk.transforms.DoFn;
 import org.apache.beam.sdk.transforms.GroupByKey;
@@ -74,6 +72,8 @@
 import org.apache.beam.sdk.util.CoderUtils;
 import org.apache.beam.sdk.util.WindowedValue;
 import org.apache.beam.sdk.values.KV;
+import org.apache.beam.util.fn.channel.ManagedChannelFactory;
+import org.apache.beam.util.fn.stream.StreamObserverFactory;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
diff --git a/runners/java-fn-execution/src/test/java/org/apache/beam/runners/fnexecution/control/SdkHarnessClientTest.java b/runners/java-fn-execution/src/test/java/org/apache/beam/runners/fnexecution/control/SdkHarnessClientTest.java
index dc97cebb1d1..1bf4a746d32 100644
--- a/runners/java-fn-execution/src/test/java/org/apache/beam/runners/fnexecution/control/SdkHarnessClientTest.java
+++ b/runners/java-fn-execution/src/test/java/org/apache/beam/runners/fnexecution/control/SdkHarnessClientTest.java
@@ -58,11 +58,6 @@
 import org.apache.beam.sdk.coders.LengthPrefixCoder;
 import org.apache.beam.sdk.coders.StringUtf8Coder;
 import org.apache.beam.sdk.coders.VarIntCoder;
-import org.apache.beam.sdk.fn.data.CloseableFnDataReceiver;
-import org.apache.beam.sdk.fn.data.FnDataReceiver;
-import org.apache.beam.sdk.fn.data.InboundDataClient;
-import org.apache.beam.sdk.fn.data.RemoteGrpcPortRead;
-import org.apache.beam.sdk.fn.data.RemoteGrpcPortWrite;
 import org.apache.beam.sdk.transforms.Create;
 import org.apache.beam.sdk.transforms.DoFn;
 import org.apache.beam.sdk.transforms.ParDo;
@@ -72,6 +67,11 @@
 import org.apache.beam.sdk.util.WindowedValue.FullWindowedValueCoder;
 import org.apache.beam.sdk.values.TupleTag;
 import org.apache.beam.sdk.values.TupleTagList;
+import org.apache.beam.util.fn.data.CloseableFnDataReceiver;
+import org.apache.beam.util.fn.data.FnDataReceiver;
+import org.apache.beam.util.fn.data.InboundDataClient;
+import org.apache.beam.util.fn.data.RemoteGrpcPortRead;
+import org.apache.beam.util.fn.data.RemoteGrpcPortWrite;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
diff --git a/runners/java-fn-execution/src/test/java/org/apache/beam/runners/fnexecution/data/GrpcDataServiceTest.java b/runners/java-fn-execution/src/test/java/org/apache/beam/runners/fnexecution/data/GrpcDataServiceTest.java
index d07250ca8e4..50325eaff76 100644
--- a/runners/java-fn-execution/src/test/java/org/apache/beam/runners/fnexecution/data/GrpcDataServiceTest.java
+++ b/runners/java-fn-execution/src/test/java/org/apache/beam/runners/fnexecution/data/GrpcDataServiceTest.java
@@ -45,11 +45,11 @@
 import org.apache.beam.sdk.coders.CoderException;
 import org.apache.beam.sdk.coders.LengthPrefixCoder;
 import org.apache.beam.sdk.coders.StringUtf8Coder;
-import org.apache.beam.sdk.fn.data.CloseableFnDataReceiver;
-import org.apache.beam.sdk.fn.data.InboundDataClient;
-import org.apache.beam.sdk.fn.data.LogicalEndpoint;
-import org.apache.beam.sdk.fn.test.TestStreams;
 import org.apache.beam.sdk.util.WindowedValue;
+import org.apache.beam.util.fn.data.CloseableFnDataReceiver;
+import org.apache.beam.util.fn.data.InboundDataClient;
+import org.apache.beam.util.fn.data.LogicalEndpoint;
+import org.apache.beam.util.fn.test.TestStreams;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
diff --git a/runners/java-fn-execution/src/test/java/org/apache/beam/runners/fnexecution/logging/GrpcLoggingServiceTest.java b/runners/java-fn-execution/src/test/java/org/apache/beam/runners/fnexecution/logging/GrpcLoggingServiceTest.java
index b49d6093a40..afa38407995 100644
--- a/runners/java-fn-execution/src/test/java/org/apache/beam/runners/fnexecution/logging/GrpcLoggingServiceTest.java
+++ b/runners/java-fn-execution/src/test/java/org/apache/beam/runners/fnexecution/logging/GrpcLoggingServiceTest.java
@@ -40,7 +40,7 @@
 import org.apache.beam.model.fnexecution.v1.BeamFnLoggingGrpc;
 import org.apache.beam.runners.fnexecution.GrpcFnServer;
 import org.apache.beam.runners.fnexecution.InProcessServerFactory;
-import org.apache.beam.sdk.fn.test.TestStreams;
+import org.apache.beam.util.fn.test.TestStreams;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
diff --git a/runners/java-fn-execution/src/test/java/org/apache/beam/runners/fnexecution/state/GrpcStateServiceTest.java b/runners/java-fn-execution/src/test/java/org/apache/beam/runners/fnexecution/state/GrpcStateServiceTest.java
index 07db6ee8578..6cf91d1dab3 100644
--- a/runners/java-fn-execution/src/test/java/org/apache/beam/runners/fnexecution/state/GrpcStateServiceTest.java
+++ b/runners/java-fn-execution/src/test/java/org/apache/beam/runners/fnexecution/state/GrpcStateServiceTest.java
@@ -32,7 +32,7 @@
 import java.util.concurrent.LinkedBlockingDeque;
 import java.util.concurrent.TimeUnit;
 import org.apache.beam.model.fnexecution.v1.BeamFnApi;
-import org.apache.beam.sdk.fn.test.TestStreams;
+import org.apache.beam.util.fn.test.TestStreams;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
diff --git a/sdks/java/harness/build.gradle b/sdks/java/harness/build.gradle
index 9825fb8b58e..77461d2027a 100644
--- a/sdks/java/harness/build.gradle
+++ b/sdks/java/harness/build.gradle
@@ -29,13 +29,13 @@ description = "Apache Beam :: SDKs :: Java :: Harness"
  * TODO: Swap to generating test artifacts which we can then rely on instead of
  * the test outputs directly.
  */
-evaluationDependsOn(":sdks:java:fn-execution")
+evaluationDependsOn(":util:java:fn-execution")
 
 dependencies {
   compile project(path: ":model:pipeline", configuration: "shadow")
   compile project(path: ":model:fn-execution", configuration: "shadow")
   compile project(path: ":sdks:java:core", configuration: "shadow")
-  compile project(path: ":sdks:java:fn-execution", configuration: "shadow")
+  compile project(path: ":util:java:fn-execution", configuration: "shadow")
   compile project(path: ":sdks:java:extensions:google-cloud-platform-core", configuration: "shadow")
   compile project(path: ":runners:core-java", configuration: "shadow")
   compile project(path: ":runners:core-construction-java", configuration: "shadow")
diff --git a/sdks/java/harness/pom.xml b/sdks/java/harness/pom.xml
index e1f010a7098..3dd8744980d 100644
--- a/sdks/java/harness/pom.xml
+++ b/sdks/java/harness/pom.xml
@@ -153,7 +153,7 @@
 
     <dependency>
       <groupId>org.apache.beam</groupId>
-      <artifactId>beam-sdks-java-fn-execution</artifactId>
+      <artifactId>beam-util-java-fn-execution</artifactId>
     </dependency>
 
     <dependency>
diff --git a/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/BeamFnDataReadRunner.java b/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/BeamFnDataReadRunner.java
index 4324bf4cb48..a65a3fb2b3d 100644
--- a/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/BeamFnDataReadRunner.java
+++ b/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/BeamFnDataReadRunner.java
@@ -42,12 +42,12 @@
 import org.apache.beam.runners.core.construction.CoderTranslation;
 import org.apache.beam.runners.core.construction.RehydratedComponents;
 import org.apache.beam.sdk.coders.Coder;
-import org.apache.beam.sdk.fn.data.FnDataReceiver;
-import org.apache.beam.sdk.fn.data.InboundDataClient;
-import org.apache.beam.sdk.fn.data.LogicalEndpoint;
-import org.apache.beam.sdk.fn.data.RemoteGrpcPortRead;
 import org.apache.beam.sdk.options.PipelineOptions;
 import org.apache.beam.sdk.util.WindowedValue;
+import org.apache.beam.util.fn.data.FnDataReceiver;
+import org.apache.beam.util.fn.data.InboundDataClient;
+import org.apache.beam.util.fn.data.LogicalEndpoint;
+import org.apache.beam.util.fn.data.RemoteGrpcPortRead;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/BeamFnDataWriteRunner.java b/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/BeamFnDataWriteRunner.java
index 09bbc6330af..3f8bd752c44 100644
--- a/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/BeamFnDataWriteRunner.java
+++ b/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/BeamFnDataWriteRunner.java
@@ -40,12 +40,12 @@
 import org.apache.beam.runners.core.construction.CoderTranslation;
 import org.apache.beam.runners.core.construction.RehydratedComponents;
 import org.apache.beam.sdk.coders.Coder;
-import org.apache.beam.sdk.fn.data.CloseableFnDataReceiver;
-import org.apache.beam.sdk.fn.data.FnDataReceiver;
-import org.apache.beam.sdk.fn.data.LogicalEndpoint;
-import org.apache.beam.sdk.fn.data.RemoteGrpcPortWrite;
 import org.apache.beam.sdk.options.PipelineOptions;
 import org.apache.beam.sdk.util.WindowedValue;
+import org.apache.beam.util.fn.data.CloseableFnDataReceiver;
+import org.apache.beam.util.fn.data.FnDataReceiver;
+import org.apache.beam.util.fn.data.LogicalEndpoint;
+import org.apache.beam.util.fn.data.RemoteGrpcPortWrite;
 
 /**
  * Registers as a consumer with the Beam Fn Data Api. Consumes elements and encodes them for
diff --git a/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/BoundedSourceRunner.java b/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/BoundedSourceRunner.java
index f09c77d4ee0..85a54274275 100644
--- a/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/BoundedSourceRunner.java
+++ b/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/BoundedSourceRunner.java
@@ -39,12 +39,12 @@
 import org.apache.beam.model.pipeline.v1.RunnerApi.ReadPayload;
 import org.apache.beam.runners.core.construction.PTransformTranslation;
 import org.apache.beam.runners.core.construction.ReadTranslation;
-import org.apache.beam.sdk.fn.data.FnDataReceiver;
 import org.apache.beam.sdk.io.BoundedSource;
 import org.apache.beam.sdk.io.Source.Reader;
 import org.apache.beam.sdk.options.PipelineOptions;
 import org.apache.beam.sdk.util.SerializableUtils;
 import org.apache.beam.sdk.util.WindowedValue;
+import org.apache.beam.util.fn.data.FnDataReceiver;
 
 /**
  * A runner which creates {@link Reader}s for each {@link BoundedSource} sent as an input and
diff --git a/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/FlattenRunner.java b/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/FlattenRunner.java
index 840c9106a27..8b31fd404da 100644
--- a/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/FlattenRunner.java
+++ b/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/FlattenRunner.java
@@ -35,9 +35,9 @@
 import org.apache.beam.model.pipeline.v1.RunnerApi.Coder;
 import org.apache.beam.model.pipeline.v1.RunnerApi.PCollection;
 import org.apache.beam.runners.core.construction.PTransformTranslation;
-import org.apache.beam.sdk.fn.data.FnDataReceiver;
 import org.apache.beam.sdk.options.PipelineOptions;
 import org.apache.beam.sdk.util.WindowedValue;
+import org.apache.beam.util.fn.data.FnDataReceiver;
 
 /** Executes flatten PTransforms. */
 public class FlattenRunner<InputT>{
diff --git a/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/FnApiDoFnRunner.java b/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/FnApiDoFnRunner.java
index f7dcb650b4b..01e9db48ef1 100644
--- a/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/FnApiDoFnRunner.java
+++ b/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/FnApiDoFnRunner.java
@@ -60,7 +60,6 @@
 import org.apache.beam.runners.core.construction.RehydratedComponents;
 import org.apache.beam.sdk.coders.Coder;
 import org.apache.beam.sdk.coders.KvCoder;
-import org.apache.beam.sdk.fn.data.FnDataReceiver;
 import org.apache.beam.sdk.options.PipelineOptions;
 import org.apache.beam.sdk.state.BagState;
 import org.apache.beam.sdk.state.CombiningState;
@@ -103,6 +102,7 @@
 import org.apache.beam.sdk.values.PCollectionView;
 import org.apache.beam.sdk.values.TupleTag;
 import org.apache.beam.sdk.values.WindowingStrategy;
+import org.apache.beam.util.fn.data.FnDataReceiver;
 import org.joda.time.Instant;
 
 /**
diff --git a/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/FnHarness.java b/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/FnHarness.java
index 7c2ffe75c88..ffb8c17cae4 100644
--- a/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/FnHarness.java
+++ b/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/FnHarness.java
@@ -35,11 +35,11 @@
 import org.apache.beam.model.fnexecution.v1.BeamFnApi.InstructionResponse.Builder;
 import org.apache.beam.model.pipeline.v1.Endpoints;
 import org.apache.beam.sdk.extensions.gcp.options.GcsOptions;
-import org.apache.beam.sdk.fn.channel.ManagedChannelFactory;
-import org.apache.beam.sdk.fn.stream.StreamObserverFactory;
 import org.apache.beam.sdk.options.ExperimentalOptions;
 import org.apache.beam.sdk.options.PipelineOptions;
 import org.apache.beam.sdk.util.common.ReflectHelpers;
+import org.apache.beam.util.fn.channel.ManagedChannelFactory;
+import org.apache.beam.util.fn.stream.StreamObserverFactory;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/MapFnRunner.java b/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/MapFnRunner.java
index 33b37878658..bf6cf9159c2 100644
--- a/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/MapFnRunner.java
+++ b/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/MapFnRunner.java
@@ -35,9 +35,9 @@
 import org.apache.beam.model.pipeline.v1.RunnerApi;
 import org.apache.beam.model.pipeline.v1.RunnerApi.PCollection;
 import org.apache.beam.model.pipeline.v1.RunnerApi.PTransform;
-import org.apache.beam.sdk.fn.data.FnDataReceiver;
 import org.apache.beam.sdk.options.PipelineOptions;
 import org.apache.beam.sdk.util.WindowedValue;
+import org.apache.beam.util.fn.data.FnDataReceiver;
 
 /**
  * A {@code PTransformRunner} which executes simple map functions.
diff --git a/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/PTransformRunnerFactory.java b/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/PTransformRunnerFactory.java
index a432332d84d..ff06d3e49c6 100644
--- a/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/PTransformRunnerFactory.java
+++ b/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/PTransformRunnerFactory.java
@@ -29,9 +29,9 @@
 import org.apache.beam.model.pipeline.v1.RunnerApi.Coder;
 import org.apache.beam.model.pipeline.v1.RunnerApi.PCollection;
 import org.apache.beam.model.pipeline.v1.RunnerApi.PTransform;
-import org.apache.beam.sdk.fn.data.FnDataReceiver;
 import org.apache.beam.sdk.options.PipelineOptions;
 import org.apache.beam.sdk.util.WindowedValue;
+import org.apache.beam.util.fn.data.FnDataReceiver;
 
 /**
  * A factory able to instantiate an appropriate handler for a given PTransform.
diff --git a/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/control/BeamFnControlClient.java b/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/control/BeamFnControlClient.java
index 730a865c86b..2af164b61c7 100644
--- a/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/control/BeamFnControlClient.java
+++ b/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/control/BeamFnControlClient.java
@@ -36,7 +36,7 @@
 import org.apache.beam.model.fnexecution.v1.BeamFnApi.InstructionRequest;
 import org.apache.beam.model.fnexecution.v1.BeamFnControlGrpc;
 import org.apache.beam.model.pipeline.v1.Endpoints;
-import org.apache.beam.sdk.fn.stream.StreamObserverFactory.StreamObserverClientFactory;
+import org.apache.beam.util.fn.stream.StreamObserverFactory.StreamObserverClientFactory;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/control/ProcessBundleHandler.java b/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/control/ProcessBundleHandler.java
index 0d2e0d0f384..493fbffd99d 100644
--- a/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/control/ProcessBundleHandler.java
+++ b/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/control/ProcessBundleHandler.java
@@ -53,10 +53,10 @@
 import org.apache.beam.model.pipeline.v1.RunnerApi.Coder;
 import org.apache.beam.model.pipeline.v1.RunnerApi.PCollection;
 import org.apache.beam.runners.core.construction.PTransformTranslation;
-import org.apache.beam.sdk.fn.data.FnDataReceiver;
 import org.apache.beam.sdk.options.PipelineOptions;
 import org.apache.beam.sdk.util.WindowedValue;
 import org.apache.beam.sdk.util.common.ReflectHelpers;
+import org.apache.beam.util.fn.data.FnDataReceiver;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/data/BeamFnDataBufferingOutboundObserver.java b/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/data/BeamFnDataBufferingOutboundObserver.java
index 51856c3a8c5..31ba93ada4c 100644
--- a/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/data/BeamFnDataBufferingOutboundObserver.java
+++ b/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/data/BeamFnDataBufferingOutboundObserver.java
@@ -25,12 +25,12 @@
 import java.util.function.Consumer;
 import org.apache.beam.model.fnexecution.v1.BeamFnApi;
 import org.apache.beam.sdk.coders.Coder;
-import org.apache.beam.sdk.fn.data.CloseableFnDataReceiver;
-import org.apache.beam.sdk.fn.data.LogicalEndpoint;
 import org.apache.beam.sdk.options.ExperimentalOptions;
 import org.apache.beam.sdk.options.PipelineOptions;
 import org.apache.beam.sdk.util.BufferedElementCountingOutputStream;
 import org.apache.beam.sdk.util.WindowedValue;
+import org.apache.beam.util.fn.data.CloseableFnDataReceiver;
+import org.apache.beam.util.fn.data.LogicalEndpoint;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/data/BeamFnDataClient.java b/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/data/BeamFnDataClient.java
index c6ad95c1f67..2618a7e7105 100644
--- a/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/data/BeamFnDataClient.java
+++ b/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/data/BeamFnDataClient.java
@@ -21,11 +21,11 @@
 import org.apache.beam.model.pipeline.v1.Endpoints;
 import org.apache.beam.model.pipeline.v1.Endpoints.ApiServiceDescriptor;
 import org.apache.beam.sdk.coders.Coder;
-import org.apache.beam.sdk.fn.data.CloseableFnDataReceiver;
-import org.apache.beam.sdk.fn.data.FnDataReceiver;
-import org.apache.beam.sdk.fn.data.InboundDataClient;
-import org.apache.beam.sdk.fn.data.LogicalEndpoint;
 import org.apache.beam.sdk.util.WindowedValue;
+import org.apache.beam.util.fn.data.CloseableFnDataReceiver;
+import org.apache.beam.util.fn.data.FnDataReceiver;
+import org.apache.beam.util.fn.data.InboundDataClient;
+import org.apache.beam.util.fn.data.LogicalEndpoint;
 
 /**
  * The {@link BeamFnDataClient} is able to forward inbound elements to a {@link FnDataReceiver} and
diff --git a/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/data/BeamFnDataGrpcClient.java b/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/data/BeamFnDataGrpcClient.java
index 6a4e492d3bc..f1d2e4df5ca 100644
--- a/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/data/BeamFnDataGrpcClient.java
+++ b/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/data/BeamFnDataGrpcClient.java
@@ -29,15 +29,15 @@
 import org.apache.beam.model.pipeline.v1.Endpoints;
 import org.apache.beam.model.pipeline.v1.Endpoints.ApiServiceDescriptor;
 import org.apache.beam.sdk.coders.Coder;
-import org.apache.beam.sdk.fn.data.BeamFnDataGrpcMultiplexer;
-import org.apache.beam.sdk.fn.data.BeamFnDataInboundObserver;
-import org.apache.beam.sdk.fn.data.CloseableFnDataReceiver;
-import org.apache.beam.sdk.fn.data.FnDataReceiver;
-import org.apache.beam.sdk.fn.data.InboundDataClient;
-import org.apache.beam.sdk.fn.data.LogicalEndpoint;
-import org.apache.beam.sdk.fn.stream.StreamObserverFactory.StreamObserverClientFactory;
 import org.apache.beam.sdk.options.PipelineOptions;
 import org.apache.beam.sdk.util.WindowedValue;
+import org.apache.beam.util.fn.data.BeamFnDataGrpcMultiplexer;
+import org.apache.beam.util.fn.data.BeamFnDataInboundObserver;
+import org.apache.beam.util.fn.data.CloseableFnDataReceiver;
+import org.apache.beam.util.fn.data.FnDataReceiver;
+import org.apache.beam.util.fn.data.InboundDataClient;
+import org.apache.beam.util.fn.data.LogicalEndpoint;
+import org.apache.beam.util.fn.stream.StreamObserverFactory.StreamObserverClientFactory;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/data/MultiplexingFnDataReceiver.java b/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/data/MultiplexingFnDataReceiver.java
index 95a9cc920ad..4f9ffd70b50 100644
--- a/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/data/MultiplexingFnDataReceiver.java
+++ b/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/data/MultiplexingFnDataReceiver.java
@@ -20,7 +20,7 @@
 
 import com.google.common.collect.Iterables;
 import java.util.Collection;
-import org.apache.beam.sdk.fn.data.FnDataReceiver;
+import org.apache.beam.util.fn.data.FnDataReceiver;
 
 /**
  * A {@link FnDataReceiver} which forwards all received inputs to a collection of {@link
diff --git a/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/state/BagUserState.java b/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/state/BagUserState.java
index 1b08e588da4..1fff76dec29 100644
--- a/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/state/BagUserState.java
+++ b/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/state/BagUserState.java
@@ -28,7 +28,7 @@
 import org.apache.beam.model.fnexecution.v1.BeamFnApi.StateClearRequest;
 import org.apache.beam.model.fnexecution.v1.BeamFnApi.StateRequest;
 import org.apache.beam.sdk.coders.Coder;
-import org.apache.beam.sdk.fn.stream.DataStreams;
+import org.apache.beam.util.fn.stream.DataStreams;
 
 /**
  * An implementation of a bag user state that utilizes the Beam Fn State API to fetch, clear
diff --git a/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/state/BeamFnStateGrpcClientCache.java b/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/state/BeamFnStateGrpcClientCache.java
index 457d5703d33..549069a1c4e 100644
--- a/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/state/BeamFnStateGrpcClientCache.java
+++ b/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/state/BeamFnStateGrpcClientCache.java
@@ -33,8 +33,8 @@
 import org.apache.beam.model.fnexecution.v1.BeamFnStateGrpc;
 import org.apache.beam.model.pipeline.v1.Endpoints;
 import org.apache.beam.model.pipeline.v1.Endpoints.ApiServiceDescriptor;
-import org.apache.beam.sdk.fn.stream.StreamObserverFactory.StreamObserverClientFactory;
 import org.apache.beam.sdk.options.PipelineOptions;
+import org.apache.beam.util.fn.stream.StreamObserverFactory.StreamObserverClientFactory;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/state/MultimapSideInput.java b/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/state/MultimapSideInput.java
index 874d0fc68ee..a77a1aac1db 100644
--- a/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/state/MultimapSideInput.java
+++ b/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/state/MultimapSideInput.java
@@ -21,8 +21,8 @@
 import java.io.IOException;
 import org.apache.beam.model.fnexecution.v1.BeamFnApi.StateRequest;
 import org.apache.beam.sdk.coders.Coder;
-import org.apache.beam.sdk.fn.stream.DataStreams;
 import org.apache.beam.sdk.transforms.Materializations.MultimapView;
+import org.apache.beam.util.fn.stream.DataStreams;
 
 /**
  * An implementation of a multimap side input that utilizes the Beam Fn State API to fetch values.
diff --git a/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/stream/HarnessStreamObserverFactories.java b/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/stream/HarnessStreamObserverFactories.java
index 0ef5f448d5a..aa987f1a003 100644
--- a/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/stream/HarnessStreamObserverFactories.java
+++ b/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/stream/HarnessStreamObserverFactories.java
@@ -21,16 +21,16 @@
 import io.grpc.stub.StreamObserver;
 import java.util.List;
 import org.apache.beam.sdk.extensions.gcp.options.GcsOptions;
-import org.apache.beam.sdk.fn.stream.StreamObserverFactory;
 import org.apache.beam.sdk.options.ExperimentalOptions;
 import org.apache.beam.sdk.options.PipelineOptions;
+import org.apache.beam.util.fn.stream.StreamObserverFactory;
 
 /**
  * Uses {@link PipelineOptions} to configure which underlying {@link StreamObserver} implementation
  * to use in the java SDK harness.
  */
 public abstract class HarnessStreamObserverFactories {
-  public static org.apache.beam.sdk.fn.stream.StreamObserverFactory fromOptions(
+  public static StreamObserverFactory fromOptions(
       PipelineOptions options) {
     List<String> experiments = options.as(ExperimentalOptions.class).getExperiments();
     if (experiments != null && experiments.contains("beam_fn_api_buffered_stream")) {
diff --git a/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/BeamFnDataReadRunnerTest.java b/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/BeamFnDataReadRunnerTest.java
index 748a7f2e806..1999036d935 100644
--- a/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/BeamFnDataReadRunnerTest.java
+++ b/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/BeamFnDataReadRunnerTest.java
@@ -54,16 +54,16 @@
 import org.apache.beam.runners.core.construction.CoderTranslation;
 import org.apache.beam.sdk.coders.Coder;
 import org.apache.beam.sdk.coders.StringUtf8Coder;
-import org.apache.beam.sdk.fn.data.CompletableFutureInboundDataClient;
-import org.apache.beam.sdk.fn.data.FnDataReceiver;
-import org.apache.beam.sdk.fn.data.InboundDataClient;
-import org.apache.beam.sdk.fn.data.LogicalEndpoint;
-import org.apache.beam.sdk.fn.data.RemoteGrpcPortRead;
-import org.apache.beam.sdk.fn.test.TestExecutors;
-import org.apache.beam.sdk.fn.test.TestExecutors.TestExecutorService;
 import org.apache.beam.sdk.options.PipelineOptionsFactory;
 import org.apache.beam.sdk.transforms.windowing.GlobalWindow;
 import org.apache.beam.sdk.util.WindowedValue;
+import org.apache.beam.util.fn.data.CompletableFutureInboundDataClient;
+import org.apache.beam.util.fn.data.FnDataReceiver;
+import org.apache.beam.util.fn.data.InboundDataClient;
+import org.apache.beam.util.fn.data.LogicalEndpoint;
+import org.apache.beam.util.fn.data.RemoteGrpcPortRead;
+import org.apache.beam.util.fn.test.TestExecutors;
+import org.apache.beam.util.fn.test.TestExecutors.TestExecutorService;
 import org.hamcrest.collection.IsMapContaining;
 import org.junit.Before;
 import org.junit.Rule;
diff --git a/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/BeamFnDataWriteRunnerTest.java b/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/BeamFnDataWriteRunnerTest.java
index 68d42894ea1..835a930c5d7 100644
--- a/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/BeamFnDataWriteRunnerTest.java
+++ b/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/BeamFnDataWriteRunnerTest.java
@@ -53,13 +53,13 @@
 import org.apache.beam.runners.core.construction.CoderTranslation;
 import org.apache.beam.sdk.coders.Coder;
 import org.apache.beam.sdk.coders.StringUtf8Coder;
-import org.apache.beam.sdk.fn.data.CloseableFnDataReceiver;
-import org.apache.beam.sdk.fn.data.FnDataReceiver;
-import org.apache.beam.sdk.fn.data.LogicalEndpoint;
-import org.apache.beam.sdk.fn.data.RemoteGrpcPortWrite;
 import org.apache.beam.sdk.options.PipelineOptionsFactory;
 import org.apache.beam.sdk.transforms.windowing.GlobalWindow;
 import org.apache.beam.sdk.util.WindowedValue;
+import org.apache.beam.util.fn.data.CloseableFnDataReceiver;
+import org.apache.beam.util.fn.data.FnDataReceiver;
+import org.apache.beam.util.fn.data.LogicalEndpoint;
+import org.apache.beam.util.fn.data.RemoteGrpcPortWrite;
 import org.hamcrest.collection.IsMapContaining;
 import org.junit.Before;
 import org.junit.Test;
diff --git a/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/BoundedSourceRunnerTest.java b/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/BoundedSourceRunnerTest.java
index 4189f9b7aa2..6ac8ff8f5be 100644
--- a/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/BoundedSourceRunnerTest.java
+++ b/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/BoundedSourceRunnerTest.java
@@ -40,12 +40,12 @@
 import org.apache.beam.fn.harness.control.ProcessBundleHandler;
 import org.apache.beam.fn.harness.fn.ThrowingRunnable;
 import org.apache.beam.model.pipeline.v1.RunnerApi;
-import org.apache.beam.sdk.fn.data.FnDataReceiver;
 import org.apache.beam.sdk.io.BoundedSource;
 import org.apache.beam.sdk.io.CountingSource;
 import org.apache.beam.sdk.options.PipelineOptionsFactory;
 import org.apache.beam.sdk.util.SerializableUtils;
 import org.apache.beam.sdk.util.WindowedValue;
+import org.apache.beam.util.fn.data.FnDataReceiver;
 import org.hamcrest.Matchers;
 import org.hamcrest.collection.IsMapContaining;
 import org.junit.Test;
diff --git a/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/FlattenRunnerTest.java b/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/FlattenRunnerTest.java
index e6f849c23ca..cacf9df30b6 100644
--- a/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/FlattenRunnerTest.java
+++ b/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/FlattenRunnerTest.java
@@ -32,9 +32,9 @@
 import java.util.List;
 import org.apache.beam.model.pipeline.v1.RunnerApi;
 import org.apache.beam.runners.core.construction.PTransformTranslation;
-import org.apache.beam.sdk.fn.data.FnDataReceiver;
 import org.apache.beam.sdk.options.PipelineOptionsFactory;
 import org.apache.beam.sdk.util.WindowedValue;
+import org.apache.beam.util.fn.data.FnDataReceiver;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
diff --git a/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/FnApiDoFnRunnerTest.java b/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/FnApiDoFnRunnerTest.java
index 22bcebd842e..d4da67d77a6 100644
--- a/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/FnApiDoFnRunnerTest.java
+++ b/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/FnApiDoFnRunnerTest.java
@@ -51,7 +51,6 @@
 import org.apache.beam.sdk.Pipeline;
 import org.apache.beam.sdk.coders.KvCoder;
 import org.apache.beam.sdk.coders.StringUtf8Coder;
-import org.apache.beam.sdk.fn.data.FnDataReceiver;
 import org.apache.beam.sdk.options.PipelineOptionsFactory;
 import org.apache.beam.sdk.state.BagState;
 import org.apache.beam.sdk.state.CombiningState;
@@ -80,6 +79,7 @@
 import org.apache.beam.sdk.values.PCollectionView;
 import org.apache.beam.sdk.values.TupleTag;
 import org.apache.beam.sdk.values.WindowingStrategy;
+import org.apache.beam.util.fn.data.FnDataReceiver;
 import org.hamcrest.collection.IsMapContaining;
 import org.joda.time.Duration;
 import org.joda.time.Instant;
diff --git a/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/FnHarnessTest.java b/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/FnHarnessTest.java
index 0e68f6d8dd1..11c8b76fff2 100644
--- a/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/FnHarnessTest.java
+++ b/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/FnHarnessTest.java
@@ -36,9 +36,9 @@
 import org.apache.beam.model.fnexecution.v1.BeamFnLoggingGrpc;
 import org.apache.beam.model.pipeline.v1.Endpoints;
 import org.apache.beam.sdk.extensions.gcp.options.GcsOptions;
-import org.apache.beam.sdk.fn.test.TestStreams;
 import org.apache.beam.sdk.options.PipelineOptions;
 import org.apache.beam.sdk.options.PipelineOptionsFactory;
+import org.apache.beam.util.fn.test.TestStreams;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
diff --git a/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/MapFnRunnerTest.java b/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/MapFnRunnerTest.java
index 09b9b6b7297..4be82634696 100644
--- a/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/MapFnRunnerTest.java
+++ b/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/MapFnRunnerTest.java
@@ -36,9 +36,9 @@
 import org.apache.beam.fn.harness.fn.ThrowingRunnable;
 import org.apache.beam.model.pipeline.v1.RunnerApi;
 import org.apache.beam.model.pipeline.v1.RunnerApi.PTransform;
-import org.apache.beam.sdk.fn.data.FnDataReceiver;
 import org.apache.beam.sdk.options.PipelineOptionsFactory;
 import org.apache.beam.sdk.util.WindowedValue;
+import org.apache.beam.util.fn.data.FnDataReceiver;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
diff --git a/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/control/BeamFnControlClientTest.java b/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/control/BeamFnControlClientTest.java
index 620dca6e496..d2a08cb7813 100644
--- a/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/control/BeamFnControlClientTest.java
+++ b/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/control/BeamFnControlClientTest.java
@@ -40,8 +40,8 @@
 import org.apache.beam.model.fnexecution.v1.BeamFnApi;
 import org.apache.beam.model.fnexecution.v1.BeamFnControlGrpc;
 import org.apache.beam.model.pipeline.v1.Endpoints;
-import org.apache.beam.sdk.fn.stream.StreamObserverFactory.StreamObserverClientFactory;
-import org.apache.beam.sdk.fn.test.TestStreams;
+import org.apache.beam.util.fn.stream.StreamObserverFactory.StreamObserverClientFactory;
+import org.apache.beam.util.fn.test.TestStreams;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
diff --git a/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/control/ProcessBundleHandlerTest.java b/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/control/ProcessBundleHandlerTest.java
index b8cd7066a75..4dcb5445b1d 100644
--- a/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/control/ProcessBundleHandlerTest.java
+++ b/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/control/ProcessBundleHandlerTest.java
@@ -52,10 +52,10 @@
 import org.apache.beam.model.pipeline.v1.RunnerApi.Coder;
 import org.apache.beam.model.pipeline.v1.RunnerApi.PCollection;
 import org.apache.beam.model.pipeline.v1.RunnerApi.PTransform;
-import org.apache.beam.sdk.fn.data.FnDataReceiver;
 import org.apache.beam.sdk.options.PipelineOptions;
 import org.apache.beam.sdk.options.PipelineOptionsFactory;
 import org.apache.beam.sdk.util.WindowedValue;
+import org.apache.beam.util.fn.data.FnDataReceiver;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
diff --git a/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/control/RegisterHandlerTest.java b/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/control/RegisterHandlerTest.java
index 77cd295a462..2ef46efd153 100644
--- a/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/control/RegisterHandlerTest.java
+++ b/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/control/RegisterHandlerTest.java
@@ -25,8 +25,8 @@
 import org.apache.beam.model.fnexecution.v1.BeamFnApi;
 import org.apache.beam.model.fnexecution.v1.BeamFnApi.RegisterResponse;
 import org.apache.beam.model.pipeline.v1.RunnerApi;
-import org.apache.beam.sdk.fn.test.TestExecutors;
-import org.apache.beam.sdk.fn.test.TestExecutors.TestExecutorService;
+import org.apache.beam.util.fn.test.TestExecutors;
+import org.apache.beam.util.fn.test.TestExecutors.TestExecutorService;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
diff --git a/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/data/BeamFnDataBufferingOutboundObserverTest.java b/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/data/BeamFnDataBufferingOutboundObserverTest.java
index 8f36013dc87..2aaf2af451b 100644
--- a/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/data/BeamFnDataBufferingOutboundObserverTest.java
+++ b/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/data/BeamFnDataBufferingOutboundObserverTest.java
@@ -33,11 +33,11 @@
 import org.apache.beam.sdk.coders.ByteArrayCoder;
 import org.apache.beam.sdk.coders.Coder;
 import org.apache.beam.sdk.coders.LengthPrefixCoder;
-import org.apache.beam.sdk.fn.data.CloseableFnDataReceiver;
-import org.apache.beam.sdk.fn.data.LogicalEndpoint;
-import org.apache.beam.sdk.fn.test.TestStreams;
 import org.apache.beam.sdk.options.PipelineOptionsFactory;
 import org.apache.beam.sdk.util.WindowedValue;
+import org.apache.beam.util.fn.data.CloseableFnDataReceiver;
+import org.apache.beam.util.fn.data.LogicalEndpoint;
+import org.apache.beam.util.fn.test.TestStreams;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
diff --git a/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/data/BeamFnDataGrpcClientTest.java b/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/data/BeamFnDataGrpcClientTest.java
index 9639c27fd71..5c175180a07 100644
--- a/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/data/BeamFnDataGrpcClientTest.java
+++ b/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/data/BeamFnDataGrpcClientTest.java
@@ -47,14 +47,14 @@
 import org.apache.beam.sdk.coders.Coder;
 import org.apache.beam.sdk.coders.LengthPrefixCoder;
 import org.apache.beam.sdk.coders.StringUtf8Coder;
-import org.apache.beam.sdk.fn.data.CloseableFnDataReceiver;
-import org.apache.beam.sdk.fn.data.InboundDataClient;
-import org.apache.beam.sdk.fn.data.LogicalEndpoint;
-import org.apache.beam.sdk.fn.stream.StreamObserverFactory.StreamObserverClientFactory;
-import org.apache.beam.sdk.fn.test.TestStreams;
 import org.apache.beam.sdk.options.PipelineOptionsFactory;
 import org.apache.beam.sdk.transforms.windowing.GlobalWindow;
 import org.apache.beam.sdk.util.WindowedValue;
+import org.apache.beam.util.fn.data.CloseableFnDataReceiver;
+import org.apache.beam.util.fn.data.InboundDataClient;
+import org.apache.beam.util.fn.data.LogicalEndpoint;
+import org.apache.beam.util.fn.stream.StreamObserverFactory.StreamObserverClientFactory;
+import org.apache.beam.util.fn.test.TestStreams;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
diff --git a/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/data/BeamFnDataInboundObserverTest.java b/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/data/BeamFnDataInboundObserverTest.java
index a934928d1a9..d988a04da9c 100644
--- a/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/data/BeamFnDataInboundObserverTest.java
+++ b/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/data/BeamFnDataInboundObserverTest.java
@@ -32,11 +32,11 @@
 import org.apache.beam.model.fnexecution.v1.BeamFnApi;
 import org.apache.beam.sdk.coders.Coder;
 import org.apache.beam.sdk.coders.StringUtf8Coder;
-import org.apache.beam.sdk.fn.data.BeamFnDataInboundObserver;
-import org.apache.beam.sdk.fn.data.CompletableFutureInboundDataClient;
-import org.apache.beam.sdk.fn.data.InboundDataClient;
 import org.apache.beam.sdk.transforms.windowing.GlobalWindow;
 import org.apache.beam.sdk.util.WindowedValue;
+import org.apache.beam.util.fn.data.BeamFnDataInboundObserver;
+import org.apache.beam.util.fn.data.CompletableFutureInboundDataClient;
+import org.apache.beam.util.fn.data.InboundDataClient;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.ExpectedException;
diff --git a/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/data/MultiplexingFnDataReceiverTest.java b/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/data/MultiplexingFnDataReceiverTest.java
index 3af1cdb54aa..a7340e783c5 100644
--- a/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/data/MultiplexingFnDataReceiverTest.java
+++ b/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/data/MultiplexingFnDataReceiverTest.java
@@ -27,7 +27,7 @@
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
-import org.apache.beam.sdk.fn.data.FnDataReceiver;
+import org.apache.beam.util.fn.data.FnDataReceiver;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.ExpectedException;
diff --git a/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/logging/BeamFnLoggingClientTest.java b/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/logging/BeamFnLoggingClientTest.java
index cdc8139a135..354d4e71bdd 100644
--- a/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/logging/BeamFnLoggingClientTest.java
+++ b/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/logging/BeamFnLoggingClientTest.java
@@ -44,8 +44,8 @@
 import org.apache.beam.model.fnexecution.v1.BeamFnApi;
 import org.apache.beam.model.fnexecution.v1.BeamFnLoggingGrpc;
 import org.apache.beam.model.pipeline.v1.Endpoints;
-import org.apache.beam.sdk.fn.test.TestStreams;
 import org.apache.beam.sdk.options.PipelineOptionsFactory;
+import org.apache.beam.util.fn.test.TestStreams;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.ExpectedException;
diff --git a/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/state/BeamFnStateGrpcClientCacheTest.java b/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/state/BeamFnStateGrpcClientCacheTest.java
index 05acbd69d3f..91a79aa1da1 100644
--- a/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/state/BeamFnStateGrpcClientCacheTest.java
+++ b/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/state/BeamFnStateGrpcClientCacheTest.java
@@ -43,9 +43,9 @@
 import org.apache.beam.model.fnexecution.v1.BeamFnApi.StateResponse;
 import org.apache.beam.model.fnexecution.v1.BeamFnStateGrpc;
 import org.apache.beam.model.pipeline.v1.Endpoints;
-import org.apache.beam.sdk.fn.stream.StreamObserverFactory.StreamObserverClientFactory;
-import org.apache.beam.sdk.fn.test.TestStreams;
 import org.apache.beam.sdk.options.PipelineOptionsFactory;
+import org.apache.beam.util.fn.stream.StreamObserverFactory.StreamObserverClientFactory;
+import org.apache.beam.util.fn.test.TestStreams;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
diff --git a/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/stream/HarnessStreamObserverFactoriesTest.java b/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/stream/HarnessStreamObserverFactoriesTest.java
index 22d9fcb79bc..7b3ed49e65c 100644
--- a/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/stream/HarnessStreamObserverFactoriesTest.java
+++ b/sdks/java/harness/src/test/java/org/apache/beam/fn/harness/stream/HarnessStreamObserverFactoriesTest.java
@@ -24,10 +24,10 @@
 
 import io.grpc.stub.CallStreamObserver;
 import io.grpc.stub.StreamObserver;
-import org.apache.beam.sdk.fn.stream.BufferingStreamObserver;
-import org.apache.beam.sdk.fn.stream.DirectStreamObserver;
-import org.apache.beam.sdk.fn.stream.ForwardingClientResponseObserver;
 import org.apache.beam.sdk.options.PipelineOptionsFactory;
+import org.apache.beam.util.fn.stream.BufferingStreamObserver;
+import org.apache.beam.util.fn.stream.DirectStreamObserver;
+import org.apache.beam.util.fn.stream.ForwardingClientResponseObserver;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
diff --git a/sdks/java/pom.xml b/sdks/java/pom.xml
index 25d6ff5b9ca..3e074ade68d 100644
--- a/sdks/java/pom.xml
+++ b/sdks/java/pom.xml
@@ -42,7 +42,6 @@
     <module>io</module>
     <module>maven-archetypes</module>
     <module>extensions</module>
-    <module>fn-execution</module>
     <!-- javadoc runs directly from the root parent as the last module
          in the build to be able to capture runner-specific javadoc.
     <module>javadoc</module> -->
diff --git a/settings.gradle b/settings.gradle
index e740738d9e5..cfe42d2cfad 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -49,7 +49,6 @@ include ":sdks:java:extensions:protobuf"
 include ":sdks:java:extensions:sketching"
 include ":sdks:java:extensions:sorter"
 include ":sdks:java:extensions:sql"
-include ":sdks:java:fn-execution"
 include ":sdks:java:harness"
 include ":sdks:java:io:amazon-web-services"
 include ":sdks:java:io:amqp"
@@ -81,3 +80,4 @@ include ":sdks:java:maven-archetypes:starter"
 include ":sdks:java:nexmark"
 include ":sdks:python"
 include ":sdks:python:container"
+include ":util:java:fn-execution"
diff --git a/sdks/java/fn-execution/build.gradle b/util/java/fn-execution/build.gradle
similarity index 92%
rename from sdks/java/fn-execution/build.gradle
rename to util/java/fn-execution/build.gradle
index cdf58061950..3821172577a 100644
--- a/sdks/java/fn-execution/build.gradle
+++ b/util/java/fn-execution/build.gradle
@@ -17,9 +17,9 @@
  */
 
 apply from: project(":").file("build_rules.gradle")
-applyJavaNature(artifactId: "beam-sdks-java-fn-execution")
+applyJavaNature(artifactId: "beam-util-java-fn-execution")
 
-description = "Apache Beam :: SDKs :: Java :: Fn Execution"
+description = "Apache Beam :: Util :: Java :: Fn Execution"
 
 dependencies {
   compile library.java.guava
diff --git a/sdks/java/fn-execution/pom.xml b/util/java/fn-execution/pom.xml
similarity index 90%
rename from sdks/java/fn-execution/pom.xml
rename to util/java/fn-execution/pom.xml
index 94238799d5f..3c0d3bf470b 100644
--- a/sdks/java/fn-execution/pom.xml
+++ b/util/java/fn-execution/pom.xml
@@ -21,13 +21,13 @@
 
   <parent>
     <groupId>org.apache.beam</groupId>
-    <artifactId>beam-sdks-java-parent</artifactId>
+    <artifactId>beam-util-java-parent</artifactId>
     <version>2.5.0-SNAPSHOT</version>
     <relativePath>../pom.xml</relativePath>
   </parent>
 
-  <artifactId>beam-sdks-java-fn-execution</artifactId>
-  <name>Apache Beam :: SDKs :: Java :: Fn Execution</name>
+  <artifactId>beam-util-java-fn-execution</artifactId>
+  <name>Apache Beam :: Util :: Java :: Fn Execution</name>
   <description>Contains code shared across the Beam Java SDK Harness Java Runners to execute using
     the Beam Portability Framework
   </description>
@@ -45,8 +45,9 @@
       <artifactId>beam-model-fn-execution</artifactId>
     </dependency>
 
-      <!-- The Core SDK is used for utility code and concepts shared between runner and SDK. It
-      should not be used to refer to any user-defined functions. -->
+    <!-- The Core SDK is used for utility code and concepts shared between runner and SDK. It
+    should not be used to refer to any user-defined functions. -->
+    <!-- TODO: BEAM-3966: Move core SDK utilities into the util module. -->
     <dependency>
       <groupId>org.apache.beam</groupId>
       <artifactId>beam-sdks-java-core</artifactId>
diff --git a/sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/channel/ManagedChannelFactory.java b/util/java/fn-execution/src/main/java/org/apache/beam/util/fn/channel/ManagedChannelFactory.java
similarity index 98%
rename from sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/channel/ManagedChannelFactory.java
rename to util/java/fn-execution/src/main/java/org/apache/beam/util/fn/channel/ManagedChannelFactory.java
index 0a4a35d58f1..6ebb79bc079 100644
--- a/sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/channel/ManagedChannelFactory.java
+++ b/util/java/fn-execution/src/main/java/org/apache/beam/util/fn/channel/ManagedChannelFactory.java
@@ -16,7 +16,7 @@
  * limitations under the License.
  */
 
-package org.apache.beam.sdk.fn.channel;
+package org.apache.beam.util.fn.channel;
 
 import io.grpc.ManagedChannel;
 import io.grpc.ManagedChannelBuilder;
diff --git a/sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/channel/SocketAddressFactory.java b/util/java/fn-execution/src/main/java/org/apache/beam/util/fn/channel/SocketAddressFactory.java
similarity index 98%
rename from sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/channel/SocketAddressFactory.java
rename to util/java/fn-execution/src/main/java/org/apache/beam/util/fn/channel/SocketAddressFactory.java
index 640931d694e..9019e84a095 100644
--- a/sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/channel/SocketAddressFactory.java
+++ b/util/java/fn-execution/src/main/java/org/apache/beam/util/fn/channel/SocketAddressFactory.java
@@ -16,7 +16,7 @@
  * limitations under the License.
  */
 
-package org.apache.beam.sdk.fn.channel;
+package org.apache.beam.util.fn.channel;
 
 import static com.google.common.base.Preconditions.checkArgument;
 
diff --git a/sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/channel/package-info.java b/util/java/fn-execution/src/main/java/org/apache/beam/util/fn/channel/package-info.java
similarity index 95%
rename from sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/channel/package-info.java
rename to util/java/fn-execution/src/main/java/org/apache/beam/util/fn/channel/package-info.java
index 3d2cb51a583..532fb857ba8 100644
--- a/sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/channel/package-info.java
+++ b/util/java/fn-execution/src/main/java/org/apache/beam/util/fn/channel/package-info.java
@@ -19,4 +19,4 @@
 /**
  * gRPC channel management.
  */
-package org.apache.beam.sdk.fn.channel;
+package org.apache.beam.util.fn.channel;
diff --git a/sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/data/BeamFnDataBufferingOutboundObserver.java b/util/java/fn-execution/src/main/java/org/apache/beam/util/fn/data/BeamFnDataBufferingOutboundObserver.java
similarity index 99%
rename from sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/data/BeamFnDataBufferingOutboundObserver.java
rename to util/java/fn-execution/src/main/java/org/apache/beam/util/fn/data/BeamFnDataBufferingOutboundObserver.java
index d2986c352e7..2f49481dcbe 100644
--- a/sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/data/BeamFnDataBufferingOutboundObserver.java
+++ b/util/java/fn-execution/src/main/java/org/apache/beam/util/fn/data/BeamFnDataBufferingOutboundObserver.java
@@ -15,7 +15,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.beam.sdk.fn.data;
+package org.apache.beam.util.fn.data;
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.protobuf.ByteString;
diff --git a/sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/data/BeamFnDataGrpcMultiplexer.java b/util/java/fn-execution/src/main/java/org/apache/beam/util/fn/data/BeamFnDataGrpcMultiplexer.java
similarity index 98%
rename from sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/data/BeamFnDataGrpcMultiplexer.java
rename to util/java/fn-execution/src/main/java/org/apache/beam/util/fn/data/BeamFnDataGrpcMultiplexer.java
index 5b97d3bc8e8..ccc841a4c45 100644
--- a/sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/data/BeamFnDataGrpcMultiplexer.java
+++ b/util/java/fn-execution/src/main/java/org/apache/beam/util/fn/data/BeamFnDataGrpcMultiplexer.java
@@ -15,7 +15,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.beam.sdk.fn.data;
+package org.apache.beam.util.fn.data;
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.MoreObjects;
@@ -31,7 +31,7 @@
 import org.apache.beam.model.fnexecution.v1.BeamFnApi;
 import org.apache.beam.model.fnexecution.v1.BeamFnApi.Elements.Data;
 import org.apache.beam.model.pipeline.v1.Endpoints;
-import org.apache.beam.sdk.fn.stream.StreamObserverFactory.StreamObserverClientFactory;
+import org.apache.beam.util.fn.stream.StreamObserverFactory.StreamObserverClientFactory;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/data/BeamFnDataInboundObserver.java b/util/java/fn-execution/src/main/java/org/apache/beam/util/fn/data/BeamFnDataInboundObserver.java
similarity index 98%
rename from sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/data/BeamFnDataInboundObserver.java
rename to util/java/fn-execution/src/main/java/org/apache/beam/util/fn/data/BeamFnDataInboundObserver.java
index 0f9aa011f81..bc0f551bc03 100644
--- a/sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/data/BeamFnDataInboundObserver.java
+++ b/util/java/fn-execution/src/main/java/org/apache/beam/util/fn/data/BeamFnDataInboundObserver.java
@@ -15,7 +15,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.beam.sdk.fn.data;
+package org.apache.beam.util.fn.data;
 
 import java.io.InputStream;
 import java.util.function.Consumer;
diff --git a/sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/data/CloseableFnDataReceiver.java b/util/java/fn-execution/src/main/java/org/apache/beam/util/fn/data/CloseableFnDataReceiver.java
similarity index 96%
rename from sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/data/CloseableFnDataReceiver.java
rename to util/java/fn-execution/src/main/java/org/apache/beam/util/fn/data/CloseableFnDataReceiver.java
index d497c8fed25..65007518afa 100644
--- a/sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/data/CloseableFnDataReceiver.java
+++ b/util/java/fn-execution/src/main/java/org/apache/beam/util/fn/data/CloseableFnDataReceiver.java
@@ -16,7 +16,7 @@
  * limitations under the License.
  */
 
-package org.apache.beam.sdk.fn.data;
+package org.apache.beam.util.fn.data;
 
 /**
  * A receiver of streamed data that can be closed.
diff --git a/sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/data/CompletableFutureInboundDataClient.java b/util/java/fn-execution/src/main/java/org/apache/beam/util/fn/data/CompletableFutureInboundDataClient.java
similarity index 98%
rename from sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/data/CompletableFutureInboundDataClient.java
rename to util/java/fn-execution/src/main/java/org/apache/beam/util/fn/data/CompletableFutureInboundDataClient.java
index 0229a5bdb85..0b80c257cc4 100644
--- a/sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/data/CompletableFutureInboundDataClient.java
+++ b/util/java/fn-execution/src/main/java/org/apache/beam/util/fn/data/CompletableFutureInboundDataClient.java
@@ -16,7 +16,7 @@
  * limitations under the License.
  */
 
-package org.apache.beam.sdk.fn.data;
+package org.apache.beam.util.fn.data;
 
 import java.util.concurrent.CompletableFuture;
 
diff --git a/sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/data/FnDataReceiver.java b/util/java/fn-execution/src/main/java/org/apache/beam/util/fn/data/FnDataReceiver.java
similarity index 96%
rename from sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/data/FnDataReceiver.java
rename to util/java/fn-execution/src/main/java/org/apache/beam/util/fn/data/FnDataReceiver.java
index 387b81aa817..ffd2a947679 100644
--- a/sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/data/FnDataReceiver.java
+++ b/util/java/fn-execution/src/main/java/org/apache/beam/util/fn/data/FnDataReceiver.java
@@ -15,7 +15,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.beam.sdk.fn.data;
+package org.apache.beam.util.fn.data;
 
 /**
  * A receiver of streamed data.
diff --git a/sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/data/InboundDataClient.java b/util/java/fn-execution/src/main/java/org/apache/beam/util/fn/data/InboundDataClient.java
similarity index 98%
rename from sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/data/InboundDataClient.java
rename to util/java/fn-execution/src/main/java/org/apache/beam/util/fn/data/InboundDataClient.java
index 98c3983a0de..d558b6505c6 100644
--- a/sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/data/InboundDataClient.java
+++ b/util/java/fn-execution/src/main/java/org/apache/beam/util/fn/data/InboundDataClient.java
@@ -16,7 +16,7 @@
  * limitations under the License.
  */
 
-package org.apache.beam.sdk.fn.data;
+package org.apache.beam.util.fn.data;
 
 import java.util.concurrent.CancellationException;
 
diff --git a/sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/data/LogicalEndpoint.java b/util/java/fn-execution/src/main/java/org/apache/beam/util/fn/data/LogicalEndpoint.java
similarity index 97%
rename from sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/data/LogicalEndpoint.java
rename to util/java/fn-execution/src/main/java/org/apache/beam/util/fn/data/LogicalEndpoint.java
index 785a8c944cb..8418adc0196 100644
--- a/sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/data/LogicalEndpoint.java
+++ b/util/java/fn-execution/src/main/java/org/apache/beam/util/fn/data/LogicalEndpoint.java
@@ -16,7 +16,7 @@
  * limitations under the License.
  */
 
-package org.apache.beam.sdk.fn.data;
+package org.apache.beam.util.fn.data;
 
 import com.google.auto.value.AutoValue;
 import org.apache.beam.model.fnexecution.v1.BeamFnApi;
diff --git a/sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/data/RemoteGrpcPortRead.java b/util/java/fn-execution/src/main/java/org/apache/beam/util/fn/data/RemoteGrpcPortRead.java
similarity index 98%
rename from sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/data/RemoteGrpcPortRead.java
rename to util/java/fn-execution/src/main/java/org/apache/beam/util/fn/data/RemoteGrpcPortRead.java
index 54d32dbf6ba..45c1104ae1e 100644
--- a/sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/data/RemoteGrpcPortRead.java
+++ b/util/java/fn-execution/src/main/java/org/apache/beam/util/fn/data/RemoteGrpcPortRead.java
@@ -16,7 +16,7 @@
  * limitations under the License.
  */
 
-package org.apache.beam.sdk.fn.data;
+package org.apache.beam.util.fn.data;
 
 import static com.google.common.base.Preconditions.checkArgument;
 
diff --git a/sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/data/RemoteGrpcPortWrite.java b/util/java/fn-execution/src/main/java/org/apache/beam/util/fn/data/RemoteGrpcPortWrite.java
similarity index 98%
rename from sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/data/RemoteGrpcPortWrite.java
rename to util/java/fn-execution/src/main/java/org/apache/beam/util/fn/data/RemoteGrpcPortWrite.java
index 805aef9c46c..243749b0d68 100644
--- a/sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/data/RemoteGrpcPortWrite.java
+++ b/util/java/fn-execution/src/main/java/org/apache/beam/util/fn/data/RemoteGrpcPortWrite.java
@@ -16,7 +16,7 @@
  * limitations under the License.
  */
 
-package org.apache.beam.sdk.fn.data;
+package org.apache.beam.util.fn.data;
 
 import static com.google.common.base.Preconditions.checkArgument;
 
diff --git a/sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/data/package-info.java b/util/java/fn-execution/src/main/java/org/apache/beam/util/fn/data/package-info.java
similarity index 95%
rename from sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/data/package-info.java
rename to util/java/fn-execution/src/main/java/org/apache/beam/util/fn/data/package-info.java
index e7a77c0b427..11cb06f93a4 100644
--- a/sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/data/package-info.java
+++ b/util/java/fn-execution/src/main/java/org/apache/beam/util/fn/data/package-info.java
@@ -19,4 +19,4 @@
 /**
  * Classes to interact with the portability framework data plane.
  */
-package org.apache.beam.sdk.fn.data;
+package org.apache.beam.util.fn.data;
diff --git a/sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/stream/AdvancingPhaser.java b/util/java/fn-execution/src/main/java/org/apache/beam/util/fn/stream/AdvancingPhaser.java
similarity index 96%
rename from sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/stream/AdvancingPhaser.java
rename to util/java/fn-execution/src/main/java/org/apache/beam/util/fn/stream/AdvancingPhaser.java
index c0917054c4f..b414f532139 100644
--- a/sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/stream/AdvancingPhaser.java
+++ b/util/java/fn-execution/src/main/java/org/apache/beam/util/fn/stream/AdvancingPhaser.java
@@ -16,7 +16,7 @@
  * limitations under the License.
  */
 
-package org.apache.beam.sdk.fn.stream;
+package org.apache.beam.util.fn.stream;
 
 import java.util.concurrent.Phaser;
 
diff --git a/sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/stream/BufferingStreamObserver.java b/util/java/fn-execution/src/main/java/org/apache/beam/util/fn/stream/BufferingStreamObserver.java
similarity index 99%
rename from sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/stream/BufferingStreamObserver.java
rename to util/java/fn-execution/src/main/java/org/apache/beam/util/fn/stream/BufferingStreamObserver.java
index 76406727e36..401b19d0b8b 100644
--- a/sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/stream/BufferingStreamObserver.java
+++ b/util/java/fn-execution/src/main/java/org/apache/beam/util/fn/stream/BufferingStreamObserver.java
@@ -16,7 +16,7 @@
  * limitations under the License.
  */
 
-package org.apache.beam.sdk.fn.stream;
+package org.apache.beam.util.fn.stream;
 
 import static com.google.common.base.Preconditions.checkState;
 
diff --git a/sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/stream/DataStreams.java b/util/java/fn-execution/src/main/java/org/apache/beam/util/fn/stream/DataStreams.java
similarity index 99%
rename from sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/stream/DataStreams.java
rename to util/java/fn-execution/src/main/java/org/apache/beam/util/fn/stream/DataStreams.java
index 4ddd5127f93..9e005ccd8e9 100644
--- a/sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/stream/DataStreams.java
+++ b/util/java/fn-execution/src/main/java/org/apache/beam/util/fn/stream/DataStreams.java
@@ -15,7 +15,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.beam.sdk.fn.stream;
+package org.apache.beam.util.fn.stream;
 
 import static com.google.common.base.Preconditions.checkState;
 
diff --git a/sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/stream/DirectStreamObserver.java b/util/java/fn-execution/src/main/java/org/apache/beam/util/fn/stream/DirectStreamObserver.java
similarity index 98%
rename from sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/stream/DirectStreamObserver.java
rename to util/java/fn-execution/src/main/java/org/apache/beam/util/fn/stream/DirectStreamObserver.java
index eb7183f7cea..011a5ddc63e 100644
--- a/sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/stream/DirectStreamObserver.java
+++ b/util/java/fn-execution/src/main/java/org/apache/beam/util/fn/stream/DirectStreamObserver.java
@@ -16,7 +16,7 @@
  * limitations under the License.
  */
 
-package org.apache.beam.sdk.fn.stream;
+package org.apache.beam.util.fn.stream;
 
 import io.grpc.stub.CallStreamObserver;
 import io.grpc.stub.StreamObserver;
diff --git a/sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/stream/ForwardingClientResponseObserver.java b/util/java/fn-execution/src/main/java/org/apache/beam/util/fn/stream/ForwardingClientResponseObserver.java
similarity index 98%
rename from sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/stream/ForwardingClientResponseObserver.java
rename to util/java/fn-execution/src/main/java/org/apache/beam/util/fn/stream/ForwardingClientResponseObserver.java
index 958c69b13ab..04fb5152ae3 100644
--- a/sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/stream/ForwardingClientResponseObserver.java
+++ b/util/java/fn-execution/src/main/java/org/apache/beam/util/fn/stream/ForwardingClientResponseObserver.java
@@ -16,7 +16,7 @@
  * limitations under the License.
  */
 
-package org.apache.beam.sdk.fn.stream;
+package org.apache.beam.util.fn.stream;
 
 import io.grpc.stub.ClientCallStreamObserver;
 import io.grpc.stub.ClientResponseObserver;
diff --git a/sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/stream/StreamObserverFactory.java b/util/java/fn-execution/src/main/java/org/apache/beam/util/fn/stream/StreamObserverFactory.java
similarity index 99%
rename from sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/stream/StreamObserverFactory.java
rename to util/java/fn-execution/src/main/java/org/apache/beam/util/fn/stream/StreamObserverFactory.java
index abba070ae14..e0a3c5199a8 100644
--- a/sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/stream/StreamObserverFactory.java
+++ b/util/java/fn-execution/src/main/java/org/apache/beam/util/fn/stream/StreamObserverFactory.java
@@ -16,7 +16,7 @@
  * limitations under the License.
  */
 
-package org.apache.beam.sdk.fn.stream;
+package org.apache.beam.util.fn.stream;
 
 import io.grpc.stub.CallStreamObserver;
 import io.grpc.stub.StreamObserver;
diff --git a/sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/stream/SynchronizedStreamObserver.java b/util/java/fn-execution/src/main/java/org/apache/beam/util/fn/stream/SynchronizedStreamObserver.java
similarity index 98%
rename from sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/stream/SynchronizedStreamObserver.java
rename to util/java/fn-execution/src/main/java/org/apache/beam/util/fn/stream/SynchronizedStreamObserver.java
index 62bd46aa228..2cc7c112d4b 100644
--- a/sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/stream/SynchronizedStreamObserver.java
+++ b/util/java/fn-execution/src/main/java/org/apache/beam/util/fn/stream/SynchronizedStreamObserver.java
@@ -16,7 +16,7 @@
  * limitations under the License.
  */
 
-package org.apache.beam.sdk.fn.stream;
+package org.apache.beam.util.fn.stream;
 
 import io.grpc.stub.StreamObserver;
 
diff --git a/sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/stream/package-info.java b/util/java/fn-execution/src/main/java/org/apache/beam/util/fn/stream/package-info.java
similarity index 95%
rename from sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/stream/package-info.java
rename to util/java/fn-execution/src/main/java/org/apache/beam/util/fn/stream/package-info.java
index 6aa27292ae7..1801153ec9e 100644
--- a/sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/stream/package-info.java
+++ b/util/java/fn-execution/src/main/java/org/apache/beam/util/fn/stream/package-info.java
@@ -19,4 +19,4 @@
 /**
  * gRPC stream management.
  */
-package org.apache.beam.sdk.fn.stream;
+package org.apache.beam.util.fn.stream;
diff --git a/sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/test/TestExecutors.java b/util/java/fn-execution/src/main/java/org/apache/beam/util/fn/test/TestExecutors.java
similarity index 98%
rename from sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/test/TestExecutors.java
rename to util/java/fn-execution/src/main/java/org/apache/beam/util/fn/test/TestExecutors.java
index 01d64bd4f31..b81b36ca16d 100644
--- a/sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/test/TestExecutors.java
+++ b/util/java/fn-execution/src/main/java/org/apache/beam/util/fn/test/TestExecutors.java
@@ -16,7 +16,7 @@
  * limitations under the License.
  */
 
-package org.apache.beam.sdk.fn.test;
+package org.apache.beam.util.fn.test;
 
 import com.google.common.util.concurrent.ForwardingExecutorService;
 import java.util.concurrent.ExecutorService;
diff --git a/sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/test/TestStreams.java b/util/java/fn-execution/src/main/java/org/apache/beam/util/fn/test/TestStreams.java
similarity index 99%
rename from sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/test/TestStreams.java
rename to util/java/fn-execution/src/main/java/org/apache/beam/util/fn/test/TestStreams.java
index 73fcafc7fc1..9a190f2782e 100644
--- a/sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/test/TestStreams.java
+++ b/util/java/fn-execution/src/main/java/org/apache/beam/util/fn/test/TestStreams.java
@@ -16,7 +16,7 @@
  * limitations under the License.
  */
 
-package org.apache.beam.sdk.fn.test;
+package org.apache.beam.util.fn.test;
 
 import io.grpc.stub.CallStreamObserver;
 import io.grpc.stub.StreamObserver;
diff --git a/sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/test/package-info.java b/util/java/fn-execution/src/main/java/org/apache/beam/util/fn/test/package-info.java
similarity index 95%
rename from sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/test/package-info.java
rename to util/java/fn-execution/src/main/java/org/apache/beam/util/fn/test/package-info.java
index 40b663fe0da..ad560065fd2 100644
--- a/sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/test/package-info.java
+++ b/util/java/fn-execution/src/main/java/org/apache/beam/util/fn/test/package-info.java
@@ -17,4 +17,4 @@
  */
 
 /** Utilities for testing use of this package. */
-package org.apache.beam.sdk.fn.test;
+package org.apache.beam.util.fn.test;
diff --git a/sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/windowing/EncodedBoundedWindow.java b/util/java/fn-execution/src/main/java/org/apache/beam/util/fn/windowing/EncodedBoundedWindow.java
similarity index 98%
rename from sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/windowing/EncodedBoundedWindow.java
rename to util/java/fn-execution/src/main/java/org/apache/beam/util/fn/windowing/EncodedBoundedWindow.java
index 97659e34f62..3122215aadf 100644
--- a/sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/windowing/EncodedBoundedWindow.java
+++ b/util/java/fn-execution/src/main/java/org/apache/beam/util/fn/windowing/EncodedBoundedWindow.java
@@ -16,7 +16,7 @@
  * limitations under the License.
  */
 
-package org.apache.beam.sdk.fn.windowing;
+package org.apache.beam.util.fn.windowing;
 
 import com.google.auto.value.AutoValue;
 import com.google.common.io.ByteStreams;
diff --git a/sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/windowing/package-info.java b/util/java/fn-execution/src/main/java/org/apache/beam/util/fn/windowing/package-info.java
similarity index 95%
rename from sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/windowing/package-info.java
rename to util/java/fn-execution/src/main/java/org/apache/beam/util/fn/windowing/package-info.java
index 9a91836c222..e07f0f93ac2 100644
--- a/sdks/java/fn-execution/src/main/java/org/apache/beam/sdk/fn/windowing/package-info.java
+++ b/util/java/fn-execution/src/main/java/org/apache/beam/util/fn/windowing/package-info.java
@@ -19,4 +19,4 @@
 /**
  * Common utilities related to windowing during execution of a pipeline.
  */
-package org.apache.beam.sdk.fn.windowing;
+package org.apache.beam.util.fn.windowing;
diff --git a/sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/channel/ManagedChannelFactoryTest.java b/util/java/fn-execution/src/test/java/org/apache/beam/util/fn/channel/ManagedChannelFactoryTest.java
similarity index 98%
rename from sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/channel/ManagedChannelFactoryTest.java
rename to util/java/fn-execution/src/test/java/org/apache/beam/util/fn/channel/ManagedChannelFactoryTest.java
index fc08ff56f95..c50bd60b3ac 100644
--- a/sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/channel/ManagedChannelFactoryTest.java
+++ b/util/java/fn-execution/src/test/java/org/apache/beam/util/fn/channel/ManagedChannelFactoryTest.java
@@ -16,7 +16,7 @@
  * limitations under the License.
  */
 
-package org.apache.beam.sdk.fn.channel;
+package org.apache.beam.util.fn.channel;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assume.assumeTrue;
diff --git a/sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/channel/SocketAddressFactoryTest.java b/util/java/fn-execution/src/test/java/org/apache/beam/util/fn/channel/SocketAddressFactoryTest.java
similarity index 98%
rename from sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/channel/SocketAddressFactoryTest.java
rename to util/java/fn-execution/src/test/java/org/apache/beam/util/fn/channel/SocketAddressFactoryTest.java
index f702dd1ba8e..97c62397af5 100644
--- a/sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/channel/SocketAddressFactoryTest.java
+++ b/util/java/fn-execution/src/test/java/org/apache/beam/util/fn/channel/SocketAddressFactoryTest.java
@@ -16,7 +16,7 @@
  * limitations under the License.
  */
 
-package org.apache.beam.sdk.fn.channel;
+package org.apache.beam.util.fn.channel;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertThat;
diff --git a/sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/data/BeamFnDataBufferingOutboundObserverTest.java b/util/java/fn-execution/src/test/java/org/apache/beam/util/fn/data/BeamFnDataBufferingOutboundObserverTest.java
similarity index 98%
rename from sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/data/BeamFnDataBufferingOutboundObserverTest.java
rename to util/java/fn-execution/src/test/java/org/apache/beam/util/fn/data/BeamFnDataBufferingOutboundObserverTest.java
index 94685de066c..4fd91b0f415 100644
--- a/sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/data/BeamFnDataBufferingOutboundObserverTest.java
+++ b/util/java/fn-execution/src/test/java/org/apache/beam/util/fn/data/BeamFnDataBufferingOutboundObserverTest.java
@@ -15,7 +15,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.beam.sdk.fn.data;
+package org.apache.beam.util.fn.data;
 
 import static org.apache.beam.sdk.util.WindowedValue.valueInGlobalWindow;
 import static org.hamcrest.Matchers.empty;
@@ -36,8 +36,8 @@
 import org.apache.beam.sdk.coders.ByteArrayCoder;
 import org.apache.beam.sdk.coders.Coder;
 import org.apache.beam.sdk.coders.LengthPrefixCoder;
-import org.apache.beam.sdk.fn.test.TestStreams;
 import org.apache.beam.sdk.util.WindowedValue;
+import org.apache.beam.util.fn.test.TestStreams;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
diff --git a/sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/data/BeamFnDataGrpcMultiplexerTest.java b/util/java/fn-execution/src/test/java/org/apache/beam/util/fn/data/BeamFnDataGrpcMultiplexerTest.java
similarity index 97%
rename from sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/data/BeamFnDataGrpcMultiplexerTest.java
rename to util/java/fn-execution/src/test/java/org/apache/beam/util/fn/data/BeamFnDataGrpcMultiplexerTest.java
index b1abb07434d..2bca1d920f2 100644
--- a/sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/data/BeamFnDataGrpcMultiplexerTest.java
+++ b/util/java/fn-execution/src/test/java/org/apache/beam/util/fn/data/BeamFnDataGrpcMultiplexerTest.java
@@ -15,7 +15,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.beam.sdk.fn.data;
+package org.apache.beam.util.fn.data;
 
 import static org.hamcrest.Matchers.contains;
 import static org.junit.Assert.assertFalse;
@@ -31,7 +31,7 @@
 import java.util.concurrent.TimeUnit;
 import org.apache.beam.model.fnexecution.v1.BeamFnApi;
 import org.apache.beam.model.pipeline.v1.Endpoints;
-import org.apache.beam.sdk.fn.test.TestStreams;
+import org.apache.beam.util.fn.test.TestStreams;
 import org.junit.Test;
 
 /** Tests for {@link BeamFnDataGrpcMultiplexer}. */
diff --git a/sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/data/CompletableFutureInboundDataClientTest.java b/util/java/fn-execution/src/test/java/org/apache/beam/util/fn/data/CompletableFutureInboundDataClientTest.java
similarity index 99%
rename from sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/data/CompletableFutureInboundDataClientTest.java
rename to util/java/fn-execution/src/test/java/org/apache/beam/util/fn/data/CompletableFutureInboundDataClientTest.java
index 277ab56ee91..2f487361ab4 100644
--- a/sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/data/CompletableFutureInboundDataClientTest.java
+++ b/util/java/fn-execution/src/test/java/org/apache/beam/util/fn/data/CompletableFutureInboundDataClientTest.java
@@ -16,7 +16,7 @@
  * limitations under the License.
  */
 
-package org.apache.beam.sdk.fn.data;
+package org.apache.beam.util.fn.data;
 
 import static org.hamcrest.Matchers.is;
 import static org.hamcrest.Matchers.isA;
diff --git a/sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/data/RemoteGrpcPortReadTest.java b/util/java/fn-execution/src/test/java/org/apache/beam/util/fn/data/RemoteGrpcPortReadTest.java
similarity index 98%
rename from sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/data/RemoteGrpcPortReadTest.java
rename to util/java/fn-execution/src/test/java/org/apache/beam/util/fn/data/RemoteGrpcPortReadTest.java
index 5977e90007f..31fb3100ee8 100644
--- a/sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/data/RemoteGrpcPortReadTest.java
+++ b/util/java/fn-execution/src/test/java/org/apache/beam/util/fn/data/RemoteGrpcPortReadTest.java
@@ -16,7 +16,7 @@
  * limitations under the License.
  */
 
-package org.apache.beam.sdk.fn.data;
+package org.apache.beam.util.fn.data;
 
 import static org.hamcrest.Matchers.equalTo;
 import static org.junit.Assert.assertThat;
diff --git a/sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/data/RemoteGrpcPortWriteTest.java b/util/java/fn-execution/src/test/java/org/apache/beam/util/fn/data/RemoteGrpcPortWriteTest.java
similarity index 98%
rename from sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/data/RemoteGrpcPortWriteTest.java
rename to util/java/fn-execution/src/test/java/org/apache/beam/util/fn/data/RemoteGrpcPortWriteTest.java
index 5e4737c7e80..93ef78138ed 100644
--- a/sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/data/RemoteGrpcPortWriteTest.java
+++ b/util/java/fn-execution/src/test/java/org/apache/beam/util/fn/data/RemoteGrpcPortWriteTest.java
@@ -16,7 +16,7 @@
  * limitations under the License.
  */
 
-package org.apache.beam.sdk.fn.data;
+package org.apache.beam.util.fn.data;
 
 import static org.hamcrest.Matchers.equalTo;
 import static org.junit.Assert.assertThat;
diff --git a/sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/stream/AdvancingPhaserTest.java b/util/java/fn-execution/src/test/java/org/apache/beam/util/fn/stream/AdvancingPhaserTest.java
similarity index 97%
rename from sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/stream/AdvancingPhaserTest.java
rename to util/java/fn-execution/src/test/java/org/apache/beam/util/fn/stream/AdvancingPhaserTest.java
index a112a165f1d..d452c621fe1 100644
--- a/sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/stream/AdvancingPhaserTest.java
+++ b/util/java/fn-execution/src/test/java/org/apache/beam/util/fn/stream/AdvancingPhaserTest.java
@@ -16,7 +16,7 @@
  * limitations under the License.
  */
 
-package org.apache.beam.sdk.fn.stream;
+package org.apache.beam.util.fn.stream;
 
 import static org.hamcrest.collection.IsEmptyCollection.empty;
 import static org.junit.Assert.assertFalse;
diff --git a/sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/stream/BufferingStreamObserverTest.java b/util/java/fn-execution/src/test/java/org/apache/beam/util/fn/stream/BufferingStreamObserverTest.java
similarity index 95%
rename from sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/stream/BufferingStreamObserverTest.java
rename to util/java/fn-execution/src/test/java/org/apache/beam/util/fn/stream/BufferingStreamObserverTest.java
index c5739b7e29c..63caaf63889 100644
--- a/sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/stream/BufferingStreamObserverTest.java
+++ b/util/java/fn-execution/src/test/java/org/apache/beam/util/fn/stream/BufferingStreamObserverTest.java
@@ -16,7 +16,7 @@
  * limitations under the License.
  */
 
-package org.apache.beam.sdk.fn.stream;
+package org.apache.beam.util.fn.stream;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
@@ -31,9 +31,9 @@
 import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
-import org.apache.beam.sdk.fn.test.TestExecutors;
-import org.apache.beam.sdk.fn.test.TestExecutors.TestExecutorService;
-import org.apache.beam.sdk.fn.test.TestStreams;
+import org.apache.beam.util.fn.test.TestExecutors;
+import org.apache.beam.util.fn.test.TestExecutors.TestExecutorService;
+import org.apache.beam.util.fn.test.TestStreams;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
diff --git a/sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/stream/DataStreamsTest.java b/util/java/fn-execution/src/test/java/org/apache/beam/util/fn/stream/DataStreamsTest.java
similarity index 97%
rename from sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/stream/DataStreamsTest.java
rename to util/java/fn-execution/src/test/java/org/apache/beam/util/fn/stream/DataStreamsTest.java
index 35e18571db0..105d588077d 100644
--- a/sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/stream/DataStreamsTest.java
+++ b/util/java/fn-execution/src/test/java/org/apache/beam/util/fn/stream/DataStreamsTest.java
@@ -15,7 +15,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.beam.sdk.fn.stream;
+package org.apache.beam.util.fn.stream;
 
 import static org.junit.Assert.assertArrayEquals;
 import static org.junit.Assert.assertEquals;
@@ -38,9 +38,9 @@
 import java.util.concurrent.SynchronousQueue;
 import org.apache.beam.sdk.coders.Coder;
 import org.apache.beam.sdk.coders.StringUtf8Coder;
-import org.apache.beam.sdk.fn.stream.DataStreams.BlockingQueueIterator;
-import org.apache.beam.sdk.fn.stream.DataStreams.DataStreamDecoder;
 import org.apache.beam.sdk.transforms.windowing.GlobalWindow;
+import org.apache.beam.util.fn.stream.DataStreams.BlockingQueueIterator;
+import org.apache.beam.util.fn.stream.DataStreams.DataStreamDecoder;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.experimental.runners.Enclosed;
diff --git a/sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/stream/DirectStreamObserverTest.java b/util/java/fn-execution/src/test/java/org/apache/beam/util/fn/stream/DirectStreamObserverTest.java
similarity index 95%
rename from sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/stream/DirectStreamObserverTest.java
rename to util/java/fn-execution/src/test/java/org/apache/beam/util/fn/stream/DirectStreamObserverTest.java
index bd6c318e7c9..393831cc605 100644
--- a/sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/stream/DirectStreamObserverTest.java
+++ b/util/java/fn-execution/src/test/java/org/apache/beam/util/fn/stream/DirectStreamObserverTest.java
@@ -16,7 +16,7 @@
  * limitations under the License.
  */
 
-package org.apache.beam.sdk.fn.stream;
+package org.apache.beam.util.fn.stream;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
@@ -31,9 +31,9 @@
 import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
-import org.apache.beam.sdk.fn.test.TestExecutors;
-import org.apache.beam.sdk.fn.test.TestExecutors.TestExecutorService;
-import org.apache.beam.sdk.fn.test.TestStreams;
+import org.apache.beam.util.fn.test.TestExecutors;
+import org.apache.beam.util.fn.test.TestExecutors.TestExecutorService;
+import org.apache.beam.util.fn.test.TestStreams;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
diff --git a/sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/stream/ForwardingClientResponseObserverTest.java b/util/java/fn-execution/src/test/java/org/apache/beam/util/fn/stream/ForwardingClientResponseObserverTest.java
similarity index 98%
rename from sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/stream/ForwardingClientResponseObserverTest.java
rename to util/java/fn-execution/src/test/java/org/apache/beam/util/fn/stream/ForwardingClientResponseObserverTest.java
index ea2ecb1b6bd..2f0fa908fba 100644
--- a/sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/stream/ForwardingClientResponseObserverTest.java
+++ b/util/java/fn-execution/src/test/java/org/apache/beam/util/fn/stream/ForwardingClientResponseObserverTest.java
@@ -16,7 +16,7 @@
  * limitations under the License.
  */
 
-package org.apache.beam.sdk.fn.stream;
+package org.apache.beam.util.fn.stream;
 
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
diff --git a/sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/stream/StreamObserverFactoryTest.java b/util/java/fn-execution/src/test/java/org/apache/beam/util/fn/stream/StreamObserverFactoryTest.java
similarity index 95%
rename from sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/stream/StreamObserverFactoryTest.java
rename to util/java/fn-execution/src/test/java/org/apache/beam/util/fn/stream/StreamObserverFactoryTest.java
index 0b51c09c811..979078f818e 100644
--- a/sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/stream/StreamObserverFactoryTest.java
+++ b/util/java/fn-execution/src/test/java/org/apache/beam/util/fn/stream/StreamObserverFactoryTest.java
@@ -16,7 +16,7 @@
  * limitations under the License.
  */
 
-package org.apache.beam.sdk.fn.stream;
+package org.apache.beam.util.fn.stream;
 
 import static org.hamcrest.Matchers.instanceOf;
 import static org.junit.Assert.assertEquals;
@@ -25,7 +25,7 @@
 import io.grpc.stub.CallStreamObserver;
 import io.grpc.stub.StreamObserver;
 import java.util.concurrent.Executors;
-import org.apache.beam.sdk.fn.stream.StreamObserverFactory.StreamObserverClientFactory;
+import org.apache.beam.util.fn.stream.StreamObserverFactory.StreamObserverClientFactory;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
diff --git a/sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/test/TestExecutorsTest.java b/util/java/fn-execution/src/test/java/org/apache/beam/util/fn/test/TestExecutorsTest.java
similarity index 98%
rename from sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/test/TestExecutorsTest.java
rename to util/java/fn-execution/src/test/java/org/apache/beam/util/fn/test/TestExecutorsTest.java
index 7c76a072115..1887b303385 100644
--- a/sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/test/TestExecutorsTest.java
+++ b/util/java/fn-execution/src/test/java/org/apache/beam/util/fn/test/TestExecutorsTest.java
@@ -16,7 +16,7 @@
  * limitations under the License.
  */
 
-package org.apache.beam.sdk.fn.test;
+package org.apache.beam.util.fn.test;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertSame;
@@ -26,7 +26,7 @@
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.atomic.AtomicBoolean;
-import org.apache.beam.sdk.fn.test.TestExecutors.TestExecutorService;
+import org.apache.beam.util.fn.test.TestExecutors.TestExecutorService;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
diff --git a/sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/test/TestStreamsTest.java b/util/java/fn-execution/src/test/java/org/apache/beam/util/fn/test/TestStreamsTest.java
similarity index 98%
rename from sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/test/TestStreamsTest.java
rename to util/java/fn-execution/src/test/java/org/apache/beam/util/fn/test/TestStreamsTest.java
index 20d561f6879..35c2de4c6e3 100644
--- a/sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/test/TestStreamsTest.java
+++ b/util/java/fn-execution/src/test/java/org/apache/beam/util/fn/test/TestStreamsTest.java
@@ -16,7 +16,7 @@
  * limitations under the License.
  */
 
-package org.apache.beam.sdk.fn.test;
+package org.apache.beam.util.fn.test;
 
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertThat;
diff --git a/sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/windowing/EncodedBoundedWindowTest.java b/util/java/fn-execution/src/test/java/org/apache/beam/util/fn/windowing/EncodedBoundedWindowTest.java
similarity index 94%
rename from sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/windowing/EncodedBoundedWindowTest.java
rename to util/java/fn-execution/src/test/java/org/apache/beam/util/fn/windowing/EncodedBoundedWindowTest.java
index c3e4b11fdfc..16b4be917e1 100644
--- a/sdks/java/fn-execution/src/test/java/org/apache/beam/sdk/fn/windowing/EncodedBoundedWindowTest.java
+++ b/util/java/fn-execution/src/test/java/org/apache/beam/util/fn/windowing/EncodedBoundedWindowTest.java
@@ -16,11 +16,11 @@
  * limitations under the License.
  */
 
-package org.apache.beam.sdk.fn.windowing;
+package org.apache.beam.util.fn.windowing;
 
 import com.google.protobuf.ByteString;
-import org.apache.beam.sdk.fn.windowing.EncodedBoundedWindow.Coder;
 import org.apache.beam.sdk.testing.CoderProperties;
+import org.apache.beam.util.fn.windowing.EncodedBoundedWindow.Coder;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
diff --git a/util/java/pom.xml b/util/java/pom.xml
new file mode 100644
index 00000000000..50c2963ee34
--- /dev/null
+++ b/util/java/pom.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.beam</groupId>
+    <artifactId>beam-util-parent</artifactId>
+    <version>2.5.0-SNAPSHOT</version>
+    <relativePath>../pom.xml</relativePath>
+  </parent>
+
+  <artifactId>beam-util-java-parent</artifactId>
+
+  <packaging>pom</packaging>
+
+  <name>Apache Beam :: Util :: Java</name>
+
+  <modules>
+    <module>fn-execution</module>
+  </modules>
+</project>
diff --git a/util/pom.xml b/util/pom.xml
new file mode 100644
index 00000000000..76e5b74fe62
--- /dev/null
+++ b/util/pom.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.beam</groupId>
+    <artifactId>beam-parent</artifactId>
+    <version>2.5.0-SNAPSHOT</version>
+    <relativePath>../pom.xml</relativePath>
+  </parent>
+
+  <artifactId>beam-util-parent</artifactId>
+
+  <packaging>pom</packaging>
+
+  <name>Apache Beam :: Util</name>
+
+  <modules>
+    <module>java</module>
+  </modules>
+
+  <profiles>
+    <profile>
+      <id>release</id>
+      <build>
+        <plugins>
+          <plugin>
+            <groupId>org.codehaus.mojo</groupId>
+            <artifactId>findbugs-maven-plugin</artifactId>
+          </plugin>
+        </plugins>
+      </build>
+    </profile>
+  </profiles>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-checkstyle-plugin</artifactId>
+      </plugin>
+    </plugins>
+  </build>
+
+</project>


 

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Issue Time Tracking
-------------------

    Worklog Id:     (was: 140690)
    Time Spent: 2h 20m  (was: 2h 10m)

> Move core utilities into a new top-level module
> -----------------------------------------------
>
>                 Key: BEAM-3966
>                 URL: https://issues.apache.org/jira/browse/BEAM-3966
>             Project: Beam
>          Issue Type: Bug
>          Components: sdk-java-core
>            Reporter: Ben Sidhom
>            Priority: Minor
>          Time Spent: 2h 20m
>  Remaining Estimate: 0h
>
> As part of a longer-term dependency cleanup, fn-execution and similar utilities should be moved into a new top-level module (util?) that can be shared among runner and/or SDK code while clearly delineating the boundary between runner and SDK.



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Mime
View raw message