You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pulsar.apache.org by mm...@apache.org on 2018/03/04 17:10:20 UTC

[incubator-pulsar] branch master updated: Refactored all unit tests to use new typed API with builders for configuration (#1320)

This is an automated email from the ASF dual-hosted git repository.

mmerli pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-pulsar.git


The following commit(s) were added to refs/heads/master by this push:
     new 052814d  Refactored all unit tests to use new typed API with builders for configuration (#1320)
052814d is described below

commit 052814d516adb429d2c0fca030920f26770a52ac
Author: Matteo Merli <mm...@apache.org>
AuthorDate: Sun Mar 4 09:10:18 2018 -0800

    Refactored all unit tests to use new typed API with builders for configuration (#1320)
    
    * Refactored all unit tests to use new typed API with builders for configuration
    
    * Did conversion in pulsar-client tool
    
    * Refactoring typo fixes
---
 .../AuthenticationProviderBasic.java               |   6 +-
 .../broker/authorization/AuthorizationService.java |   9 +-
 .../apache/pulsar/broker/admin/AdminApiTest.java   | 201 +++---
 .../apache/pulsar/broker/admin/AdminApiTest2.java  |  77 +-
 .../broker/admin/CreateSubscriptionTest.java       |   5 +-
 .../broker/admin/IncrementPartitionsTest.java      |   9 +-
 .../AntiAffinityNamespaceGroupTest.java            |   7 +-
 .../broker/loadbalance/LoadBalancerTest.java       |   2 +
 .../loadbalance/ModularLoadManagerImplTest.java    |   5 +-
 .../loadbalance/SimpleLoadManagerImplTest.java     |   2 +-
 .../broker/namespace/NamespaceServiceTest.java     |  19 +-
 .../broker/namespace/NamespaceUnloadingTest.java   |   3 +-
 .../broker/service/AddMissingPatchVersionTest.java |   1 -
 .../broker/service/BacklogQuotaManagerTest.java    | 118 ++-
 .../pulsar/broker/service/BatchMessageTest.java    | 227 +++---
 .../broker/service/BrokerBkEnsemblesTests.java     |  50 +-
 .../pulsar/broker/service/BrokerServiceTest.java   | 267 +++----
 .../service/BrokerServiceThrottlingTest.java       |  50 +-
 .../pulsar/broker/service/PartitionKeyTest.java    |  14 +-
 .../pulsar/broker/service/PeerReplicatorTest.java  |  23 +-
 .../PersistentDispatcherFailoverConsumerTest.java  |   9 +-
 .../broker/service/PersistentFailoverE2ETest.java  | 158 ++---
 .../broker/service/PersistentQueueE2ETest.java     | 188 ++---
 .../service/PersistentTopicConcurrentTest.java     |   2 +
 .../broker/service/PersistentTopicE2ETest.java     | 301 +++-----
 .../pulsar/broker/service/PersistentTopicTest.java |  13 +-
 .../pulsar/broker/service/ReplicatorTest.java      |  83 +--
 .../pulsar/broker/service/ReplicatorTestBase.java  |  39 +-
 .../pulsar/broker/service/ResendRequestTest.java   | 143 ++--
 .../pulsar/broker/service/ServerCnxTest.java       |  10 +-
 .../broker/service/SubscriptionSeekTest.java       |  13 +-
 .../broker/service/TopicTerminationTest.java       | 104 ++-
 .../broker/service/persistent/ChecksumTest.java    |   4 +-
 .../broker/stats/ManagedLedgerMetricsTest.java     |   3 +-
 .../pulsar/broker/stats/PrometheusMetricsTest.java |   8 +-
 .../zookeeper/ZooKeeperClientAspectJTest.java      |   2 +-
 .../api/AuthenticatedProducerConsumerTest.java     |  41 +-
 .../AuthenticationTlsHostnameVerificationTest.java |  34 +-
 .../api/AuthorizationProducerConsumerTest.java     |  55 +-
 .../pulsar/client/api/BrokerServiceLookupTest.java | 378 +++++-----
 .../pulsar/client/api/ClientDeduplicationTest.java |  33 +-
 .../apache/pulsar/client/api/ClientErrorsTest.java | 106 ++-
 .../client/api/DispatcherBlockConsumerTest.java    | 205 +++---
 .../client/api/MessageDispatchThrottlingTest.java  | 196 +++--
 .../pulsar/client/api/MockBrokerService.java       |   2 -
 .../pulsar/client/api/NonPersistentTopicTest.java  | 148 ++--
 .../api/PartitionedProducerConsumerTest.java       | 147 ++--
 .../client/api/SimpleProducerConsumerStatTest.java | 146 ++--
 .../client/api/SimpleProducerConsumerTest.java     | 788 +++++++++------------
 .../pulsar/client/api/TlsProducerConsumerBase.java |  13 +-
 .../pulsar/client/api/TlsProducerConsumerTest.java |  13 +-
 .../apache/pulsar/client/api/TopicReaderTest.java  | 140 ++--
 .../V1_ProducerConsumerTest.java}                  | 171 ++---
 .../client/impl/BrokerClientIntegrationTest.java   | 192 +++--
 .../client/impl/ConsumeBaseExceptionTest.java      |  16 +-
 .../client/impl/ConsumerConfigurationTest.java     |  40 +-
 .../apache/pulsar/client/impl/MessageIdTest.java   | 122 ++--
 .../client/impl/PatternTopicsConsumerImplTest.java | 113 +--
 .../PerMessageUnAcknowledgedRedeliveryTest.java    |  99 ++-
 .../pulsar/client/impl/RawMessageSerDeserTest.java |   3 +-
 .../apache/pulsar/client/impl/RawReaderTest.java   |  35 +-
 .../pulsar/client/impl/TopicsConsumerImplTest.java |  78 +-
 .../impl/UnAcknowledgedMessagesTimeoutTest.java    | 114 ++-
 .../pulsar/client/impl/ZeroQueueSizeTest.java      |  81 +--
 .../pulsar/common/naming/NamespaceBundleTest.java  |   1 +
 .../pulsar/common/naming/NamespaceBundlesTest.java |   1 +
 .../pulsar/compaction/CompactedTopicTest.java      |  33 +-
 .../apache/pulsar/compaction/CompactionTest.java   | 128 ++--
 .../apache/pulsar/compaction/CompactorTest.java    |  37 +-
 .../stats/client/PulsarBrokerStatsClientTest.java  |  22 +-
 .../apache/pulsar/utils/StatsOutputStreamTest.java |   1 -
 .../websocket/proxy/ProxyAuthenticationTest.java   |   4 -
 .../websocket/proxy/ProxyAuthorizationTest.java    |   1 -
 .../websocket/proxy/SimpleProducerSocket.java      |   9 +-
 .../pulsar/client/admin/PersistentTopics.java      |   4 +-
 .../apache/pulsar/client/admin/PulsarAdmin.java    |  17 +
 .../admin/internal/PersistentTopicsImpl.java       |  21 +-
 .../kafka/compat/examples/ConsumerExample.java     |   2 +
 .../kafka/compat/tests/KafkaConsumerTest.java      |  42 +-
 .../kafka/compat/tests/KafkaProducerTest.java      |  10 +-
 .../pulsar/admin/cli/CmdPersistentTopics.java      |   4 +-
 .../apache/pulsar/admin/cli/PulsarAdminTool.java   |  15 +-
 .../org/apache/pulsar/client/cli/CmdConsume.java   |  23 +-
 .../org/apache/pulsar/client/cli/CmdProduce.java   |  34 +-
 .../apache/pulsar/client/cli/PulsarClientTool.java |  27 +-
 .../apache/pulsar/admin/cli/utils/IOUtilsTest.java |  20 +-
 .../cli/utils/NameValueParameterSplitterTest.java  |   5 +-
 .../pulsar/client/cli/PulsarClientToolTest.java    |   1 -
 .../apache/pulsar/client/api/ConsumerBuilder.java  |  13 +
 .../org/apache/pulsar/client/api/Producer.java     |   8 +-
 .../pulsar/client/api/ProducerConfiguration.java   |   2 +
 .../pulsar/client/impl/ConsumerBuilderImpl.java    |  24 +-
 .../pulsar/client/impl/ProducerBuilderImpl.java    |  32 +-
 .../impl/SinglePartitionMessageRouterImpl.java     |   2 +-
 .../pulsar/client/impl/TopicMessageImpl.java       |  10 +-
 .../pulsar/client/impl/TopicsConsumerImpl.java     |  16 +-
 .../pulsar/client/impl/UnAckedMessageTracker.java  |   4 +-
 .../client/impl/UnAckedTopicMessageTracker.java    |   2 +-
 .../impl/conf/ConsumerConfigurationData.java       |   3 +-
 .../client/impl/conf/ReaderConfigurationData.java  |   1 +
 .../client/api/ConsumerConfigurationTest.java      |   7 +-
 .../pulsar/client/api/MessageRouterTest.java       |   5 +-
 .../pulsar/client/impl/MessageBuilderTest.java     |  18 +-
 .../pulsar/client/impl/MessageIdCompareToTest.java |   1 -
 .../apache/pulsar/client/impl/MessageImplTest.java |   8 +-
 .../RoundRobinPartitionMessageRouterImplTest.java  |   6 +-
 .../impl/SinglePartitionMessageRouterImplTest.java |   6 +-
 .../client/tutorial/ContinuousAsyncProducer.java   |   5 +-
 .../pulsar/client/tutorial/ContinuousProducer.java |   5 +-
 .../client/tutorial/SampleAsyncProducer.java       |  14 +-
 .../pulsar/client/tutorial/SampleConsumer.java     |  10 +-
 .../client/tutorial/SampleConsumerListener.java    |  29 +-
 .../client/tutorial/SampleCryptoConsumer.java      |  26 +-
 .../client/tutorial/SampleCryptoProducer.java      |  20 +-
 .../pulsar/client/tutorial/SampleProducer.java     |   2 +-
 .../ProxyAuthenticatedProducerConsumerTest.java    |  41 +-
 .../proxy/server/ProxyForwardAuthDataTest.java     |  14 +-
 .../proxy/server/ProxyRolesEnforcementTest.java    |  77 +-
 .../org/apache/pulsar/proxy/server/ProxyTest.java  |  39 +-
 .../apache/pulsar/proxy/server/ProxyTlsTest.java   |  37 +-
 .../server/ProxyWithAuthorizationNegTest.java      |  74 +-
 .../proxy/server/ProxyWithAuthorizationTest.java   | 130 ++--
 .../server/ProxyWithoutServiceDiscoveryTest.java   |  46 +-
 123 files changed, 3095 insertions(+), 3788 deletions(-)

diff --git a/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/authentication/AuthenticationProviderBasic.java b/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/authentication/AuthenticationProviderBasic.java
index f2f2f65..faa8718 100644
--- a/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/authentication/AuthenticationProviderBasic.java
+++ b/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/authentication/AuthenticationProviderBasic.java
@@ -24,6 +24,8 @@ import org.apache.commons.codec.digest.Md5Crypt;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.pulsar.broker.ServiceConfiguration;
 
+import lombok.Cleanup;
+
 import javax.naming.AuthenticationException;
 import java.io.BufferedReader;
 import java.io.File;
@@ -49,7 +51,8 @@ public class AuthenticationProviderBasic implements AuthenticationProvider {
         } else if (!confFile.isFile()) {
             throw new IOException("The path is not a file");
         }
-        BufferedReader reader = new BufferedReader(new FileReader(confFile));
+
+        @Cleanup BufferedReader reader = new BufferedReader(new FileReader(confFile));
         users = new HashMap<>();
         for (String line : reader.lines().toArray(s -> new String[s])) {
             List<String> splitLine = Arrays.asList(line.split(":"));
@@ -58,7 +61,6 @@ public class AuthenticationProviderBasic implements AuthenticationProvider {
             }
             users.put(splitLine.get(0), splitLine.get(1));
         }
-        reader.close();
     }
 
     @Override
diff --git a/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/authorization/AuthorizationService.java b/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/authorization/AuthorizationService.java
index f38482d..76e98cc 100644
--- a/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/authorization/AuthorizationService.java
+++ b/pulsar-broker-common/src/main/java/org/apache/pulsar/broker/authorization/AuthorizationService.java
@@ -21,28 +21,21 @@ package org.apache.pulsar.broker.authorization;
 import static java.util.concurrent.TimeUnit.SECONDS;
 import static org.apache.pulsar.zookeeper.ZooKeeperCache.cacheTimeOutInSec;
 
-import java.util.Map;
-import java.util.Map.Entry;
 import java.util.Set;
 import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import javax.servlet.http.HttpServletRequest;
 
 import org.apache.commons.lang3.StringUtils;
 import org.apache.pulsar.broker.PulsarServerException;
 import org.apache.pulsar.broker.ServiceConfiguration;
 import org.apache.pulsar.broker.authentication.AuthenticationDataSource;
 import org.apache.pulsar.broker.cache.ConfigurationCacheService;
-import org.apache.pulsar.common.naming.TopicName;
 import org.apache.pulsar.common.naming.NamespaceName;
+import org.apache.pulsar.common.naming.TopicName;
 import org.apache.pulsar.common.policies.data.AuthAction;
 import org.apache.pulsar.common.util.FutureUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.collect.Maps;
-
 /**
  * Authorization service that manages pluggable authorization provider and authorize requests accordingly.
  *
diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/AdminApiTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/AdminApiTest.java
index 7e098cf..0f5cfa5 100644
--- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/AdminApiTest.java
+++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/AdminApiTest.java
@@ -55,22 +55,20 @@ import org.apache.pulsar.client.admin.PulsarAdminException.PreconditionFailedExc
 import org.apache.pulsar.client.admin.internal.LookupImpl;
 import org.apache.pulsar.client.admin.internal.PersistentTopicsImpl;
 import org.apache.pulsar.client.admin.internal.PropertiesImpl;
-import org.apache.pulsar.client.api.ClientConfiguration;
 import org.apache.pulsar.client.api.Consumer;
-import org.apache.pulsar.client.api.ConsumerConfiguration;
+import org.apache.pulsar.client.api.ConsumerBuilder;
 import org.apache.pulsar.client.api.Message;
+import org.apache.pulsar.client.api.MessageRoutingMode;
 import org.apache.pulsar.client.api.Producer;
-import org.apache.pulsar.client.api.ProducerConfiguration;
-import org.apache.pulsar.client.api.ProducerConfiguration.MessageRoutingMode;
 import org.apache.pulsar.client.api.PulsarClient;
 import org.apache.pulsar.client.api.SubscriptionType;
 import org.apache.pulsar.common.lookup.data.LookupData;
-import org.apache.pulsar.common.naming.TopicDomain;
-import org.apache.pulsar.common.naming.TopicName;
 import org.apache.pulsar.common.naming.NamespaceBundle;
 import org.apache.pulsar.common.naming.NamespaceBundleFactory;
 import org.apache.pulsar.common.naming.NamespaceBundles;
 import org.apache.pulsar.common.naming.NamespaceName;
+import org.apache.pulsar.common.naming.TopicDomain;
+import org.apache.pulsar.common.naming.TopicName;
 import org.apache.pulsar.common.partition.PartitionedTopicMetadata;
 import org.apache.pulsar.common.policies.data.AuthAction;
 import org.apache.pulsar.common.policies.data.AutoFailoverPolicyData;
@@ -164,8 +162,7 @@ public class AdminApiTest extends MockedPulsarServiceBaseTest {
 
     @DataProvider(name = "topicType")
     public Object[][] topicTypeProvider() {
-        return new Object[][] { { TopicDomain.persistent.value() },
-                { TopicDomain.non_persistent.value() } };
+        return new Object[][] { { TopicDomain.persistent.value() }, { TopicDomain.non_persistent.value() } };
     }
 
     @Test
@@ -443,12 +440,14 @@ public class AdminApiTest extends MockedPulsarServiceBaseTest {
 
     /**
      * Verifies broker sets watch on dynamic-configuration map even with invalid init json data
+     *
      * <pre>
      * 1. Set invalid json at dynamic-config znode
      * 2. Broker fails to deserialize znode content but sets the watch on znode
      * 3. Update znode with valid json map
      * 4. Broker should get watch and update the dynamic-config map
      * </pre>
+     *
      * @throws Exception
      */
     @Test
@@ -485,6 +484,7 @@ public class AdminApiTest extends MockedPulsarServiceBaseTest {
      * 3. trigger watch and listener
      * 4. verify that config is updated
      * </pre>
+     *
      * @throws Exception
      */
     @Test
@@ -611,7 +611,7 @@ public class AdminApiTest extends MockedPulsarServiceBaseTest {
         assertEquals(admin.namespaces().getPersistence("prop-xyz/use/ns1"), new PersistencePolicies(3, 2, 1, 10.0));
 
         // Force topic creation and namespace being loaded
-        Producer producer = pulsarClient.createProducer("persistent://prop-xyz/use/ns1/my-topic");
+        Producer<byte[]> producer = pulsarClient.newProducer().topic("persistent://prop-xyz/use/ns1/my-topic").create();
         producer.close();
         admin.persistentTopics().delete("persistent://prop-xyz/use/ns1/my-topic");
 
@@ -644,7 +644,7 @@ public class AdminApiTest extends MockedPulsarServiceBaseTest {
         }
 
         // Force topic creation and namespace being loaded
-        producer = pulsarClient.createProducer("persistent://prop-xyz/use/ns2/my-topic");
+        producer = pulsarClient.newProducer().topic("persistent://prop-xyz/use/ns2/my-topic").create();
         producer.close();
         admin.persistentTopics().delete("persistent://prop-xyz/use/ns2/my-topic");
 
@@ -664,12 +664,10 @@ public class AdminApiTest extends MockedPulsarServiceBaseTest {
 
         // create consumer and subscription
         URL pulsarUrl = new URL("http://127.0.0.1" + ":" + BROKER_WEBSERVICE_PORT);
-        ClientConfiguration clientConf = new ClientConfiguration();
-        clientConf.setStatsInterval(0, TimeUnit.SECONDS);
-        PulsarClient client = PulsarClient.create(pulsarUrl.toString(), clientConf);
-        ConsumerConfiguration conf = new ConsumerConfiguration();
-        conf.setSubscriptionType(SubscriptionType.Exclusive);
-        Consumer consumer = client.subscribe(persistentTopicName, "my-sub", conf);
+        PulsarClient client = PulsarClient.builder().serviceUrl(pulsarUrl.toString()).statsInterval(0, TimeUnit.SECONDS)
+                .build();
+        Consumer<byte[]> consumer = client.newConsumer().topic(persistentTopicName).subscriptionName("my-sub")
+                .subscriptionType(SubscriptionType.Exclusive).subscribe();
 
         assertEquals(admin.persistentTopics().getSubscriptions(persistentTopicName), Lists.newArrayList("my-sub"));
 
@@ -684,7 +682,7 @@ public class AdminApiTest extends MockedPulsarServiceBaseTest {
         PersistentTopicInternalStats internalStats = admin.persistentTopics().getInternalStats(persistentTopicName);
         assertEquals(internalStats.cursors.keySet(), Sets.newTreeSet(Lists.newArrayList("my-sub")));
 
-        List<Message> messages = admin.persistentTopics().peekMessages(persistentTopicName, "my-sub", 3);
+        List<Message<byte[]>> messages = admin.persistentTopics().peekMessages(persistentTopicName, "my-sub", 3);
         assertEquals(messages.size(), 3);
         for (int i = 0; i < 3; i++) {
             String expectedMessage = "message-" + i;
@@ -737,8 +735,8 @@ public class AdminApiTest extends MockedPulsarServiceBaseTest {
         assertEquals(admin.persistentTopics().getPartitionedTopicList("prop-xyz/use/ns1"), Lists.newArrayList());
         final String partitionedTopicName = "persistent://prop-xyz/use/ns1/" + topicName;
         admin.persistentTopics().createPartitionedTopic(partitionedTopicName, 4);
-        assertEquals(admin.persistentTopics().getPartitionedTopicList("prop-xyz/use/ns1"), Lists.newArrayList(partitionedTopicName));
-
+        assertEquals(admin.persistentTopics().getPartitionedTopicList("prop-xyz/use/ns1"),
+                Lists.newArrayList(partitionedTopicName));
 
         assertEquals(admin.persistentTopics().getPartitionedTopicMetadata(partitionedTopicName).partitions, 4);
 
@@ -752,12 +750,10 @@ public class AdminApiTest extends MockedPulsarServiceBaseTest {
 
         // create consumer and subscription
         URL pulsarUrl = new URL("http://127.0.0.1" + ":" + BROKER_WEBSERVICE_PORT);
-        ClientConfiguration clientConf = new ClientConfiguration();
-        clientConf.setStatsInterval(0, TimeUnit.SECONDS);
-        PulsarClient client = PulsarClient.create(pulsarUrl.toString(), clientConf);
-        ConsumerConfiguration conf = new ConsumerConfiguration();
-        conf.setSubscriptionType(SubscriptionType.Exclusive);
-        Consumer consumer = client.subscribe(partitionedTopicName, "my-sub", conf);
+        PulsarClient client = PulsarClient.builder().serviceUrl(pulsarUrl.toString()).statsInterval(0, TimeUnit.SECONDS)
+                .build();
+        Consumer<byte[]> consumer = client.newConsumer().topic(partitionedTopicName).subscriptionName("my-sub")
+                .subscriptionType(SubscriptionType.Exclusive).subscribe();
 
         assertEquals(admin.persistentTopics().getSubscriptions(partitionedTopicName), Lists.newArrayList("my-sub"));
 
@@ -770,7 +766,8 @@ public class AdminApiTest extends MockedPulsarServiceBaseTest {
             fail(e.getMessage());
         }
 
-        Consumer consumer1 = client.subscribe(partitionedTopicName, "my-sub-1", conf);
+        Consumer<byte[]> consumer1 = client.newConsumer().topic(partitionedTopicName).subscriptionName("my-sub-1")
+                .subscribe();
 
         assertEquals(Sets.newHashSet(admin.persistentTopics().getSubscriptions(partitionedTopicName)),
                 Sets.newHashSet("my-sub", "my-sub-1"));
@@ -779,9 +776,8 @@ public class AdminApiTest extends MockedPulsarServiceBaseTest {
         admin.persistentTopics().deleteSubscription(partitionedTopicName, "my-sub-1");
         assertEquals(admin.persistentTopics().getSubscriptions(partitionedTopicName), Lists.newArrayList("my-sub"));
 
-        ProducerConfiguration prodConf = new ProducerConfiguration();
-        prodConf.setMessageRoutingMode(MessageRoutingMode.RoundRobinPartition);
-        Producer producer = client.createProducer(partitionedTopicName, prodConf);
+        Producer<byte[]> producer = client.newProducer().topic(partitionedTopicName)
+                .messageRoutingMode(MessageRoutingMode.RoundRobinPartition).create();
 
         for (int i = 0; i < 10; i++) {
             String message = "message-" + i;
@@ -835,7 +831,7 @@ public class AdminApiTest extends MockedPulsarServiceBaseTest {
         } catch (ConflictException ce) {
         }
 
-        producer = client.createProducer(partitionedTopicName);
+        producer = client.newProducer().topic(partitionedTopicName).create();
 
         topics = admin.persistentTopics().getList("prop-xyz/use/ns1");
         assertEquals(topics.size(), 4);
@@ -893,7 +889,7 @@ public class AdminApiTest extends MockedPulsarServiceBaseTest {
         // Force to create a topic
         final String namespace = "prop-xyz/use/ns1";
         final String topicName = (new StringBuilder("persistent://")).append(namespace).append("/ds2").toString();
-        Producer producer = pulsarClient.createProducer(topicName);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName).create();
         producer.send("message".getBytes());
         publishMessagesOnPersistentTopic(topicName, 0);
         assertEquals(admin.persistentTopics().getList(namespace), Lists.newArrayList(topicName));
@@ -924,14 +920,13 @@ public class AdminApiTest extends MockedPulsarServiceBaseTest {
                 Lists.newArrayList("persistent://prop-xyz/use/ns1/ds2"));
 
         // create consumer and subscription
-        ConsumerConfiguration conf = new ConsumerConfiguration();
-        conf.setSubscriptionType(SubscriptionType.Exclusive);
-        Consumer consumer = pulsarClient.subscribe("persistent://prop-xyz/use/ns1/ds2", "my-sub", conf);
+        Consumer<byte[]> consumer = pulsarClient.newConsumer().topic("persistent://prop-xyz/use/ns1/ds2")
+                .subscriptionName("my-sub").subscribe();
         assertEquals(admin.persistentTopics().getSubscriptions("persistent://prop-xyz/use/ns1/ds2"),
                 Lists.newArrayList("my-sub"));
 
         // Create producer
-        Producer producer = pulsarClient.createProducer("persistent://prop-xyz/use/ns1/ds2");
+        Producer<byte[]> producer = pulsarClient.newProducer().topic("persistent://prop-xyz/use/ns1/ds2").create();
         for (int i = 0; i < 10; i++) {
             String message = "message-" + i;
             producer.send(message.getBytes());
@@ -982,13 +977,14 @@ public class AdminApiTest extends MockedPulsarServiceBaseTest {
                 Lists.newArrayList("persistent://prop-xyz/use/ns1-bundles/ds2"));
 
         // create consumer and subscription
-        ConsumerConfiguration conf = new ConsumerConfiguration();
-        Consumer consumer = pulsarClient.subscribe("persistent://prop-xyz/use/ns1-bundles/ds2", "my-sub", conf);
+        Consumer<byte[]> consumer = pulsarClient.newConsumer().topic("persistent://prop-xyz/use/ns1-bundles/ds2")
+                .subscriptionName("my-sub").subscribe();
         assertEquals(admin.persistentTopics().getSubscriptions("persistent://prop-xyz/use/ns1-bundles/ds2"),
                 Lists.newArrayList("my-sub"));
 
         // Create producer
-        Producer producer = pulsarClient.createProducer("persistent://prop-xyz/use/ns1-bundles/ds2");
+        Producer<byte[]> producer = pulsarClient.newProducer().topic("persistent://prop-xyz/use/ns1-bundles/ds2")
+                .create();
         for (int i = 0; i < 10; i++) {
             String message = "message-" + i;
             producer.send(message.getBytes());
@@ -1028,14 +1024,20 @@ public class AdminApiTest extends MockedPulsarServiceBaseTest {
         admin.namespaces().createNamespace("prop-xyz/use/ns1-bundles", numBundles);
 
         // create consumer and subscription
-        pulsarClient.subscribe("persistent://prop-xyz/use/ns1-bundles/ds2", "my-sub");
-        pulsarClient.subscribe("persistent://prop-xyz/use/ns1-bundles/ds2", "my-sub-1");
-        pulsarClient.subscribe("persistent://prop-xyz/use/ns1-bundles/ds2", "my-sub-2");
-        pulsarClient.subscribe("persistent://prop-xyz/use/ns1-bundles/ds1", "my-sub");
-        pulsarClient.subscribe("persistent://prop-xyz/use/ns1-bundles/ds1", "my-sub-1");
+        pulsarClient.newConsumer().topic("persistent://prop-xyz/use/ns1-bundles/ds2").subscriptionName("my-sub")
+                .subscribe();
+        pulsarClient.newConsumer().topic("persistent://prop-xyz/use/ns1-bundles/ds2").subscriptionName("my-sub-1")
+                .subscribe();
+        pulsarClient.newConsumer().topic("persistent://prop-xyz/use/ns1-bundles/ds2").subscriptionName("my-sub-2")
+                .subscribe();
+        pulsarClient.newConsumer().topic("persistent://prop-xyz/use/ns1-bundles/ds1").subscriptionName("my-sub")
+                .subscribe();
+        pulsarClient.newConsumer().topic("persistent://prop-xyz/use/ns1-bundles/ds1").subscriptionName("my-sub-1")
+                .subscribe();
 
         // Create producer
-        Producer producer = pulsarClient.createProducer("persistent://prop-xyz/use/ns1-bundles/ds2");
+        Producer<byte[]> producer = pulsarClient.newProducer().topic("persistent://prop-xyz/use/ns1-bundles/ds2")
+                .create();
         for (int i = 0; i < 10; i++) {
             String message = "message-" + i;
             producer.send(message.getBytes());
@@ -1044,7 +1046,8 @@ public class AdminApiTest extends MockedPulsarServiceBaseTest {
         producer.close();
 
         // Create producer
-        Producer producer1 = pulsarClient.createProducer("persistent://prop-xyz/use/ns1-bundles/ds1");
+        Producer<byte[]> producer1 = pulsarClient.newProducer().topic("persistent://prop-xyz/use/ns1-bundles/ds1")
+                .create();
         for (int i = 0; i < 10; i++) {
             String message = "message-" + i;
             producer1.send(message.getBytes());
@@ -1082,11 +1085,16 @@ public class AdminApiTest extends MockedPulsarServiceBaseTest {
         admin.namespaces().createNamespace("prop-xyz/use/ns1-bundles", numBundles);
 
         // create consumer and subscription
-        Consumer consumer1 = pulsarClient.subscribe("persistent://prop-xyz/use/ns1-bundles/ds2", "my-sub");
-        Consumer consumer2 = pulsarClient.subscribe("persistent://prop-xyz/use/ns1-bundles/ds2", "my-sub-1");
-        /* Consumer consumer3 = */ pulsarClient.subscribe("persistent://prop-xyz/use/ns1-bundles/ds2", "my-sub-2");
-        Consumer consumer4 = pulsarClient.subscribe("persistent://prop-xyz/use/ns1-bundles/ds1", "my-sub");
-        Consumer consumer5 = pulsarClient.subscribe("persistent://prop-xyz/use/ns1-bundles/ds1", "my-sub-1");
+        Consumer<byte[]> consumer1 = pulsarClient.newConsumer().topic("persistent://prop-xyz/use/ns1-bundles/ds2")
+                .subscriptionName("my-sub").subscribe();
+        Consumer<byte[]> consumer2 = pulsarClient.newConsumer().topic("persistent://prop-xyz/use/ns1-bundles/ds2")
+                .subscriptionName("my-sub-1").subscribe();
+        /* Consumer consumer3 = */ pulsarClient.newConsumer().topic("persistent://prop-xyz/use/ns1-bundles/ds2")
+                .subscriptionName("my-sub-2").subscribe();
+        Consumer<byte[]> consumer4 = pulsarClient.newConsumer().topic("persistent://prop-xyz/use/ns1-bundles/ds1")
+                .subscriptionName("my-sub").subscribe();
+        Consumer<byte[]> consumer5 = pulsarClient.newConsumer().topic("persistent://prop-xyz/use/ns1-bundles/ds1")
+                .subscriptionName("my-sub-1").subscribe();
 
         try {
             admin.namespaces().unsubscribeNamespace("prop-xyz/use/ns1-bundles", "my-sub");
@@ -1132,7 +1140,7 @@ public class AdminApiTest extends MockedPulsarServiceBaseTest {
     }
 
     private void publishMessagesOnPersistentTopic(String topicName, int messages, int startIdx) throws Exception {
-        Producer producer = pulsarClient.createProducer(topicName);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName).create();
 
         for (int i = startIdx; i < (messages + startIdx); i++) {
             String message = "message-" + i;
@@ -1177,7 +1185,7 @@ public class AdminApiTest extends MockedPulsarServiceBaseTest {
     @Test
     public void testDeleteFailedReturnCode() throws Exception {
         String topicName = "persistent://prop-xyz/use/ns1/my-topic";
-        Producer producer = pulsarClient.createProducer(topicName);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName).create();
 
         try {
             admin.persistentTopics().delete(topicName);
@@ -1188,7 +1196,7 @@ public class AdminApiTest extends MockedPulsarServiceBaseTest {
 
         producer.close();
 
-        Consumer consumer = pulsarClient.subscribe(topicName, "sub");
+        Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topicName).subscriptionName("sub").subscribe();
 
         try {
             admin.persistentTopics().delete(topicName);
@@ -1257,9 +1265,8 @@ public class AdminApiTest extends MockedPulsarServiceBaseTest {
         topicName = "persistent://prop-xyz/use/ns1/" + topicName;
 
         // create consumer and subscription
-        ConsumerConfiguration conf = new ConsumerConfiguration();
-        conf.setSubscriptionType(SubscriptionType.Exclusive);
-        Consumer consumer = pulsarClient.subscribe(topicName, "my-sub", conf);
+        Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topicName).subscriptionName("my-sub")
+                .subscriptionType(SubscriptionType.Exclusive).subscribe();
 
         assertEquals(admin.persistentTopics().getSubscriptions(topicName), Lists.newArrayList("my-sub"));
 
@@ -1271,11 +1278,11 @@ public class AdminApiTest extends MockedPulsarServiceBaseTest {
 
         publishMessagesOnPersistentTopic(topicName, 5, 5);
 
-        List<Message> messages = admin.persistentTopics().peekMessages(topicName, "my-sub", 10);
+        List<Message<byte[]>> messages = admin.persistentTopics().peekMessages(topicName, "my-sub", 10);
         assertEquals(messages.size(), 10);
 
         for (int i = 0; i < 10; i++) {
-            Message message = consumer.receive();
+            Message<byte[]> message = consumer.receive();
             consumer.acknowledge(message);
         }
         // messages should still be available due to retention
@@ -1285,7 +1292,7 @@ public class AdminApiTest extends MockedPulsarServiceBaseTest {
         int receivedAfterReset = 0;
 
         for (int i = 4; i < 10; i++) {
-            Message message = consumer.receive();
+            Message<byte[]> message = consumer.receive();
             consumer.acknowledge(message);
             ++receivedAfterReset;
             String expected = "message-" + i;
@@ -1309,9 +1316,8 @@ public class AdminApiTest extends MockedPulsarServiceBaseTest {
         topicName = "persistent://prop-xyz/use/ns1/" + topicName;
 
         // create consumer and subscription
-        ConsumerConfiguration conf = new ConsumerConfiguration();
-        conf.setSubscriptionType(SubscriptionType.Exclusive);
-        Consumer consumer = pulsarClient.subscribe(topicName, "my-sub", conf);
+        Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topicName).subscriptionName("my-sub")
+                .subscriptionType(SubscriptionType.Exclusive).subscribe();
 
         assertEquals(admin.persistentTopics().getSubscriptions(topicName), Lists.newArrayList("my-sub"));
 
@@ -1327,14 +1333,14 @@ public class AdminApiTest extends MockedPulsarServiceBaseTest {
 
         publishMessagesOnPersistentTopic(topicName, 2, 8);
 
-        List<Message> messages = admin.persistentTopics().peekMessages(topicName, "my-sub", 10);
+        List<Message<byte[]>> messages = admin.persistentTopics().peekMessages(topicName, "my-sub", 10);
         assertEquals(messages.size(), 10);
         messages.forEach(message -> {
             LOG.info("Peeked message: {}", new String(message.getData()));
         });
 
         for (int i = 0; i < 10; i++) {
-            Message message = consumer.receive();
+            Message<byte[]> message = consumer.receive();
             consumer.acknowledge(message);
         }
 
@@ -1344,7 +1350,7 @@ public class AdminApiTest extends MockedPulsarServiceBaseTest {
 
         // Should received messages from 4-9
         for (int i = 4; i < 10; i++) {
-            Message message = consumer.receive();
+            Message<byte[]> message = consumer.receive();
             consumer.acknowledge(message);
             ++receivedAfterReset;
             String expected = "message-" + i;
@@ -1358,7 +1364,7 @@ public class AdminApiTest extends MockedPulsarServiceBaseTest {
 
         // Should received messages from 7-9
         for (int i = 7; i < 10; i++) {
-            Message message = consumer.receive();
+            Message<byte[]> message = consumer.receive();
             consumer.acknowledge(message);
             ++receivedAfterReset;
             String expected = "message-" + i;
@@ -1381,9 +1387,8 @@ public class AdminApiTest extends MockedPulsarServiceBaseTest {
         admin.persistentTopics().createPartitionedTopic(topicName, 4);
 
         // create consumer and subscription
-        ConsumerConfiguration conf = new ConsumerConfiguration();
-        conf.setSubscriptionType(SubscriptionType.Exclusive);
-        Consumer consumer = pulsarClient.subscribe(topicName, "my-sub", conf);
+        Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topicName).subscriptionName("my-sub")
+                .subscriptionType(SubscriptionType.Exclusive).subscribe();
 
         List<String> topics = admin.persistentTopics().getList("prop-xyz/use/ns1");
         assertEquals(topics.size(), 4);
@@ -1397,7 +1402,7 @@ public class AdminApiTest extends MockedPulsarServiceBaseTest {
         publishMessagesOnPersistentTopic(topicName, 5, 5);
 
         for (int i = 0; i < 10; i++) {
-            Message message = consumer.receive();
+            Message<byte[]> message = consumer.receive();
             consumer.acknowledge(message);
         }
         // messages should still be available due to retention
@@ -1407,7 +1412,7 @@ public class AdminApiTest extends MockedPulsarServiceBaseTest {
         Set<String> expectedMessages = Sets.newHashSet();
         Set<String> receivedMessages = Sets.newHashSet();
         for (int i = 4; i < 10; i++) {
-            Message message = consumer.receive();
+            Message<byte[]> message = consumer.receive();
             consumer.acknowledge(message);
             expectedMessages.add("message-" + i);
             receivedMessages.add(new String(message.getData()));
@@ -1434,22 +1439,20 @@ public class AdminApiTest extends MockedPulsarServiceBaseTest {
 
         // create consumer and subscription
         URL pulsarUrl = new URL("http://127.0.0.1" + ":" + BROKER_WEBSERVICE_PORT);
-        ClientConfiguration clientConf = new ClientConfiguration();
-        clientConf.setStatsInterval(0, TimeUnit.SECONDS);
-        PulsarClient client = PulsarClient.create(pulsarUrl.toString(), clientConf);
-        ConsumerConfiguration conf = new ConsumerConfiguration();
-        conf.setSubscriptionType(SubscriptionType.Exclusive);
-        Consumer consumer = client.subscribe(topicName, "my-sub", conf);
+        PulsarClient client = PulsarClient.builder().serviceUrl(pulsarUrl.toString()).statsInterval(0, TimeUnit.SECONDS)
+                .build();
+        Consumer<byte[]> consumer = client.newConsumer().topic(topicName).subscriptionName("my-sub")
+                .subscriptionType(SubscriptionType.Exclusive).subscribe();
 
         assertEquals(admin.persistentTopics().getSubscriptions(topicName), Lists.newArrayList("my-sub"));
 
         publishMessagesOnPersistentTopic(topicName, 10);
 
-        List<Message> messages = admin.persistentTopics().peekMessages(topicName, "my-sub", 10);
+        List<Message<byte[]>> messages = admin.persistentTopics().peekMessages(topicName, "my-sub", 10);
         assertEquals(messages.size(), 10);
 
         for (int i = 0; i < 10; i++) {
-            Message message = consumer.receive();
+            Message<byte[]> message = consumer.receive();
             consumer.acknowledge(message);
         }
         // use invalid timestamp
@@ -1461,7 +1464,7 @@ public class AdminApiTest extends MockedPulsarServiceBaseTest {
         }
 
         admin.persistentTopics().resetCursor(topicName, "my-sub", System.currentTimeMillis() + 90000);
-        consumer = client.subscribe(topicName, "my-sub", conf);
+        consumer = client.newConsumer().topic(topicName).subscriptionName("my-sub").subscribe();
         consumer.close();
         client.close();
 
@@ -1500,6 +1503,7 @@ public class AdminApiTest extends MockedPulsarServiceBaseTest {
      * 3. expire message on sub-1 : backlog for sub-1 must be 0
      * 4. expire message on all subscriptions: backlog for all subscription must be 0
      * </pre>
+     *
      * @throws Exception
      */
     @Test
@@ -1512,14 +1516,13 @@ public class AdminApiTest extends MockedPulsarServiceBaseTest {
 
         // create consumer and subscription
         URL pulsarUrl = new URL("http://127.0.0.1" + ":" + BROKER_WEBSERVICE_PORT);
-        ClientConfiguration clientConf = new ClientConfiguration();
-        clientConf.setStatsInterval(0, TimeUnit.SECONDS);
-        PulsarClient client = PulsarClient.create(pulsarUrl.toString(), clientConf);
-        ConsumerConfiguration conf = new ConsumerConfiguration();
-        conf.setSubscriptionType(SubscriptionType.Shared);
-        Consumer consumer1 = client.subscribe("persistent://prop-xyz/use/ns1/ds2", "my-sub1", conf);
-        Consumer consumer2 = client.subscribe("persistent://prop-xyz/use/ns1/ds2", "my-sub2", conf);
-        Consumer consumer3 = client.subscribe("persistent://prop-xyz/use/ns1/ds2", "my-sub3", conf);
+        PulsarClient client = PulsarClient.builder().serviceUrl(pulsarUrl.toString()).statsInterval(0, TimeUnit.SECONDS)
+                .build();
+        ConsumerBuilder<byte[]> consumerBuilder = client.newConsumer().topic("persistent://prop-xyz/use/ns1/ds2")
+                .subscriptionType(SubscriptionType.Shared);
+        Consumer<byte[]> consumer1 = consumerBuilder.clone().subscriptionName("my-sub1").subscribe();
+        Consumer<byte[]> consumer2 = consumerBuilder.clone().subscriptionName("my-sub2").subscribe();
+        Consumer<byte[]> consumer3 = consumerBuilder.clone().subscriptionName("my-sub3").subscribe();
 
         assertEquals(admin.persistentTopics().getSubscriptions("persistent://prop-xyz/use/ns1/ds2").size(), 3);
 
@@ -1565,16 +1568,13 @@ public class AdminApiTest extends MockedPulsarServiceBaseTest {
 
         // create consumer and subscription
         URL pulsarUrl = new URL("http://127.0.0.1" + ":" + BROKER_WEBSERVICE_PORT);
-        ClientConfiguration clientConf = new ClientConfiguration();
-        clientConf.setStatsInterval(0, TimeUnit.SECONDS);
-        PulsarClient client = PulsarClient.create(pulsarUrl.toString(), clientConf);
-        ConsumerConfiguration conf = new ConsumerConfiguration();
-        conf.setSubscriptionType(SubscriptionType.Exclusive);
-        Consumer consumer = client.subscribe("persistent://prop-xyz/use/ns1/ds1", "my-sub", conf);
-
-        ProducerConfiguration prodConf = new ProducerConfiguration();
-        prodConf.setMessageRoutingMode(MessageRoutingMode.RoundRobinPartition);
-        Producer producer = client.createProducer("persistent://prop-xyz/use/ns1/ds1", prodConf);
+        PulsarClient client = PulsarClient.builder().serviceUrl(pulsarUrl.toString()).statsInterval(0, TimeUnit.SECONDS)
+                .build();
+        Consumer<byte[]> consumer = client.newConsumer().topic("persistent://prop-xyz/use/ns1/ds1")
+                .subscriptionName("my-sub").subscribe();
+
+        Producer<byte[]> producer = client.newProducer().topic("persistent://prop-xyz/use/ns1/ds1")
+                .messageRoutingMode(MessageRoutingMode.RoundRobinPartition).create();
         for (int i = 0; i < 10; i++) {
             String message = "message-" + i;
             producer.send(message.getBytes());
@@ -1624,7 +1624,7 @@ public class AdminApiTest extends MockedPulsarServiceBaseTest {
         final int numOfPartitions = 4;
         admin.persistentTopics().createPartitionedTopic(topic1, numOfPartitions);
         // Create a consumer to get stats on this topic
-        pulsarClient.subscribe(topic1, "my-subscriber-name", new ConsumerConfiguration());
+        pulsarClient.newConsumer().topic(topic1).subscriptionName("my-subscriber-name").subscribe();
 
         PersistentTopicsImpl persistent = (PersistentTopicsImpl) admin.persistentTopics();
         Field field = PersistentTopicsImpl.class.getDeclaredField("persistentTopics");
@@ -1753,8 +1753,7 @@ public class AdminApiTest extends MockedPulsarServiceBaseTest {
         // (1) create a topic
         final String topicName = "persistent://prop-xyz/use/getBundleNs/topic1";
         String bundleRange = admin.lookups().getBundleRange(topicName);
-        assertEquals(bundleRange,
-                pulsar.getNamespaceService().getBundle(TopicName.get(topicName)).getBundleRange());
+        assertEquals(bundleRange, pulsar.getNamespaceService().getBundle(TopicName.get(topicName)).getBundleRange());
     }
 
 }
diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/AdminApiTest2.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/AdminApiTest2.java
index 711d125..dbc36f3 100644
--- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/AdminApiTest2.java
+++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/AdminApiTest2.java
@@ -44,13 +44,10 @@ import org.apache.pulsar.broker.service.persistent.PersistentTopic;
 import org.apache.pulsar.client.admin.PulsarAdmin;
 import org.apache.pulsar.client.admin.PulsarAdminException;
 import org.apache.pulsar.client.admin.PulsarAdminException.PreconditionFailedException;
-import org.apache.pulsar.client.api.ClientConfiguration;
 import org.apache.pulsar.client.api.Consumer;
-import org.apache.pulsar.client.api.ConsumerConfiguration;
 import org.apache.pulsar.client.api.Message;
+import org.apache.pulsar.client.api.MessageRoutingMode;
 import org.apache.pulsar.client.api.Producer;
-import org.apache.pulsar.client.api.ProducerConfiguration;
-import org.apache.pulsar.client.api.ProducerConfiguration.MessageRoutingMode;
 import org.apache.pulsar.client.api.PulsarClient;
 import org.apache.pulsar.client.api.SubscriptionType;
 import org.apache.pulsar.client.impl.MessageIdImpl;
@@ -65,8 +62,6 @@ import org.apache.pulsar.common.policies.data.PersistentTopicInternalStats;
 import org.apache.pulsar.common.policies.data.PersistentTopicStats;
 import org.apache.pulsar.common.policies.data.PropertyAdmin;
 import org.apache.pulsar.common.policies.data.RetentionPolicies;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.testng.annotations.AfterMethod;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.DataProvider;
@@ -75,13 +70,11 @@ import org.testng.annotations.Test;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
-import static org.apache.pulsar.broker.auth.MockedPulsarServiceBaseTest.retryStrategically;
 
 public class AdminApiTest2 extends MockedPulsarServiceBaseTest {
 
     private MockedPulsarService mockPulsarSetup;
 
-
     @BeforeMethod
     @Override
     public void setup() throws Exception {
@@ -109,8 +102,7 @@ public class AdminApiTest2 extends MockedPulsarServiceBaseTest {
 
     @DataProvider(name = "topicType")
     public Object[][] topicTypeProvider() {
-        return new Object[][] { { TopicDomain.persistent.value() },
-                { TopicDomain.non_persistent.value() } };
+        return new Object[][] { { TopicDomain.persistent.value() }, { TopicDomain.non_persistent.value() } };
     }
 
     @DataProvider(name = "namespaceNames")
@@ -137,8 +129,8 @@ public class AdminApiTest2 extends MockedPulsarServiceBaseTest {
     @Test
     public void testIncrementPartitionsOfTopic() throws Exception {
         final String topicName = "increment-partitionedTopic";
-        final String subName1 = topicName + "-my-sub 1";
-        final String subName2 = topicName + "-my-sub 2";
+        final String subName1 = topicName + "-my-sub-1";
+        final String subName2 = topicName + "-my-sub-2";
         final int startPartitions = 4;
         final int newPartitions = 8;
         final String partitionedTopicName = "persistent://prop-xyz/use/ns1/" + topicName;
@@ -151,12 +143,12 @@ public class AdminApiTest2 extends MockedPulsarServiceBaseTest {
                 startPartitions);
 
         // create consumer and subscriptions : check subscriptions
-        PulsarClient client = PulsarClient.create(pulsarUrl.toString());
-        ConsumerConfiguration conf = new ConsumerConfiguration();
-        conf.setSubscriptionType(SubscriptionType.Shared);
-        Consumer consumer1 = client.subscribe(partitionedTopicName, subName1, conf);
+        PulsarClient client = PulsarClient.builder().serviceUrl(pulsarUrl.toString()).build();
+        Consumer<byte[]> consumer1 = client.newConsumer().topic(partitionedTopicName).subscriptionName(subName1)
+                .subscriptionType(SubscriptionType.Shared).subscribe();
         assertEquals(admin.persistentTopics().getSubscriptions(partitionedTopicName), Lists.newArrayList(subName1));
-        Consumer consumer2 = client.subscribe(partitionedTopicName, subName2, conf);
+        Consumer<byte[]> consumer2 = client.newConsumer().topic(partitionedTopicName).subscriptionName(subName2)
+                .subscriptionType(SubscriptionType.Shared).subscribe();
         assertEquals(Sets.newHashSet(admin.persistentTopics().getSubscriptions(partitionedTopicName)),
                 Sets.newHashSet(subName1, subName2));
 
@@ -172,9 +164,8 @@ public class AdminApiTest2 extends MockedPulsarServiceBaseTest {
                 .toString();
 
         // (3) produce messages to all partitions including newly created partitions (RoundRobin)
-        ProducerConfiguration prodConf = new ProducerConfiguration();
-        prodConf.setMessageRoutingMode(MessageRoutingMode.RoundRobinPartition);
-        Producer producer = client.createProducer(partitionedTopicName, prodConf);
+        Producer<byte[]> producer = client.newProducer().topic(partitionedTopicName)
+                .messageRoutingMode(MessageRoutingMode.RoundRobinPartition).create();
         final int totalMessages = newPartitions * 2;
         for (int i = 0; i < totalMessages; i++) {
             String message = "message-" + i;
@@ -184,7 +175,8 @@ public class AdminApiTest2 extends MockedPulsarServiceBaseTest {
         // (4) verify existing subscription has not lost any message: create new consumer with sub-2: it will load all
         // newly created partition topics
         consumer2.close();
-        consumer2 = client.subscribe(partitionedTopicName, subName2, conf);
+        consumer2 = client.newConsumer().topic(partitionedTopicName).subscriptionName(subName2)
+                .subscriptionType(SubscriptionType.Shared).subscribe();
         // sometime: mockZk fails to refresh ml-cache: so, invalidate the cache to get fresh data
         pulsar.getLocalZkCacheService().managedLedgerListCache().clearTree();
         assertEquals(Sets.newHashSet(admin.persistentTopics().getSubscriptions(newPartitionTopicName)),
@@ -222,10 +214,9 @@ public class AdminApiTest2 extends MockedPulsarServiceBaseTest {
         consumer2.close();
     }
 
-
     /**
-     * verifies admin api command for non-persistent topic.
-     * It verifies: partitioned-topic, stats
+     * verifies admin api command for non-persistent topic. It verifies: partitioned-topic, stats
+     *
      * @throws Exception
      */
     @Test
@@ -238,12 +229,10 @@ public class AdminApiTest2 extends MockedPulsarServiceBaseTest {
 
         // create consumer and subscription
         URL pulsarUrl = new URL("http://127.0.0.1" + ":" + BROKER_WEBSERVICE_PORT);
-        ClientConfiguration clientConf = new ClientConfiguration();
-        clientConf.setStatsInterval(0, TimeUnit.SECONDS);
-        PulsarClient client = PulsarClient.create(pulsarUrl.toString(), clientConf);
-        ConsumerConfiguration conf = new ConsumerConfiguration();
-        conf.setSubscriptionType(SubscriptionType.Exclusive);
-        Consumer consumer = client.subscribe(persistentTopicName, "my-sub", conf);
+        PulsarClient client = PulsarClient.builder().serviceUrl(pulsarUrl.toString()).statsInterval(0, TimeUnit.SECONDS)
+                .build();
+        Consumer<byte[]> consumer = client.newConsumer().topic(persistentTopicName).subscriptionName("my-sub")
+                .subscribe();
 
         publishMessagesOnTopic("non-persistent://prop-xyz/use/ns1/" + topicName, 10, 0);
 
@@ -270,7 +259,7 @@ public class AdminApiTest2 extends MockedPulsarServiceBaseTest {
     }
 
     private void publishMessagesOnTopic(String topicName, int messages, int startIdx) throws Exception {
-        Producer producer = pulsarClient.createProducer(topicName);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName).create();
 
         for (int i = startIdx; i < (messages + startIdx); i++) {
             String message = "message-" + i;
@@ -333,8 +322,8 @@ public class AdminApiTest2 extends MockedPulsarServiceBaseTest {
         admin.namespaces().setPersistence(namespace, new PersistencePolicies(3, 3, 3, 50.0));
         assertEquals(admin.namespaces().getPersistence(namespace), new PersistencePolicies(3, 3, 3, 50.0));
 
-        Producer producer = pulsarClient.createProducer(topicName);
-        Consumer consumer = pulsarClient.subscribe(topicName, "my-sub");
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName).create();
+        Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topicName).subscriptionName("my-sub").subscribe();
 
         PersistentTopic topic = (PersistentTopic) pulsar.getBrokerService().getTopic(topicName).get();
         ManagedLedgerImpl managedLedger = (ManagedLedgerImpl) topic.getManagedLedger();
@@ -344,7 +333,7 @@ public class AdminApiTest2 extends MockedPulsarServiceBaseTest {
         final int newEnsembleSize = 5;
         admin.namespaces().setPersistence(namespace, new PersistencePolicies(newEnsembleSize, 3, 3, newThrottleRate));
 
-        retryStrategically((test) -> managedLedger.getConfig().getEnsembleSize() != newEnsembleSize
+        retryStrategically((test) -> managedLedger.getConfig().getEnsembleSize() == newEnsembleSize
                 && cursor.getThrottleMarkDelete() != newThrottleRate, 5, 200);
 
         // (1) verify cursor.markDelete has been updated
@@ -370,7 +359,7 @@ public class AdminApiTest2 extends MockedPulsarServiceBaseTest {
         admin.namespaces().createNamespace(namespace);
 
         // create a topic by creating a producer
-        Producer producer = pulsarClient.createProducer(topicName);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName).create();
         producer.close();
 
         Topic topic = pulsar.getBrokerService().getTopicReference(topicName);
@@ -384,7 +373,7 @@ public class AdminApiTest2 extends MockedPulsarServiceBaseTest {
         assertNull(topic);
 
         // recreation of producer will load the topic again
-        producer = pulsarClient.createProducer(topicName);
+        producer = pulsarClient.newProducer().topic(topicName).create();
         topic = pulsar.getBrokerService().getTopicReference(topicName);
         assertNotNull(topic);
         // unload the topic
@@ -431,18 +420,17 @@ public class AdminApiTest2 extends MockedPulsarServiceBaseTest {
         admin.namespaces().setRetention("prop-xyz/use/ns1", new RetentionPolicies(10, 10));
 
         // create consumer and subscription
-        ConsumerConfiguration conf = new ConsumerConfiguration();
-        conf.setSubscriptionType(SubscriptionType.Shared);
-        Consumer consumer = pulsarClient.subscribe(topicName, "my-sub", conf);
+        Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topicName).subscriptionName("my-sub")
+                .subscriptionType(SubscriptionType.Shared).subscribe();
 
         assertEquals(admin.persistentTopics().getSubscriptions(topicName), Lists.newArrayList("my-sub"));
 
         publishMessagesOnPersistentTopic(topicName, totalProducedMessages, 0);
 
-        List<Message> messages = admin.persistentTopics().peekMessages(topicName, "my-sub", 10);
+        List<Message<byte[]>> messages = admin.persistentTopics().peekMessages(topicName, "my-sub", 10);
         assertEquals(messages.size(), 10);
 
-        Message message = null;
+        Message<byte[]> message = null;
         MessageIdImpl resetMessageId = null;
         int resetPositionId = 10;
         for (int i = 0; i < 20; i++) {
@@ -461,7 +449,8 @@ public class AdminApiTest2 extends MockedPulsarServiceBaseTest {
         // reset position at resetMessageId
         admin.persistentTopics().resetCursor(topicName, "my-sub", messageId);
 
-        consumer = pulsarClient.subscribe(topicName, "my-sub", conf);
+        consumer = pulsarClient.newConsumer().topic(topicName).subscriptionName("my-sub")
+                .subscriptionType(SubscriptionType.Shared).subscribe();
         MessageIdImpl msgId2 = (MessageIdImpl) consumer.receive(1, TimeUnit.SECONDS).getMessageId();
         assertEquals(resetMessageId, msgId2);
 
@@ -506,7 +495,7 @@ public class AdminApiTest2 extends MockedPulsarServiceBaseTest {
     }
 
     private void publishMessagesOnPersistentTopic(String topicName, int messages, int startIdx) throws Exception {
-        Producer producer = pulsarClient.createProducer(topicName);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName).create();
 
         for (int i = startIdx; i < (messages + startIdx); i++) {
             String message = "message-" + i;
@@ -719,7 +708,7 @@ public class AdminApiTest2 extends MockedPulsarServiceBaseTest {
         Set<String> topicNames = Sets.newHashSet();
         for (int i = 0; i < totalTopics; i++) {
             topicNames.add(topicName + i);
-            Producer producer = pulsarClient.createProducer(topicName + i);
+            Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName + i).create();
             producer.close();
         }
 
diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/CreateSubscriptionTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/CreateSubscriptionTest.java
index c6f277d..052116f 100644
--- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/CreateSubscriptionTest.java
+++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/CreateSubscriptionTest.java
@@ -65,7 +65,7 @@ public class CreateSubscriptionTest extends MockedPulsarServiceBaseTest {
 
         assertEquals(admin.persistentTopics().getSubscriptions(topic), Lists.newArrayList("sub-1"));
 
-        Producer p1 = pulsarClient.createProducer(topic);
+        Producer<byte[]> p1 = pulsarClient.newProducer().topic(topic).create();
         p1.send("test-1".getBytes());
         p1.send("test-2".getBytes());
         MessageId m3 = p1.send("test-3".getBytes());
@@ -98,8 +98,7 @@ public class CreateSubscriptionTest extends MockedPulsarServiceBaseTest {
         }
 
         for (int i = 0; i < 10; i++) {
-            assertEquals(
-                    admin.persistentTopics().getSubscriptions(TopicName.get(topic).getPartition(i).toString()),
+            assertEquals(admin.persistentTopics().getSubscriptions(TopicName.get(topic).getPartition(i).toString()),
                     Lists.newArrayList("sub-1"));
         }
     }
diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/IncrementPartitionsTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/IncrementPartitionsTest.java
index e001ba0..60f2044 100644
--- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/IncrementPartitionsTest.java
+++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/admin/IncrementPartitionsTest.java
@@ -80,15 +80,14 @@ public class IncrementPartitionsTest extends MockedPulsarServiceBaseTest {
         admin.persistentTopics().createPartitionedTopic(partitionedTopicName, 10);
         assertEquals(admin.persistentTopics().getPartitionedTopicMetadata(partitionedTopicName).partitions, 10);
 
-        Consumer consumer = pulsarClient.subscribe(partitionedTopicName, "sub-1");
+        Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(partitionedTopicName).subscriptionName("sub-1")
+                .subscribe();
 
         admin.persistentTopics().updatePartitionedTopic(partitionedTopicName, 20);
         assertEquals(admin.persistentTopics().getPartitionedTopicMetadata(partitionedTopicName).partitions, 20);
 
-        assertEquals(
-                admin.persistentTopics()
-                        .getSubscriptions(TopicName.get(partitionedTopicName).getPartition(15).toString()),
-                Lists.newArrayList("sub-1"));
+        assertEquals(admin.persistentTopics().getSubscriptions(
+                TopicName.get(partitionedTopicName).getPartition(15).toString()), Lists.newArrayList("sub-1"));
 
         consumer.close();
     }
diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/loadbalance/AntiAffinityNamespaceGroupTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/loadbalance/AntiAffinityNamespaceGroupTest.java
index e7161b2..f43b24e 100644
--- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/loadbalance/AntiAffinityNamespaceGroupTest.java
+++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/loadbalance/AntiAffinityNamespaceGroupTest.java
@@ -24,7 +24,6 @@ import static org.testng.Assert.assertNotEquals;
 import static org.testng.Assert.assertTrue;
 
 import java.lang.reflect.Field;
-import java.net.InetAddress;
 import java.net.URL;
 import java.util.Map;
 import java.util.Set;
@@ -511,8 +510,9 @@ public class AntiAffinityNamespaceGroupTest {
             admin1.namespaces().setNamespaceAntiAffinityGroup(ns, namespaceAntiAffinityGroup);
         }
 
-        PulsarClient pulsarClient = PulsarClient.create(pulsar1.getWebServiceAddress());
-        Producer producer = pulsarClient.createProducer("persistent://" + namespace + "0/my-topic1");
+        PulsarClient pulsarClient = PulsarClient.builder().serviceUrl(pulsar1.getWebServiceAddress()).build();
+        Producer<byte[]> producer = pulsarClient.newProducer().topic("persistent://" + namespace + "0/my-topic1")
+                .create();
         ModularLoadManagerImpl loadManager = (ModularLoadManagerImpl) ((ModularLoadManagerWrapper) pulsar1
                 .getLoadManager().get()).getLoadManager();
 
@@ -527,6 +527,7 @@ public class AntiAffinityNamespaceGroupTest {
     private boolean isLoadManagerUpdatedDomainCache(ModularLoadManagerImpl loadManager) throws Exception {
         Field mapField = ModularLoadManagerImpl.class.getDeclaredField("brokerToFailureDomainMap");
         mapField.setAccessible(true);
+        @SuppressWarnings("unchecked")
         Map<String, String> map = (Map<String, String>) mapField.get(loadManager);
         return !map.isEmpty();
     }
diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/loadbalance/LoadBalancerTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/loadbalance/LoadBalancerTest.java
index 9ebba22..e0745c4 100644
--- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/loadbalance/LoadBalancerTest.java
+++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/loadbalance/LoadBalancerTest.java
@@ -195,6 +195,7 @@ public class LoadBalancerTest {
      * those load reports can be deserialized and are in valid format tests if the rankings are populated from the load
      * reports are not, both broker will have zero rank
      */
+    @SuppressWarnings("unchecked")
     @Test
     public void testLoadReportsWrittenOnZK() throws Exception {
         ZooKeeper zkc = bkEnsemble.getZkClient();
@@ -289,6 +290,7 @@ public class LoadBalancerTest {
         Field ranking = ((SimpleLoadManagerImpl) pulsar.getLoadManager().get()).getClass()
                 .getDeclaredField("sortedRankings");
         ranking.setAccessible(true);
+        @SuppressWarnings("unchecked")
         AtomicReference<Map<Long, Set<ResourceUnit>>> sortedRanking = (AtomicReference<Map<Long, Set<ResourceUnit>>>) ranking
                 .get(pulsar.getLoadManager().get());
         return sortedRanking;
diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/loadbalance/ModularLoadManagerImplTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/loadbalance/ModularLoadManagerImplTest.java
index 7d36d39..0502d78 100644
--- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/loadbalance/ModularLoadManagerImplTest.java
+++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/loadbalance/ModularLoadManagerImplTest.java
@@ -23,8 +23,8 @@ import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertNotEquals;
 import static org.testng.Assert.assertFalse;
+import static org.testng.Assert.assertNotEquals;
 import static org.testng.Assert.assertTrue;
 
 import java.lang.reflect.Field;
@@ -76,7 +76,6 @@ import org.apache.zookeeper.ZooDefs;
 import org.mockito.Mockito;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.testng.Assert;
 import org.testng.annotations.AfterMethod;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
@@ -616,5 +615,7 @@ public class ModularLoadManagerImplTest {
         } catch (PulsarServerException e) {
             //Ok.
         }
+
+        pulsar.close();
     }
 }
diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/loadbalance/SimpleLoadManagerImplTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/loadbalance/SimpleLoadManagerImplTest.java
index e26fe34..1771d3d 100644
--- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/loadbalance/SimpleLoadManagerImplTest.java
+++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/loadbalance/SimpleLoadManagerImplTest.java
@@ -234,7 +234,7 @@ public class SimpleLoadManagerImplTest {
 
     }
 
-    private void setObjectField(Class objClass, Object objInstance, String fieldName, Object newValue)
+    private void setObjectField(Class<?> objClass, Object objInstance, String fieldName, Object newValue)
             throws Exception {
         Field field = objClass.getDeclaredField(fieldName);
         field.setAccessible(true);
diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/namespace/NamespaceServiceTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/namespace/NamespaceServiceTest.java
index 659361c..066693e 100644
--- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/namespace/NamespaceServiceTest.java
+++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/namespace/NamespaceServiceTest.java
@@ -45,8 +45,6 @@ import org.apache.bookkeeper.mledger.ManagedLedger;
 import org.apache.bookkeeper.util.ZkUtils;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.tuple.Pair;
-import org.apache.pulsar.broker.PulsarService;
-import org.apache.pulsar.broker.cache.LocalZooKeeperCacheService;
 import org.apache.pulsar.broker.loadbalance.LoadManager;
 import org.apache.pulsar.broker.loadbalance.impl.ModularLoadManagerImpl;
 import org.apache.pulsar.broker.loadbalance.impl.ModularLoadManagerWrapper;
@@ -55,19 +53,16 @@ import org.apache.pulsar.broker.service.BrokerTestBase;
 import org.apache.pulsar.broker.service.Topic;
 import org.apache.pulsar.broker.service.persistent.PersistentTopic;
 import org.apache.pulsar.client.api.Consumer;
-import org.apache.pulsar.client.api.ConsumerConfiguration;
-import org.apache.pulsar.common.naming.TopicName;
 import org.apache.pulsar.common.naming.NamespaceBundle;
 import org.apache.pulsar.common.naming.NamespaceBundleFactory;
 import org.apache.pulsar.common.naming.NamespaceBundles;
 import org.apache.pulsar.common.naming.NamespaceName;
-import org.apache.pulsar.common.policies.data.LocalPolicies;
+import org.apache.pulsar.common.naming.TopicName;
 import org.apache.pulsar.common.policies.data.Policies;
 import org.apache.pulsar.common.util.ObjectMapperFactory;
 import org.apache.pulsar.common.util.collections.ConcurrentOpenHashMap;
 import org.apache.pulsar.policies.data.loadbalancer.LoadReport;
 import org.apache.pulsar.policies.data.loadbalancer.LocalBrokerData;
-import org.apache.pulsar.zookeeper.ZooKeeperDataCache;
 import org.apache.zookeeper.CreateMode;
 import org.apache.zookeeper.ZooDefs;
 import org.apache.zookeeper.data.Stat;
@@ -267,8 +262,8 @@ public class NamespaceServiceTest extends BrokerTestBase {
     public void testUnloadNamespaceBundleFailure() throws Exception {
 
         final String topicName = "persistent://my-property/use/my-ns/my-topic1";
-        ConsumerConfiguration conf = new ConsumerConfiguration();
-        Consumer consumer = pulsarClient.subscribe(topicName, "my-subscriber-name", conf);
+        pulsarClient.newConsumer().topic(topicName).subscriptionName("my-subscriber-name").subscribe();
+
         ConcurrentOpenHashMap<String, CompletableFuture<Topic>> topics = pulsar.getBrokerService().getTopics();
         Topic spyTopic = spy(topics.get(topicName).get());
         topics.clear();
@@ -300,15 +295,15 @@ public class NamespaceServiceTest extends BrokerTestBase {
 
     /**
      * It verifies that unloading bundle will timeout and will not hung even if one of the topic-unloading stuck.
-     * 
+     *
      * @throws Exception
      */
     @Test(timeOut = 6000)
     public void testUnloadNamespaceBundleWithStuckTopic() throws Exception {
 
         final String topicName = "persistent://my-property/use/my-ns/my-topic1";
-        ConsumerConfiguration conf = new ConsumerConfiguration();
-        Consumer consumer = pulsarClient.subscribe(topicName, "my-subscriber-name", conf);
+        Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topicName).subscriptionName("my-subscriber-name")
+                .subscribe();
         ConcurrentOpenHashMap<String, CompletableFuture<Topic>> topics = pulsar.getBrokerService().getTopics();
         Topic spyTopic = spy(topics.get(topicName).get());
         topics.clear();
@@ -335,7 +330,7 @@ public class NamespaceServiceTest extends BrokerTestBase {
         }
         consumer.close();
     }
-    
+
     /**
      * <pre>
      *  It verifies that namespace service deserialize the load-report based on load-manager which active.
diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/namespace/NamespaceUnloadingTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/namespace/NamespaceUnloadingTest.java
index bcd6b76..1da9564 100644
--- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/namespace/NamespaceUnloadingTest.java
+++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/namespace/NamespaceUnloadingTest.java
@@ -53,7 +53,8 @@ public class NamespaceUnloadingTest extends BrokerTestBase {
     public void testUnloadPartiallyLoadedNamespace() throws Exception {
         admin.namespaces().createNamespace("prop/use/ns-test-2", 16);
 
-        Producer producer = pulsarClient.createProducer("persistent://prop/use/ns-test-2/my-topic");
+        Producer<byte[]> producer = pulsarClient.newProducer().topic("persistent://prop/use/ns-test-2/my-topic")
+                .create();
 
         assertTrue(admin.namespaces().getNamespaces("prop", "use").contains("prop/use/ns-test-2"));
 
diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/AddMissingPatchVersionTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/AddMissingPatchVersionTest.java
index bcc589a..14b5dd4 100644
--- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/AddMissingPatchVersionTest.java
+++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/AddMissingPatchVersionTest.java
@@ -18,7 +18,6 @@
  */
 package org.apache.pulsar.broker.service;
 
-import org.apache.pulsar.broker.PulsarService;
 import org.apache.pulsar.utils.PulsarBrokerVersionStringUtils;
 import org.testng.Assert;
 import org.testng.annotations.Test;
diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/BacklogQuotaManagerTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/BacklogQuotaManagerTest.java
index f1761d8..80a870c 100644
--- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/BacklogQuotaManagerTest.java
+++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/BacklogQuotaManagerTest.java
@@ -31,11 +31,9 @@ import org.apache.pulsar.broker.PulsarService;
 import org.apache.pulsar.broker.ServiceConfiguration;
 import org.apache.pulsar.client.admin.PulsarAdmin;
 import org.apache.pulsar.client.api.Authentication;
-import org.apache.pulsar.client.api.ClientConfiguration;
 import org.apache.pulsar.client.api.Consumer;
 import org.apache.pulsar.client.api.Message;
 import org.apache.pulsar.client.api.Producer;
-import org.apache.pulsar.client.api.ProducerConfiguration;
 import org.apache.pulsar.client.api.PulsarClient;
 import org.apache.pulsar.client.api.PulsarClientException;
 import org.apache.pulsar.common.policies.data.BacklogQuota;
@@ -129,18 +127,17 @@ public class BacklogQuotaManagerTest {
         assertEquals(admin.namespaces().getBacklogQuotaMap("prop/usc/ns-quota"), Maps.newTreeMap());
         admin.namespaces().setBacklogQuota("prop/usc/ns-quota",
                 new BacklogQuota(10 * 1024, BacklogQuota.RetentionPolicy.consumer_backlog_eviction));
-        ClientConfiguration clientConf = new ClientConfiguration();
-        clientConf.setStatsInterval(0, TimeUnit.SECONDS);
-        PulsarClient client = PulsarClient.create(adminUrl.toString(), clientConf);
+        PulsarClient client = PulsarClient.builder().serviceUrl(adminUrl.toString()).statsInterval(0, TimeUnit.SECONDS)
+                .build();
 
         final String topic1 = "persistent://prop/usc/ns-quota/topic1";
         final String subName1 = "c1";
         final String subName2 = "c2";
         final int numMsgs = 20;
 
-        Consumer consumer1 = client.subscribe(topic1, subName1);
-        Consumer consumer2 = client.subscribe(topic1, subName2);
-        org.apache.pulsar.client.api.Producer producer = client.createProducer(topic1);
+        Consumer<byte[]> consumer1 = client.newConsumer().topic(topic1).subscriptionName(subName1).subscribe();
+        Consumer<byte[]> consumer2 = client.newConsumer().topic(topic1).subscriptionName(subName2).subscribe();
+        org.apache.pulsar.client.api.Producer<byte[]> producer = client.newProducer().topic(topic1).create();
         byte[] content = new byte[1024];
         for (int i = 0; i < numMsgs; i++) {
             producer.send(content);
@@ -161,16 +158,16 @@ public class BacklogQuotaManagerTest {
         assertEquals(admin.namespaces().getBacklogQuotaMap("prop/usc/ns-quota"), Maps.newTreeMap());
         admin.namespaces().setBacklogQuota("prop/usc/ns-quota",
                 new BacklogQuota(10 * 1024, BacklogQuota.RetentionPolicy.consumer_backlog_eviction));
-        PulsarClient client = PulsarClient.create(adminUrl.toString());
+        PulsarClient client = PulsarClient.builder().serviceUrl(adminUrl.toString()).build();
 
         final String topic1 = "persistent://prop/usc/ns-quota/topic11";
         final String subName1 = "c11";
         final String subName2 = "c21";
         final int numMsgs = 20;
 
-        Consumer consumer1 = client.subscribe(topic1, subName1);
-        Consumer consumer2 = client.subscribe(topic1, subName2);
-        org.apache.pulsar.client.api.Producer producer = client.createProducer(topic1);
+        Consumer<byte[]> consumer1 = client.newConsumer().topic(topic1).subscriptionName(subName1).subscribe();
+        Consumer<byte[]> consumer2 = client.newConsumer().topic(topic1).subscriptionName(subName2).subscribe();
+        org.apache.pulsar.client.api.Producer<byte[]> producer = client.newProducer().topic(topic1).create();
         byte[] content = new byte[1024];
         for (int i = 0; i < numMsgs; i++) {
             producer.send(content);
@@ -201,18 +198,19 @@ public class BacklogQuotaManagerTest {
         final CyclicBarrier barrier = new CyclicBarrier(2);
         final CountDownLatch counter = new CountDownLatch(2);
         final AtomicBoolean gotException = new AtomicBoolean(false);
-        ClientConfiguration clientConf = new ClientConfiguration();
-        clientConf.setStatsInterval(0, TimeUnit.SECONDS);
-        PulsarClient client = PulsarClient.create(adminUrl.toString(), clientConf);
-        PulsarClient client2 = PulsarClient.create(adminUrl.toString(), clientConf);
-        Consumer consumer1 = client2.subscribe(topic1, subName1);
-        Consumer consumer2 = client2.subscribe(topic1, subName2);
+        PulsarClient client = PulsarClient.builder().serviceUrl(adminUrl.toString()).statsInterval(0, TimeUnit.SECONDS)
+                .build();
+        PulsarClient client2 = PulsarClient.builder().serviceUrl(adminUrl.toString()).statsInterval(0, TimeUnit.SECONDS)
+                .build();
+        Consumer<byte[]> consumer1 = client2.newConsumer().topic(topic1).subscriptionName(subName1).subscribe();
+        Consumer<byte[]> consumer2 = client2.newConsumer().topic(topic1).subscriptionName(subName2).subscribe();
 
         Thread producerThread = new Thread() {
             public void run() {
                 try {
                     barrier.await();
-                    final org.apache.pulsar.client.api.Producer producer = client.createProducer(topic1);
+                    org.apache.pulsar.client.api.Producer<byte[]> producer = client.newProducer().topic(topic1)
+                            .create();
                     byte[] content = new byte[1024];
                     for (int i = 0; i < numMsgs; i++) {
                         producer.send(content);
@@ -272,19 +270,20 @@ public class BacklogQuotaManagerTest {
         final CyclicBarrier barrier = new CyclicBarrier(2);
         final CountDownLatch counter = new CountDownLatch(2);
         final AtomicBoolean gotException = new AtomicBoolean(false);
-        final ClientConfiguration clientConf = new ClientConfiguration();
-        clientConf.setStatsInterval(0, TimeUnit.SECONDS);
-        final PulsarClient client = PulsarClient.create(adminUrl.toString(), clientConf);
+        final PulsarClient client = PulsarClient.builder().serviceUrl(adminUrl.toString())
+                .statsInterval(0, TimeUnit.SECONDS).build();
 
-        final Consumer consumer1 = client.subscribe(topic1, subName1);
-        final Consumer consumer2 = client.subscribe(topic1, subName2);
-        final PulsarClient client2 = PulsarClient.create(adminUrl.toString(), clientConf);
+        final Consumer<byte[]> consumer1 = client.newConsumer().topic(topic1).subscriptionName(subName1).subscribe();
+        final Consumer<byte[]> consumer2 = client.newConsumer().topic(topic1).subscriptionName(subName2).subscribe();
+        final PulsarClient client2 = PulsarClient.builder().serviceUrl(adminUrl.toString())
+                .statsInterval(0, TimeUnit.SECONDS).build();
 
         Thread producerThread = new Thread() {
             public void run() {
                 try {
                     barrier.await();
-                    org.apache.pulsar.client.api.Producer producer = client2.createProducer(topic1);
+                    org.apache.pulsar.client.api.Producer<byte[]> producer = client2.newProducer().topic(topic1)
+                            .create();
                     byte[] content = new byte[1024];
                     for (int i = 0; i < numMsgs; i++) {
                         producer.send(content);
@@ -336,20 +335,22 @@ public class BacklogQuotaManagerTest {
         final CyclicBarrier barrier = new CyclicBarrier(4);
         final CountDownLatch counter = new CountDownLatch(4);
         final AtomicBoolean gotException = new AtomicBoolean(false);
-        final ClientConfiguration clientConf = new ClientConfiguration();
-        clientConf.setStatsInterval(0, TimeUnit.SECONDS);
-        final PulsarClient client = PulsarClient.create(adminUrl.toString(), clientConf);
+        final PulsarClient client = PulsarClient.builder().serviceUrl(adminUrl.toString())
+                .statsInterval(0, TimeUnit.SECONDS).build();
 
-        final Consumer consumer1 = client.subscribe(topic1, subName1);
-        final Consumer consumer2 = client.subscribe(topic1, subName2);
-        final PulsarClient client3 = PulsarClient.create(adminUrl.toString(), clientConf);
-        final PulsarClient client2 = PulsarClient.create(adminUrl.toString(), clientConf);
+        final Consumer<byte[]> consumer1 = client.newConsumer().topic(topic1).subscriptionName(subName1).subscribe();
+        final Consumer<byte[]> consumer2 = client.newConsumer().topic(topic1).subscriptionName(subName2).subscribe();
+        final PulsarClient client3 = PulsarClient.builder().serviceUrl(adminUrl.toString())
+                .statsInterval(0, TimeUnit.SECONDS).build();
+        final PulsarClient client2 = PulsarClient.builder().serviceUrl(adminUrl.toString())
+                .statsInterval(0, TimeUnit.SECONDS).build();
 
         Thread producerThread1 = new Thread() {
             public void run() {
                 try {
                     barrier.await();
-                    org.apache.pulsar.client.api.Producer producer = client2.createProducer(topic1);
+                    org.apache.pulsar.client.api.Producer<byte[]> producer = client2.newProducer().topic(topic1)
+                            .create();
                     byte[] content = new byte[1024];
                     for (int i = 0; i < numMsgs; i++) {
                         producer.send(content);
@@ -367,7 +368,8 @@ public class BacklogQuotaManagerTest {
             public void run() {
                 try {
                     barrier.await();
-                    org.apache.pulsar.client.api.Producer producer = client3.createProducer(topic1);
+                    org.apache.pulsar.client.api.Producer<byte[]> producer = client3.newProducer().topic(topic1)
+                            .create();
                     byte[] content = new byte[1024];
                     for (int i = 0; i < numMsgs; i++) {
                         producer.send(content);
@@ -432,19 +434,16 @@ public class BacklogQuotaManagerTest {
         assertEquals(admin.namespaces().getBacklogQuotaMap("prop/usc/quotahold"), Maps.newTreeMap());
         admin.namespaces().setBacklogQuota("prop/usc/quotahold",
                 new BacklogQuota(10 * 1024, BacklogQuota.RetentionPolicy.producer_request_hold));
-        final ClientConfiguration clientConf = new ClientConfiguration();
-        clientConf.setStatsInterval(0, TimeUnit.SECONDS);
-        final PulsarClient client = PulsarClient.create(adminUrl.toString(), clientConf);
+        final PulsarClient client = PulsarClient.builder().serviceUrl(adminUrl.toString())
+                .statsInterval(0, TimeUnit.SECONDS).build();
         final String topic1 = "persistent://prop/usc/quotahold/hold";
         final String subName1 = "c1hold";
         final int numMsgs = 10;
 
-        Consumer consumer = client.subscribe(topic1, subName1);
-        ProducerConfiguration producerConfiguration = new ProducerConfiguration();
-        producerConfiguration.setSendTimeout(2, TimeUnit.SECONDS);
+        Consumer<byte[]> consumer = client.newConsumer().topic(topic1).subscriptionName(subName1).subscribe();
 
         byte[] content = new byte[1024];
-        Producer producer = client.createProducer(topic1, producerConfiguration);
+        Producer<byte[]> producer = client.newProducer().topic(topic1).sendTimeout(2, TimeUnit.SECONDS).create();
         for (int i = 0; i <= numMsgs; i++) {
             try {
                 producer.send(content);
@@ -473,19 +472,16 @@ public class BacklogQuotaManagerTest {
         assertEquals(admin.namespaces().getBacklogQuotaMap("prop/usc/quotahold"), Maps.newTreeMap());
         admin.namespaces().setBacklogQuota("prop/usc/quotahold",
                 new BacklogQuota(10 * 1024, BacklogQuota.RetentionPolicy.producer_request_hold));
-        final ClientConfiguration clientConf = new ClientConfiguration();
-        clientConf.setStatsInterval(0, TimeUnit.SECONDS);
-        final PulsarClient client = PulsarClient.create(adminUrl.toString(), clientConf);
+        final PulsarClient client = PulsarClient.builder().serviceUrl(adminUrl.toString())
+                .statsInterval(0, TimeUnit.SECONDS).build();
         final String topic1 = "persistent://prop/usc/quotahold/holdtimeout";
         final String subName1 = "c1holdtimeout";
         boolean gotException = false;
 
-        client.subscribe(topic1, subName1);
-        ProducerConfiguration producerConfiguration = new ProducerConfiguration();
-        producerConfiguration.setSendTimeout(2, TimeUnit.SECONDS);
+        client.newConsumer().topic(topic1).subscriptionName(subName1).subscribe();
 
         byte[] content = new byte[1024];
-        Producer producer = client.createProducer(topic1, producerConfiguration);
+        Producer<byte[]> producer = client.newProducer().topic(topic1).sendTimeout(2, TimeUnit.SECONDS).create();
         for (int i = 0; i < 10; i++) {
             producer.send(content);
         }
@@ -510,19 +506,16 @@ public class BacklogQuotaManagerTest {
         assertEquals(admin.namespaces().getBacklogQuotaMap("prop/usc/quotahold"), Maps.newTreeMap());
         admin.namespaces().setBacklogQuota("prop/usc/quotahold",
                 new BacklogQuota(10 * 1024, BacklogQuota.RetentionPolicy.producer_exception));
-        final ClientConfiguration clientConf = new ClientConfiguration();
-        clientConf.setStatsInterval(0, TimeUnit.SECONDS);
-        final PulsarClient client = PulsarClient.create(adminUrl.toString(), clientConf);
+        final PulsarClient client = PulsarClient.builder().serviceUrl(adminUrl.toString())
+                .statsInterval(0, TimeUnit.SECONDS).build();
         final String topic1 = "persistent://prop/usc/quotahold/except";
         final String subName1 = "c1except";
         boolean gotException = false;
 
-        client.subscribe(topic1, subName1);
-        ProducerConfiguration producerConfiguration = new ProducerConfiguration();
-        producerConfiguration.setSendTimeout(2, TimeUnit.SECONDS);
+        client.newConsumer().topic(topic1).subscriptionName(subName1).subscribe();
 
         byte[] content = new byte[1024];
-        Producer producer = client.createProducer(topic1, producerConfiguration);
+        Producer<byte[]> producer = client.newProducer().topic(topic1).sendTimeout(2, TimeUnit.SECONDS).create();
         for (int i = 0; i < 10; i++) {
             producer.send(content);
         }
@@ -549,19 +542,16 @@ public class BacklogQuotaManagerTest {
         assertEquals(admin.namespaces().getBacklogQuotaMap("prop/usc/quotahold"), Maps.newTreeMap());
         admin.namespaces().setBacklogQuota("prop/usc/quotahold",
                 new BacklogQuota(10 * 1024, BacklogQuota.RetentionPolicy.producer_exception));
-        final ClientConfiguration clientConf = new ClientConfiguration();
-        clientConf.setStatsInterval(0, TimeUnit.SECONDS);
-        final PulsarClient client = PulsarClient.create(adminUrl.toString(), clientConf);
+        final PulsarClient client = PulsarClient.builder().serviceUrl(adminUrl.toString())
+                .statsInterval(0, TimeUnit.SECONDS).build();
         final String topic1 = "persistent://prop/usc/quotahold/exceptandunblock";
         final String subName1 = "c1except";
         boolean gotException = false;
 
-        Consumer consumer = client.subscribe(topic1, subName1);
-        ProducerConfiguration producerConfiguration = new ProducerConfiguration();
-        producerConfiguration.setSendTimeout(2, TimeUnit.SECONDS);
+        Consumer<byte[]> consumer = client.newConsumer().topic(topic1).subscriptionName(subName1).subscribe();
 
         byte[] content = new byte[1024];
-        Producer producer = client.createProducer(topic1, producerConfiguration);
+        Producer<byte[]> producer = client.newProducer().topic(topic1).sendTimeout(2, TimeUnit.SECONDS).create();
         for (int i = 0; i < 10; i++) {
             producer.send(content);
         }
@@ -586,7 +576,7 @@ public class BacklogQuotaManagerTest {
         int backlog = (int) stats.subscriptions.get(subName1).msgBacklog;
 
         for (int i = 0; i < backlog; i++) {
-            Message msg = consumer.receive();
+            Message<?> msg = consumer.receive();
             consumer.acknowledge(msg);
         }
         Thread.sleep((TIME_TO_CHECK_BACKLOG_QUOTA + 1) * 1000);
diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/BatchMessageTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/BatchMessageTest.java
index b34e7d3..2d7c7ae 100644
--- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/BatchMessageTest.java
+++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/BatchMessageTest.java
@@ -37,12 +37,10 @@ import org.apache.pulsar.broker.service.persistent.PersistentDispatcherMultipleC
 import org.apache.pulsar.broker.service.persistent.PersistentTopic;
 import org.apache.pulsar.client.api.CompressionType;
 import org.apache.pulsar.client.api.Consumer;
-import org.apache.pulsar.client.api.ConsumerConfiguration;
 import org.apache.pulsar.client.api.Message;
 import org.apache.pulsar.client.api.MessageBuilder;
 import org.apache.pulsar.client.api.MessageId;
 import org.apache.pulsar.client.api.Producer;
-import org.apache.pulsar.client.api.ProducerConfiguration;
 import org.apache.pulsar.client.api.SubscriptionType;
 import org.apache.pulsar.client.impl.ConsumerImpl;
 import org.apache.pulsar.common.util.FutureUtil;
@@ -82,20 +80,18 @@ public class BatchMessageTest extends BrokerTestBase {
         final String topicName = "persistent://prop/use/ns-abc/testSimpleBatchProducerWithFixedBatchSize";
         final String subscriptionName = "sub-1" + compressionType.toString();
 
-        Consumer consumer = pulsarClient.subscribe(topicName, subscriptionName);
+        Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topicName).subscriptionName(subscriptionName)
+                .subscribe();
         consumer.close();
 
-        ProducerConfiguration producerConf = new ProducerConfiguration();
-        producerConf.setCompressionType(compressionType);
-        producerConf.setBatchingMaxPublishDelay(5000, TimeUnit.MILLISECONDS);
-        producerConf.setBatchingMaxMessages(numMsgsInBatch);
-        producerConf.setBatchingEnabled(true);
-        Producer producer = pulsarClient.createProducer(topicName, producerConf);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName).compressionType(compressionType)
+                .batchingMaxPublishDelay(5, TimeUnit.SECONDS).batchingMaxMessages(numMsgsInBatch).enableBatching(true)
+                .create();
 
         List<CompletableFuture<MessageId>> sendFutureList = Lists.newArrayList();
         for (int i = 0; i < numMsgs; i++) {
             byte[] message = ("my-message-" + i).getBytes();
-            Message msg = MessageBuilder.create().setContent(message).build();
+            Message<byte[]> msg = MessageBuilder.create().setContent(message).build();
             sendFutureList.add(producer.sendAsync(msg));
         }
         FutureUtil.waitForAll(sendFutureList).get();
@@ -107,10 +103,10 @@ public class BatchMessageTest extends BrokerTestBase {
         // we expect 2 messages in the backlog since we sent 50 messages with the batch size set to 25. We have set the
         // batch time high enough for it to not affect the number of messages in the batch
         assertEquals(topic.getSubscription(subscriptionName).getNumberOfEntriesInBacklog(), 2);
-        consumer = pulsarClient.subscribe(topicName, subscriptionName);
+        consumer = pulsarClient.newConsumer().topic(topicName).subscriptionName(subscriptionName).subscribe();
 
         for (int i = 0; i < numMsgs; i++) {
-            Message msg = consumer.receive(5, TimeUnit.SECONDS);
+            Message<byte[]> msg = consumer.receive(5, TimeUnit.SECONDS);
             assertNotNull(msg);
             String receivedMessage = new String(msg.getData());
             String expectedMessage = "my-message-" + i;
@@ -127,14 +123,12 @@ public class BatchMessageTest extends BrokerTestBase {
         final String topicName = "persistent://prop/use/ns-abc/testSimpleBatchProducerWithFixedBatchTime";
         final String subscriptionName = "time-sub-1" + compressionType.toString();
 
-        Consumer consumer = pulsarClient.subscribe(topicName, subscriptionName);
+        Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topicName).subscriptionName(subscriptionName)
+                .subscribe();
         consumer.close();
 
-        ProducerConfiguration producerConf = new ProducerConfiguration();
-        producerConf.setCompressionType(compressionType);
-        producerConf.setBatchingMaxPublishDelay(10, TimeUnit.MILLISECONDS);
-        producerConf.setBatchingEnabled(true);
-        Producer producer = pulsarClient.createProducer(topicName, producerConf);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName).compressionType(compressionType)
+                .batchingMaxPublishDelay(10, TimeUnit.MILLISECONDS).enableBatching(true).create();
 
         Random random = new Random();
         List<CompletableFuture<MessageId>> sendFutureList = Lists.newArrayList();
@@ -142,7 +136,7 @@ public class BatchMessageTest extends BrokerTestBase {
             // put a random sleep from 0 to 3 ms
             Thread.sleep(random.nextInt(4));
             byte[] message = ("msg-" + i).getBytes();
-            Message msg = MessageBuilder.create().setContent(message).build();
+            Message<byte[]> msg = MessageBuilder.create().setContent(message).build();
             sendFutureList.add(producer.sendAsync(msg));
         }
         FutureUtil.waitForAll(sendFutureList).get();
@@ -164,15 +158,13 @@ public class BatchMessageTest extends BrokerTestBase {
         final String topicName = "persistent://prop/use/ns-abc/testSimpleBatchProducerWithFixedBatchSizeAndTime";
         final String subscriptionName = "time-size-sub-1" + compressionType.toString();
 
-        Consumer consumer = pulsarClient.subscribe(topicName, subscriptionName);
+        Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topicName).subscriptionName(subscriptionName)
+                .subscribe();
         consumer.close();
 
-        ProducerConfiguration producerConf = new ProducerConfiguration();
-        producerConf.setBatchingMaxPublishDelay(10, TimeUnit.MILLISECONDS);
-        producerConf.setBatchingMaxMessages(5);
-        producerConf.setCompressionType(compressionType);
-        producerConf.setBatchingEnabled(true);
-        Producer producer = pulsarClient.createProducer(topicName, producerConf);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName)
+                .batchingMaxPublishDelay(10, TimeUnit.MILLISECONDS).batchingMaxMessages(5)
+                .compressionType(compressionType).enableBatching(true).create();
 
         Random random = new Random();
         List<CompletableFuture<MessageId>> sendFutureList = Lists.newArrayList();
@@ -180,7 +172,7 @@ public class BatchMessageTest extends BrokerTestBase {
             // put a random sleep from 0 to 3 ms
             Thread.sleep(random.nextInt(4));
             byte[] message = ("msg-" + i).getBytes();
-            Message msg = MessageBuilder.create().setContent(message).build();
+            Message<byte[]> msg = MessageBuilder.create().setContent(message).build();
             sendFutureList.add(producer.sendAsync(msg));
         }
         FutureUtil.waitForAll(sendFutureList).get();
@@ -203,31 +195,29 @@ public class BatchMessageTest extends BrokerTestBase {
         final String topicName = "persistent://prop/use/finance/testBatchProducerWithLargeMessage";
         final String subscriptionName = "large-message-sub-1" + compressionType.toString();
 
-        Consumer consumer = pulsarClient.subscribe(topicName, subscriptionName);
+        Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topicName).subscriptionName(subscriptionName)
+                .subscribe();
         consumer.close();
 
-        ProducerConfiguration producerConf = new ProducerConfiguration();
-        producerConf.setCompressionType(compressionType);
-        producerConf.setBatchingMaxPublishDelay(5000, TimeUnit.MILLISECONDS);
-        producerConf.setBatchingMaxMessages(numMsgsInBatch);
-        producerConf.setBatchingEnabled(true);
-        Producer producer = pulsarClient.createProducer(topicName, producerConf);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName).compressionType(compressionType)
+                .batchingMaxPublishDelay(5, TimeUnit.SECONDS).batchingMaxMessages(numMsgsInBatch).enableBatching(true)
+                .create();
 
         List<CompletableFuture<MessageId>> sendFutureList = Lists.newArrayList();
         for (int i = 0; i < numMsgs; i++) {
             if (i == 25) {
                 // send a large message
                 byte[] largeMessage = new byte[128 * 1024 + 4];
-                Message msg = MessageBuilder.create().setContent(largeMessage).build();
+                Message<byte[]> msg = MessageBuilder.create().setContent(largeMessage).build();
                 sendFutureList.add(producer.sendAsync(msg));
             } else {
                 byte[] message = ("msg-" + i).getBytes();
-                Message msg = MessageBuilder.create().setContent(message).build();
+                Message<byte[]> msg = MessageBuilder.create().setContent(message).build();
                 sendFutureList.add(producer.sendAsync(msg));
             }
         }
         byte[] message = ("msg-" + "last").getBytes();
-        Message lastMsg = MessageBuilder.create().setContent(message).build();
+        Message<byte[]> lastMsg = MessageBuilder.create().setContent(message).build();
         sendFutureList.add(producer.sendAsync(lastMsg));
 
         FutureUtil.waitForAll(sendFutureList).get();
@@ -239,10 +229,10 @@ public class BatchMessageTest extends BrokerTestBase {
         // we expect 3 messages in the backlog since the large message in the middle should
         // close out the batch and be sent in a batch of its own
         assertEquals(topic.getSubscription(subscriptionName).getNumberOfEntriesInBacklog(), 3);
-        consumer = pulsarClient.subscribe(topicName, subscriptionName);
+        consumer = pulsarClient.newConsumer().topic(topicName).subscriptionName(subscriptionName).subscribe();
 
         for (int i = 0; i <= numMsgs; i++) {
-            Message msg = consumer.receive(5, TimeUnit.SECONDS);
+            Message<byte[]> msg = consumer.receive(5, TimeUnit.SECONDS);
             assertNotNull(msg);
             LOG.info("received msg - {}", msg.getData().toString());
             consumer.acknowledge(msg);
@@ -260,20 +250,18 @@ public class BatchMessageTest extends BrokerTestBase {
         final String topicName = "persistent://prop/use/ns-abc/testSimpleBatchProducerConsumer";
         final String subscriptionName = "pc-sub-1" + compressionType.toString();
 
-        Consumer consumer = pulsarClient.subscribe(topicName, subscriptionName);
+        Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topicName).subscriptionName(subscriptionName)
+                .subscribe();
         consumer.close();
 
-        ProducerConfiguration producerConf = new ProducerConfiguration();
-        producerConf.setCompressionType(compressionType);
-        producerConf.setBatchingMaxPublishDelay(5000, TimeUnit.MILLISECONDS);
-        producerConf.setBatchingMaxMessages(numMsgsInBatch);
-        producerConf.setBatchingEnabled(true);
-        Producer producer = pulsarClient.createProducer(topicName, producerConf);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName).compressionType(compressionType)
+                .batchingMaxPublishDelay(5, TimeUnit.SECONDS).batchingMaxMessages(numMsgsInBatch).enableBatching(true)
+                .create();
 
         List<CompletableFuture<MessageId>> sendFutureList = Lists.newArrayList();
         for (int i = 0; i < numMsgs; i++) {
             byte[] message = ("msg-" + i).getBytes();
-            Message msg = MessageBuilder.create().setContent(message).build();
+            Message<byte[]> msg = MessageBuilder.create().setContent(message).build();
             sendFutureList.add(producer.sendAsync(msg));
         }
         FutureUtil.waitForAll(sendFutureList).get();
@@ -282,13 +270,12 @@ public class BatchMessageTest extends BrokerTestBase {
 
         rolloverPerIntervalStats();
         assertTrue(topic.getProducers().values().iterator().next().getStats().msgRateIn > 0.0);
-        assertEquals(topic.getSubscription(subscriptionName).getNumberOfEntriesInBacklog(),
-                numMsgs / numMsgsInBatch);
-        consumer = pulsarClient.subscribe(topicName, subscriptionName);
+        assertEquals(topic.getSubscription(subscriptionName).getNumberOfEntriesInBacklog(), numMsgs / numMsgsInBatch);
+        consumer = pulsarClient.newConsumer().topic(topicName).subscriptionName(subscriptionName).subscribe();
 
-        Message lastunackedMsg = null;
+        Message<byte[]> lastunackedMsg = null;
         for (int i = 0; i < numMsgs; i++) {
-            Message msg = consumer.receive(5, TimeUnit.SECONDS);
+            Message<byte[]> msg = consumer.receive(5, TimeUnit.SECONDS);
             assertNotNull(msg);
             if (i % 2 == 0) {
                 consumer.acknowledgeCumulative(msg);
@@ -312,18 +299,17 @@ public class BatchMessageTest extends BrokerTestBase {
         final String topicName = "persistent://prop/use/ns-abc/testSimpleBatchSyncProducerWithFixedBatchSize";
         final String subscriptionName = "syncsub-1";
 
-        Consumer consumer = pulsarClient.subscribe(topicName, subscriptionName);
+        Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topicName).subscriptionName(subscriptionName)
+                .subscribe();
         consumer.close();
 
-        ProducerConfiguration producerConf = new ProducerConfiguration();
-        producerConf.setBatchingMaxPublishDelay(1000, TimeUnit.MILLISECONDS);
-        producerConf.setBatchingMaxMessages(numMsgsInBatch);
-        producerConf.setBatchingEnabled(true);
-        Producer producer = pulsarClient.createProducer(topicName, producerConf);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName)
+                .batchingMaxPublishDelay(1, TimeUnit.SECONDS).batchingMaxMessages(numMsgsInBatch).enableBatching(true)
+                .create();
 
         for (int i = 0; i < numMsgs; i++) {
             byte[] message = ("my-message-" + i).getBytes();
-            Message msg = MessageBuilder.create().setContent(message).build();
+            Message<byte[]> msg = MessageBuilder.create().setContent(message).build();
             producer.send(msg);
         }
 
@@ -334,10 +320,10 @@ public class BatchMessageTest extends BrokerTestBase {
         // we expect 10 messages in the backlog since we sent 10 messages with the batch size set to 5.
         // However, we are using synchronous send and so each message will go as an individual message
         assertEquals(topic.getSubscription(subscriptionName).getNumberOfEntriesInBacklog(), 10);
-        consumer = pulsarClient.subscribe(topicName, subscriptionName);
+        consumer = pulsarClient.newConsumer().topic(topicName).subscriptionName(subscriptionName).subscribe();
 
         for (int i = 0; i < numMsgs; i++) {
-            Message msg = consumer.receive(5, TimeUnit.SECONDS);
+            Message<byte[]> msg = consumer.receive(5, TimeUnit.SECONDS);
             assertNotNull(msg);
             String receivedMessage = new String(msg.getData());
             String expectedMessage = "my-message-" + i;
@@ -356,20 +342,18 @@ public class BatchMessageTest extends BrokerTestBase {
         final String topicName = "persistent://prop/use/ns-abc/testSimpleBatchProducerConsumer1kMessages";
         final String subscriptionName = "pc1k-sub-1";
 
-        Consumer consumer = pulsarClient.subscribe(topicName, subscriptionName);
+        Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topicName).subscriptionName(subscriptionName)
+                .subscribe();
         consumer.close();
 
-        ProducerConfiguration producerConf = new ProducerConfiguration();
-        producerConf.setMaxPendingMessages(numMsgs + 1);
-        producerConf.setBatchingMaxPublishDelay(30000, TimeUnit.MILLISECONDS);
-        producerConf.setBatchingMaxMessages(numMsgsInBatch);
-        producerConf.setBatchingEnabled(true);
-        Producer producer = pulsarClient.createProducer(topicName, producerConf);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName).maxPendingMessages(numMsgs + 1)
+                .batchingMaxPublishDelay(30, TimeUnit.SECONDS).batchingMaxMessages(numMsgsInBatch).enableBatching(true)
+                .create();
 
         List<CompletableFuture<MessageId>> sendFutureList = Lists.newArrayList();
         for (int i = 0; i < numMsgs; i++) {
             byte[] message = ("msg-" + i).getBytes();
-            Message msg = MessageBuilder.create().setContent(message).build();
+            Message<byte[]> msg = MessageBuilder.create().setContent(message).build();
             sendFutureList.add(producer.sendAsync(msg));
         }
         FutureUtil.waitForAll(sendFutureList).get();
@@ -391,13 +375,12 @@ public class BatchMessageTest extends BrokerTestBase {
         Thread.sleep(5000);
         LOG.info("[{}] checking backlog stats..");
         rolloverPerIntervalStats();
-        assertEquals(topic.getSubscription(subscriptionName).getNumberOfEntriesInBacklog(),
-                numMsgs / numMsgsInBatch);
-        consumer = pulsarClient.subscribe(topicName, subscriptionName);
+        assertEquals(topic.getSubscription(subscriptionName).getNumberOfEntriesInBacklog(), numMsgs / numMsgsInBatch);
+        consumer = pulsarClient.newConsumer().topic(topicName).subscriptionName(subscriptionName).subscribe();
 
-        Message lastunackedMsg = null;
+        Message<byte[]> lastunackedMsg = null;
         for (int i = 0; i < numMsgs; i++) {
-            Message msg = consumer.receive(1, TimeUnit.SECONDS);
+            Message<byte[]> msg = consumer.receive(1, TimeUnit.SECONDS);
             assertNotNull(msg);
             lastunackedMsg = msg;
         }
@@ -423,19 +406,18 @@ public class BatchMessageTest extends BrokerTestBase {
         final String topicName = "persistent://prop/use/ns-abc/testOutOfOrderAcksForBatchMessage";
         final String subscriptionName = "oooack-sub-1";
 
-        Consumer consumer = pulsarClient.subscribe(topicName, subscriptionName);
+        Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topicName).subscriptionName(subscriptionName)
+                .subscribe();
         consumer.close();
 
-        ProducerConfiguration producerConf = new ProducerConfiguration();
-        producerConf.setBatchingMaxPublishDelay(5000, TimeUnit.MILLISECONDS);
-        producerConf.setBatchingMaxMessages(numMsgsInBatch);
-        producerConf.setBatchingEnabled(true);
-        Producer producer = pulsarClient.createProducer(topicName, producerConf);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName)
+                .batchingMaxPublishDelay(5, TimeUnit.SECONDS).batchingMaxMessages(numMsgsInBatch).enableBatching(true)
+                .create();
 
         List<CompletableFuture<MessageId>> sendFutureList = Lists.newArrayList();
         for (int i = 0; i < numMsgs; i++) {
             byte[] message = ("msg-" + i).getBytes();
-            Message msg = MessageBuilder.create().setContent(message).build();
+            Message<byte[]> msg = MessageBuilder.create().setContent(message).build();
             sendFutureList.add(producer.sendAsync(msg));
         }
         FutureUtil.waitForAll(sendFutureList).get();
@@ -443,16 +425,15 @@ public class BatchMessageTest extends BrokerTestBase {
         PersistentTopic topic = (PersistentTopic) pulsar.getBrokerService().getTopicReference(topicName);
 
         rolloverPerIntervalStats();
-        assertEquals(topic.getSubscription(subscriptionName).getNumberOfEntriesInBacklog(),
-                numMsgs / numMsgsInBatch);
-        consumer = pulsarClient.subscribe(topicName, subscriptionName);
+        assertEquals(topic.getSubscription(subscriptionName).getNumberOfEntriesInBacklog(), numMsgs / numMsgsInBatch);
+        consumer = pulsarClient.newConsumer().topic(topicName).subscriptionName(subscriptionName).subscribe();
         Set<Integer> individualAcks = new HashSet<>();
         for (int i = 15; i < 20; i++) {
             individualAcks.add(i);
         }
-        Message lastunackedMsg = null;
+        Message<byte[]> lastunackedMsg = null;
         for (int i = 0; i < numMsgs; i++) {
-            Message msg = consumer.receive(5, TimeUnit.SECONDS);
+            Message<byte[]> msg = consumer.receive(5, TimeUnit.SECONDS);
             LOG.info("received message {}", String.valueOf(msg.getData()));
             assertNotNull(msg);
             if (i == 8) {
@@ -491,28 +472,27 @@ public class BatchMessageTest extends BrokerTestBase {
         final String topicName = "persistent://prop/use/ns-abc/testNonBatchCumulativeAckAfterBatchPublish";
         final String subscriptionName = "nbcaabp-sub-1";
 
-        Consumer consumer = pulsarClient.subscribe(topicName, subscriptionName);
+        Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topicName).subscriptionName(subscriptionName)
+                .subscribe();
         consumer.close();
 
-        ProducerConfiguration producerConf = new ProducerConfiguration();
-        producerConf.setBatchingMaxPublishDelay(5000, TimeUnit.MILLISECONDS);
-        producerConf.setBatchingMaxMessages(numMsgsInBatch);
-        producerConf.setBatchingEnabled(true);
-        Producer producer = pulsarClient.createProducer(topicName, producerConf);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName)
+                .batchingMaxPublishDelay(5, TimeUnit.SECONDS).batchingMaxMessages(numMsgsInBatch).enableBatching(true)
+                .create();
         // create producer to publish non batch messages
-        Producer noBatchProducer = pulsarClient.createProducer(topicName);
+        Producer<byte[]> noBatchProducer = pulsarClient.newProducer().topic(topicName).create();
 
         List<CompletableFuture<MessageId>> sendFutureList = Lists.newArrayList();
         for (int i = 0; i < numMsgs; i++) {
             byte[] message = ("msg-" + i).getBytes();
-            Message msg = MessageBuilder.create().setContent(message).build();
+            Message<byte[]> msg = MessageBuilder.create().setContent(message).build();
             sendFutureList.add(producer.sendAsync(msg));
 
         }
         FutureUtil.waitForAll(sendFutureList).get();
         sendFutureList.clear();
         byte[] nobatchmsg = ("nobatch").getBytes();
-        Message nmsg = MessageBuilder.create().setContent(nobatchmsg).build();
+        Message<byte[]> nmsg = MessageBuilder.create().setContent(nobatchmsg).build();
         noBatchProducer.sendAsync(nmsg).get();
 
         PersistentTopic topic = (PersistentTopic) pulsar.getBrokerService().getTopicReference(topicName);
@@ -520,11 +500,11 @@ public class BatchMessageTest extends BrokerTestBase {
         rolloverPerIntervalStats();
         assertTrue(topic.getProducers().values().iterator().next().getStats().msgRateIn > 0.0);
         assertEquals(topic.getSubscription(subscriptionName).getNumberOfEntriesInBacklog(), 2);
-        consumer = pulsarClient.subscribe(topicName, subscriptionName);
+        consumer = pulsarClient.newConsumer().topic(topicName).subscriptionName(subscriptionName).subscribe();
 
-        Message lastunackedMsg = null;
+        Message<byte[]> lastunackedMsg = null;
         for (int i = 0; i <= numMsgs; i++) {
-            Message msg = consumer.receive(5, TimeUnit.SECONDS);
+            Message<byte[]> msg = consumer.receive(5, TimeUnit.SECONDS);
             assertNotNull(msg);
             lastunackedMsg = msg;
         }
@@ -534,7 +514,7 @@ public class BatchMessageTest extends BrokerTestBase {
         Thread.sleep(100);
         rolloverPerIntervalStats();
         assertEquals(topic.getSubscription(subscriptionName).getNumberOfEntriesInBacklog(), 0);
-        assertTrue(((ConsumerImpl) consumer).isBatchingAckTrackerEmpty());
+        assertTrue(((ConsumerImpl<byte[]>) consumer).isBatchingAckTrackerEmpty());
         consumer.close();
         producer.close();
         noBatchProducer.close();
@@ -547,21 +527,20 @@ public class BatchMessageTest extends BrokerTestBase {
         final String topicName = "persistent://prop/use/ns-abc/testBatchAndNonBatchCumulativeAcks";
         final String subscriptionName = "bnb-sub-1";
 
-        Consumer consumer = pulsarClient.subscribe(topicName, subscriptionName);
+        Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topicName).subscriptionName(subscriptionName)
+                .subscribe();
         consumer.close();
 
-        ProducerConfiguration producerConf = new ProducerConfiguration();
-        producerConf.setBatchingMaxPublishDelay(5000, TimeUnit.MILLISECONDS);
-        producerConf.setBatchingMaxMessages(numMsgsInBatch);
-        producerConf.setBatchingEnabled(true);
-        Producer producer = pulsarClient.createProducer(topicName, producerConf);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName)
+                .batchingMaxPublishDelay(5, TimeUnit.SECONDS).batchingMaxMessages(numMsgsInBatch).enableBatching(true)
+                .create();
         // create producer to publish non batch messages
-        Producer noBatchProducer = pulsarClient.createProducer(topicName);
+        Producer<byte[]> noBatchProducer = pulsarClient.newProducer().topic(topicName).create();
 
         List<CompletableFuture<MessageId>> sendFutureList = Lists.newArrayList();
         for (int i = 0; i < numMsgs / 2; i++) {
             byte[] message = ("msg-" + i).getBytes();
-            Message msg = MessageBuilder.create().setContent(message).build();
+            Message<byte[]> msg = MessageBuilder.create().setContent(message).build();
             sendFutureList.add(producer.sendAsync(msg));
             byte[] nobatchmsg = ("nobatch-" + i).getBytes();
             msg = MessageBuilder.create().setContent(nobatchmsg).build();
@@ -575,11 +554,11 @@ public class BatchMessageTest extends BrokerTestBase {
         assertTrue(topic.getProducers().values().iterator().next().getStats().msgRateIn > 0.0);
         assertEquals(topic.getSubscription(subscriptionName).getNumberOfEntriesInBacklog(),
                 (numMsgs / 2) / numMsgsInBatch + numMsgs / 2);
-        consumer = pulsarClient.subscribe(topicName, subscriptionName);
+        consumer = pulsarClient.newConsumer().topic(topicName).subscriptionName(subscriptionName).subscribe();
 
-        Message lastunackedMsg = null;
+        Message<byte[]> lastunackedMsg = null;
         for (int i = 0; i < numMsgs; i++) {
-            Message msg = consumer.receive(5, TimeUnit.SECONDS);
+            Message<byte[]> msg = consumer.receive(5, TimeUnit.SECONDS);
             assertNotNull(msg);
             LOG.info("[{}] got message position{} data {}", subscriptionName, msg.getMessageId(),
                     String.valueOf(msg.getData()));
@@ -595,15 +574,15 @@ public class BatchMessageTest extends BrokerTestBase {
         }
         Thread.sleep(100);
         assertEquals(topic.getSubscription(subscriptionName).getNumberOfEntriesInBacklog(), 0);
-        assertTrue(((ConsumerImpl) consumer).isBatchingAckTrackerEmpty());
+        assertTrue(((ConsumerImpl<byte[]>) consumer).isBatchingAckTrackerEmpty());
         consumer.close();
         producer.close();
         noBatchProducer.close();
     }
 
     /**
-     * Verifies batch-message acking is thread-safe 
-     * 
+     * Verifies batch-message acking is thread-safe
+     *
      * @throws Exception
      */
     @Test(timeOut = 3000)
@@ -612,28 +591,26 @@ public class BatchMessageTest extends BrokerTestBase {
         final String topicName = "persistent://prop/use/ns-abc/testConcurrentAck";
         final String subscriptionName = "sub-1";
 
-        ConsumerConfiguration consConf = new ConsumerConfiguration();
-        consConf.setSubscriptionType(SubscriptionType.Shared);
-        Consumer consumer = pulsarClient.subscribe(topicName, subscriptionName, consConf);
+        Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topicName).subscriptionName(subscriptionName)
+                .subscriptionType(SubscriptionType.Shared).subscribe();
         consumer.close();
 
-        ProducerConfiguration producerConf = new ProducerConfiguration();
-        producerConf.setBatchingMaxPublishDelay(5000, TimeUnit.MILLISECONDS);
-        producerConf.setBatchingMaxMessages(numMsgs);
-        producerConf.setBatchingEnabled(true);
-        Producer producer = pulsarClient.createProducer(topicName, producerConf);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName)
+                .batchingMaxPublishDelay(5, TimeUnit.SECONDS).batchingMaxMessages(numMsgs).enableBatching(true)
+                .create();
 
         List<CompletableFuture<MessageId>> sendFutureList = Lists.newArrayList();
         for (int i = 0; i < numMsgs; i++) {
             byte[] message = ("my-message-" + i).getBytes();
-            Message msg = MessageBuilder.create().setContent(message).build();
+            Message<byte[]> msg = MessageBuilder.create().setContent(message).build();
             sendFutureList.add(producer.sendAsync(msg));
         }
         FutureUtil.waitForAll(sendFutureList).get();
 
         PersistentTopic topic = (PersistentTopic) pulsar.getBrokerService().getTopicReference(topicName);
 
-        final Consumer myConsumer = pulsarClient.subscribe(topicName, subscriptionName, consConf);
+        final Consumer<byte[]> myConsumer = pulsarClient.newConsumer().topic(topicName)
+                .subscriptionName(subscriptionName).subscriptionType(SubscriptionType.Shared).subscribe();
         // assertEquals(dispatcher.getTotalUnackedMessages(), 1);
         ExecutorService executor = Executors.newFixedThreadPool(10);
 
@@ -642,7 +619,7 @@ public class BatchMessageTest extends BrokerTestBase {
         for (int i = 0; i < numMsgs; i++) {
             executor.submit(() -> {
                 try {
-                    Message msg = myConsumer.receive(1, TimeUnit.SECONDS);
+                    Message<byte[]> msg = myConsumer.receive(1, TimeUnit.SECONDS);
                     myConsumer.acknowledge(msg);
                 } catch (Exception e) {
                     failed.set(false);
@@ -662,6 +639,6 @@ public class BatchMessageTest extends BrokerTestBase {
         myConsumer.close();
         producer.close();
     }
-    
+
     private static final Logger LOG = LoggerFactory.getLogger(BatchMessageTest.class);
 }
diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/BrokerBkEnsemblesTests.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/BrokerBkEnsemblesTests.java
index d688b7f..7f64082 100644
--- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/BrokerBkEnsemblesTests.java
+++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/BrokerBkEnsemblesTests.java
@@ -30,7 +30,6 @@ import java.util.concurrent.TimeUnit;
 
 import org.apache.bookkeeper.client.BookKeeper;
 import org.apache.bookkeeper.mledger.ManagedLedgerConfig;
-import org.apache.bookkeeper.mledger.impl.EntryCache;
 import org.apache.bookkeeper.mledger.impl.ManagedCursorImpl;
 import org.apache.bookkeeper.mledger.impl.ManagedLedgerFactoryImpl;
 import org.apache.bookkeeper.mledger.impl.ManagedLedgerImpl;
@@ -41,13 +40,10 @@ import org.apache.pulsar.broker.ServiceConfiguration;
 import org.apache.pulsar.broker.service.persistent.PersistentTopic;
 import org.apache.pulsar.client.admin.PulsarAdmin;
 import org.apache.pulsar.client.api.Authentication;
-import org.apache.pulsar.client.api.ClientConfiguration;
 import org.apache.pulsar.client.api.Consumer;
-import org.apache.pulsar.client.api.ConsumerConfiguration;
 import org.apache.pulsar.client.api.Message;
 import org.apache.pulsar.client.api.Producer;
 import org.apache.pulsar.client.api.PulsarClient;
-import org.apache.pulsar.client.impl.MessageImpl;
 import org.apache.pulsar.common.policies.data.ClusterData;
 import org.apache.pulsar.common.policies.data.PropertyAdmin;
 import org.apache.pulsar.zookeeper.LocalBookkeeperEnsemble;
@@ -126,7 +122,7 @@ public class BrokerBkEnsemblesTests {
 
     /**
      * It verifies that broker deletes cursor-ledger when broker-crashes without closing topic gracefully
-     * 
+     *
      * <pre>
      * 1. Create topic : publish/consume-ack msgs to update new cursor-ledger
      * 2. Verify cursor-ledger is created and ledger-znode present
@@ -135,16 +131,15 @@ public class BrokerBkEnsemblesTests {
      * 5. Topic is recovered from old-ledger and broker deletes the old ledger
      * 6. verify znode of old-ledger is deleted
      * </pre>
-     * 
+     *
      * @throws Exception
      */
     @Test
     public void testCrashBrokerWithoutCursorLedgerLeak() throws Exception {
 
         ZooKeeper zk = bkEnsemble.getZkClient();
-        ClientConfiguration clientConf = new ClientConfiguration();
-        clientConf.setStatsInterval(0, TimeUnit.SECONDS);
-        PulsarClient client = PulsarClient.create(adminUrl.toString(), clientConf);
+        PulsarClient client = PulsarClient.builder().serviceUrl(adminUrl.toString()).statsInterval(0, TimeUnit.SECONDS)
+                .build();
 
         final String ns1 = "prop/usc/crash-broker";
 
@@ -154,13 +149,14 @@ public class BrokerBkEnsemblesTests {
 
         // (1) create topic
         // publish and ack messages so, cursor can create cursor-ledger and update metadata
-        Consumer consumer = client.subscribe(topic1, "my-subscriber-name");
-        Producer producer = client.createProducer(topic1);
+        Consumer<byte[]> consumer = client.newConsumer().topic(topic1).subscriptionName("my-subscriber-name")
+                .subscribe();
+        Producer<byte[]> producer = client.newProducer().topic(topic1).create();
         for (int i = 0; i < 10; i++) {
             String message = "my-message-" + i;
             producer.send(message.getBytes());
         }
-        Message msg = null;
+        Message<byte[]> msg = null;
         for (int i = 0; i < 10; i++) {
             msg = consumer.receive(1, TimeUnit.SECONDS);
             consumer.acknowledge(msg);
@@ -189,8 +185,8 @@ public class BrokerBkEnsemblesTests {
 
         // (4) Recreate topic
         // publish and ack messages so, cursor can create cursor-ledger and update metadata
-        consumer = client.subscribe(topic1, "my-subscriber-name");
-        producer = client.createProducer(topic1);
+        consumer = client.newConsumer().topic(topic1).subscriptionName("my-subscriber-name").subscribe();
+        producer = client.newProducer().topic(topic1).create();
         for (int i = 0; i < 10; i++) {
             String message = "my-message-" + i;
             producer.send(message.getBytes());
@@ -219,23 +215,22 @@ public class BrokerBkEnsemblesTests {
 
     /**
      * It verifies broker-configuration using which broker can skip non-recoverable data-ledgers.
-     * 
+     *
      * <pre>
      * 1. publish messages in 5 data-ledgers each with 20 entries under managed-ledger
      * 2. delete first 4 data-ledgers
      * 3. consumer will fail to consume any message as first data-ledger is non-recoverable
      * 4. enable dynamic config to skip non-recoverable data-ledgers
      * 5. consumer will be able to consume 20 messages from last non-deleted ledger
-     * 
+     *
      * </pre>
-     * 
+     *
      * @throws Exception
      */
     @Test(timeOut = 6000)
     public void testSkipCorruptDataLedger() throws Exception {
-        ClientConfiguration clientConf = new ClientConfiguration();
-        clientConf.setStatsInterval(0, TimeUnit.SECONDS);
-        PulsarClient client = PulsarClient.create(adminUrl.toString(), clientConf);
+        PulsarClient client = PulsarClient.builder().serviceUrl(adminUrl.toString()).statsInterval(0, TimeUnit.SECONDS)
+                .build();
 
         final String ns1 = "prop/usc/crash-broker";
         final int totalMessages = 100;
@@ -247,9 +242,8 @@ public class BrokerBkEnsemblesTests {
         final String topic1 = "persistent://" + ns1 + "/my-topic";
 
         // Create subscription
-        ConsumerConfiguration consumerConfig = new ConsumerConfiguration();
-        consumerConfig.setReceiverQueueSize(5);
-        Consumer consumer = client.subscribe(topic1, "my-subscriber-name", consumerConfig);
+        Consumer<byte[]> consumer = client.newConsumer().topic(topic1).subscriptionName("my-subscriber-name")
+                .receiverQueueSize(5).subscribe();
 
         PersistentTopic topic = (PersistentTopic) pulsar.getBrokerService().getTopic(topic1).get();
         ManagedLedgerImpl ml = (ManagedLedgerImpl) topic.getManagedLedger();
@@ -267,7 +261,7 @@ public class BrokerBkEnsemblesTests {
         BookKeeper bookKeeper = (BookKeeper) bookKeeperField.get(ml);
 
         // (1) publish messages in 5 data-ledgers each with 20 entries under managed-ledger
-        Producer producer = client.createProducer(topic1);
+        Producer<byte[]> producer = client.newProducer().topic(topic1).create();
         for (int i = 0; i < totalMessages; i++) {
             String message = "my-message-" + i;
             producer.send(message.getBytes());
@@ -304,9 +298,9 @@ public class BrokerBkEnsemblesTests {
         ledgers.clear();
 
         // (3) consumer will fail to consume any message as first data-ledger is non-recoverable
-        Message msg = null;
+        Message<byte[]> msg = null;
         // start consuming message
-        consumer = client.subscribe(topic1, "my-subscriber-name");
+        consumer = client.newConsumer().topic(topic1).subscriptionName("my-subscriber-name").subscribe();
         msg = consumer.receive(1, TimeUnit.SECONDS);
         Assert.assertNull(msg);
         consumer.close();
@@ -317,7 +311,7 @@ public class BrokerBkEnsemblesTests {
         retryStrategically((test) -> config.isAutoSkipNonRecoverableData(), 5, 100);
 
         // (5) consumer will be able to consume 20 messages from last non-deleted ledger
-        consumer = client.subscribe(topic1, "my-subscriber-name");
+        consumer = client.newConsumer().topic(topic1).subscriptionName("my-subscriber-name").subscribe();
         for (int i = 0; i < entriesPerLedger; i++) {
             msg = consumer.receive(5, TimeUnit.SECONDS);
             System.out.println(i);
@@ -329,6 +323,6 @@ public class BrokerBkEnsemblesTests {
         client.close();
 
     }
-    
+
     private static final Logger LOG = LoggerFactory.getLogger(BrokerBkEnsemblesTests.class);
 }
diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/BrokerServiceTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/BrokerServiceTest.java
index f0c28ab..c8dc63a 100644
--- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/BrokerServiceTest.java
+++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/BrokerServiceTest.java
@@ -55,16 +55,14 @@ import org.apache.pulsar.broker.service.BrokerServiceException.PersistenceExcept
 import org.apache.pulsar.broker.service.persistent.PersistentTopic;
 import org.apache.pulsar.client.admin.BrokerStats;
 import org.apache.pulsar.client.api.Authentication;
-import org.apache.pulsar.client.api.ClientConfiguration;
 import org.apache.pulsar.client.api.Consumer;
-import org.apache.pulsar.client.api.ConsumerConfiguration;
 import org.apache.pulsar.client.api.Message;
 import org.apache.pulsar.client.api.Producer;
 import org.apache.pulsar.client.api.PulsarClient;
 import org.apache.pulsar.client.api.SubscriptionType;
 import org.apache.pulsar.client.impl.auth.AuthenticationTls;
-import org.apache.pulsar.common.naming.TopicName;
 import org.apache.pulsar.common.naming.NamespaceBundle;
+import org.apache.pulsar.common.naming.TopicName;
 import org.apache.pulsar.common.policies.data.BundlesData;
 import org.apache.pulsar.common.policies.data.LocalPolicies;
 import org.apache.pulsar.common.policies.data.PersistentTopicStats;
@@ -77,6 +75,8 @@ import com.google.common.collect.Lists;
 import com.google.gson.JsonArray;
 import com.google.gson.JsonObject;
 
+import lombok.Cleanup;
+
 /**
  */
 public class BrokerServiceTest extends BrokerTestBase {
@@ -140,9 +140,7 @@ public class BrokerServiceTest extends BrokerTestBase {
         PersistentTopicStats stats;
         SubscriptionStats subStats;
 
-        ConsumerConfiguration conf = new ConsumerConfiguration();
-        conf.setSubscriptionType(SubscriptionType.Exclusive);
-        Consumer consumer = pulsarClient.subscribe(topicName, subName, conf);
+        Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topicName).subscriptionName(subName).subscribe();
         Thread.sleep(ASYNC_EVENT_COMPLETION_WAIT);
 
         PersistentTopic topicRef = (PersistentTopic) pulsar.getBrokerService().getTopicReference(topicName);
@@ -157,7 +155,7 @@ public class BrokerServiceTest extends BrokerTestBase {
         assertEquals(subStats.msgBacklog, 0);
         assertEquals(subStats.consumers.size(), 1);
 
-        Producer producer = pulsarClient.createProducer(topicName);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName).create();
         Thread.sleep(ASYNC_EVENT_COMPLETION_WAIT);
 
         for (int i = 0; i < 10; i++) {
@@ -195,7 +193,7 @@ public class BrokerServiceTest extends BrokerTestBase {
         assertEquals(stats.msgThroughputOut, subStats.consumers.get(0).msgThroughputOut);
         assertNotNull(subStats.consumers.get(0).clientVersion);
 
-        Message msg;
+        Message<byte[]> msg;
         for (int i = 0; i < 10; i++) {
             msg = consumer.receive();
             consumer.acknowledge(msg);
@@ -218,9 +216,8 @@ public class BrokerServiceTest extends BrokerTestBase {
         PersistentTopicStats stats;
         SubscriptionStats subStats;
 
-        ConsumerConfiguration conf = new ConsumerConfiguration();
-        conf.setSubscriptionType(SubscriptionType.Shared);
-        Consumer consumer = pulsarClient.subscribe(topicName, subName, conf);
+        Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topicName).subscriptionName(subName)
+                .subscriptionType(SubscriptionType.Shared).subscribe();
         Thread.sleep(ASYNC_EVENT_COMPLETION_WAIT);
 
         PersistentTopic topicRef = (PersistentTopic) pulsar.getBrokerService().getTopicReference(topicName);
@@ -235,7 +232,7 @@ public class BrokerServiceTest extends BrokerTestBase {
         assertEquals(subStats.msgBacklog, 0);
         assertEquals(subStats.consumers.size(), 1);
 
-        Producer producer = pulsarClient.createProducer(topicName);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName).create();
         Thread.sleep(ASYNC_EVENT_COMPLETION_WAIT);
 
         for (int i = 0; i < 10; i++) {
@@ -285,7 +282,7 @@ public class BrokerServiceTest extends BrokerTestBase {
         assertTrue(subStats.msgRateRedeliver > 0.0);
         assertEquals(subStats.msgRateRedeliver, subStats.consumers.get(0).msgRateRedeliver);
 
-        Message msg;
+        Message<byte[]> msg;
         for (int i = 0; i < 10; i++) {
             msg = consumer.receive();
             consumer.acknowledge(msg);
@@ -306,12 +303,10 @@ public class BrokerServiceTest extends BrokerTestBase {
         final String subName = "newSub";
         BrokerStats brokerStatsClient = admin.brokerStats();
 
-        ConsumerConfiguration conf = new ConsumerConfiguration();
-        conf.setSubscriptionType(SubscriptionType.Exclusive);
-        Consumer consumer = pulsarClient.subscribe(topicName, subName, conf);
+        Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topicName).subscriptionName(subName).subscribe();
         Thread.sleep(ASYNC_EVENT_COMPLETION_WAIT);
 
-        Producer producer = pulsarClient.createProducer(topicName);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName).create();
         Thread.sleep(ASYNC_EVENT_COMPLETION_WAIT);
 
         for (int i = 0; i < 10; i++) {
@@ -319,7 +314,7 @@ public class BrokerServiceTest extends BrokerTestBase {
             producer.send(message.getBytes());
         }
         Thread.sleep(ASYNC_EVENT_COMPLETION_WAIT);
-        Message msg = null;
+        Message<byte[]> msg = null;
         for (int i = 0; i < 10; i++) {
             msg = consumer.receive();
             consumer.acknowledge(msg);
@@ -333,7 +328,7 @@ public class BrokerServiceTest extends BrokerTestBase {
         // is the order really relevant here?
         boolean namespaceDimensionFound = false;
         boolean topicLoadTimesDimensionFound = false;
-        for ( int i=0; i<metrics.size(); i++ ) {
+        for (int i = 0; i < metrics.size(); i++) {
             try {
                 String data = metrics.get(i).getAsJsonObject().get("dimensions").toString();
                 if (!namespaceDimensionFound && data.contains("prop/use/ns-abc")) {
@@ -342,7 +337,8 @@ public class BrokerServiceTest extends BrokerTestBase {
                 if (!topicLoadTimesDimensionFound && data.contains("prop/use/ns-abc")) {
                     topicLoadTimesDimensionFound = true;
                 }
-            } catch (Exception e) { /* it's possible there's no dimensions */ }
+            } catch (Exception e) {
+                /* it's possible there's no dimensions */ }
         }
 
         assertTrue(namespaceDimensionFound && topicLoadTimesDimensionFound);
@@ -350,7 +346,6 @@ public class BrokerServiceTest extends BrokerTestBase {
         Thread.sleep(ASYNC_EVENT_COMPLETION_WAIT);
     }
 
-    @SuppressWarnings("unchecked")
     @Test
     public void testBrokerServiceNamespaceStats() throws Exception {
         final int numBundles = 4;
@@ -358,16 +353,16 @@ public class BrokerServiceTest extends BrokerTestBase {
         final String ns2 = "prop/use/stats2";
 
         List<String> nsList = Lists.newArrayList(ns1, ns2);
-        List<Producer> producerList = Lists.newArrayList();
+        List<Producer<byte[]>> producerList = Lists.newArrayList();
 
         BrokerStats brokerStatsClient = admin.brokerStats();
 
         for (String ns : nsList) {
             admin.namespaces().createNamespace(ns, numBundles);
             String topic1 = String.format("persistent://%s/topic1", ns);
-            producerList.add(pulsarClient.createProducer(topic1));
+            producerList.add(pulsarClient.newProducer().topic(topic1).create());
             String topic2 = String.format("persistent://%s/topic2", ns);
-            producerList.add(pulsarClient.createProducer(topic2));
+            producerList.add(pulsarClient.newProducer().topic(topic2).create());
         }
 
         rolloverPerIntervalStats();
@@ -378,8 +373,7 @@ public class BrokerServiceTest extends BrokerTestBase {
             JsonObject nsObject = topicStats.getAsJsonObject(ns);
             List<String> topicList = admin.namespaces().getTopics(ns);
             for (String topic : topicList) {
-                NamespaceBundle bundle = (NamespaceBundle) pulsar.getNamespaceService()
-                        .getBundle(TopicName.get(topic));
+                NamespaceBundle bundle = (NamespaceBundle) pulsar.getNamespaceService().getBundle(TopicName.get(topic));
                 JsonObject bundleObject = nsObject.getAsJsonObject(bundle.getBundleRange());
                 JsonObject topicObject = bundleObject.getAsJsonObject("persistent");
                 AtomicBoolean topicPresent = new AtomicBoolean();
@@ -392,9 +386,10 @@ public class BrokerServiceTest extends BrokerTestBase {
             }
         }
 
-        for (Producer producer : producerList) {
+        for (Producer<?> producer : producerList) {
             producer.close();
         }
+
         for (String ns : nsList) {
             List<String> topics = admin.namespaces().getTopics(ns);
             for (String dest : topics) {
@@ -408,9 +403,6 @@ public class BrokerServiceTest extends BrokerTestBase {
     public void testTlsDisabled() throws Exception {
         final String topicName = "persistent://prop/use/ns-abc/newTopic";
         final String subName = "newSub";
-        ClientConfiguration clientConfig;
-        ConsumerConfiguration consumerConfig;
-        Consumer consumer;
         PulsarClient pulsarClient = null;
 
         conf.setAuthenticationEnabled(false);
@@ -419,13 +411,11 @@ public class BrokerServiceTest extends BrokerTestBase {
 
         // Case 1: Access without TLS
         try {
-            clientConfig = new ClientConfiguration();
-            clientConfig.setStatsInterval(0, TimeUnit.SECONDS);
-            pulsarClient = PulsarClient.create(brokerUrl.toString(), clientConfig);
-            consumerConfig = new ConsumerConfiguration();
-            consumerConfig.setSubscriptionType(SubscriptionType.Exclusive);
-            consumer = pulsarClient.subscribe(topicName, subName, consumerConfig);
-            consumer.close();
+            pulsarClient = PulsarClient.builder().serviceUrl(brokerUrl.toString()).statsInterval(0, TimeUnit.SECONDS)
+                    .build();
+            @Cleanup
+            Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topicName).subscriptionName(subName)
+                    .subscribe();
         } catch (Exception e) {
             fail("should not fail");
         } finally {
@@ -434,14 +424,13 @@ public class BrokerServiceTest extends BrokerTestBase {
 
         // Case 2: Access with TLS
         try {
-            clientConfig = new ClientConfiguration();
-            clientConfig.setUseTls(true);
-            clientConfig.setStatsInterval(0, TimeUnit.SECONDS);
-            pulsarClient = PulsarClient.create(brokerUrlTls.toString(), clientConfig);
-            consumerConfig = new ConsumerConfiguration();
-            consumerConfig.setSubscriptionType(SubscriptionType.Exclusive);
-            consumer = pulsarClient.subscribe(topicName, subName, consumerConfig);
-            consumer.close();
+            pulsarClient = PulsarClient.builder().serviceUrl(brokerUrlTls.toString()).enableTls(true)
+                    .statsInterval(0, TimeUnit.SECONDS).build();
+
+            @Cleanup
+            Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topicName).subscriptionName(subName)
+                    .subscribe();
+
             fail("TLS connection should fail");
         } catch (Exception e) {
             assertTrue(e.getMessage().contains("ConnectException"));
@@ -454,9 +443,6 @@ public class BrokerServiceTest extends BrokerTestBase {
     public void testTlsEnabled() throws Exception {
         final String topicName = "persistent://prop/use/ns-abc/newTopic";
         final String subName = "newSub";
-        ClientConfiguration clientConfig;
-        ConsumerConfiguration consumerConfig;
-        Consumer consumer;
 
         conf.setAuthenticationEnabled(false);
         conf.setTlsEnabled(true);
@@ -467,13 +453,11 @@ public class BrokerServiceTest extends BrokerTestBase {
         // Case 1: Access without TLS
         PulsarClient pulsarClient = null;
         try {
-            clientConfig = new ClientConfiguration();
-            clientConfig.setStatsInterval(0, TimeUnit.SECONDS);
-            pulsarClient = PulsarClient.create(brokerUrl.toString(), clientConfig);
-            consumerConfig = new ConsumerConfiguration();
-            consumerConfig.setSubscriptionType(SubscriptionType.Exclusive);
-            consumer = pulsarClient.subscribe(topicName, subName, consumerConfig);
-            consumer.close();
+            pulsarClient = PulsarClient.builder().serviceUrl(brokerUrl.toString()).statsInterval(0, TimeUnit.SECONDS)
+                    .build();
+            @Cleanup
+            Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topicName).subscriptionName(subName)
+                    .subscribe();
         } catch (Exception e) {
             fail("should not fail");
         } finally {
@@ -482,15 +466,13 @@ public class BrokerServiceTest extends BrokerTestBase {
 
         // Case 2: Access with TLS (Allow insecure TLS connection)
         try {
-            clientConfig = new ClientConfiguration();
-            clientConfig.setUseTls(true);
-            clientConfig.setTlsAllowInsecureConnection(true);
-            clientConfig.setStatsInterval(0, TimeUnit.SECONDS);
-            pulsarClient = PulsarClient.create(brokerUrlTls.toString(), clientConfig);
-            consumerConfig = new ConsumerConfiguration();
-            consumerConfig.setSubscriptionType(SubscriptionType.Exclusive);
-            consumer = pulsarClient.subscribe(topicName, subName, consumerConfig);
-            consumer.close();
+            pulsarClient = PulsarClient.builder().serviceUrl(brokerUrlTls.toString()).enableTls(true)
+                    .allowTlsInsecureConnection(true).statsInterval(0, TimeUnit.SECONDS).build();
+
+            @Cleanup
+            Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topicName).subscriptionName(subName)
+                    .subscribe();
+
         } catch (Exception e) {
             fail("should not fail");
         } finally {
@@ -499,15 +481,13 @@ public class BrokerServiceTest extends BrokerTestBase {
 
         // Case 3: Access with TLS (Disallow insecure TLS connection)
         try {
-            clientConfig = new ClientConfiguration();
-            clientConfig.setUseTls(true);
-            clientConfig.setTlsAllowInsecureConnection(false);
-            clientConfig.setStatsInterval(0, TimeUnit.SECONDS);
-            pulsarClient = PulsarClient.create(brokerUrlTls.toString(), clientConfig);
-            consumerConfig = new ConsumerConfiguration();
-            consumerConfig.setSubscriptionType(SubscriptionType.Exclusive);
-            consumer = pulsarClient.subscribe(topicName, subName, consumerConfig);
-            consumer.close();
+            pulsarClient = PulsarClient.builder().serviceUrl(brokerUrlTls.toString()).enableTls(true)
+                    .allowTlsInsecureConnection(false).statsInterval(0, TimeUnit.SECONDS).build();
+
+            @Cleanup
+            Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topicName).subscriptionName(subName)
+                    .subscribe();
+
             fail("should fail");
         } catch (Exception e) {
             assertTrue(e.getMessage().contains("General OpenSslEngine problem"));
@@ -517,16 +497,13 @@ public class BrokerServiceTest extends BrokerTestBase {
 
         // Case 4: Access with TLS (Use trusted certificates)
         try {
-            clientConfig = new ClientConfiguration();
-            clientConfig.setUseTls(true);
-            clientConfig.setTlsAllowInsecureConnection(false);
-            clientConfig.setTlsTrustCertsFilePath(TLS_SERVER_CERT_FILE_PATH);
-            clientConfig.setStatsInterval(0, TimeUnit.SECONDS);
-            pulsarClient = PulsarClient.create(brokerUrlTls.toString(), clientConfig);
-            consumerConfig = new ConsumerConfiguration();
-            consumerConfig.setSubscriptionType(SubscriptionType.Exclusive);
-            consumer = pulsarClient.subscribe(topicName, subName, consumerConfig);
-            consumer.close();
+            pulsarClient = PulsarClient.builder().serviceUrl(brokerUrlTls.toString()).enableTls(true)
+                    .allowTlsInsecureConnection(false).tlsTrustCertsFilePath(TLS_SERVER_CERT_FILE_PATH)
+                    .statsInterval(0, TimeUnit.SECONDS).build();
+
+            @Cleanup
+            Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topicName).subscriptionName(subName)
+                    .subscribe();
         } catch (Exception e) {
             fail("should not fail");
         } finally {
@@ -534,13 +511,11 @@ public class BrokerServiceTest extends BrokerTestBase {
         }
     }
 
+    @SuppressWarnings("deprecation")
     @Test
     public void testTlsAuthAllowInsecure() throws Exception {
         final String topicName = "persistent://prop/usw/my-ns/newTopic";
         final String subName = "newSub";
-        ClientConfiguration clientConfig;
-        ConsumerConfiguration consumerConfig;
-        Consumer consumer;
         Authentication auth;
 
         Set<String> providers = new HashSet<>();
@@ -562,15 +537,13 @@ public class BrokerServiceTest extends BrokerTestBase {
 
         // Case 1: Access without client certificate
         try {
-            clientConfig = new ClientConfiguration();
-            clientConfig.setUseTls(true);
-            clientConfig.setTlsAllowInsecureConnection(true);
-            clientConfig.setStatsInterval(0, TimeUnit.SECONDS);
-            pulsarClient = PulsarClient.create(brokerUrlTls.toString(), clientConfig);
-            consumerConfig = new ConsumerConfiguration();
-            consumerConfig.setSubscriptionType(SubscriptionType.Exclusive);
-            consumer = pulsarClient.subscribe(topicName, subName, consumerConfig);
-            consumer.close();
+            pulsarClient = PulsarClient.builder().serviceUrl(brokerUrlTls.toString()).enableTls(true)
+                    .allowTlsInsecureConnection(true).statsInterval(0, TimeUnit.SECONDS).build();
+
+            @Cleanup
+            Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topicName).subscriptionName(subName)
+                    .subscribe();
+
             fail("should fail");
         } catch (Exception e) {
             assertTrue(e.getMessage().contains("Authentication required"));
@@ -582,16 +555,14 @@ public class BrokerServiceTest extends BrokerTestBase {
         try {
             auth = new AuthenticationTls();
             auth.configure(authParams);
-            clientConfig = new ClientConfiguration();
-            clientConfig.setAuthentication(auth);
-            clientConfig.setUseTls(true);
-            clientConfig.setTlsAllowInsecureConnection(true);
-            clientConfig.setStatsInterval(0, TimeUnit.SECONDS);
-            pulsarClient = PulsarClient.create(brokerUrlTls.toString(), clientConfig);
-            consumerConfig = new ConsumerConfiguration();
-            consumerConfig.setSubscriptionType(SubscriptionType.Exclusive);
-            consumer = pulsarClient.subscribe(topicName, subName, consumerConfig);
-            consumer.close();
+
+            pulsarClient = PulsarClient.builder().authentication(auth).serviceUrl(brokerUrlTls.toString())
+                    .enableTls(true).allowTlsInsecureConnection(true).statsInterval(0, TimeUnit.SECONDS).build();
+
+            @Cleanup
+            Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topicName).subscriptionName(subName)
+                    .subscribe();
+
         } catch (Exception e) {
             fail("should not fail");
         } finally {
@@ -599,13 +570,11 @@ public class BrokerServiceTest extends BrokerTestBase {
         }
     }
 
+    @SuppressWarnings("deprecation")
     @Test
     public void testTlsAuthDisallowInsecure() throws Exception {
         final String topicName = "persistent://prop/usw/my-ns/newTopic";
         final String subName = "newSub";
-        ClientConfiguration clientConfig;
-        ConsumerConfiguration consumerConfig;
-        Consumer consumer;
         Authentication auth;
 
         Set<String> providers = new HashSet<>();
@@ -627,15 +596,13 @@ public class BrokerServiceTest extends BrokerTestBase {
 
         // Case 1: Access without client certificate
         try {
-            clientConfig = new ClientConfiguration();
-            clientConfig.setUseTls(true);
-            clientConfig.setTlsAllowInsecureConnection(true);
-            clientConfig.setStatsInterval(0, TimeUnit.SECONDS);
-            pulsarClient = PulsarClient.create(brokerUrlTls.toString(), clientConfig);
-            consumerConfig = new ConsumerConfiguration();
-            consumerConfig.setSubscriptionType(SubscriptionType.Exclusive);
-            consumer = pulsarClient.subscribe(topicName, subName, consumerConfig);
-            consumer.close();
+            pulsarClient = PulsarClient.builder().serviceUrl(brokerUrlTls.toString()).enableTls(true)
+                    .allowTlsInsecureConnection(true).statsInterval(0, TimeUnit.SECONDS).build();
+
+            @Cleanup
+            Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topicName).subscriptionName(subName)
+                    .subscribe();
+
             fail("should fail");
         } catch (Exception e) {
             assertTrue(e.getMessage().contains("Authentication required"));
@@ -647,16 +614,12 @@ public class BrokerServiceTest extends BrokerTestBase {
         try {
             auth = new AuthenticationTls();
             auth.configure(authParams);
-            clientConfig = new ClientConfiguration();
-            clientConfig.setAuthentication(auth);
-            clientConfig.setUseTls(true);
-            clientConfig.setTlsAllowInsecureConnection(true);
-            clientConfig.setStatsInterval(0, TimeUnit.SECONDS);
-            pulsarClient = PulsarClient.create(brokerUrlTls.toString(), clientConfig);
-            consumerConfig = new ConsumerConfiguration();
-            consumerConfig.setSubscriptionType(SubscriptionType.Exclusive);
-            consumer = pulsarClient.subscribe(topicName, subName, consumerConfig);
-            consumer.close();
+            pulsarClient = PulsarClient.builder().authentication(auth).serviceUrl(brokerUrlTls.toString())
+                    .enableTls(true).allowTlsInsecureConnection(true).statsInterval(0, TimeUnit.SECONDS).build();
+
+            @Cleanup
+            Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topicName).subscriptionName(subName)
+                    .subscribe();
             fail("should fail");
         } catch (Exception e) {
             assertTrue(e.getMessage().contains("Authentication required"));
@@ -665,13 +628,11 @@ public class BrokerServiceTest extends BrokerTestBase {
         }
     }
 
+    @SuppressWarnings("deprecation")
     @Test
     public void testTlsAuthUseTrustCert() throws Exception {
         final String topicName = "persistent://prop/usw/my-ns/newTopic";
         final String subName = "newSub";
-        ClientConfiguration clientConfig;
-        ConsumerConfiguration consumerConfig;
-        Consumer consumer;
         Authentication auth;
 
         Set<String> providers = new HashSet<>();
@@ -694,15 +655,12 @@ public class BrokerServiceTest extends BrokerTestBase {
 
         // Case 1: Access without client certificate
         try {
-            clientConfig = new ClientConfiguration();
-            clientConfig.setUseTls(true);
-            clientConfig.setTlsAllowInsecureConnection(true);
-            clientConfig.setStatsInterval(0, TimeUnit.SECONDS);
-            pulsarClient = PulsarClient.create(brokerUrlTls.toString(), clientConfig);
-            consumerConfig = new ConsumerConfiguration();
-            consumerConfig.setSubscriptionType(SubscriptionType.Exclusive);
-            consumer = pulsarClient.subscribe(topicName, subName, consumerConfig);
-            consumer.close();
+            pulsarClient = PulsarClient.builder().serviceUrl(brokerUrlTls.toString()).enableTls(true)
+                    .allowTlsInsecureConnection(true).statsInterval(0, TimeUnit.SECONDS).build();
+
+            @Cleanup
+            Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topicName).subscriptionName(subName)
+                    .subscribe();
             fail("should fail");
         } catch (Exception e) {
             assertTrue(e.getMessage().contains("Authentication required"));
@@ -714,16 +672,12 @@ public class BrokerServiceTest extends BrokerTestBase {
         try {
             auth = new AuthenticationTls();
             auth.configure(authParams);
-            clientConfig = new ClientConfiguration();
-            clientConfig.setAuthentication(auth);
-            clientConfig.setUseTls(true);
-            clientConfig.setTlsAllowInsecureConnection(true);
-            clientConfig.setStatsInterval(0, TimeUnit.SECONDS);
-            pulsarClient = PulsarClient.create(brokerUrlTls.toString(), clientConfig);
-            consumerConfig = new ConsumerConfiguration();
-            consumerConfig.setSubscriptionType(SubscriptionType.Exclusive);
-            consumer = pulsarClient.subscribe(topicName, subName, consumerConfig);
-            consumer.close();
+            pulsarClient = PulsarClient.builder().authentication(auth).serviceUrl(brokerUrlTls.toString())
+                    .enableTls(true).allowTlsInsecureConnection(true).statsInterval(0, TimeUnit.SECONDS).build();
+
+            @Cleanup
+            Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topicName).subscriptionName(subName)
+                    .subscribe();
         } catch (Exception e) {
             fail("should not fail");
         } finally {
@@ -740,14 +694,12 @@ public class BrokerServiceTest extends BrokerTestBase {
     public void testLookupThrottlingForClientByClient() throws Exception {
         final String topicName = "persistent://prop/usw/my-ns/newTopic";
 
-        org.apache.pulsar.client.api.ClientConfiguration clientConf = new org.apache.pulsar.client.api.ClientConfiguration();
-        clientConf.setStatsInterval(0, TimeUnit.SECONDS);
-        clientConf.setConcurrentLookupRequest(0);
         String lookupUrl = new URI("pulsar://localhost:" + BROKER_PORT).toString();
-        PulsarClient pulsarClient = PulsarClient.create(lookupUrl, clientConf);
+        PulsarClient pulsarClient = PulsarClient.builder().serviceUrl(lookupUrl).statsInterval(0, TimeUnit.SECONDS)
+                .maxConcurrentLookupRequests(0).build();
 
         try {
-            Consumer consumer = pulsarClient.subscribe(topicName, "mysub", new ConsumerConfiguration());
+            pulsarClient.newConsumer().topic(topicName).subscriptionName("mysub").subscribe();
             fail("It should fail as throttling should not receive any request");
         } catch (org.apache.pulsar.client.api.PulsarClientException.TooManyRequestsException e) {
             // ok as throttling set to 0
@@ -762,7 +714,7 @@ public class BrokerServiceTest extends BrokerTestBase {
         // own namespace bundle
         final String topicName = "persistent://" + namespace + "/my-topic";
         TopicName topic = TopicName.get(topicName);
-        Producer producer = pulsarClient.createProducer(topicName);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName).create();
         producer.close();
 
         // disable namespace-bundle
@@ -796,7 +748,7 @@ public class BrokerServiceTest extends BrokerTestBase {
         // let this broker own this namespace bundle by creating a topic
         try {
             final String successfulTopic = "persistent://" + namespace + "/ownBundleTopic";
-            Producer producer = pulsarClient.createProducer(successfulTopic);
+            Producer<byte[]> producer = pulsarClient.newProducer().topic(successfulTopic).create();
             producer.close();
         } catch (Exception e) {
             fail(e.getMessage());
@@ -839,7 +791,7 @@ public class BrokerServiceTest extends BrokerTestBase {
         // let this broker own this namespace bundle by creating a topic
         try {
             final String successfulTopic = "persistent://" + namespace + "/ownBundleTopic";
-            Producer producer = pulsarClient.createProducer(successfulTopic);
+            Producer<byte[]> producer = pulsarClient.newProducer().topic(successfulTopic).create();
             producer.close();
         } catch (Exception e) {
             fail(e.getMessage());
@@ -856,6 +808,7 @@ public class BrokerServiceTest extends BrokerTestBase {
         // fail managed-ledger future
         Field ledgerField = ManagedLedgerFactoryImpl.class.getDeclaredField("ledgers");
         ledgerField.setAccessible(true);
+        @SuppressWarnings("unchecked")
         ConcurrentHashMap<String, CompletableFuture<ManagedLedgerImpl>> ledgers = (ConcurrentHashMap<String, CompletableFuture<ManagedLedgerImpl>>) ledgerField
                 .get(pulsar.getManagedLedgerFactory());
         CompletableFuture<ManagedLedgerImpl> future = new CompletableFuture<>();
diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/BrokerServiceThrottlingTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/BrokerServiceThrottlingTest.java
index 89f4771..a3171c7 100644
--- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/BrokerServiceThrottlingTest.java
+++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/BrokerServiceThrottlingTest.java
@@ -34,7 +34,6 @@ import java.util.concurrent.TimeUnit;
 
 import org.apache.bookkeeper.util.ZkUtils;
 import org.apache.pulsar.client.api.Consumer;
-import org.apache.pulsar.client.api.ConsumerConfiguration;
 import org.apache.pulsar.client.api.PulsarClient;
 import org.apache.pulsar.client.api.PulsarClientException;
 import org.apache.pulsar.client.api.SubscriptionType;
@@ -48,8 +47,6 @@ import org.testng.annotations.Test;
 
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
-import static org.apache.pulsar.broker.auth.MockedPulsarServiceBaseTest.retryStrategically;
-import static org.apache.pulsar.broker.auth.MockedPulsarServiceBaseTest.retryStrategically;
 
 /**
  */
@@ -92,13 +89,11 @@ public class BrokerServiceThrottlingTest extends BrokerTestBase {
 
         final String topicName = "persistent://prop/usw/my-ns/newTopic";
 
-        org.apache.pulsar.client.api.ClientConfiguration clientConf = new org.apache.pulsar.client.api.ClientConfiguration();
-        clientConf.setStatsInterval(0, TimeUnit.SECONDS);
         String lookupUrl = new URI("pulsar://localhost:" + BROKER_PORT).toString();
-        PulsarClient pulsarClient = PulsarClient.create(lookupUrl, clientConf);
+        PulsarClient pulsarClient = PulsarClient.builder().serviceUrl(lookupUrl).statsInterval(0, TimeUnit.SECONDS)
+                .build();
 
-        ConsumerConfiguration consumerConfig = new ConsumerConfiguration();
-        Consumer consumer = pulsarClient.subscribe(topicName, "mysub", consumerConfig);
+        Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topicName).subscriptionName("mysub").subscribe();
         consumer.close();
 
         int newPermits = 0;
@@ -113,7 +108,7 @@ public class BrokerServiceThrottlingTest extends BrokerTestBase {
         }
 
         try {
-            consumer = pulsarClient.subscribe(topicName, "mysub", consumerConfig);
+            consumer = pulsarClient.newConsumer().topic(topicName).subscriptionName("mysub").subscribe();
             consumer.close();
             fail("It should fail as throttling should not receive any request");
         } catch (org.apache.pulsar.client.api.PulsarClientException.TooManyRequestsException e) {
@@ -135,15 +130,9 @@ public class BrokerServiceThrottlingTest extends BrokerTestBase {
     public void testLookupThrottlingForClientByBroker() throws Exception {
         final String topicName = "persistent://prop/usw/my-ns/newTopic";
 
-        org.apache.pulsar.client.api.ClientConfiguration clientConf = new org.apache.pulsar.client.api.ClientConfiguration();
-        clientConf.setStatsInterval(0, TimeUnit.SECONDS);
-        clientConf.setIoThreads(20);
-        clientConf.setConnectionsPerBroker(20);
         String lookupUrl = new URI("pulsar://localhost:" + BROKER_PORT).toString();
-        PulsarClient pulsarClient = PulsarClient.create(lookupUrl, clientConf);
-
-        ConsumerConfiguration consumerConfig = new ConsumerConfiguration();
-        consumerConfig.setSubscriptionType(SubscriptionType.Shared);
+        PulsarClient pulsarClient = PulsarClient.builder().serviceUrl(lookupUrl).statsInterval(0, TimeUnit.SECONDS)
+                .ioThreads(20).connectionsPerBroker(20).build();
 
         int newPermits = 1;
         admin.brokers().updateDynamicConfiguration("maxConcurrentLookupRequest", Integer.toString(newPermits));
@@ -156,14 +145,15 @@ public class BrokerServiceThrottlingTest extends BrokerTestBase {
             }
         }
 
-        List<Consumer> successfulConsumers = Collections.synchronizedList(Lists.newArrayList());
+        List<Consumer<byte[]>> successfulConsumers = Collections.synchronizedList(Lists.newArrayList());
         ExecutorService executor = Executors.newFixedThreadPool(10);
         final int totalConsumers = 20;
         CountDownLatch latch = new CountDownLatch(totalConsumers);
         for (int i = 0; i < totalConsumers; i++) {
             executor.execute(() -> {
                 try {
-                    successfulConsumers.add(pulsarClient.subscribe(topicName, "mysub", consumerConfig));
+                    successfulConsumers.add(pulsarClient.newConsumer().topic(topicName).subscriptionName("mysub")
+                            .subscriptionType(SubscriptionType.Shared).subscribe());
                 } catch (PulsarClientException.TooManyRequestsException e) {
                     // ok
                 } catch (Exception e) {
@@ -174,7 +164,7 @@ public class BrokerServiceThrottlingTest extends BrokerTestBase {
         }
         latch.await();
 
-        for (Consumer c : successfulConsumers) {
+        for (Consumer<?> c : successfulConsumers) {
             if (c != null) {
                 c.close();
             }
@@ -202,23 +192,19 @@ public class BrokerServiceThrottlingTest extends BrokerTestBase {
 
         final String topicName = "persistent://prop/usw/my-ns/newTopic";
 
-        org.apache.pulsar.client.api.ClientConfiguration clientConf = new org.apache.pulsar.client.api.ClientConfiguration();
-        clientConf.setStatsInterval(0, TimeUnit.SECONDS);
-        clientConf.setIoThreads(20);
-        clientConf.setConnectionsPerBroker(20);
         String lookupUrl = new URI("pulsar://localhost:" + BROKER_PORT).toString();
-        PulsarClient pulsarClient = PulsarClient.create(lookupUrl, clientConf);
+        PulsarClient pulsarClient = PulsarClient.builder().serviceUrl(lookupUrl).statsInterval(0, TimeUnit.SECONDS)
+                .ioThreads(20).connectionsPerBroker(20).build();
         upsertLookupPermits(100);
-        ConsumerConfiguration consumerConfig = new ConsumerConfiguration();
-        consumerConfig.setSubscriptionType(SubscriptionType.Shared);
-        List<Consumer> consumers = Collections.synchronizedList(Lists.newArrayList());
+        List<Consumer<byte[]>> consumers = Collections.synchronizedList(Lists.newArrayList());
         ExecutorService executor = Executors.newFixedThreadPool(10);
         final int totalConsumers = 8;
         CountDownLatch latch = new CountDownLatch(totalConsumers);
         for (int i = 0; i < totalConsumers; i++) {
             executor.execute(() -> {
                 try {
-                    consumers.add(pulsarClient.subscribe(topicName, "mysub", consumerConfig));
+                    consumers.add(pulsarClient.newConsumer().topic(topicName).subscriptionName("mysub")
+                            .subscriptionType(SubscriptionType.Shared).subscribe());
                 } catch (PulsarClientException.TooManyRequestsException e) {
                     // ok
                 } catch (Exception e) {
@@ -238,7 +224,7 @@ public class BrokerServiceThrottlingTest extends BrokerTestBase {
 
         int totalConnectedConsumers = 0;
         for (int i = 0; i < consumers.size(); i++) {
-            if (((ConsumerImpl) consumers.get(i)).isConnected()) {
+            if (((ConsumerImpl<?>) consumers.get(i)).isConnected()) {
                 totalConnectedConsumers++;
             }
             consumers.get(i).close();
@@ -250,9 +236,9 @@ public class BrokerServiceThrottlingTest extends BrokerTestBase {
         pulsarClient.close();
     }
 
-    private boolean areAllConsumersConnected(List<Consumer> consumers) {
+    private boolean areAllConsumersConnected(List<Consumer<byte[]>> consumers) {
         for (int i = 0; i < consumers.size(); i++) {
-            if (!((ConsumerImpl) consumers.get(i)).isConnected()) {
+            if (!((ConsumerImpl<?>) consumers.get(i)).isConnected()) {
                 return false;
             }
         }
diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/PartitionKeyTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/PartitionKeyTest.java
index cedaf3a..d467ed1 100644
--- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/PartitionKeyTest.java
+++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/PartitionKeyTest.java
@@ -24,7 +24,6 @@ import static org.testng.Assert.assertTrue;
 import org.apache.pulsar.client.api.Message;
 import org.apache.pulsar.client.api.MessageBuilder;
 import org.apache.pulsar.client.api.Producer;
-import org.apache.pulsar.client.api.ProducerConfiguration;
 import org.testng.annotations.AfterMethod;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
@@ -49,15 +48,16 @@ public class PartitionKeyTest extends BrokerTestBase {
     public void testPartitionKey() throws Exception {
         final String topicName = "persistent://prop/use/ns-abc/testPartitionKey";
 
-        org.apache.pulsar.client.api.Consumer consumer = pulsarClient.subscribe(topicName, "my-subscription");
+        org.apache.pulsar.client.api.Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topicName)
+                .subscriptionName("my-subscription").subscribe();
 
         // 1. producer with batch enabled
-        ProducerConfiguration conf = new ProducerConfiguration();
-        conf.setBatchingEnabled(true);
-        Producer producerWithBatches = pulsarClient.createProducer(topicName, conf);
+        Producer<byte[]> producerWithBatches = pulsarClient.newProducer().topic(topicName).enableBatching(true)
+                .create();
+
 
         // 2. Producer without batches
-        Producer producerWithoutBatches = pulsarClient.createProducer(topicName);
+        Producer<byte[]> producerWithoutBatches = pulsarClient.newProducer().topic(topicName).create();
 
         producerWithBatches.sendAsync(MessageBuilder.create().setKey("key-1").setContent("msg-1".getBytes()).build());
         producerWithBatches.sendAsync(MessageBuilder.create().setKey("key-2").setContent("msg-2".getBytes()).build())
@@ -67,7 +67,7 @@ public class PartitionKeyTest extends BrokerTestBase {
                 .sendAsync(MessageBuilder.create().setKey("key-3").setContent("msg-3".getBytes()).build());
 
         for (int i = 1; i <= 3; i++) {
-            Message msg = consumer.receive();
+            Message<byte[]> msg = consumer.receive();
 
             assertTrue(msg.hasKey());
             assertEquals(msg.getKey(), "key-" + i);
diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/PeerReplicatorTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/PeerReplicatorTest.java
index d5456fc..d23356e 100644
--- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/PeerReplicatorTest.java
+++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/PeerReplicatorTest.java
@@ -28,13 +28,10 @@ import java.util.concurrent.TimeUnit;
 
 import org.apache.pulsar.broker.service.persistent.PersistentTopic;
 import org.apache.pulsar.client.admin.PulsarAdminException;
-import org.apache.pulsar.client.api.ClientConfiguration;
 import org.apache.pulsar.client.api.Producer;
 import org.apache.pulsar.client.api.PulsarClient;
 import org.apache.pulsar.client.api.PulsarClientException;
 import org.apache.pulsar.common.policies.data.PersistentTopicStats;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.testng.annotations.AfterClass;
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.DataProvider;
@@ -73,9 +70,9 @@ public class PeerReplicatorTest extends ReplicatorTestBase {
      * 5. Try to create producer using broker in cluster r3
      * 6. Success : "r3" finds "r1" in peer cluster which owns n1 and redirects to "r1"
      * 7. call admin-api to "r3" which redirects request to "r1"
-     * 
+     *
      * </pre>
-     * 
+     *
      * @param protocol
      * @throws Exception
      */
@@ -99,14 +96,11 @@ public class PeerReplicatorTest extends ReplicatorTestBase {
 
         final String topic1 = "persistent://" + namespace1 + "/topic1";
         final String topic2 = "persistent://" + namespace2 + "/topic2";
-        ClientConfiguration conf = new ClientConfiguration();
-        conf.setStatsInterval(0, TimeUnit.SECONDS);
 
-        PulsarClient client3 = PulsarClient.create(serviceUrl, conf);
-        Producer producer;
+        PulsarClient client3 = PulsarClient.builder().serviceUrl(serviceUrl).statsInterval(0, TimeUnit.SECONDS).build();
         try {
             // try to create producer for topic1 (part of cluster: r1) by calling cluster: r3
-            producer = client3.createProducer(topic1);
+            client3.newProducer().topic(topic1).create();
             fail("should have failed as cluster:r3 doesn't own namespace");
         } catch (PulsarClientException e) {
             // Ok
@@ -114,7 +108,7 @@ public class PeerReplicatorTest extends ReplicatorTestBase {
 
         try {
             // try to create producer for topic2 (part of cluster: r2) by calling cluster: r3
-            producer = client3.createProducer(topic2);
+            client3.newProducer().topic(topic2).create();
             fail("should have failed as cluster:r3 doesn't own namespace");
         } catch (PulsarClientException e) {
             // Ok
@@ -122,7 +116,7 @@ public class PeerReplicatorTest extends ReplicatorTestBase {
 
         // set peer-clusters : r3->r1
         admin1.clusters().updatePeerClusterNames("r3", Sets.newLinkedHashSet(Lists.newArrayList("r1")));
-        producer = client3.createProducer(topic1);
+        Producer<byte[]> producer = client3.newProducer().topic(topic1).create();
         PersistentTopic topic = (PersistentTopic) pulsar1.getBrokerService().getTopic(topic1).get();
         assertNotNull(topic);
         pulsar1.getBrokerService().updateRates();
@@ -137,7 +131,7 @@ public class PeerReplicatorTest extends ReplicatorTestBase {
 
         // set peer-clusters : r3->r2
         admin2.clusters().updatePeerClusterNames("r3", Sets.newLinkedHashSet(Lists.newArrayList("r2")));
-        producer = client3.createProducer(topic2);
+        producer = client3.newProducer().topic(topic2).create();
         topic = (PersistentTopic) pulsar2.getBrokerService().getTopic(topic2).get();
         assertNotNull(topic);
         pulsar2.getBrokerService().updateRates();
@@ -169,7 +163,4 @@ public class PeerReplicatorTest extends ReplicatorTestBase {
 		}, 5, 100);
 		assertEquals(admin1.clusters().getPeerClusterNames(mainClusterName), peerClusters);
 	}
-    
-    private static final Logger log = LoggerFactory.getLogger(PeerReplicatorTest.class);
-
 }
diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/PersistentDispatcherFailoverConsumerTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/PersistentDispatcherFailoverConsumerTest.java
index e25581f..50fe3c3 100644
--- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/PersistentDispatcherFailoverConsumerTest.java
+++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/PersistentDispatcherFailoverConsumerTest.java
@@ -409,7 +409,7 @@ public class PersistentDispatcherFailoverConsumerTest {
         // 11. With only one consumer, unsubscribe is allowed
         assertTrue(pdfc.canUnsubscribe(consumer1));
     }
-    
+
     @Test
     public void testMultipleDispatcherGetNextConsumerWithDifferentPriorityLevel() throws Exception {
 
@@ -561,14 +561,15 @@ public class PersistentDispatcherFailoverConsumerTest {
         Assert.assertEquals(getNextConsumer(dispatcher), null);
     }
 
+    @SuppressWarnings("unchecked")
     private Consumer getNextConsumer(PersistentDispatcherMultipleConsumers dispatcher) throws Exception {
-        
+
         Consumer consumer = dispatcher.getNextConsumer();
-        
+
         if (consumer != null) {
             Field field = Consumer.class.getDeclaredField("MESSAGE_PERMITS_UPDATER");
             field.setAccessible(true);
-            AtomicIntegerFieldUpdater<Consumer> messagePermits = (AtomicIntegerFieldUpdater) field.get(consumer);
+            AtomicIntegerFieldUpdater<Consumer> messagePermits = (AtomicIntegerFieldUpdater<Consumer>) field.get(consumer);
             messagePermits.decrementAndGet(consumer);
             return consumer;
         }
diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/PersistentFailoverE2ETest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/PersistentFailoverE2ETest.java
index dda0bc0..d609cd4 100644
--- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/PersistentFailoverE2ETest.java
+++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/PersistentFailoverE2ETest.java
@@ -24,7 +24,6 @@ import static org.testng.Assert.assertNull;
 import static org.testng.Assert.assertTrue;
 import static org.testng.Assert.fail;
 
-import com.google.common.collect.Sets;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
@@ -36,15 +35,14 @@ import org.apache.pulsar.broker.service.persistent.PersistentDispatcherSingleAct
 import org.apache.pulsar.broker.service.persistent.PersistentSubscription;
 import org.apache.pulsar.broker.service.persistent.PersistentTopic;
 import org.apache.pulsar.client.api.Consumer;
-import org.apache.pulsar.client.api.ConsumerConfiguration;
+import org.apache.pulsar.client.api.ConsumerBuilder;
 import org.apache.pulsar.client.api.ConsumerEventListener;
 import org.apache.pulsar.client.api.Message;
 import org.apache.pulsar.client.api.MessageId;
+import org.apache.pulsar.client.api.MessageRoutingMode;
 import org.apache.pulsar.client.api.Producer;
-import org.apache.pulsar.client.api.ProducerConfiguration;
 import org.apache.pulsar.client.api.PulsarClientException;
 import org.apache.pulsar.client.api.SubscriptionType;
-import org.apache.pulsar.client.api.ProducerConfiguration.MessageRoutingMode;
 import org.apache.pulsar.client.impl.MessageIdImpl;
 import org.apache.pulsar.common.api.proto.PulsarApi.CommandSubscribe.SubType;
 import org.apache.pulsar.common.naming.TopicName;
@@ -55,6 +53,7 @@ import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 
 import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
 
 public class PersistentFailoverE2ETest extends BrokerTestBase {
 
@@ -78,7 +77,7 @@ public class PersistentFailoverE2ETest extends BrokerTestBase {
         final LinkedBlockingQueue<Integer> inActiveQueue = new LinkedBlockingQueue<>();
 
         @Override
-        public void becameActive(Consumer consumer, int partitionId) {
+        public void becameActive(Consumer<?> consumer, int partitionId) {
             try {
                 activeQueue.put(partitionId);
             } catch (InterruptedException e) {
@@ -86,7 +85,7 @@ public class PersistentFailoverE2ETest extends BrokerTestBase {
         }
 
         @Override
-        public void becameInactive(Consumer consumer, int partitionId) {
+        public void becameInactive(Consumer<?> consumer, int partitionId) {
             try {
                 inActiveQueue.put(partitionId);
             } catch (InterruptedException e) {
@@ -115,13 +114,13 @@ public class PersistentFailoverE2ETest extends BrokerTestBase {
         private final Set<Integer> inactivePtns = Sets.newHashSet();
 
         @Override
-        public synchronized void becameActive(Consumer consumer, int partitionId) {
+        public synchronized void becameActive(Consumer<?> consumer, int partitionId) {
             activePtns.add(partitionId);
             inactivePtns.remove(partitionId);
         }
 
         @Override
-        public synchronized void becameInactive(Consumer consumer, int partitionId) {
+        public synchronized void becameInactive(Consumer<?> consumer, int partitionId) {
             activePtns.remove(partitionId);
             inactivePtns.add(partitionId);
         }
@@ -134,20 +133,17 @@ public class PersistentFailoverE2ETest extends BrokerTestBase {
         final int numMsgs = 100;
 
         TestConsumerStateEventListener listener1 = new TestConsumerStateEventListener();
-        ConsumerConfiguration consumerConf1 = new ConsumerConfiguration();
-        consumerConf1.setSubscriptionType(SubscriptionType.Failover);
-        consumerConf1.setConsumerName("1");
-        consumerConf1.setConsumerEventListener(listener1);
-
         TestConsumerStateEventListener listener2 = new TestConsumerStateEventListener();
-        ConsumerConfiguration consumerConf2 = new ConsumerConfiguration();
-        consumerConf2.setSubscriptionType(SubscriptionType.Failover);
-        consumerConf2.setConsumerName("2");
-        consumerConf2.setConsumerEventListener(listener2);
+        ConsumerBuilder<byte[]> consumerBuilder = pulsarClient.newConsumer().topic(topicName).subscriptionName(subName)
+                .subscriptionType(SubscriptionType.Failover);
+
 
         // 1. two consumers on the same subscription
-        Consumer consumer1 = pulsarClient.subscribe(topicName, subName, consumerConf1);
-        Consumer consumer2 = pulsarClient.subscribe(topicName, subName, consumerConf2);
+        ConsumerBuilder<byte[]> consumerBulder1 = consumerBuilder.clone().consumerName("1")
+                .consumerEventListener(listener1);
+        Consumer<byte[]> consumer1 = consumerBulder1.subscribe();
+        Consumer<byte[]> consumer2 = consumerBuilder.clone().consumerName("2").consumerEventListener(listener2)
+                .subscribe();
         verifyConsumerActive(listener1, -1);
         verifyConsumerInactive(listener2, -1);
 
@@ -162,7 +158,7 @@ public class PersistentFailoverE2ETest extends BrokerTestBase {
         assertEquals(subRef.getDispatcher().getType(), SubType.Failover);
 
         List<CompletableFuture<MessageId>> futures = Lists.newArrayListWithCapacity(numMsgs);
-        Producer producer = pulsarClient.createProducer(topicName);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName).create();
         for (int i = 0; i < numMsgs; i++) {
             String message = "my-message-" + i;
             futures.add(producer.sendAsync(message.getBytes()));
@@ -176,7 +172,7 @@ public class PersistentFailoverE2ETest extends BrokerTestBase {
         Thread.sleep(ASYNC_EVENT_COMPLETION_WAIT);
 
         // 3. consumer1 should have all the messages while consumer2 should have no messages
-        Message msg = null;
+        Message<byte[]> msg = null;
         Assert.assertNull(consumer2.receive(1, TimeUnit.SECONDS));
         for (int i = 0; i < numMsgs; i++) {
             msg = consumer1.receive(1, TimeUnit.SECONDS);
@@ -242,7 +238,7 @@ public class PersistentFailoverE2ETest extends BrokerTestBase {
             Assert.assertEquals(new String(msg.getData()), "my-message-" + i);
             consumer2.acknowledge(msg);
         }
-        consumer1 = pulsarClient.subscribe(topicName, subName, consumerConf1);
+        consumer1 = consumerBulder1.subscribe();
         Thread.sleep(CONSUMER_ADD_OR_REMOVE_WAIT_TIME);
         for (int i = 5; i < numMsgs; i++) {
             msg = consumer1.receive(1, TimeUnit.SECONDS);
@@ -264,18 +260,15 @@ public class PersistentFailoverE2ETest extends BrokerTestBase {
         futures.clear();
 
         // 7. consumer subscription should not send messages to the new consumer if its name is not highest in the list
-        TestConsumerStateEventListener listener3 = new TestConsumerStateEventListener();
-        ConsumerConfiguration consumerConf3 = new ConsumerConfiguration();
-        consumerConf3.setSubscriptionType(SubscriptionType.Failover);
-        consumerConf3.setConsumerName("3");
-        consumerConf3.setConsumerEventListener(listener3);
         for (int i = 0; i < 5; i++) {
             msg = consumer1.receive(1, TimeUnit.SECONDS);
             Assert.assertNotNull(msg);
             Assert.assertEquals(new String(msg.getData()), "my-message-" + i);
             consumer1.acknowledge(msg);
         }
-        Consumer consumer3 = pulsarClient.subscribe(topicName, subName, consumerConf3);
+        TestConsumerStateEventListener listener3 = new TestConsumerStateEventListener();
+        Consumer<byte[]> consumer3 = consumerBuilder.clone().consumerName("3").consumerEventListener(listener3)
+                .subscribe();
         Thread.sleep(CONSUMER_ADD_OR_REMOVE_WAIT_TIME);
 
         verifyConsumerInactive(listener3, -1);
@@ -333,24 +326,18 @@ public class PersistentFailoverE2ETest extends BrokerTestBase {
 
         admin.persistentTopics().createPartitionedTopic(topicName, numPartitions);
 
-        ProducerConfiguration producerConf = new ProducerConfiguration();
-        producerConf.setMessageRoutingMode(MessageRoutingMode.RoundRobinPartition);
+        ConsumerBuilder<byte[]> consumerBuilder = pulsarClient.newConsumer().topic(topicName).subscriptionName(subName)
+                .subscriptionType(SubscriptionType.Failover);
 
-        ActiveInactiveListenerEvent listener1 = new ActiveInactiveListenerEvent();
-        ConsumerConfiguration consumerConf1 = new ConsumerConfiguration();
-        consumerConf1.setSubscriptionType(SubscriptionType.Failover);
-        consumerConf1.setConsumerName("1");
-        consumerConf1.setConsumerEventListener(listener1);
 
+        // 1. two consumers on the same subscription
+        ActiveInactiveListenerEvent listener1 = new ActiveInactiveListenerEvent();
         ActiveInactiveListenerEvent listener2 = new ActiveInactiveListenerEvent();
-        ConsumerConfiguration consumerConf2 = new ConsumerConfiguration();
-        consumerConf2.setSubscriptionType(SubscriptionType.Failover);
-        consumerConf2.setConsumerName("2");
-        consumerConf2.setConsumerEventListener(listener2);
 
-        // 1. two consumers on the same subscription
-        Consumer consumer1 = pulsarClient.subscribe(topicName, subName, consumerConf1);
-        Consumer consumer2 = pulsarClient.subscribe(topicName, subName, consumerConf2);
+        Consumer<byte[]> consumer1 = consumerBuilder.clone().consumerName("1").consumerEventListener(listener1)
+                .subscribe();
+        Consumer<byte[]> consumer2 = consumerBuilder.clone().consumerName("2").consumerEventListener(listener2)
+                .subscribe();
 
         PersistentTopic topicRef;
         topicRef = (PersistentTopic) pulsar.getBrokerService().getTopicReference(destName.getPartition(0).toString());
@@ -367,7 +354,8 @@ public class PersistentFailoverE2ETest extends BrokerTestBase {
                 .getSubscription(subName).getDispatcher();
 
         List<CompletableFuture<MessageId>> futures = Lists.newArrayListWithCapacity(numMsgs);
-        Producer producer = pulsarClient.createProducer(topicName, producerConf);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName)
+                .messageRoutingMode(MessageRoutingMode.RoundRobinPartition).create();
         for (int i = 0; i < numMsgs; i++) {
             String message = "my-message-" + i;
             futures.add(producer.sendAsync(message.getBytes()));
@@ -377,7 +365,7 @@ public class PersistentFailoverE2ETest extends BrokerTestBase {
 
         // equal distribution between both consumers
         int totalMessages = 0;
-        Message msg = null;
+        Message<byte[]> msg = null;
         Set<Integer> receivedPtns = Sets.newHashSet();
         while (true) {
             msg = consumer1.receive(1, TimeUnit.SECONDS);
@@ -410,10 +398,10 @@ public class PersistentFailoverE2ETest extends BrokerTestBase {
         assertTrue(Sets.difference(listener2.activePtns, receivedPtns).isEmpty());
 
         Assert.assertEquals(totalMessages, numMsgs);
-        Assert.assertEquals(disp0.getActiveConsumer().consumerName(), consumerConf1.getConsumerName());
-        Assert.assertEquals(disp1.getActiveConsumer().consumerName(), consumerConf2.getConsumerName());
-        Assert.assertEquals(disp2.getActiveConsumer().consumerName(), consumerConf1.getConsumerName());
-        Assert.assertEquals(disp3.getActiveConsumer().consumerName(), consumerConf2.getConsumerName());
+        Assert.assertEquals(disp0.getActiveConsumer().consumerName(), "1");
+        Assert.assertEquals(disp1.getActiveConsumer().consumerName(), "2");
+        Assert.assertEquals(disp2.getActiveConsumer().consumerName(), "1");
+        Assert.assertEquals(disp3.getActiveConsumer().consumerName(), "2");
         totalMessages = 0;
 
         for (int i = 0; i < numMsgs; i++) {
@@ -424,16 +412,13 @@ public class PersistentFailoverE2ETest extends BrokerTestBase {
         futures.clear();
 
         // add a consumer
-        ConsumerConfiguration consumerConf3 = new ConsumerConfiguration();
-        consumerConf3.setSubscriptionType(SubscriptionType.Failover);
-        consumerConf3.setConsumerName("3");
         for (int i = 0; i < 20; i++) {
             msg = consumer1.receive(1, TimeUnit.SECONDS);
             Assert.assertNotNull(msg);
             uniqueMessages.add(new String(msg.getData()));
             consumer1.acknowledge(msg);
         }
-        Consumer consumer3 = pulsarClient.subscribe(topicName, subName, consumerConf3);
+        Consumer<byte[]> consumer3 = consumerBuilder.clone().consumerName("3").subscribe();
         Thread.sleep(CONSUMER_ADD_OR_REMOVE_WAIT_TIME);
         int consumer1Messages = 0;
         while (true) {
@@ -470,10 +455,10 @@ public class PersistentFailoverE2ETest extends BrokerTestBase {
         }
 
         Assert.assertEquals(uniqueMessages.size(), numMsgs);
-        Assert.assertEquals(disp0.getActiveConsumer().consumerName(), consumerConf1.getConsumerName());
-        Assert.assertEquals(disp1.getActiveConsumer().consumerName(), consumerConf2.getConsumerName());
-        Assert.assertEquals(disp2.getActiveConsumer().consumerName(), consumerConf3.getConsumerName());
-        Assert.assertEquals(disp3.getActiveConsumer().consumerName(), consumerConf1.getConsumerName());
+        Assert.assertEquals(disp0.getActiveConsumer().consumerName(), "1");
+        Assert.assertEquals(disp1.getActiveConsumer().consumerName(), "2");
+        Assert.assertEquals(disp2.getActiveConsumer().consumerName(), "3");
+        Assert.assertEquals(disp3.getActiveConsumer().consumerName(), "1");
         uniqueMessages.clear();
 
         for (int i = 0; i < numMsgs; i++) {
@@ -516,10 +501,10 @@ public class PersistentFailoverE2ETest extends BrokerTestBase {
         }
 
         Assert.assertEquals(uniqueMessages.size(), numMsgs);
-        Assert.assertEquals(disp0.getActiveConsumer().consumerName(), consumerConf2.getConsumerName());
-        Assert.assertEquals(disp1.getActiveConsumer().consumerName(), consumerConf3.getConsumerName());
-        Assert.assertEquals(disp2.getActiveConsumer().consumerName(), consumerConf2.getConsumerName());
-        Assert.assertEquals(disp3.getActiveConsumer().consumerName(), consumerConf3.getConsumerName());
+        Assert.assertEquals(disp0.getActiveConsumer().consumerName(), "2");
+        Assert.assertEquals(disp1.getActiveConsumer().consumerName(), "3");
+        Assert.assertEquals(disp2.getActiveConsumer().consumerName(), "2");
+        Assert.assertEquals(disp3.getActiveConsumer().consumerName(), "3");
 
         producer.close();
         consumer2.close();
@@ -533,48 +518,35 @@ public class PersistentFailoverE2ETest extends BrokerTestBase {
         final String topicName = "persistent://prop/use/ns-abc/failover-topic3";
         final String subName = "sub1";
         final int numMsgs = 100;
-        List<Message> receivedMessages = Lists.newArrayList();
-
-        ConsumerConfiguration consumerConf1 = new ConsumerConfiguration();
-        consumerConf1.setSubscriptionType(SubscriptionType.Failover);
-        consumerConf1.setConsumerName("1");
-        consumerConf1.setMessageListener((consumer, msg) -> {
-            try {
-                synchronized (receivedMessages) {
-                    receivedMessages.add(msg);
-                }
-                consumer.acknowledge(msg);
-            } catch (Exception e) {
-                fail("Should not fail");
-            }
-        });
-
-        ConsumerConfiguration consumerConf2 = new ConsumerConfiguration();
-        consumerConf2.setSubscriptionType(SubscriptionType.Failover);
-        consumerConf2.setConsumerName("2");
-        consumerConf2.setMessageListener((consumer, msg) -> {
-            try {
-                synchronized (receivedMessages) {
-                    receivedMessages.add(msg);
-                }
-                consumer.acknowledge(msg);
-            } catch (Exception e) {
-                fail("Should not fail");
-            }
-        });
+        List<Message<byte[]>> receivedMessages = Lists.newArrayList();
+
+        ConsumerBuilder<byte[]> consumerBuilder = pulsarClient.newConsumer().topic(topicName).subscriptionName(subName)
+                .subscriptionType(SubscriptionType.Failover).messageListener((consumer, msg) -> {
+                    try {
+                        synchronized (receivedMessages) {
+                            receivedMessages.add(msg);
+                        }
+                        consumer.acknowledge(msg);
+                    } catch (Exception e) {
+                        fail("Should not fail");
+                    }
+                });
+
+        ConsumerBuilder<byte[]> consumerBuilder1 = consumerBuilder.clone().consumerName("1");
+        ConsumerBuilder<byte[]> consumerBuilder2 = consumerBuilder.clone().consumerName("2");
 
         conf.setActiveConsumerFailoverDelayTimeMillis(500);
         restartBroker();
 
         // create subscription
-        Consumer consumer = pulsarClient.subscribe(topicName, subName, consumerConf1);
+        Consumer<byte[]> consumer = consumerBuilder1.subscribe();
         consumer.close();
         PersistentTopic topicRef = (PersistentTopic) pulsar.getBrokerService().getTopicReference(topicName);
         PersistentSubscription subRef = topicRef.getSubscription(subName);
 
         // enqueue messages
         List<CompletableFuture<MessageId>> futures = Lists.newArrayListWithCapacity(numMsgs);
-        Producer producer = pulsarClient.createProducer(topicName);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName).create();
         for (int i = 0; i < numMsgs; i++) {
             String message = "my-message-" + i;
             futures.add(producer.sendAsync(message.getBytes()));
@@ -584,8 +556,8 @@ public class PersistentFailoverE2ETest extends BrokerTestBase {
         producer.close();
 
         // two consumers subscribe at almost the same time
-        CompletableFuture<Consumer<byte[]>> subscribeFuture2 = pulsarClient.subscribeAsync(topicName, subName, consumerConf2);
-        CompletableFuture<Consumer<byte[]>> subscribeFuture1 = pulsarClient.subscribeAsync(topicName, subName, consumerConf1);
+        CompletableFuture<Consumer<byte[]>> subscribeFuture2 = consumerBuilder2.subscribeAsync();
+        CompletableFuture<Consumer<byte[]>> subscribeFuture1 = consumerBuilder1.subscribeAsync();
 
         // wait for all messages to be dequeued
         int retry = 20;
diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/PersistentQueueE2ETest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/PersistentQueueE2ETest.java
index f311f4c..8cc11d7 100644
--- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/PersistentQueueE2ETest.java
+++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/PersistentQueueE2ETest.java
@@ -36,15 +36,13 @@ import org.apache.commons.collections.CollectionUtils;
 import org.apache.pulsar.broker.service.persistent.PersistentSubscription;
 import org.apache.pulsar.broker.service.persistent.PersistentTopic;
 import org.apache.pulsar.client.api.Consumer;
-import org.apache.pulsar.client.api.ConsumerConfiguration;
+import org.apache.pulsar.client.api.ConsumerBuilder;
 import org.apache.pulsar.client.api.Message;
 import org.apache.pulsar.client.api.MessageId;
 import org.apache.pulsar.client.api.Producer;
-import org.apache.pulsar.client.api.ProducerConfiguration;
 import org.apache.pulsar.client.api.PulsarClientException;
 import org.apache.pulsar.client.api.SubscriptionType;
 import org.apache.pulsar.client.impl.ConsumerImpl;
-import org.apache.pulsar.client.impl.MessageIdImpl;
 import org.apache.pulsar.common.api.proto.PulsarApi.CommandSubscribe.SubType;
 import org.apache.pulsar.common.policies.data.ConsumerStats;
 import org.apache.pulsar.common.policies.data.PersistentTopicStats;
@@ -83,12 +81,12 @@ public class PersistentQueueE2ETest extends BrokerTestBase {
         final String subName = "sub1";
         final int numMsgs = 100;
 
-        ConsumerConfiguration conf = new ConsumerConfiguration();
-        conf.setSubscriptionType(SubscriptionType.Shared);
+        ConsumerBuilder<byte[]> consumerBuilder = pulsarClient.newConsumer().topic(topicName).subscriptionName(subName)
+                .subscriptionType(SubscriptionType.Shared);
 
         // 1. two consumers on the same subscription
-        Consumer consumer1 = pulsarClient.subscribe(topicName, subName, conf);
-        Consumer consumer2 = pulsarClient.subscribe(topicName, subName, conf);
+        Consumer<byte[]> consumer1 = consumerBuilder.subscribe();
+        Consumer<byte[]> consumer2 = consumerBuilder.subscribe();
 
         PersistentTopic topicRef = (PersistentTopic) pulsar.getBrokerService().getTopicReference(topicName);
         PersistentSubscription subRef = topicRef.getSubscription(subName);
@@ -101,7 +99,7 @@ public class PersistentQueueE2ETest extends BrokerTestBase {
         assertEquals(subRef.getDispatcher().getType(), SubType.Shared);
 
         List<CompletableFuture<MessageId>> futures = Lists.newArrayListWithCapacity(numMsgs * 2);
-        Producer producer = pulsarClient.createProducer(topicName);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName).create();
         for (int i = 0; i < numMsgs * 2; i++) {
             String message = "my-message-" + i;
             futures.add(producer.sendAsync(message.getBytes()));
@@ -114,14 +112,15 @@ public class PersistentQueueE2ETest extends BrokerTestBase {
         Thread.sleep(ASYNC_EVENT_COMPLETION_WAIT);
 
         // both consumers will together consumer all messages
-        Message msg;
-        Consumer c = consumer1;
+        Message<byte[]> msg;
+        Consumer<byte[]> c = consumer1;
         while (true) {
             try {
                 msg = c.receive(1, TimeUnit.SECONDS);
                 c.acknowledge(msg);
             } catch (PulsarClientException e) {
                 if (c.equals(consumer1)) {
+                    consumer1.close();
                     c = consumer2;
                 } else {
                     break;
@@ -181,34 +180,24 @@ public class PersistentQueueE2ETest extends BrokerTestBase {
         final List<String> messagesProduced = Lists.newArrayListWithCapacity(numMsgs);
         final List<String> messagesConsumed = new BlockingArrayQueue<>(numMsgs);
 
-        ConsumerConfiguration conf1 = new ConsumerConfiguration();
-        conf1.setSubscriptionType(SubscriptionType.Shared);
-        conf1.setMessageListener((consumer, msg) -> {
-            try {
-                consumer.acknowledge(msg);
-                messagesConsumed.add(new String(msg.getData()));
-            } catch (Exception e) {
-                fail("Should not fail");
-            }
-        });
-
-        ConsumerConfiguration conf2 = new ConsumerConfiguration();
-        conf2.setSubscriptionType(SubscriptionType.Shared);
-        conf2.setMessageListener((consumer, msg) -> {
-            try {
-                // do nothing
-            } catch (Exception e) {
-                fail("Should not fail");
-            }
-        });
-
-        Consumer consumer1 = pulsarClient.subscribe(topicName, subName, conf1);
+        Consumer<byte[]> consumer1 = pulsarClient.newConsumer().topic(topicName).subscriptionName(subName)
+                .subscriptionType(SubscriptionType.Shared).messageListener((consumer, msg) -> {
+                    try {
+                        consumer.acknowledge(msg);
+                        messagesConsumed.add(new String(msg.getData()));
+                    } catch (Exception e) {
+                        fail("Should not fail");
+                    }
+                }).subscribe();
 
         // consumer2 does not ack messages
-        Consumer consumer2 = pulsarClient.subscribe(topicName, subName, conf2);
+        Consumer<byte[]> consumer2 = pulsarClient.newConsumer().topic(topicName).subscriptionName(subName)
+                .subscriptionType(SubscriptionType.Shared).messageListener((consumer, msg) -> {
+                    // do notthing
+                }).subscribe();
 
         List<CompletableFuture<MessageId>> futures = Lists.newArrayListWithCapacity(numMsgs * 2);
-        Producer producer = pulsarClient.createProducer(topicName);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName).create();
         for (int i = 0; i < numMsgs; i++) {
             String message = "msg-" + i;
             futures.add(producer.sendAsync(message.getBytes()));
@@ -241,40 +230,34 @@ public class PersistentQueueE2ETest extends BrokerTestBase {
         final CountDownLatch latch = new CountDownLatch(numMsgs);
 
         int recvQ1 = 10;
-        ConsumerConfiguration conf1 = new ConsumerConfiguration();
-        conf1.setSubscriptionType(SubscriptionType.Shared);
-        conf1.setReceiverQueueSize(recvQ1);
-        conf1.setMessageListener((consumer, msg) -> {
-            msgCountConsumer1.incrementAndGet();
-            try {
-                consumer.acknowledge(msg);
-                latch.countDown();
-            } catch (PulsarClientException e) {
-                fail("Should not fail");
-            }
-        });
+        Consumer<byte[]> consumer1 = pulsarClient.newConsumer().topic(topicName).subscriptionName(subName)
+                .subscriptionType(SubscriptionType.Shared).receiverQueueSize(recvQ1)
+                .messageListener((consumer, msg) -> {
+                    msgCountConsumer1.incrementAndGet();
+                    try {
+                        consumer.acknowledge(msg);
+                        latch.countDown();
+                    } catch (PulsarClientException e) {
+                        fail("Should not fail");
+                    }
+                }).subscribe();
 
         int recvQ2 = 1;
-        ConsumerConfiguration conf2 = new ConsumerConfiguration();
-        conf2.setSubscriptionType(SubscriptionType.Shared);
-        conf2.setReceiverQueueSize(recvQ2);
-        conf2.setMessageListener((consumer, msg) -> {
-            msgCountConsumer2.incrementAndGet();
-            try {
-                consumer.acknowledge(msg);
-                latch.countDown();
-            } catch (PulsarClientException e) {
-                fail("Should not fail");
-            }
-        });
-
-        Consumer consumer1 = pulsarClient.subscribe(topicName, subName, conf1);
-        Consumer consumer2 = pulsarClient.subscribe(topicName, subName, conf2);
+        Consumer<byte[]> consumer2 = pulsarClient.newConsumer().topic(topicName).subscriptionName(subName)
+                .subscriptionType(SubscriptionType.Shared).receiverQueueSize(recvQ2)
+                .messageListener((consumer, msg) -> {
+                    msgCountConsumer2.incrementAndGet();
+                    try {
+                        consumer.acknowledge(msg);
+                        latch.countDown();
+                    } catch (PulsarClientException e) {
+                        fail("Should not fail");
+                    }
+                }).subscribe();
 
         List<CompletableFuture<MessageId>> futures = Lists.newArrayListWithCapacity(numMsgs);
-        ProducerConfiguration conf = new ProducerConfiguration();
-        conf.setMaxPendingMessages(numMsgs + 1);
-        Producer producer = pulsarClient.createProducer(topicName, conf);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName).maxPendingMessages(numMsgs + 1)
+                .create();
         for (int i = 0; i < numMsgs; i++) {
             String message = "msg-" + i;
             futures.add(producer.sendAsync(message.getBytes()));
@@ -307,10 +290,10 @@ public class PersistentQueueE2ETest extends BrokerTestBase {
 
         final CountDownLatch latch = new CountDownLatch(numMsgs * 3);
 
-        ConsumerConfiguration conf1 = new ConsumerConfiguration();
-        conf1.setSubscriptionType(SubscriptionType.Shared);
-        conf1.setReceiverQueueSize(10);
-        conf1.setMessageListener((consumer, msg) -> {
+        ConsumerBuilder<byte[]> consumerBuilder = pulsarClient.newConsumer().topic(topicName).subscriptionName(subName)
+                .receiverQueueSize(10).subscriptionType(SubscriptionType.Shared);
+
+        Consumer<byte[]> consumer1 = consumerBuilder.clone().messageListener((consumer, msg) -> {
             try {
                 counter1.incrementAndGet();
                 consumer.acknowledge(msg);
@@ -318,12 +301,9 @@ public class PersistentQueueE2ETest extends BrokerTestBase {
             } catch (Exception e) {
                 fail("Should not fail");
             }
-        });
+        }).subscribe();
 
-        ConsumerConfiguration conf2 = new ConsumerConfiguration();
-        conf2.setSubscriptionType(SubscriptionType.Shared);
-        conf2.setReceiverQueueSize(10);
-        conf2.setMessageListener((consumer, msg) -> {
+        Consumer<byte[]> consumer2 = consumerBuilder.clone().messageListener((consumer, msg) -> {
             try {
                 counter2.incrementAndGet();
                 consumer.acknowledge(msg);
@@ -331,29 +311,20 @@ public class PersistentQueueE2ETest extends BrokerTestBase {
             } catch (Exception e) {
                 fail("Should not fail");
             }
-        });
+        }).subscribe();
 
-        ConsumerConfiguration conf3 = new ConsumerConfiguration();
-        conf3.setSubscriptionType(SubscriptionType.Shared);
-        conf3.setReceiverQueueSize(10);
-        conf3.setMessageListener((consumer, msg) -> {
+        Consumer<byte[]> consumer3 = consumerBuilder.clone().messageListener((consumer, msg) -> {
             try {
-                counter3.incrementAndGet();
+                counter1.incrementAndGet();
                 consumer.acknowledge(msg);
                 latch.countDown();
             } catch (Exception e) {
                 fail("Should not fail");
             }
-        });
-
-        // subscribe and close, so that distribution can be checked after
-        // all messages are published
-        Consumer consumer1 = pulsarClient.subscribe(topicName, subName, conf1);
-        Consumer consumer2 = pulsarClient.subscribe(topicName, subName, conf2);
-        Consumer consumer3 = pulsarClient.subscribe(topicName, subName, conf3);
+        }).subscribe();
 
         List<CompletableFuture<MessageId>> futures = Lists.newArrayListWithCapacity(numMsgs);
-        Producer producer = pulsarClient.createProducer(topicName);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName).create();
         for (int i = 0; i < numMsgs * 3; i++) {
             String message = "msg-" + i;
             futures.add(producer.sendAsync(message.getBytes()));
@@ -386,17 +357,16 @@ public class PersistentQueueE2ETest extends BrokerTestBase {
         final int totalMessages = 50;
 
         // 1. producer connect
-        Producer producer = pulsarClient.createProducer(topicName);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName).create();
         PersistentTopic topicRef = (PersistentTopic) pulsar.getBrokerService().getTopicReference(topicName);
         assertNotNull(topicRef);
         assertEquals(topicRef.getProducers().size(), 1);
 
         // 2. Create consumer
-        ConsumerConfiguration conf = new ConsumerConfiguration();
-        conf.setReceiverQueueSize(10);
-        conf.setSubscriptionType(SubscriptionType.Shared);
-        Consumer consumer1 = pulsarClient.subscribe(topicName, subscriptionName, conf);
-        Consumer consumer2 = pulsarClient.subscribe(topicName, subscriptionName, conf);
+        ConsumerBuilder<byte[]> consumerBuilder = pulsarClient.newConsumer().topic(topicName)
+                .subscriptionName(subscriptionName).receiverQueueSize(10).subscriptionType(SubscriptionType.Shared);
+        Consumer<byte[]> consumer1 = consumerBuilder.subscribe();
+        Consumer<byte[]> consumer2 = consumerBuilder.subscribe();
 
         // 3. Producer publishes messages
         for (int i = 0; i < totalMessages; i++) {
@@ -407,8 +377,8 @@ public class PersistentQueueE2ETest extends BrokerTestBase {
 
         // 4. Receive messages
         int receivedConsumer1 = 0, receivedConsumer2 = 0;
-        Message message1 = consumer1.receive();
-        Message message2 = consumer2.receive();
+        Message<byte[]> message1 = consumer1.receive();
+        Message<byte[]> message2 = consumer2.receive();
         do {
             if (message1 != null) {
                 log.info("Consumer 1 Received: " + new String(message1.getData()));
@@ -453,17 +423,16 @@ public class PersistentQueueE2ETest extends BrokerTestBase {
         final int totalMessages = 10;
 
         // 1. producer connect
-        Producer producer = pulsarClient.createProducer(topicName);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName).create();
         PersistentTopic topicRef = (PersistentTopic) pulsar.getBrokerService().getTopicReference(topicName);
         assertNotNull(topicRef);
         assertEquals(topicRef.getProducers().size(), 1);
 
         // 2. Create consumer
-        ConsumerConfiguration conf = new ConsumerConfiguration();
-        conf.setReceiverQueueSize(1000);
-        conf.setSubscriptionType(SubscriptionType.Shared);
-        Consumer consumer1 = pulsarClient.subscribe(topicName, subscriptionName, conf);
-        Consumer consumer2 = pulsarClient.subscribe(topicName, subscriptionName, conf);
+        ConsumerBuilder<byte[]> consumerBuilder = pulsarClient.newConsumer().topic(topicName)
+                .subscriptionName(subscriptionName).receiverQueueSize(1000).subscriptionType(SubscriptionType.Shared);
+        Consumer<byte[]> consumer1 = consumerBuilder.subscribe();
+        Consumer<byte[]> consumer2 = consumerBuilder.subscribe();
 
         // 3. Producer publishes messages
         for (int i = 0; i < totalMessages; i++) {
@@ -474,8 +443,8 @@ public class PersistentQueueE2ETest extends BrokerTestBase {
 
         // 4. Receive messages
         int receivedConsumer1 = 0, receivedConsumer2 = 0;
-        Message message1 = consumer1.receive();
-        Message message2 = consumer2.receive();
+        Message<byte[]> message1 = consumer1.receive();
+        Message<byte[]> message2 = consumer2.receive();
         do {
             if (message1 != null) {
                 log.info("Consumer 1 Received: " + new String(message1.getData()));
@@ -508,7 +477,7 @@ public class PersistentQueueE2ETest extends BrokerTestBase {
         }
 
         // 7. Consumer reconnects
-        consumer1 = pulsarClient.subscribe(topicName, subscriptionName, conf);
+        consumer1 = consumerBuilder.subscribe();
 
         // 8. Check number of messages received
         receivedConsumer1 = 0;
@@ -528,12 +497,11 @@ public class PersistentQueueE2ETest extends BrokerTestBase {
         final String subName = "sub3";
         final int numMsgs = 10;
 
-        Producer producer = pulsarClient.createProducer(topicName);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName).create();
 
-        ConsumerConfiguration conf = new ConsumerConfiguration();
-        conf.setSubscriptionType(SubscriptionType.Shared);
-        conf.setReceiverQueueSize(0);
-        ConsumerImpl consumer1 = (ConsumerImpl) pulsarClient.subscribe(topicName, subName, conf);
+        ConsumerBuilder<byte[]> consumerBuilder = pulsarClient.newConsumer().topic(topicName).subscriptionName(subName)
+                .receiverQueueSize(10).subscriptionType(SubscriptionType.Shared);
+        ConsumerImpl<byte[]> consumer1 = (ConsumerImpl<byte[]>) consumerBuilder.subscribe();
 
         for (int i = 0; i < numMsgs; i++) {
             producer.send(("hello-" + i).getBytes());
@@ -547,7 +515,7 @@ public class PersistentQueueE2ETest extends BrokerTestBase {
         }
 
         // C-2 will not get any message initially, since everything went to C-1 already
-        Consumer consumer2 = pulsarClient.subscribe(topicName, subName, conf);
+        Consumer<byte[]> consumer2 = consumerBuilder.subscribe();
 
         // Trigger C-1 to redeliver everything, half will go C-1 again and the other half to C-2
         consumer1.redeliverUnacknowledgedMessages(c1_receivedMessages);
diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/PersistentTopicConcurrentTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/PersistentTopicConcurrentTest.java
index eda685a..52c976d 100644
--- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/PersistentTopicConcurrentTest.java
+++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/PersistentTopicConcurrentTest.java
@@ -65,7 +65,9 @@ public class PersistentTopicConcurrentTest extends MockedBookKeeperTestCase {
     private BrokerService brokerService;
     private ManagedLedgerFactory mlFactoryMock;
     private ServerCnx serverCnx;
+    @SuppressWarnings("unused")
     private ManagedLedger ledgerMock;
+    @SuppressWarnings("unused")
     private ManagedCursor cursorMock;
 
     final String successTopicName = "persistent://prop/use/ns-abc/successTopic";
diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/PersistentTopicE2ETest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/PersistentTopicE2ETest.java
index ad46179..8b82c88 100644
--- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/PersistentTopicE2ETest.java
+++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/PersistentTopicE2ETest.java
@@ -18,12 +18,6 @@
  */
 package org.apache.pulsar.broker.service;
 
-import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.anyObject;
-import static org.mockito.Matchers.anyString;
-import static org.mockito.Mockito.doAnswer;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.mock;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertFalse;
 import static org.testng.Assert.assertNotNull;
@@ -32,10 +26,8 @@ import static org.testng.Assert.assertTrue;
 import static org.testng.Assert.fail;
 
 import java.lang.reflect.Field;
-import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
-import java.util.TreeSet;
 import java.util.concurrent.Callable;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.CountDownLatch;
@@ -46,26 +38,20 @@ import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
 
 import org.apache.bookkeeper.mledger.ManagedCursor;
-import org.apache.bookkeeper.mledger.ManagedLedger;
-import org.apache.bookkeeper.mledger.ManagedLedgerConfig;
-import org.apache.bookkeeper.mledger.AsyncCallbacks.OpenLedgerCallback;
 import org.apache.bookkeeper.mledger.impl.EntryCacheImpl;
 import org.apache.bookkeeper.mledger.impl.ManagedLedgerFactoryImpl;
 import org.apache.bookkeeper.mledger.impl.ManagedLedgerImpl;
-import org.apache.bookkeeper.mledger.impl.PositionImpl;
-import org.apache.pulsar.broker.service.BrokerService;
 import org.apache.pulsar.broker.service.persistent.PersistentDispatcherMultipleConsumers;
 import org.apache.pulsar.broker.service.persistent.PersistentSubscription;
 import org.apache.pulsar.broker.service.persistent.PersistentTopic;
 import org.apache.pulsar.client.admin.PulsarAdminException;
 import org.apache.pulsar.client.api.CompressionType;
 import org.apache.pulsar.client.api.Consumer;
-import org.apache.pulsar.client.api.ConsumerConfiguration;
 import org.apache.pulsar.client.api.Message;
 import org.apache.pulsar.client.api.MessageBuilder;
 import org.apache.pulsar.client.api.MessageId;
 import org.apache.pulsar.client.api.Producer;
-import org.apache.pulsar.client.api.ProducerConfiguration;
+import org.apache.pulsar.client.api.ProducerBuilder;
 import org.apache.pulsar.client.api.PulsarClient;
 import org.apache.pulsar.client.api.PulsarClientException;
 import org.apache.pulsar.client.api.PulsarClientException.ProducerBusyException;
@@ -79,16 +65,12 @@ import org.apache.pulsar.common.policies.data.RetentionPolicies;
 import org.apache.pulsar.common.stats.Metrics;
 import org.apache.pulsar.common.util.collections.ConcurrentLongPairSet;
 import org.apache.pulsar.policies.data.loadbalancer.NamespaceBundleStats;
-import org.mockito.invocation.InvocationOnMock;
-import org.mockito.stubbing.Answer;
 import org.testng.Assert;
 import org.testng.annotations.AfterMethod;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.DataProvider;
 import org.testng.annotations.Test;
 
-import com.google.common.collect.Sets;
-
 /**
  */
 @Test
@@ -110,7 +92,7 @@ public class PersistentTopicE2ETest extends BrokerTestBase {
         final String topicName = "persistent://prop/use/ns-abc/topic0";
 
         // 1. producer connect
-        Producer producer = pulsarClient.createProducer(topicName);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName).create();
 
         PersistentTopic topicRef = (PersistentTopic) pulsar.getBrokerService().getTopicReference(topicName);
         assertNotNull(topicRef);
@@ -138,11 +120,8 @@ public class PersistentTopicE2ETest extends BrokerTestBase {
         final String subName = "sub1";
         final int numMsgs = 10;
 
-        ConsumerConfiguration conf = new ConsumerConfiguration();
-        conf.setSubscriptionType(SubscriptionType.Exclusive);
-
         // 1. client connect
-        Consumer consumer = pulsarClient.subscribe(topicName, subName, conf);
+        Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topicName).subscriptionName(subName).subscribe();
 
         PersistentTopic topicRef = (PersistentTopic) pulsar.getBrokerService().getTopicReference(topicName);
         PersistentSubscription subRef = topicRef.getSubscription(subName);
@@ -154,7 +133,7 @@ public class PersistentTopicE2ETest extends BrokerTestBase {
         Thread.sleep(ASYNC_EVENT_COMPLETION_WAIT);
         assertEquals(getAvailablePermits(subRef), 1000 /* default */);
 
-        Producer producer = pulsarClient.createProducer(topicName);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName).create();
         for (int i = 0; i < numMsgs * 2; i++) {
             String message = "my-message-" + i;
             producer.send(message.getBytes());
@@ -168,7 +147,7 @@ public class PersistentTopicE2ETest extends BrokerTestBase {
         Thread.sleep(ASYNC_EVENT_COMPLETION_WAIT);
         assertEquals(getAvailablePermits(subRef), 1000 - numMsgs * 2);
 
-        Message msg = null;
+        Message<byte[]> msg = null;
         for (int i = 0; i < numMsgs; i++) {
             msg = consumer.receive();
             // 3. in-order message delivery
@@ -223,15 +202,12 @@ public class PersistentTopicE2ETest extends BrokerTestBase {
         final String topicName = "persistent://prop/use/ns-abc/topic2";
         final String subName = "sub2";
 
-        Message msg;
+        Message<byte[]> msg;
         int recvQueueSize = 4;
 
-        ConsumerConfiguration conf = new ConsumerConfiguration();
-        conf.setSubscriptionType(SubscriptionType.Exclusive);
-        conf.setReceiverQueueSize(recvQueueSize);
-
-        Consumer consumer = pulsarClient.subscribe(topicName, subName, conf);
-        Producer producer = pulsarClient.createProducer(topicName);
+        Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topicName).subscriptionName(subName)
+                .receiverQueueSize(recvQueueSize).subscribe();
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName).create();
 
         PersistentTopic topicRef = (PersistentTopic) pulsar.getBrokerService().getTopicReference(topicName);
         assertNotNull(topicRef);
@@ -269,16 +245,13 @@ public class PersistentTopicE2ETest extends BrokerTestBase {
         final String topicName = "persistent://prop/use/ns-abc/topic2";
         final String subName = "sub2";
 
-        Message msg;
+        Message<byte[]> msg;
         int recvQueueSize = 4;
 
-        ConsumerConfiguration conf = new ConsumerConfiguration();
-        conf.setSubscriptionType(SubscriptionType.Exclusive);
-        conf.setReceiverQueueSize(recvQueueSize);
-
         // (1) Create subscription
-        Consumer consumer = pulsarClient.subscribe(topicName, subName, conf);
-        Producer producer = pulsarClient.createProducer(topicName);
+        Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topicName).subscriptionName(subName)
+                .receiverQueueSize(recvQueueSize).subscribe();
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName).create();
 
         // (2) Produce Messages
         for (int i = 0; i < recvQueueSize / 2; i++) {
@@ -329,10 +302,6 @@ public class PersistentTopicE2ETest extends BrokerTestBase {
         final int recvQueueSize = 100;
         final int numConsumersThreads = 10;
 
-        ConsumerConfiguration conf = new ConsumerConfiguration();
-        conf.setSubscriptionType(SubscriptionType.Exclusive);
-        conf.setReceiverQueueSize(recvQueueSize);
-
         ExecutorService executor = Executors.newCachedThreadPool();
 
         final CyclicBarrier barrier = new CyclicBarrier(numConsumersThreads + 1);
@@ -342,9 +311,10 @@ public class PersistentTopicE2ETest extends BrokerTestBase {
                 public Void call() throws Exception {
                     barrier.await();
 
-                    Consumer consumer = pulsarClient.subscribe(topicName, subName, conf);
+                    Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topicName).subscriptionName(subName)
+                            .receiverQueueSize(recvQueueSize).subscribe();
                     for (int i = 0; i < recvQueueSize / numConsumersThreads; i++) {
-                        Message msg = consumer.receive();
+                        Message<byte[]> msg = consumer.receive();
                         consumer.acknowledge(msg);
                     }
                     return null;
@@ -352,7 +322,7 @@ public class PersistentTopicE2ETest extends BrokerTestBase {
             });
         }
 
-        Producer producer = pulsarClient.createProducer(topicName);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName).create();
         for (int i = 0; i < recvQueueSize * numConsumersThreads; i++) {
             String message = "my-message-" + i;
             producer.send(message.getBytes());
@@ -370,6 +340,7 @@ public class PersistentTopicE2ETest extends BrokerTestBase {
         // 2. flow control works the same as single consumer single thread
         Thread.sleep(ASYNC_EVENT_COMPLETION_WAIT);
         assertEquals(getAvailablePermits(subRef), recvQueueSize);
+        executor.shutdown();
     }
 
     @Test(enabled = false)
@@ -378,7 +349,7 @@ public class PersistentTopicE2ETest extends BrokerTestBase {
         final String topicName = "persistent://prop/use/ns-abc/topic4";
         final String subName = "sub4";
 
-        Producer producer = pulsarClient.createProducer(topicName);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName).create();
         Thread.sleep(ASYNC_EVENT_COMPLETION_WAIT);
 
         PersistentTopic topicRef = (PersistentTopic) pulsar.getBrokerService().getTopicReference(topicName);
@@ -405,14 +376,12 @@ public class PersistentTopicE2ETest extends BrokerTestBase {
         // wait for the spawned thread to complete
         latch.await();
 
-        ConsumerConfiguration conf = new ConsumerConfiguration();
-        conf.setSubscriptionType(SubscriptionType.Exclusive);
-        Consumer consumer = pulsarClient.subscribe(topicName, subName, conf);
+        Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topicName).subscriptionName(subName).subscribe();
 
         PersistentSubscription subRef = topicRef.getSubscription(subName);
         assertNotNull(subRef);
 
-        Message msg = null;
+        Message<byte[]> msg = null;
         for (int i = 0; i < 10; i++) {
             msg = consumer.receive();
         }
@@ -433,6 +402,8 @@ public class PersistentTopicE2ETest extends BrokerTestBase {
         consumer.close();
         Thread.sleep(ASYNC_EVENT_COMPLETION_WAIT);
         assertTrue(subRef.getDispatcher().isConsumerConnected());
+
+        executor.shutdown();
     }
 
     @Test
@@ -440,18 +411,15 @@ public class PersistentTopicE2ETest extends BrokerTestBase {
         final String topicName = "persistent://prop/use/ns-abc/topic5";
         final String subName = "sub5";
 
-        ConsumerConfiguration conf = new ConsumerConfiguration();
-        conf.setSubscriptionType(SubscriptionType.Exclusive);
-
-        Consumer consumer = pulsarClient.subscribe(topicName, subName, conf);
-        Producer producer = pulsarClient.createProducer(topicName);
+        Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topicName).subscriptionName(subName).subscribe();
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName).create();
 
         PersistentTopic topicRef = (PersistentTopic) pulsar.getBrokerService().getTopicReference(topicName);
         assertNotNull(topicRef);
         PersistentSubscription subRef = topicRef.getSubscription(subName);
         assertNotNull(subRef);
 
-        Message msg;
+        Message<byte[]> msg;
         for (int i = 0; i < 10; i++) {
             String message = "my-message-" + i;
             producer.send(message.getBytes());
@@ -471,13 +439,10 @@ public class PersistentTopicE2ETest extends BrokerTestBase {
         final String topicName = "persistent://prop/use/ns-abc/topic6";
         final String subName = "sub6";
 
-        ConsumerConfiguration conf = new ConsumerConfiguration();
-        conf.setSubscriptionType(SubscriptionType.Exclusive);
-
-        pulsarClient.subscribe(topicName, subName, conf);
-        pulsarClient.createProducer(topicName);
+        pulsarClient.newConsumer().topic(topicName).subscriptionName(subName).subscribe();
+        pulsarClient.newProducer().topic(topicName).create();
         try {
-            pulsarClient.subscribe(topicName, subName, conf);
+            pulsarClient.newConsumer().topic(topicName).subscriptionName(subName).subscribe();
             fail("Should have thrown an exception since one consumer is already connected");
         } catch (PulsarClientException cce) {
             Assert.assertTrue(cce.getMessage().contains("Exclusive consumer is already connected"));
@@ -489,19 +454,16 @@ public class PersistentTopicE2ETest extends BrokerTestBase {
         final String topicName = "persistent://prop/use/ns-abc/topic7";
         final String subName = "sub7";
 
-        ConsumerConfiguration conf = new ConsumerConfiguration();
-        conf.setSubscriptionType(SubscriptionType.Exclusive);
-
-        PulsarClient client1 = PulsarClient.create(brokerUrl.toString());
-        PulsarClient client2 = PulsarClient.create(brokerUrl.toString());
+        PulsarClient client1 = PulsarClient.builder().serviceUrl(brokerUrl.toString()).build();
+        PulsarClient client2 = PulsarClient.builder().serviceUrl(brokerUrl.toString()).build();
 
         try {
-            client1.subscribe(topicName, subName, conf);
-            client1.createProducer(topicName);
+            client1.newConsumer().topic(topicName).subscriptionName(subName).subscribe();
+            client1.newProducer().topic(topicName).create();
 
-            client2.createProducer(topicName);
+            client2.newProducer().topic(topicName).create();
 
-            client2.subscribe(topicName, subName, conf);
+            client2.newConsumer().topic(topicName).subscriptionName(subName).subscribe();
             fail("Should have thrown an exception since one consumer is already connected");
         } catch (PulsarClientException cce) {
             Assert.assertTrue(cce.getMessage().contains("Exclusive consumer is already connected"));
@@ -516,11 +478,8 @@ public class PersistentTopicE2ETest extends BrokerTestBase {
         final String topicName = "persistent://prop/use/ns-abc/topic8";
         final String subName = "sub1";
 
-        ConsumerConfiguration conf = new ConsumerConfiguration();
-        conf.setSubscriptionType(SubscriptionType.Exclusive);
-
         // 1. client connect
-        Consumer consumer = pulsarClient.subscribe(topicName, subName, conf);
+        Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topicName).subscriptionName(subName).subscribe();
 
         PersistentTopic topicRef = (PersistentTopic) pulsar.getBrokerService().getTopicReference(topicName);
         PersistentSubscription subRef = topicRef.getSubscription(subName);
@@ -550,7 +509,7 @@ public class PersistentTopicE2ETest extends BrokerTestBase {
     public void testUnloadNamespace() throws Exception {
         String topic = "persistent://prop/use/ns-abc/topic-9";
         TopicName topicName = TopicName.get(topic);
-        pulsarClient.createProducer(topic);
+        pulsarClient.newProducer().topic(topic).create();
         pulsarClient.close();
 
         assertTrue(pulsar.getBrokerService().getTopicReference(topic) != null);
@@ -579,7 +538,7 @@ public class PersistentTopicE2ETest extends BrokerTestBase {
     public void testGC() throws Exception {
         // 1. Simple successful GC
         String topicName = "persistent://prop/use/ns-abc/topic-10";
-        Producer producer = pulsarClient.createProducer(topicName);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName).create();
         producer.close();
 
         assertNotNull(pulsar.getBrokerService().getTopicReference(topicName));
@@ -587,10 +546,8 @@ public class PersistentTopicE2ETest extends BrokerTestBase {
         assertNull(pulsar.getBrokerService().getTopicReference(topicName));
 
         // 2. Topic is not GCed with live connection
-        ConsumerConfiguration conf = new ConsumerConfiguration();
-        conf.setSubscriptionType(SubscriptionType.Exclusive);
         String subName = "sub1";
-        Consumer consumer = pulsarClient.subscribe(topicName, subName, conf);
+        Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topicName).subscriptionName(subName).subscribe();
 
         runGC();
         assertNotNull(pulsar.getBrokerService().getTopicReference(topicName));
@@ -609,8 +566,8 @@ public class PersistentTopicE2ETest extends BrokerTestBase {
     }
 
     /**
-     * A topic that has retention policy set to non-0, should not be GCed
-     * until it has been inactive for at least the retention time.
+     * A topic that has retention policy set to non-0, should not be GCed until it has been inactive for at least the
+     * retention time.
      */
     @Test
     public void testGcAndRetentionPolicy() throws Exception {
@@ -620,7 +577,7 @@ public class PersistentTopicE2ETest extends BrokerTestBase {
 
         // 1. Simple successful GC
         String topicName = "persistent://prop/use/ns-abc/topic-10";
-        Producer producer = pulsarClient.createProducer(topicName);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName).create();
         producer.close();
 
         assertNotNull(pulsar.getBrokerService().getTopicReference(topicName));
@@ -628,16 +585,13 @@ public class PersistentTopicE2ETest extends BrokerTestBase {
         // Should not have been deleted, since we have retention
         assertNotNull(pulsar.getBrokerService().getTopicReference(topicName));
 
-
         // Remove retention
         admin.namespaces().setRetention("prop/use/ns-abc", new RetentionPolicies(0, 10));
         Thread.sleep(300);
 
         // 2. Topic is not GCed with live connection
-        ConsumerConfiguration conf = new ConsumerConfiguration();
-        conf.setSubscriptionType(SubscriptionType.Exclusive);
         String subName = "sub1";
-        Consumer consumer = pulsarClient.subscribe(topicName, subName, conf);
+        Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topicName).subscriptionName(subName).subscribe();
 
         runGC();
         assertNotNull(pulsar.getBrokerService().getTopicReference(topicName));
@@ -656,9 +610,8 @@ public class PersistentTopicE2ETest extends BrokerTestBase {
     }
 
     /**
-     * A topic that has retention policy set to -1, should not be GCed
-     * until it has been inactive for at least the retention time and the data
-     * should never be deleted
+     * A topic that has retention policy set to -1, should not be GCed until it has been inactive for at least the
+     * retention time and the data should never be deleted
      */
     @Test
     public void testInfiniteRetentionPolicy() throws Exception {
@@ -667,7 +620,7 @@ public class PersistentTopicE2ETest extends BrokerTestBase {
 
         // 1. Simple successful GC
         String topicName = "persistent://prop/use/ns-abc/topic-10";
-        Producer producer = pulsarClient.createProducer(topicName);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName).create();
         producer.close();
 
         assertNotNull(pulsar.getBrokerService().getTopicReference(topicName));
@@ -675,16 +628,13 @@ public class PersistentTopicE2ETest extends BrokerTestBase {
         // Should not have been deleted, since we have retention
         assertNotNull(pulsar.getBrokerService().getTopicReference(topicName));
 
-
         // Remove retention
         admin.namespaces().setRetention("prop/use/ns-abc", new RetentionPolicies(0, 10));
         Thread.sleep(300);
 
         // 2. Topic is not GCed with live connection
-        ConsumerConfiguration conf = new ConsumerConfiguration();
-        conf.setSubscriptionType(SubscriptionType.Exclusive);
         String subName = "sub1";
-        Consumer consumer = pulsarClient.subscribe(topicName, subName, conf);
+        Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topicName).subscriptionName(subName).subscribe();
 
         runGC();
         assertNotNull(pulsar.getBrokerService().getTopicReference(topicName));
@@ -714,10 +664,7 @@ public class PersistentTopicE2ETest extends BrokerTestBase {
         final String subName = "sub1";
         final int numMsgs = 10;
 
-        ConsumerConfiguration conf = new ConsumerConfiguration();
-        conf.setSubscriptionType(SubscriptionType.Exclusive);
-
-        Consumer consumer = pulsarClient.subscribe(topicName, subName, conf);
+        Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topicName).subscriptionName(subName).subscribe();
 
         PersistentTopic topicRef = (PersistentTopic) pulsar.getBrokerService().getTopicReference(topicName);
         PersistentSubscription subRef = topicRef.getSubscription(subName);
@@ -725,7 +672,7 @@ public class PersistentTopicE2ETest extends BrokerTestBase {
         consumer.close();
         assertFalse(subRef.getDispatcher().isConsumerConnected());
 
-        Producer producer = pulsarClient.createProducer(topicName);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName).create();
         for (int i = 0; i < numMsgs; i++) {
             String message = "my-message-" + i;
             producer.send(message.getBytes());
@@ -760,17 +707,14 @@ public class PersistentTopicE2ETest extends BrokerTestBase {
         final String subName = "sub1";
         final int numMsgs = 10;
 
-        ConsumerConfiguration conf = new ConsumerConfiguration();
-        conf.setSubscriptionType(SubscriptionType.Exclusive);
-
-        pulsarClient.subscribe(topicName, subName, conf);
+        pulsarClient.newConsumer().topic(topicName).subscriptionName(subName).subscribe();
 
         PersistentTopic topicRef = (PersistentTopic) pulsar.getBrokerService().getTopicReference(topicName);
         PersistentSubscription subRef = topicRef.getSubscription(subName);
 
         assertTrue(subRef.getDispatcher().isConsumerConnected());
 
-        Producer producer = pulsarClient.createProducer(topicName);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName).create();
         for (int i = 0; i < numMsgs; i++) {
             String message = "my-message-" + i;
             producer.send(message.getBytes());
@@ -795,25 +739,18 @@ public class PersistentTopicE2ETest extends BrokerTestBase {
         final String topicName = "persistent://prop/use/ns-abc/shared-topic2";
         final String subName = "sub2";
 
-        ConsumerConfiguration conf1 = new ConsumerConfiguration();
-        conf1.setSubscriptionType(SubscriptionType.Exclusive);
-
-        ConsumerConfiguration conf2 = new ConsumerConfiguration();
-        conf2.setSubscriptionType(SubscriptionType.Shared);
-
-        ConsumerConfiguration conf3 = new ConsumerConfiguration();
-        conf3.setSubscriptionType(SubscriptionType.Failover);
-
-        Consumer consumer1 = pulsarClient.subscribe(topicName, subName, conf1);
-        Consumer consumer2 = null;
-        Consumer consumer3 = null;
+        Consumer<byte[]> consumer1 = pulsarClient.newConsumer().topic(topicName).subscriptionName(subName)
+                .subscriptionType(SubscriptionType.Exclusive).subscribe();
+        Consumer<byte[]> consumer2 = null;
+        Consumer<byte[]> consumer3 = null;
 
         PersistentTopic topicRef = (PersistentTopic) pulsar.getBrokerService().getTopicReference(topicName);
         PersistentSubscription subRef = topicRef.getSubscription(subName);
 
         // 1. shared consumer on an exclusive sub fails
         try {
-            consumer2 = pulsarClient.subscribe(topicName, subName, conf2);
+            consumer2 = pulsarClient.newConsumer().topic(topicName).subscriptionName(subName)
+                    .subscriptionType(SubscriptionType.Shared).subscribe();
             fail("should have failed");
         } catch (PulsarClientException e) {
             assertTrue(e.getMessage().contains("Subscription is of different type"));
@@ -821,7 +758,8 @@ public class PersistentTopicE2ETest extends BrokerTestBase {
 
         // 2. failover consumer on an exclusive sub fails
         try {
-            consumer3 = pulsarClient.subscribe(topicName, subName, conf3);
+            consumer3 = pulsarClient.newConsumer().topic(topicName).subscriptionName(subName)
+                    .subscriptionType(SubscriptionType.Failover).subscribe();
             fail("should have failed");
         } catch (PulsarClientException e) {
             assertTrue(e.getMessage().contains("Subscription is of different type"));
@@ -830,7 +768,8 @@ public class PersistentTopicE2ETest extends BrokerTestBase {
         // 3. disconnected sub can be converted in shared
         consumer1.close();
         try {
-            consumer2 = pulsarClient.subscribe(topicName, subName, conf2);
+            consumer2 = pulsarClient.newConsumer().topic(topicName).subscriptionName(subName)
+                    .subscriptionType(SubscriptionType.Shared).subscribe();
             assertEquals(subRef.getDispatcher().getType(), SubType.Shared);
         } catch (PulsarClientException e) {
             fail("should not fail");
@@ -838,7 +777,8 @@ public class PersistentTopicE2ETest extends BrokerTestBase {
 
         // 4. exclusive fails on shared sub
         try {
-            consumer1 = pulsarClient.subscribe(topicName, subName, conf1);
+            consumer1 = pulsarClient.newConsumer().topic(topicName).subscriptionName(subName)
+                    .subscriptionType(SubscriptionType.Exclusive).subscribe();
             fail("should have failed");
         } catch (PulsarClientException e) {
             assertTrue(e.getMessage().contains("Subscription is of different type"));
@@ -847,7 +787,8 @@ public class PersistentTopicE2ETest extends BrokerTestBase {
         // 5. disconnected sub can be converted in failover
         consumer2.close();
         try {
-            consumer3 = pulsarClient.subscribe(topicName, subName, conf3);
+            consumer3 = pulsarClient.newConsumer().topic(topicName).subscriptionName(subName)
+                    .subscriptionType(SubscriptionType.Failover).subscribe();
             assertEquals(subRef.getDispatcher().getType(), SubType.Failover);
         } catch (PulsarClientException e) {
             fail("should not fail");
@@ -856,7 +797,8 @@ public class PersistentTopicE2ETest extends BrokerTestBase {
         // 5. exclusive consumer can connect after failover disconnects
         consumer3.close();
         try {
-            consumer1 = pulsarClient.subscribe(topicName, subName, conf1);
+            consumer1 = pulsarClient.newConsumer().topic(topicName).subscriptionName(subName)
+                    .subscriptionType(SubscriptionType.Exclusive).subscribe();
             assertEquals(subRef.getDispatcher().getType(), SubType.Exclusive);
         } catch (PulsarClientException e) {
             fail("should not fail");
@@ -871,16 +813,13 @@ public class PersistentTopicE2ETest extends BrokerTestBase {
         final String topicName = "persistent://prop/use/ns-abc/topic-receive-timeout";
         final String subName = "sub";
 
-        ConsumerConfiguration conf = new ConsumerConfiguration();
-        conf.setSubscriptionType(SubscriptionType.Exclusive);
-        conf.setReceiverQueueSize(1000);
-
-        ConsumerImpl consumer = (ConsumerImpl) pulsarClient.subscribe(topicName, subName, conf);
-        Producer producer = pulsarClient.createProducer(topicName);
+        ConsumerImpl<byte[]> consumer = (ConsumerImpl<byte[]>) pulsarClient.newConsumer().topic(topicName)
+                .subscriptionName(subName).receiverQueueSize(1000).subscribe();
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName).create();
 
         assertEquals(consumer.getAvailablePermits(), 0);
 
-        Message msg = consumer.receive(10, TimeUnit.MILLISECONDS);
+        Message<byte[]> msg = consumer.receive(10, TimeUnit.MILLISECONDS);
         assertNull(msg);
         assertEquals(consumer.getAvailablePermits(), 0);
 
@@ -903,7 +842,7 @@ public class PersistentTopicE2ETest extends BrokerTestBase {
         final String topicName = "persistent://prop/use/ns-abc/topic-xyz";
 
         // 1. producer connect
-        Producer producer = pulsarClient.createProducer(topicName);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName).create();
 
         PersistentTopic topicRef = (PersistentTopic) pulsar.getBrokerService().getTopicReference(topicName);
         assertNotNull(topicRef);
@@ -927,7 +866,7 @@ public class PersistentTopicE2ETest extends BrokerTestBase {
 
         for (int i = SyncMessages; i < (SyncMessages + AsyncMessages); i++) {
             String content = "my-message-" + i;
-            Message msg = MessageBuilder.create().setContent(content.getBytes()).build();
+            Message<byte[]> msg = MessageBuilder.create().setContent(content.getBytes()).build();
             final int index = i;
 
             producer.sendAsync(msg).thenRun(() -> {
@@ -949,12 +888,11 @@ public class PersistentTopicE2ETest extends BrokerTestBase {
         final String topicName = "persistent://prop/use/ns-abc/topic-xyzx";
         final int messages = 10;
 
-        PulsarClient client = PulsarClient.create(brokerUrl.toString());
+        PulsarClient client = PulsarClient.builder().serviceUrl(brokerUrl.toString()).build();
 
         // 1. Producer connect
-        ProducerConfiguration producerConfiguration = new ProducerConfiguration().setMaxPendingMessages(messages)
-                .setBlockIfQueueFull(true).setSendTimeout(1, TimeUnit.SECONDS);
-        ProducerImpl producer = (ProducerImpl) client.createProducer(topicName, producerConfiguration);
+        ProducerImpl<byte[]> producer = (ProducerImpl<byte[]>) client.newProducer().topic(topicName)
+                .maxPendingMessages(messages).blockIfQueueFull(true).sendTimeout(1, TimeUnit.SECONDS).create();
 
         // 2. Stop broker
         cleanup();
@@ -993,10 +931,9 @@ public class PersistentTopicE2ETest extends BrokerTestBase {
         final int messages = 10;
 
         // 1. Producer connect
-        PulsarClient client = PulsarClient.create(brokerUrl.toString());
-        ProducerConfiguration producerConfiguration = new ProducerConfiguration().setMaxPendingMessages(messages)
-                .setBlockIfQueueFull(false).setSendTimeout(1, TimeUnit.SECONDS);
-        ProducerImpl producer = (ProducerImpl) client.createProducer(topicName, producerConfiguration);
+        PulsarClient client = PulsarClient.builder().serviceUrl(brokerUrl.toString()).build();
+        ProducerImpl<byte[]> producer = (ProducerImpl<byte[]>) client.newProducer().topic(topicName)
+                .maxPendingMessages(messages).blockIfQueueFull(false).sendTimeout(1, TimeUnit.SECONDS).create();
 
         // 2. Stop broker
         cleanup();
@@ -1038,8 +975,9 @@ public class PersistentTopicE2ETest extends BrokerTestBase {
         BrokerService brokerService = pulsar.getBrokerService();
 
         // 1. producers connect
-        Producer producer1 = pulsarClient.createProducer("persistent://prop/use/ns-abc/topic-1");
-        Producer producer2 = pulsarClient.createProducer("persistent://prop/use/ns-abc/topic-2");
+        Producer<byte[]> producer1 = pulsarClient.newProducer().topic("persistent://prop/use/ns-abc/topic-1").create();
+        /* Producer<byte[]> producer2 = */ pulsarClient.newProducer().topic("persistent://prop/use/ns-abc/topic-2")
+                .create();
 
         brokerService.updateRates();
 
@@ -1078,11 +1016,9 @@ public class PersistentTopicE2ETest extends BrokerTestBase {
         final String topicName = "persistent://prop/use/ns-abc/topic0" + compressionType;
 
         // 1. producer connect
-        ProducerConfiguration producerConf = new ProducerConfiguration();
-        producerConf.setCompressionType(compressionType);
-        Producer producer = pulsarClient.createProducer(topicName, producerConf);
-
-        Consumer consumer = pulsarClient.subscribe(topicName, "my-sub");
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName).compressionType(compressionType)
+                .create();
+        Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topicName).subscriptionName("my-sub").subscribe();
 
         PersistentTopic topicRef = (PersistentTopic) pulsar.getBrokerService().getTopicReference(topicName);
         assertNotNull(topicRef);
@@ -1095,7 +1031,7 @@ public class PersistentTopicE2ETest extends BrokerTestBase {
         }
 
         for (int i = 0; i < 10; i++) {
-            Message msg = consumer.receive(5, TimeUnit.SECONDS);
+            Message<byte[]> msg = consumer.receive(5, TimeUnit.SECONDS);
             assertNotNull(msg);
             assertEquals(msg.getData(), ("my-message-" + i).getBytes());
         }
@@ -1116,8 +1052,7 @@ public class PersistentTopicE2ETest extends BrokerTestBase {
         statsUpdater.shutdown();
 
         final String namespace = "prop/use/ns-abc";
-        ProducerConfiguration producerConf = new ProducerConfiguration();
-        Producer producer = pulsarClient.createProducer("persistent://" + namespace + "/topic0", producerConf);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic("persistent://" + namespace + "/topic0").create();
         // 1. producer publish messages
         for (int i = 0; i < 10; i++) {
             String message = "my-message-" + i;
@@ -1146,11 +1081,10 @@ public class PersistentTopicE2ETest extends BrokerTestBase {
         final String topicName = "persistent://prop/use/ns-abc/topic1";
 
         // 1. producer connect
-        Producer producer = pulsarClient.createProducer(topicName);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName).create();
+        Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topicName).subscriptionName("my-sub").subscribe();
 
-        Consumer consumer = pulsarClient.subscribe(topicName, "my-sub");
-
-        Message msg1 = MessageBuilder.create().setContent("message-1".getBytes()).build();
+        Message<byte[]> msg1 = MessageBuilder.create().setContent("message-1".getBytes()).build();
         CompletableFuture<MessageId> future1 = producer.sendAsync(msg1);
 
         // Stop the broker, and publishes messages. Messages are accumulated in the producer queue and they're checksums
@@ -1158,8 +1092,7 @@ public class PersistentTopicE2ETest extends BrokerTestBase {
         // checksum validation error
         stopBroker();
 
-
-        Message msg2 = MessageBuilder.create().setContent("message-2".getBytes()).build();
+        Message<byte[]> msg2 = MessageBuilder.create().setContent("message-2".getBytes()).build();
         CompletableFuture<MessageId> future2 = producer.sendAsync(msg2);
 
         // Taint msg2
@@ -1178,7 +1111,7 @@ public class PersistentTopicE2ETest extends BrokerTestBase {
         }
 
         // We should only receive msg1
-        Message msg = consumer.receive(1, TimeUnit.SECONDS);
+        Message<byte[]> msg = consumer.receive(1, TimeUnit.SECONDS);
         assertEquals(new String(msg.getData()), "message-1");
 
         while ((msg = consumer.receive(1, TimeUnit.SECONDS)) != null) {
@@ -1187,25 +1120,23 @@ public class PersistentTopicE2ETest extends BrokerTestBase {
     }
 
     /**
-     * Verify: Broker should not replay already acknowledged messages again and should clear them from messageReplay bucket
+     * Verify: Broker should not replay already acknowledged messages again and should clear them from messageReplay
+     * bucket
      *
-     * 1. produce messages
-     * 2. consume messages and ack all except 1 msg
-     * 3. Verification: should replay only 1 unacked message
+     * 1. produce messages 2. consume messages and ack all except 1 msg 3. Verification: should replay only 1 unacked
+     * message
      */
     @Test()
     public void testMessageRedelivery() throws Exception {
         final String topicName = "persistent://prop/use/ns-abc/topic2";
         final String subName = "sub2";
 
-        Message msg;
+        Message<byte[]> msg;
         int totalMessages = 10;
 
-        ConsumerConfiguration conf = new ConsumerConfiguration();
-        conf.setSubscriptionType(SubscriptionType.Shared);
-
-        Consumer consumer = pulsarClient.subscribe(topicName, subName, conf);
-        Producer producer = pulsarClient.createProducer(topicName);
+        Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topicName).subscriptionName(subName)
+                .subscriptionType(SubscriptionType.Shared).subscribe();
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName).create();
 
         // (1) Produce messages
         for (int i = 0; i < totalMessages; i++) {
@@ -1213,8 +1144,8 @@ public class PersistentTopicE2ETest extends BrokerTestBase {
             producer.send(message.getBytes());
         }
 
-        //(2) Consume and ack messages except first message
-        Message unAckedMsg = null;
+        // (2) Consume and ack messages except first message
+        Message<byte[]> unAckedMsg = null;
         for (int i = 0; i < totalMessages; i++) {
             msg = consumer.receive();
             if (i == 0) {
@@ -1243,10 +1174,8 @@ public class PersistentTopicE2ETest extends BrokerTestBase {
     }
 
     /**
-     * Verify:
-     * 1. Broker should not replay already acknowledged messages
-     * 2. Dispatcher should not stuck while dispatching new messages due to previous-replay
-     * of invalid/already-acked messages
+     * Verify: 1. Broker should not replay already acknowledged messages 2. Dispatcher should not stuck while
+     * dispatching new messages due to previous-replay of invalid/already-acked messages
      *
      * @throws Exception
      */
@@ -1256,16 +1185,13 @@ public class PersistentTopicE2ETest extends BrokerTestBase {
         final String topicName = "persistent://prop/use/ns-abc/topic2";
         final String subName = "sub2";
 
-        Message msg;
+        Message<byte[]> msg;
         int totalMessages = 10;
         int replayIndex = totalMessages / 2;
 
-        ConsumerConfiguration conf = new ConsumerConfiguration();
-        conf.setSubscriptionType(SubscriptionType.Shared);
-        conf.setReceiverQueueSize(1);
-
-        Consumer consumer = pulsarClient.subscribe(topicName, subName, conf);
-        Producer producer = pulsarClient.createProducer(topicName);
+        Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topicName).subscriptionName(subName)
+                .subscriptionType(SubscriptionType.Shared).receiverQueueSize(1).subscribe();
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName).create();
 
         PersistentTopic topicRef = (PersistentTopic) pulsar.getBrokerService().getTopicReference(topicName);
         assertNotNull(topicRef);
@@ -1327,13 +1253,12 @@ public class PersistentTopicE2ETest extends BrokerTestBase {
     public void testCreateProducerWithSameName() throws Exception {
         String topic = "persistent://prop/use/ns-abc/testCreateProducerWithSameName";
 
-        ProducerConfiguration conf = new ProducerConfiguration();
-        conf.setProducerName("test-producer-a");
-
-        Producer p1 = pulsarClient.createProducer(topic, conf);
+        ProducerBuilder<byte[]> producerBuilder = pulsarClient.newProducer().topic(topic)
+                .producerName("test-producer-a");
+        Producer<byte[]> p1 = producerBuilder.create();
 
         try {
-            pulsarClient.createProducer(topic, conf);
+            producerBuilder.create();
             fail("Should have thrown ProducerBusyException");
         } catch (ProducerBusyException e) {
             // Expected
@@ -1342,7 +1267,7 @@ public class PersistentTopicE2ETest extends BrokerTestBase {
         p1.close();
 
         // Now p2 should succeed
-        Producer p2 = pulsarClient.createProducer(topic, conf);
+        Producer<byte[]> p2 = producerBuilder.create();
 
         p2.close();
     }
diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/PersistentTopicTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/PersistentTopicTest.java
index 655ccab..2f0f350 100644
--- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/PersistentTopicTest.java
+++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/PersistentTopicTest.java
@@ -701,7 +701,7 @@ public class PersistentTopicTest {
 
         try {
             Thread.sleep(10); /* delay to ensure that the ubsubscribe gets executed first */
-            Consumer consumer2 = new Consumer(sub, SubType.Exclusive, topic.getName(), 2 /* consumer id */, 0, "Cons2"/* consumer name */,
+            new Consumer(sub, SubType.Exclusive, topic.getName(), 2 /* consumer id */, 0, "Cons2"/* consumer name */,
                     50000, serverCnx, "myrole-1", Collections.emptyMap(), false /* read compacted */);
         } catch (BrokerServiceException e) {
             assertTrue(e instanceof BrokerServiceException.SubscriptionFencedException);
@@ -907,7 +907,7 @@ public class PersistentTopicTest {
         doReturn(new ArrayList<Object>()).when(ledgerMock).getCursors();
         doReturn("mockCursor").when(cursorMock).getName();
         // doNothing().when(cursorMock).asyncClose(new CloseCallback() {
-        doAnswer(new Answer() {
+        doAnswer(new Answer<Object>() {
             @Override
             public Object answer(InvocationOnMock invocationOnMock) throws Throwable {
                 // return closeFuture.get();
@@ -1159,7 +1159,7 @@ public class PersistentTopicTest {
 
         final URL brokerUrl = new URL(
                 "http://" + pulsar.getAdvertisedAddress() + ":" + pulsar.getConfiguration().getBrokerServicePort());
-        PulsarClient client = PulsarClient.create(brokerUrl.toString());
+        PulsarClient client = PulsarClient.builder().serviceUrl(brokerUrl.toString()).build();
         ManagedCursor cursor = mock(ManagedCursorImpl.class);
         doReturn(remoteCluster).when(cursor).getName();
         brokerService.getReplicationClients().put(remoteCluster, client);
@@ -1189,6 +1189,7 @@ public class PersistentTopicTest {
         callback.deleteCursorComplete(null);
     }
 
+    @SuppressWarnings("unchecked")
     @Test
     public void testClosingReplicationProducerTwice() throws Exception {
         final String globalTopicName = "persistent://prop/global/ns/testClosingReplicationProducerTwice";
@@ -1202,7 +1203,7 @@ public class PersistentTopicTest {
 
         final URL brokerUrl = new URL(
                 "http://" + pulsar.getAdvertisedAddress() + ":" + pulsar.getConfiguration().getBrokerServicePort());
-        PulsarClient client =  spy( PulsarClient.create(brokerUrl.toString()) );
+        PulsarClient client = spy(PulsarClient.builder().serviceUrl(brokerUrl.toString()).build());
         PulsarClientImpl clientImpl = (PulsarClientImpl) client;
 
         ManagedCursor cursor = mock(ManagedCursorImpl.class);
@@ -1258,9 +1259,7 @@ public class PersistentTopicTest {
 
         PersistentTopic topic = new PersistentTopic(successTopicName, ledgerMock, brokerService);
         CompactedTopic compactedTopic = mock(CompactedTopic.class);
-        PersistentSubscription sub = new CompactorSubscription(topic, compactedTopic,
-                                                               Compactor.COMPACTION_SUBSCRIPTION,
-                                                               cursorMock);
+        new CompactorSubscription(topic, compactedTopic, Compactor.COMPACTION_SUBSCRIPTION, cursorMock);
         verify(compactedTopic, Mockito.times(1)).newCompactedLedger(position, ledgerId);
     }
 }
diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/ReplicatorTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/ReplicatorTest.java
index 170ee2d..3b3565f 100644
--- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/ReplicatorTest.java
+++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/ReplicatorTest.java
@@ -24,8 +24,6 @@ import static org.testng.Assert.assertNull;
 import static org.testng.Assert.assertTrue;
 import static org.testng.Assert.fail;
 
-import com.scurrilous.circe.checksum.Crc32cIntChecksum;
-import io.netty.buffer.ByteBuf;
 import java.lang.reflect.Field;
 import java.lang.reflect.Method;
 import java.util.List;
@@ -39,6 +37,7 @@ import java.util.concurrent.Executors;
 import java.util.concurrent.ForkJoinPool;
 import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
+
 import org.apache.bookkeeper.mledger.AsyncCallbacks.DeleteCursorCallback;
 import org.apache.bookkeeper.mledger.AsyncCallbacks.ReadEntriesCallback;
 import org.apache.bookkeeper.mledger.Entry;
@@ -53,7 +52,6 @@ import org.apache.pulsar.broker.service.BrokerServiceException.NamingException;
 import org.apache.pulsar.broker.service.persistent.PersistentReplicator;
 import org.apache.pulsar.broker.service.persistent.PersistentTopic;
 import org.apache.pulsar.client.admin.PulsarAdminException.PreconditionFailedException;
-import org.apache.pulsar.client.api.ClientConfiguration;
 import org.apache.pulsar.client.api.MessageBuilder;
 import org.apache.pulsar.client.api.Producer;
 import org.apache.pulsar.client.api.PulsarClient;
@@ -82,6 +80,10 @@ import org.testng.annotations.DataProvider;
 import org.testng.annotations.Test;
 import org.testng.collections.Lists;
 
+import com.scurrilous.circe.checksum.Crc32cIntChecksum;
+
+import io.netty.buffer.ByteBuf;
+
 /**
  * Starts 2 brokers that are in 2 different clusters
  */
@@ -94,7 +96,6 @@ public class ReplicatorTest extends ReplicatorTestBase {
         methodName = m.getName();
     }
 
-
     @Override
     @BeforeClass(timeOut = 30000)
     void setup() throws Exception {
@@ -126,8 +127,7 @@ public class ReplicatorTest extends ReplicatorTestBase {
         // Run a set of producer tasks to create the topics
         List<Future<Void>> results = Lists.newArrayList();
         for (int i = 0; i < 10; i++) {
-            final TopicName dest = TopicName
-                    .get(String.format("persistent://pulsar/global/ns/topic-%d", i));
+            final TopicName dest = TopicName.get(String.format("persistent://pulsar/global/ns/topic-%d", i));
 
             results.add(executor.submit(new Callable<Void>() {
                 @Override
@@ -203,6 +203,7 @@ public class ReplicatorTest extends ReplicatorTestBase {
         // Case 3: TODO: Once automatic cleanup is implemented, add tests case to verify auto removal of clusters
     }
 
+    @SuppressWarnings("unchecked")
     @Test(timeOut = 30000)
     public void testConcurrentReplicator() throws Exception {
 
@@ -211,13 +212,13 @@ public class ReplicatorTest extends ReplicatorTestBase {
         final String namespace = "pulsar/global/concurrent";
         admin1.namespaces().createNamespace(namespace);
         admin1.namespaces().setNamespaceReplicationClusters(namespace, Lists.newArrayList("r1", "r2"));
-        final TopicName dest = TopicName.get(String.format("persistent://" + namespace + "/topic-%d", 0));
-        ClientConfiguration conf = new ClientConfiguration();
-        conf.setStatsInterval(0, TimeUnit.SECONDS);
-        Producer producer = PulsarClient.create(url1.toString(), conf).createProducer(dest.toString());
+        final TopicName topicName = TopicName.get(String.format("persistent://" + namespace + "/topic-%d", 0));
+        PulsarClient client1 = PulsarClient.builder().serviceUrl(url1.toString()).statsInterval(0, TimeUnit.SECONDS)
+                .build();
+        Producer<byte[]> producer = client1.newProducer().topic(topicName.toString()).create();
         producer.close();
 
-        PersistentTopic topic = (PersistentTopic) pulsar1.getBrokerService().getTopic(dest.toString()).get();
+        PersistentTopic topic = (PersistentTopic) pulsar1.getBrokerService().getTopic(topicName.toString()).get();
 
         PulsarClientImpl pulsarClient = spy((PulsarClientImpl) pulsar1.getBrokerService().getReplicationClient("r3"));
         final Method startRepl = PersistentTopic.class.getDeclaredMethod("startReplicator", String.class);
@@ -242,12 +243,10 @@ public class ReplicatorTest extends ReplicatorTestBase {
         }
         Thread.sleep(3000);
 
-        Mockito.verify(pulsarClient, Mockito.times(1))
-            .createProducerAsync(
-                Mockito.any(ProducerConfigurationData.class),
-                Mockito.any(Schema.class)
-            );
+        Mockito.verify(pulsarClient, Mockito.times(1)).createProducerAsync(Mockito.any(ProducerConfigurationData.class),
+                Mockito.any(Schema.class));
 
+        client1.shutdown();
     }
 
     @Test(enabled = false, timeOut = 30000)
@@ -295,8 +294,7 @@ public class ReplicatorTest extends ReplicatorTestBase {
         SortedSet<String> testDests = new TreeSet<String>();
         List<Future<Void>> results = Lists.newArrayList();
         for (int i = 0; i < 3; i++) {
-            final TopicName dest = TopicName
-                    .get(String.format("persistent://pulsar/global/ns/repltopic-%d", i));
+            final TopicName dest = TopicName.get(String.format("persistent://pulsar/global/ns/repltopic-%d", i));
             testDests.add(dest.toString());
 
             results.add(executor.submit(new Callable<Void>() {
@@ -396,8 +394,7 @@ public class ReplicatorTest extends ReplicatorTestBase {
         SortedSet<String> testDests = new TreeSet<String>();
         List<Future<Void>> results = Lists.newArrayList();
         for (int i = 0; i < 10; i++) {
-            final TopicName dest = TopicName
-                    .get(String.format("persistent://pulsar/global/ns/repltopic-%d", i));
+            final TopicName dest = TopicName.get(String.format("persistent://pulsar/global/ns/repltopic-%d", i));
             testDests.add(dest.toString());
 
             results.add(executor.submit(new Callable<Void>() {
@@ -422,11 +419,6 @@ public class ReplicatorTest extends ReplicatorTestBase {
                     MessageConsumer consumer3 = new MessageConsumer(url3, dest);
                     log.info("--- Starting Consumer --- " + url3);
 
-                    // Produce from cluster1 for this test
-                    int nr1 = 0;
-                    int nr2 = 0;
-                    int nR3 = 0;
-
                     // Produce a message that isn't replicated
                     producer1.produce(1, MessageBuilder.create().disableReplication());
 
@@ -476,8 +468,7 @@ public class ReplicatorTest extends ReplicatorTestBase {
         try {
             // 1. Create a consumer using the reserved consumer id prefix "pulsar.repl."
 
-            final TopicName dest = TopicName
-                    .get(String.format("persistent://pulsar/global/ns/res-cons-id"));
+            final TopicName dest = TopicName.get(String.format("persistent://pulsar/global/ns/res-cons-id"));
 
             // Create another consumer using replication prefix as sub id
             MessageConsumer consumer = new MessageConsumer(url2, dest, "pulsar.repl.");
@@ -504,7 +495,8 @@ public class ReplicatorTest extends ReplicatorTestBase {
         producer1.produce(2);
         producer1.close();
         PersistentTopic topic = (PersistentTopic) pulsar1.getBrokerService().getTopicReference(dest.toString());
-        PersistentReplicator replicator = (PersistentReplicator) topic.getReplicators().get(topic.getReplicators().keys().get(0));
+        PersistentReplicator replicator = (PersistentReplicator) topic.getReplicators()
+                .get(topic.getReplicators().keys().get(0));
         replicator.skipMessages(2);
         CompletableFuture<Entry> result = replicator.peekNthMessage(1);
         Entry entry = result.get(50, TimeUnit.MILLISECONDS);
@@ -528,7 +520,8 @@ public class ReplicatorTest extends ReplicatorTestBase {
         producer1.produce(2);
         producer1.close();
         PersistentTopic topic = (PersistentTopic) pulsar1.getBrokerService().getTopicReference(dest.toString());
-        PersistentReplicator replicator = (PersistentReplicator) spy(topic.getReplicators().get(topic.getReplicators().keys().get(0)));
+        PersistentReplicator replicator = (PersistentReplicator) spy(
+                topic.getReplicators().get(topic.getReplicators().keys().get(0)));
         replicator.readEntriesFailed(new ManagedLedgerException.InvalidCursorPositionException("failed"), null);
         replicator.clearBacklog().get();
         Thread.sleep(100);
@@ -548,8 +541,7 @@ public class ReplicatorTest extends ReplicatorTestBase {
         SortedSet<String> testDests = new TreeSet<String>();
         List<Future<Void>> results = Lists.newArrayList();
         for (int i = 0; i < 1; i++) {
-            final TopicName dest = TopicName
-                    .get(String.format("persistent://pulsar/global/ns/resetrepltopic-%d", i));
+            final TopicName dest = TopicName.get(String.format("persistent://pulsar/global/ns/resetrepltopic-%d", i));
             testDests.add(dest.toString());
 
             results.add(executor.submit(new Callable<Void>() {
@@ -594,8 +586,7 @@ public class ReplicatorTest extends ReplicatorTestBase {
         SortedSet<String> testDests = new TreeSet<String>();
         List<Future<Void>> results = Lists.newArrayList();
         for (int i = 0; i < 3; i++) {
-            final TopicName dest = TopicName
-                    .get(String.format("persistent://pulsar/global/ns/repltopicbatch-%d", i));
+            final TopicName dest = TopicName.get(String.format("persistent://pulsar/global/ns/repltopicbatch-%d", i));
             testDests.add(dest.toString());
 
             results.add(executor.submit(new Callable<Void>() {
@@ -638,6 +629,12 @@ public class ReplicatorTest extends ReplicatorTestBase {
 
                     consumer3.receive(10);
 
+                    producer1.close();
+                    producer2.close();
+                    producer3.close();
+                    consumer1.close();
+                    consumer2.close();
+                    consumer3.close();
                     return null;
                 }
             }));
@@ -688,6 +685,7 @@ public class ReplicatorTest extends ReplicatorTestBase {
         removeReplicator.setAccessible(true);
         // invoke removeReplicator : it fails as cursor is not present: but still it should remove the replicator from
         // list without restarting it
+        @SuppressWarnings("unchecked")
         CompletableFuture<Void> result = (CompletableFuture<Void>) removeReplicator.invoke(topic,
                 replicatorClusterName);
         result.thenApply((v) -> {
@@ -698,6 +696,7 @@ public class ReplicatorTest extends ReplicatorTestBase {
         producer1.close();
     }
 
+    @SuppressWarnings("unchecked")
     @Test(priority = 5, timeOut = 30000)
     public void testReplicatorProducerClosing() throws Exception {
         log.info("--- Starting ReplicatorTest::testDeleteReplicatorFailure ---");
@@ -713,7 +712,7 @@ public class ReplicatorTest extends ReplicatorTestBase {
         Thread.sleep(100);
         Field field = AbstractReplicator.class.getDeclaredField("producer");
         field.setAccessible(true);
-        ProducerImpl producer = (ProducerImpl) field.get(replicator);
+        ProducerImpl<byte[]> producer = (ProducerImpl<byte[]>) field.get(replicator);
         assertNull(producer);
         producer1.close();
     }
@@ -751,7 +750,8 @@ public class ReplicatorTest extends ReplicatorTestBase {
             PersistentTopic topic = (PersistentTopic) pulsar1.getBrokerService().getTopicReference(dest.toString());
             Replicator replicator = topic.getPersistentReplicator("r2");
 
-            // Produce 1 message in r1. This message will be replicated immediately into r2 and it will become part of local backlog
+            // Produce 1 message in r1. This message will be replicated immediately into r2 and it will become part of
+            // local backlog
             producer1.produce(1);
 
             Thread.sleep(500);
@@ -842,7 +842,8 @@ public class ReplicatorTest extends ReplicatorTestBase {
         // Replicator producer must be closed
         Field producerField = AbstractReplicator.class.getDeclaredField("producer");
         producerField.setAccessible(true);
-        ProducerImpl replicatorProducer = (ProducerImpl) producerField.get(replicator);
+        @SuppressWarnings("unchecked")
+        ProducerImpl<byte[]> replicatorProducer = (ProducerImpl<byte[]>) producerField.get(replicator);
         assertEquals(replicatorProducer, null);
 
         producer1.close();
@@ -854,10 +855,10 @@ public class ReplicatorTest extends ReplicatorTestBase {
     public void verifyChecksumAfterReplication() throws Exception {
         final String topicName = "persistent://pulsar/global/ns/checksumAfterReplication";
 
-        PulsarClient c1 = PulsarClient.create(url1.toString());
-        Producer p1 = c1.createProducer(topicName);
+        PulsarClient c1 = PulsarClient.builder().serviceUrl(url1.toString()).build();
+        Producer<byte[]> p1 = c1.newProducer().topic(topicName).create();
 
-        PulsarClient c2 = PulsarClient.create(url2.toString());
+        PulsarClient c2 = PulsarClient.builder().serviceUrl(url2.toString()).build();
         RawReader reader2 = RawReader.create(c2, topicName, "sub").get();
 
         p1.send("Hello".getBytes());
@@ -901,8 +902,8 @@ public class ReplicatorTest extends ReplicatorTestBase {
         }
 
         // load namespace with dummy topic on ns
-        PulsarClient client = PulsarClient.create(url1.toString());
-        client.createProducer("persistent://" + namespace + "/dummyTopic");
+        PulsarClient client = PulsarClient.builder().serviceUrl(url1.toString()).build();
+        client.newProducer().topic("persistent://" + namespace + "/dummyTopic").create();
 
         // persistent topic test
         try {
diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/ReplicatorTestBase.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/ReplicatorTestBase.java
index d71f484..abde142 100644
--- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/ReplicatorTestBase.java
+++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/ReplicatorTestBase.java
@@ -32,16 +32,14 @@ import java.util.concurrent.TimeUnit;
 import org.apache.bookkeeper.test.PortManager;
 import org.apache.pulsar.broker.PulsarService;
 import org.apache.pulsar.broker.ServiceConfiguration;
-import org.apache.pulsar.broker.service.BrokerService;
 import org.apache.pulsar.client.admin.PulsarAdmin;
 import org.apache.pulsar.client.api.Authentication;
-import org.apache.pulsar.client.api.ClientConfiguration;
 import org.apache.pulsar.client.api.Consumer;
 import org.apache.pulsar.client.api.Message;
 import org.apache.pulsar.client.api.MessageBuilder;
 import org.apache.pulsar.client.api.MessageId;
 import org.apache.pulsar.client.api.Producer;
-import org.apache.pulsar.client.api.ProducerConfiguration;
+import org.apache.pulsar.client.api.ProducerBuilder;
 import org.apache.pulsar.client.api.PulsarClient;
 import org.apache.pulsar.common.naming.TopicName;
 import org.apache.pulsar.common.policies.data.ClusterData;
@@ -263,16 +261,14 @@ public class ReplicatorTestBase {
         String namespace;
         String topicName;
         PulsarClient client;
-        Producer producer;
+        Producer<byte[]> producer;
 
         MessageProducer(URL url, final TopicName dest) throws Exception {
             this.url = url;
             this.namespace = dest.getNamespace();
             this.topicName = dest.toString();
-            ClientConfiguration conf = new ClientConfiguration();
-            conf.setStatsInterval(0, TimeUnit.SECONDS);
-            client = PulsarClient.create(url.toString(), conf);
-            producer = client.createProducer(topicName);
+            client = PulsarClient.builder().serviceUrl(url.toString()).statsInterval(0, TimeUnit.SECONDS).build();
+            producer = client.newProducer().topic(topicName).create();
 
         }
 
@@ -280,16 +276,14 @@ public class ReplicatorTestBase {
             this.url = url;
             this.namespace = dest.getNamespace();
             this.topicName = dest.toString();
-            ClientConfiguration conf = new ClientConfiguration();
-            conf.setStatsInterval(0, TimeUnit.SECONDS);
-            client = PulsarClient.create(url.toString(), conf);
-            ProducerConfiguration producerConfiguration = new ProducerConfiguration();
+            client = PulsarClient.builder().serviceUrl(url.toString()).statsInterval(0, TimeUnit.SECONDS).build();
+            ProducerBuilder<byte[]> producerBuilder = client.newProducer().topic(topicName);
             if (batch) {
-                producerConfiguration.setBatchingEnabled(true);
-                producerConfiguration.setBatchingMaxPublishDelay(1, TimeUnit.SECONDS);
-                producerConfiguration.setBatchingMaxMessages(5);
+                producerBuilder.enableBatching(true);
+                producerBuilder.batchingMaxPublishDelay(1, TimeUnit.SECONDS);
+                producerBuilder.batchingMaxMessages(5);
             }
-            producer = client.createProducer(topicName, producerConfiguration);
+            producer = producerBuilder.create();
 
         }
 
@@ -314,7 +308,7 @@ public class ReplicatorTestBase {
 
         }
 
-        void produce(int messages, MessageBuilder messageBuilder) throws Exception {
+        void produce(int messages, MessageBuilder<byte[]> messageBuilder) throws Exception {
             log.info("Start sending messages");
             for (int i = 0; i < messages; i++) {
                 final String m = new String("test-builder-" + i);
@@ -335,7 +329,7 @@ public class ReplicatorTestBase {
         final String namespace;
         final String topicName;
         final PulsarClient client;
-        final Consumer consumer;
+        final Consumer<byte[]> consumer;
 
         MessageConsumer(URL url, final TopicName dest) throws Exception {
             this(url, dest, "sub-id");
@@ -345,12 +339,11 @@ public class ReplicatorTestBase {
             this.url = url;
             this.namespace = dest.getNamespace();
             this.topicName = dest.toString();
-            ClientConfiguration conf = new ClientConfiguration();
-            conf.setStatsInterval(0, TimeUnit.SECONDS);
-            client = PulsarClient.create(url.toString(), conf);
+
+            client = PulsarClient.builder().serviceUrl(url.toString()).statsInterval(0, TimeUnit.SECONDS).build();
 
             try {
-                consumer = client.subscribe(topicName, subId);
+                consumer = client.newConsumer().topic(topicName).subscriptionName(subId).subscribe();
             } catch (Exception e) {
                 client.close();
                 throw e;
@@ -359,7 +352,7 @@ public class ReplicatorTestBase {
 
         void receive(int messages) throws Exception {
             log.info("Start receiving messages");
-            Message msg = null;
+            Message<byte[]> msg = null;
 
             for (int i = 0; i < messages; i++) {
                 msg = consumer.receive();
diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/ResendRequestTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/ResendRequestTest.java
index a429180..433904c 100644
--- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/ResendRequestTest.java
+++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/ResendRequestTest.java
@@ -30,13 +30,12 @@ import java.util.concurrent.TimeUnit;
 
 import org.apache.pulsar.broker.service.persistent.PersistentTopic;
 import org.apache.pulsar.client.api.Consumer;
-import org.apache.pulsar.client.api.ConsumerConfiguration;
+import org.apache.pulsar.client.api.ConsumerBuilder;
 import org.apache.pulsar.client.api.Message;
 import org.apache.pulsar.client.api.MessageId;
+import org.apache.pulsar.client.api.MessageRoutingMode;
 import org.apache.pulsar.client.api.Producer;
-import org.apache.pulsar.client.api.ProducerConfiguration;
 import org.apache.pulsar.client.api.SubscriptionType;
-import org.apache.pulsar.client.api.ProducerConfiguration.MessageRoutingMode;
 import org.apache.pulsar.client.impl.ConsumerBase;
 import org.apache.pulsar.common.policies.data.PropertyAdmin;
 import org.slf4j.Logger;
@@ -74,16 +73,15 @@ public class ResendRequestTest extends BrokerTestBase {
         HashSet<String> messageDataHashSet = new HashSet<String>();
 
         // 1. producer connect
-        Producer producer = pulsarClient.createProducer(topicName);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName).create();
 
         PersistentTopic topicRef = (PersistentTopic) pulsar.getBrokerService().getTopicReference(topicName);
         assertNotNull(topicRef);
         assertEquals(topicRef.getProducers().size(), 1);
 
         // 2. Create consumer
-        ConsumerConfiguration conf = new ConsumerConfiguration();
-        conf.setReceiverQueueSize(7);
-        Consumer consumer = pulsarClient.subscribe(topicName, subscriptionName, conf);
+        Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topicName).subscriptionName(subscriptionName)
+                .receiverQueueSize(7).subscribe();
 
         // 3. producer publish messages
         for (int i = 0; i < totalMessages; i++) {
@@ -92,11 +90,11 @@ public class ResendRequestTest extends BrokerTestBase {
         }
 
         // 4. Receive messages
-        Message message = consumer.receive();
+        Message<byte[]> message = consumer.receive();
         log.info("Message received " + new String(message.getData()));
-        
+
         for (int i = 1; i < totalMessages; i++) {
-            Message msg = consumer.receive();
+            Message<byte[]> msg = consumer.receive();
             log.info("Message received " + new String(msg.getData()));
             messageDataHashSet.add(new String(msg.getData()));
         }
@@ -107,7 +105,7 @@ public class ResendRequestTest extends BrokerTestBase {
         log.info("Message acked " + new String(message.getData()));
         messageIdHashSet.add(message.getMessageId());
         messageDataHashSet.add(new String(message.getData()));
-        
+
         consumer.redeliverUnacknowledgedMessages();
         log.info("Resend Messages Request sent");
 
@@ -138,7 +136,7 @@ public class ResendRequestTest extends BrokerTestBase {
             messageDataHashSet.add(new String(message.getData()));
             message = consumer.receive(5000, TimeUnit.MILLISECONDS);
         }
-        
+
         assertEquals(messageIdHashSet.size(), totalMessages);
         assertEquals(messageDataHashSet.size(), totalMessages);
         printIncomingMessageQueue(consumer);
@@ -146,7 +144,7 @@ public class ResendRequestTest extends BrokerTestBase {
         // 9. Calling resend after acking all messages - expectin 0 messages
         consumer.redeliverUnacknowledgedMessages();
         assertEquals(consumer.receive(2000, TimeUnit.MILLISECONDS), null);
-        
+
         // 10. Checking message contents
         for (int i = 0; i < totalMessages; i++) {
             assertTrue(messageDataHashSet.contains(messagePredicate + i));
@@ -161,17 +159,17 @@ public class ResendRequestTest extends BrokerTestBase {
         final String messagePredicate = "my-message-" + key + "-";
         final int totalMessages = 10;
         // 1. producer connect
-        Producer producer = pulsarClient.createProducer(topicName);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName).create();
         PersistentTopic topicRef = (PersistentTopic) pulsar.getBrokerService().getTopicReference(topicName);
         assertNotNull(topicRef);
         assertEquals(topicRef.getProducers().size(), 1);
 
         // 2. Create consumer
-        ConsumerConfiguration conf = new ConsumerConfiguration();
-        conf.setReceiverQueueSize(totalMessages / 2);
-        conf.setSubscriptionType(SubscriptionType.Shared);
-        Consumer consumer1 = pulsarClient.subscribe(topicName, subscriptionName, conf);
-        Consumer consumer2 = pulsarClient.subscribe(topicName, subscriptionName, conf);
+        ConsumerBuilder<byte[]> consumerBuilder = pulsarClient.newConsumer().topic(topicName)
+                .subscriptionName(subscriptionName).receiverQueueSize(totalMessages / 2)
+                .subscriptionType(SubscriptionType.Shared);
+        Consumer<byte[]> consumer1 = consumerBuilder.subscribe();
+        Consumer<byte[]> consumer2 = consumerBuilder.subscribe();
 
         // 3. Producer publishes messages
         for (int i = 0; i < totalMessages; i++) {
@@ -182,8 +180,8 @@ public class ResendRequestTest extends BrokerTestBase {
 
         // 4. Receive messages
         int receivedConsumer1 = 0, receivedConsumer2 = 0;
-        Message message1 = consumer1.receive();
-        Message message2 = consumer2.receive();
+        Message<byte[]> message1 = consumer1.receive();
+        Message<byte[]> message2 = consumer2.receive();
         do {
             if (message1 != null) {
                 log.info("Consumer 1 Received: " + new String(message1.getData()));
@@ -241,19 +239,16 @@ public class ResendRequestTest extends BrokerTestBase {
         final String messagePredicate = "my-message-" + key + "-";
         final int totalMessages = 10;
         // 1. producer connect
-        Producer producer = pulsarClient.createProducer(topicName);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName).create();
         PersistentTopic topicRef = (PersistentTopic) pulsar.getBrokerService().getTopicReference(topicName);
         assertNotNull(topicRef);
         assertEquals(topicRef.getProducers().size(), 1);
 
         // 2. Create consumer
-        ConsumerConfiguration conf = new ConsumerConfiguration();
-        conf.setReceiverQueueSize(10);
-        conf.setSubscriptionType(SubscriptionType.Failover);
-        conf.setConsumerName("consumer-1");
-        Consumer consumer1 = pulsarClient.subscribe(topicName, subscriptionName, conf);
-        conf.setConsumerName("consumer-2");
-        Consumer consumer2 = pulsarClient.subscribe(topicName, subscriptionName, conf);
+        ConsumerBuilder<byte[]> consumerBuilder = pulsarClient.newConsumer().topic(topicName)
+                .subscriptionName(subscriptionName).receiverQueueSize(10).subscriptionType(SubscriptionType.Failover);
+        Consumer<byte[]> consumer1 = consumerBuilder.clone().consumerName("consumer-1").subscribe();
+        Consumer<byte[]> consumer2 = consumerBuilder.clone().consumerName("consumer-2").subscribe();
 
         // 3. Producer publishes messages
         for (int i = 0; i < totalMessages; i++) {
@@ -264,8 +259,8 @@ public class ResendRequestTest extends BrokerTestBase {
 
         // 4. Receive messages
         int receivedConsumer1 = 0, receivedConsumer2 = 0;
-        Message message1;
-        Message message2;
+        Message<byte[]> message1;
+        Message<byte[]> message2;
         do {
             message1 = consumer1.receive(500, TimeUnit.MILLISECONDS);
             message2 = consumer2.receive(500, TimeUnit.MILLISECONDS);
@@ -359,16 +354,15 @@ public class ResendRequestTest extends BrokerTestBase {
         final int totalMessages = 10;
 
         // 1. producer connect
-        Producer producer = pulsarClient.createProducer(topicName);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName).create();
 
         PersistentTopic topicRef = (PersistentTopic) pulsar.getBrokerService().getTopicReference(topicName);
         assertNotNull(topicRef);
         assertEquals(topicRef.getProducers().size(), 1);
 
         // 2. Create consumer
-        ConsumerConfiguration conf = new ConsumerConfiguration();
-        conf.setReceiverQueueSize(7);
-        Consumer consumer = pulsarClient.subscribe(topicName, subscriptionName, conf);
+        Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topicName).subscriptionName(subscriptionName)
+                .receiverQueueSize(7).subscribe();
 
         // 3. producer publish messages
         for (int i = 0; i < totalMessages; i++) {
@@ -377,7 +371,7 @@ public class ResendRequestTest extends BrokerTestBase {
         }
 
         // 4. Receive messages
-        Message message = consumer.receive();
+        Message<byte[]> message = consumer.receive();
         log.info("Message received " + new String(message.getData()));
         for (int i = 0; i < 7; i++) {
             printIncomingMessageQueue(consumer);
@@ -418,14 +412,12 @@ public class ResendRequestTest extends BrokerTestBase {
         // Special step to create partitioned topic
 
         // 1. producer connect
-        ProducerConfiguration prodConfig = new ProducerConfiguration();
-        prodConfig.setMessageRoutingMode(MessageRoutingMode.RoundRobinPartition);
-        Producer producer = pulsarClient.createProducer(topicName, prodConfig);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName)
+                .messageRoutingMode(MessageRoutingMode.RoundRobinPartition).create();
 
         // 2. Create consumer
-        ConsumerConfiguration consumerConfig = new ConsumerConfiguration();
-        consumerConfig.setReceiverQueueSize(7);
-        Consumer consumer = pulsarClient.subscribe(topicName, subscriptionName, consumerConfig);
+        Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topicName).subscriptionName(subscriptionName)
+                .receiverQueueSize(7).subscribe();
 
         // 3. producer publish messages
         for (int i = 0; i < totalMessages; i++) {
@@ -435,7 +427,7 @@ public class ResendRequestTest extends BrokerTestBase {
         }
 
         // 4. Receive messages
-        Message message = consumer.receive();
+        Message<byte[]> message = consumer.receive();
         int messageCount = 0;
         log.info("Message received " + new String(message.getData()));
         do {
@@ -474,16 +466,14 @@ public class ResendRequestTest extends BrokerTestBase {
         // Special step to create partitioned topic
 
         // 1. producer connect
-        ProducerConfiguration prodConfig = new ProducerConfiguration();
-        prodConfig.setMessageRoutingMode(MessageRoutingMode.RoundRobinPartition);
-        Producer producer = pulsarClient.createProducer(topicName, prodConfig);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName)
+                .messageRoutingMode(MessageRoutingMode.RoundRobinPartition).create();
 
         // 2. Create consumer
-        ConsumerConfiguration consumerConfig = new ConsumerConfiguration();
-        consumerConfig.setReceiverQueueSize(7);
-        consumerConfig.setSubscriptionType(SubscriptionType.Shared);
-        Consumer consumer1 = pulsarClient.subscribe(topicName, subscriptionName, consumerConfig);
-        Consumer consumer2 = pulsarClient.subscribe(topicName, subscriptionName, consumerConfig);
+        ConsumerBuilder<byte[]> consumerBuilder = pulsarClient.newConsumer().topic(topicName)
+                .subscriptionName(subscriptionName).receiverQueueSize(7).subscriptionType(SubscriptionType.Shared);
+        Consumer<byte[]> consumer1 = consumerBuilder.subscribe();
+        Consumer<byte[]> consumer2 = consumerBuilder.subscribe();
 
         // 3. producer publish messages
         for (int i = 0; i < totalMessages; i++) {
@@ -493,8 +483,8 @@ public class ResendRequestTest extends BrokerTestBase {
         }
 
         // 4. Receive messages
-        Message message1 = consumer1.receive();
-        Message message2 = consumer2.receive();
+        Message<byte[]> message1 = consumer1.receive();
+        Message<byte[]> message2 = consumer2.receive();
         int messageCount1 = 0;
         int messageCount2 = 0;
         int ackCount1 = 0;
@@ -572,18 +562,15 @@ public class ResendRequestTest extends BrokerTestBase {
         // Special step to create partitioned topic
 
         // 1. producer connect
-        ProducerConfiguration prodConfig = new ProducerConfiguration();
-        prodConfig.setMessageRoutingMode(MessageRoutingMode.RoundRobinPartition);
-        Producer producer = pulsarClient.createProducer(topicName, prodConfig);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName)
+                .messageRoutingMode(MessageRoutingMode.RoundRobinPartition).create();
 
         // 2. Create consumer
-        ConsumerConfiguration consumerConfig = new ConsumerConfiguration();
-        consumerConfig.setReceiverQueueSize(7);
-        consumerConfig.setSubscriptionType(SubscriptionType.Failover);
-        consumerConfig.setConsumerName("Consumer-1");
-        Consumer consumer1 = pulsarClient.subscribe(topicName, subscriptionName, consumerConfig);
-        consumerConfig.setConsumerName("Consumer-2");
-        Consumer consumer2 = pulsarClient.subscribe(topicName, subscriptionName, consumerConfig);
+        ConsumerBuilder<byte[]> consumerBuilder = pulsarClient.newConsumer().topic(topicName)
+                .subscriptionName(subscriptionName).receiverQueueSize(7).subscriptionType(SubscriptionType.Failover);
+        Consumer<byte[]> consumer1 = consumerBuilder.clone().consumerName("Consumer-1").subscribe();
+        Consumer<byte[]> consumer2 = consumerBuilder.clone().consumerName("Consumer-2").subscribe();
+
         Thread.sleep(1000);
         // 3. producer publish messages
         for (int i = 0; i < totalMessages; i++) {
@@ -593,8 +580,8 @@ public class ResendRequestTest extends BrokerTestBase {
         }
 
         // 4. Receive messages
-        Message message1 = consumer1.receive();
-        Message message2 = consumer2.receive();
+        Message<byte[]> message1 = consumer1.receive();
+        Message<byte[]> message2 = consumer2.receive();
         int messageCount1 = 0;
         int messageCount2 = 0;
         int ackCount1 = 0;
@@ -657,19 +644,16 @@ public class ResendRequestTest extends BrokerTestBase {
         final String messagePredicate = "my-message-" + key + "-";
         final int totalMessages = 10;
         // 1. producer connect
-        Producer producer = pulsarClient.createProducer(topicName);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName).create();
         PersistentTopic topicRef = (PersistentTopic) pulsar.getBrokerService().getTopicReference(topicName);
         assertNotNull(topicRef);
         assertEquals(topicRef.getProducers().size(), 1);
 
         // 2. Create consumer
-        ConsumerConfiguration conf = new ConsumerConfiguration();
-        conf.setReceiverQueueSize(10);
-        conf.setSubscriptionType(SubscriptionType.Failover);
-        conf.setConsumerName("consumer-1");
-        Consumer consumer1 = pulsarClient.subscribe(topicName, subscriptionName, conf);
-        conf.setConsumerName("consumer-2");
-        Consumer consumer2 = pulsarClient.subscribe(topicName, subscriptionName, conf);
+        ConsumerBuilder<byte[]> consumerBuilder = pulsarClient.newConsumer().topic(topicName)
+                .subscriptionName(subscriptionName).receiverQueueSize(10).subscriptionType(SubscriptionType.Failover);
+        Consumer<byte[]> consumer1 = consumerBuilder.clone().consumerName("Consumer-1").subscribe();
+        Consumer<byte[]> consumer2 = consumerBuilder.clone().consumerName("Consumer-2").subscribe();
 
         // 3. Producer publishes messages
         for (int i = 0; i < totalMessages; i++) {
@@ -680,8 +664,8 @@ public class ResendRequestTest extends BrokerTestBase {
 
         // 4. Receive messages
         int receivedConsumer1 = 0, receivedConsumer2 = 0;
-        Message message1;
-        Message message2;
+        Message<byte[]> message1;
+        Message<byte[]> message2;
         do {
             message1 = consumer1.receive(500, TimeUnit.MILLISECONDS);
             if (message1 != null) {
@@ -707,12 +691,13 @@ public class ResendRequestTest extends BrokerTestBase {
         assertEquals(message2, null);
     }
 
-    private BlockingQueue<Message> printIncomingMessageQueue(Consumer consumer) throws Exception {
-        BlockingQueue<Message> imq = null;
-        ConsumerBase c = (ConsumerBase) consumer;
+    @SuppressWarnings("unchecked")
+    private BlockingQueue<Message<byte[]>> printIncomingMessageQueue(Consumer<byte[]> consumer) throws Exception {
+        BlockingQueue<Message<byte[]>> imq = null;
+        ConsumerBase<byte[]> c = (ConsumerBase<byte[]>) consumer;
         Field field = ConsumerBase.class.getDeclaredField("incomingMessages");
         field.setAccessible(true);
-        imq = (BlockingQueue<Message>) field.get(c);
+        imq = (BlockingQueue<Message<byte[]>>) field.get(c);
         log.info("Incoming MEssage Queue: {}", imq);
         return imq;
     }
diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/ServerCnxTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/ServerCnxTest.java
index 6158495..ded2f00 100644
--- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/ServerCnxTest.java
+++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/ServerCnxTest.java
@@ -39,7 +39,6 @@ import java.io.IOException;
 import java.lang.reflect.Field;
 import java.util.ArrayList;
 import java.util.Collections;
-import java.util.Map;
 import java.util.Optional;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.CountDownLatch;
@@ -91,8 +90,8 @@ import org.apache.pulsar.common.api.proto.PulsarApi.EncryptionKeys;
 import org.apache.pulsar.common.api.proto.PulsarApi.MessageMetadata;
 import org.apache.pulsar.common.api.proto.PulsarApi.ProtocolVersion;
 import org.apache.pulsar.common.api.proto.PulsarApi.ServerError;
-import org.apache.pulsar.common.naming.TopicName;
 import org.apache.pulsar.common.naming.NamespaceBundle;
+import org.apache.pulsar.common.naming.TopicName;
 import org.apache.pulsar.common.policies.data.AuthAction;
 import org.apache.pulsar.common.policies.data.Policies;
 import org.apache.pulsar.zookeeper.ZooKeeperDataCache;
@@ -100,8 +99,6 @@ import org.apache.zookeeper.ZooKeeper;
 import org.mockito.Mockito;
 import org.mockito.invocation.InvocationOnMock;
 import org.mockito.stubbing.Answer;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.testng.annotations.AfterMethod;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
@@ -117,6 +114,7 @@ import io.netty.handler.codec.LengthFieldBasedFrameDecoder;
 /**
  */
 @Test
+@SuppressWarnings("unchecked")
 public class ServerCnxTest {
     protected EmbeddedChannel channel;
     private ServiceConfiguration svcConfig;
@@ -159,7 +157,6 @@ public class ServerCnxTest {
         doReturn(createMockBookKeeper(mockZk)).when(pulsar).getBookKeeperClient();
 
         configCacheService = mock(ConfigurationCacheService.class);
-        @SuppressWarnings("unchecked")
         ZooKeeperDataCache<Policies> zkDataCache = mock(ZooKeeperDataCache.class);
         doReturn(Optional.empty()).when(zkDataCache).get(anyObject());
         doReturn(zkDataCache).when(configCacheService).policiesCache();
@@ -473,7 +470,6 @@ public class ServerCnxTest {
         assertEquals(topicRef.getProducers().size(), 0);
     }
 
-    @SuppressWarnings("unchecked")
     @Test(timeOut = 30000)
     public void testNonExistentTopic() throws Exception {
         ZooKeeperDataCache<Policies> zkDataCache = mock(ZooKeeperDataCache.class);
@@ -1560,6 +1556,4 @@ public class ServerCnxTest {
 
         channel.finish();
     }
-
-    private static final Logger log = LoggerFactory.getLogger(ServerCnxTest.class);
 }
diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/SubscriptionSeekTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/SubscriptionSeekTest.java
index cd38384..284e6c6 100644
--- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/SubscriptionSeekTest.java
+++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/SubscriptionSeekTest.java
@@ -27,7 +27,6 @@ import java.util.List;
 
 import org.apache.pulsar.broker.service.persistent.PersistentSubscription;
 import org.apache.pulsar.broker.service.persistent.PersistentTopic;
-import org.apache.pulsar.client.api.ConsumerConfiguration;
 import org.apache.pulsar.client.api.MessageId;
 import org.apache.pulsar.client.api.Producer;
 import org.apache.pulsar.client.api.PulsarClientException;
@@ -55,14 +54,11 @@ public class SubscriptionSeekTest extends BrokerTestBase {
     public void testSeek() throws Exception {
         final String topicName = "persistent://prop/use/ns-abc/testSeek";
 
-        Producer producer = pulsarClient.createProducer(topicName);
-
-        ConsumerConfiguration consumerConf = new ConsumerConfiguration();
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName).create();
 
         // Disable pre-fetch in consumer to track the messages received
-        consumerConf.setReceiverQueueSize(0);
-        org.apache.pulsar.client.api.Consumer consumer = pulsarClient.subscribe(topicName, "my-subscription",
-                consumerConf);
+        org.apache.pulsar.client.api.Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topicName)
+                .subscriptionName("my-subscription").receiverQueueSize(0).subscribe();
 
         PersistentTopic topicRef = (PersistentTopic) pulsar.getBrokerService().getTopicReference(topicName);
         assertNotNull(topicRef);
@@ -97,7 +93,8 @@ public class SubscriptionSeekTest extends BrokerTestBase {
         final String topicName = "persistent://prop/use/ns-abc/testSeekPartitions";
 
         admin.persistentTopics().createPartitionedTopic(topicName, 2);
-        org.apache.pulsar.client.api.Consumer consumer = pulsarClient.subscribe(topicName, "my-subscription");
+        org.apache.pulsar.client.api.Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topicName)
+                .subscriptionName("my-subscription").subscribe();
 
         try {
             consumer.seek(MessageId.latest);
diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/TopicTerminationTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/TopicTerminationTest.java
index bcc5470..696a331 100644
--- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/TopicTerminationTest.java
+++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/TopicTerminationTest.java
@@ -35,14 +35,12 @@ import java.util.concurrent.TimeUnit;
 
 import org.apache.pulsar.client.admin.PulsarAdminException.NotAllowedException;
 import org.apache.pulsar.client.api.Consumer;
-import org.apache.pulsar.client.api.ConsumerConfiguration;
 import org.apache.pulsar.client.api.Message;
 import org.apache.pulsar.client.api.MessageId;
 import org.apache.pulsar.client.api.MessageListener;
 import org.apache.pulsar.client.api.Producer;
 import org.apache.pulsar.client.api.PulsarClientException;
 import org.apache.pulsar.client.api.Reader;
-import org.apache.pulsar.client.api.ReaderConfiguration;
 import org.apache.pulsar.client.api.ReaderListener;
 import org.apache.pulsar.common.util.FutureUtil;
 import org.testng.annotations.AfterMethod;
@@ -67,7 +65,7 @@ public class TopicTerminationTest extends BrokerTestBase {
 
     @Test
     public void testSimpleTermination() throws Exception {
-        Producer producer = pulsarClient.createProducer(topicName);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName).create();
 
         /* MessageId msgId1 = */producer.send("test-msg-1".getBytes());
         /* MessageId msgId2 = */producer.send("test-msg-2".getBytes());
@@ -86,7 +84,7 @@ public class TopicTerminationTest extends BrokerTestBase {
 
     @Test
     public void testCreateProducerOnTerminatedTopic() throws Exception {
-        Producer producer = pulsarClient.createProducer(topicName);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName).create();
 
         /* MessageId msgId1 = */producer.send("test-msg-1".getBytes());
         /* MessageId msgId2 = */producer.send("test-msg-2".getBytes());
@@ -96,7 +94,7 @@ public class TopicTerminationTest extends BrokerTestBase {
         assertEquals(lastMessageId, msgId3);
 
         try {
-            pulsarClient.createProducer(topicName);
+            pulsarClient.newProducer().topic(topicName).create();
             fail("Should have thrown exception");
         } catch (PulsarClientException.TopicTerminatedException e) {
             // Expected
@@ -105,7 +103,7 @@ public class TopicTerminationTest extends BrokerTestBase {
 
     @Test(timeOut = 20000)
     public void testTerminateWhilePublishing() throws Exception {
-        Producer producer = pulsarClient.createProducer(topicName);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName).create();
 
         CyclicBarrier barrier = new CyclicBarrier(2);
         List<CompletableFuture<MessageId>> futures = new ArrayList<>();
@@ -150,7 +148,7 @@ public class TopicTerminationTest extends BrokerTestBase {
 
     @Test
     public void testDoubleTerminate() throws Exception {
-        Producer producer = pulsarClient.createProducer(topicName);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName).create();
 
         /* MessageId msgId1 = */producer.send("test-msg-1".getBytes());
         /* MessageId msgId2 = */producer.send("test-msg-2".getBytes());
@@ -178,13 +176,14 @@ public class TopicTerminationTest extends BrokerTestBase {
 
     @Test(timeOut = 20000)
     public void testSimpleTerminationConsumer() throws Exception {
-        Producer producer = pulsarClient.createProducer(topicName);
-        org.apache.pulsar.client.api.Consumer consumer = pulsarClient.subscribe(topicName, "my-sub");
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName).create();
+        org.apache.pulsar.client.api.Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topicName)
+                .subscriptionName("my-sub").subscribe();
 
         MessageId msgId1 = producer.send("test-msg-1".getBytes());
         MessageId msgId2 = producer.send("test-msg-2".getBytes());
 
-        Message msg1 = consumer.receive();
+        Message<byte[]> msg1 = consumer.receive();
         assertEquals(msg1.getMessageId(), msgId1);
         consumer.acknowledge(msg1);
 
@@ -195,43 +194,41 @@ public class TopicTerminationTest extends BrokerTestBase {
         MessageId lastMessageId = admin.persistentTopics().terminateTopicAsync(topicName).get();
         assertEquals(lastMessageId, msgId3);
 
-        Message msg2 = consumer.receive();
+        Message<byte[]> msg2 = consumer.receive();
         assertEquals(msg2.getMessageId(), msgId2);
         consumer.acknowledge(msg2);
 
-        Message msg3 = consumer.receive();
+        Message<byte[]> msg3 = consumer.receive();
         assertEquals(msg3.getMessageId(), msgId3);
         consumer.acknowledge(msg3);
 
-        Message msg4 = consumer.receive(100, TimeUnit.MILLISECONDS);
+        Message<byte[]> msg4 = consumer.receive(100, TimeUnit.MILLISECONDS);
         assertNull(msg4);
 
         Thread.sleep(100);
         assertTrue(consumer.hasReachedEndOfTopic());
     }
 
-    @SuppressWarnings("serial")
     @Test(timeOut = 20000)
     public void testSimpleTerminationMessageListener() throws Exception {
-        Producer producer = pulsarClient.createProducer(topicName);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName).create();
 
         CountDownLatch latch = new CountDownLatch(1);
 
-        ConsumerConfiguration conf = new ConsumerConfiguration();
-        conf.setMessageListener(new MessageListener() {
+        org.apache.pulsar.client.api.Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topicName)
+                .subscriptionName("my-sub").messageListener(new MessageListener<byte[]>() {
 
-            @Override
-            public void received(Consumer consumer, Message msg) {
-                // do nothing
-            }
+                    @Override
+                    public void received(Consumer<byte[]> consumer, Message<byte[]> msg) {
+                        // do nothing
+                    }
 
-            @Override
-            public void reachedEndOfTopic(Consumer consumer) {
-                latch.countDown();
-                assertTrue(consumer.hasReachedEndOfTopic());
-            }
-        });
-        org.apache.pulsar.client.api.Consumer consumer = pulsarClient.subscribe(topicName, "my-sub", conf);
+                    @Override
+                    public void reachedEndOfTopic(Consumer<byte[]> consumer) {
+                        latch.countDown();
+                        assertTrue(consumer.hasReachedEndOfTopic());
+                    }
+                }).subscribe();
 
         /* MessageId msgId1 = */ producer.send("test-msg-1".getBytes());
         /* MessageId msgId2 = */ producer.send("test-msg-2".getBytes());
@@ -251,7 +248,7 @@ public class TopicTerminationTest extends BrokerTestBase {
 
     @Test(timeOut = 20000)
     public void testSimpleTerminationReader() throws Exception {
-        Producer producer = pulsarClient.createProducer(topicName);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName).create();
 
         MessageId msgId1 = producer.send("test-msg-1".getBytes());
         MessageId msgId2 = producer.send("test-msg-2".getBytes());
@@ -260,46 +257,43 @@ public class TopicTerminationTest extends BrokerTestBase {
         MessageId lastMessageId = admin.persistentTopics().terminateTopicAsync(topicName).get();
         assertEquals(lastMessageId, msgId3);
 
-        Reader reader = pulsarClient.createReader(topicName, MessageId.earliest, new ReaderConfiguration());
+        Reader<byte[]> reader = pulsarClient.newReader().topic(topicName).startMessageId(MessageId.earliest).create();
 
-        Message msg1 = reader.readNext();
+        Message<byte[]> msg1 = reader.readNext();
         assertEquals(msg1.getMessageId(), msgId1);
 
-        Message msg2 = reader.readNext();
+        Message<byte[]> msg2 = reader.readNext();
         assertEquals(msg2.getMessageId(), msgId2);
 
-        Message msg3 = reader.readNext();
+        Message<byte[]> msg3 = reader.readNext();
         assertEquals(msg3.getMessageId(), msgId3);
 
-        Message msg4 = reader.readNext(100, TimeUnit.MILLISECONDS);
+        Message<byte[]> msg4 = reader.readNext(100, TimeUnit.MILLISECONDS);
         assertNull(msg4);
 
         Thread.sleep(100);
         assertTrue(reader.hasReachedEndOfTopic());
     }
 
-    @SuppressWarnings("serial")
     @Test(timeOut = 20000)
     public void testSimpleTerminationReaderListener() throws Exception {
-        Producer producer = pulsarClient.createProducer(topicName);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName).create();
 
         CountDownLatch latch = new CountDownLatch(1);
 
-        ReaderConfiguration conf = new ReaderConfiguration();
-        conf.setReaderListener(new ReaderListener() {
+        Reader<byte[]> reader = pulsarClient.newReader().topic(topicName).startMessageId(MessageId.latest)
+                .readerListener(new ReaderListener<byte[]>() {
+                    @Override
+                    public void received(Reader<byte[]> reader, Message<byte[]> msg) {
+                        // do nothing
+                    }
 
-            @Override
-            public void received(Reader r, Message msg) {
-                // do nothing
-            }
-
-            @Override
-            public void reachedEndOfTopic(Reader reader) {
-                latch.countDown();
-                assertTrue(reader.hasReachedEndOfTopic());
-            }
-        });
-        Reader reader = pulsarClient.createReader(topicName, MessageId.latest, conf);
+                    @Override
+                    public void reachedEndOfTopic(Reader<byte[]> reader) {
+                        latch.countDown();
+                        assertTrue(reader.hasReachedEndOfTopic());
+                    }
+                }).create();
 
         /* MessageId msgId1 = */ producer.send("test-msg-1".getBytes());
         /* MessageId msgId2 = */ producer.send("test-msg-2".getBytes());
@@ -317,14 +311,15 @@ public class TopicTerminationTest extends BrokerTestBase {
 
     @Test(timeOut = 20000)
     public void testSubscribeOnTerminatedTopic() throws Exception {
-        Producer producer = pulsarClient.createProducer(topicName);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName).create();
         /* MessageId msgId1 = */ producer.send("test-msg-1".getBytes());
         MessageId msgId2 = producer.send("test-msg-2".getBytes());
 
         MessageId lastMessageId = admin.persistentTopics().terminateTopicAsync(topicName).get();
         assertEquals(lastMessageId, msgId2);
 
-        org.apache.pulsar.client.api.Consumer consumer = pulsarClient.subscribe(topicName, "my-sub");
+        org.apache.pulsar.client.api.Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topicName)
+                .subscriptionName("my-sub").subscribe();
 
         Thread.sleep(200);
         assertTrue(consumer.hasReachedEndOfTopic());
@@ -332,10 +327,11 @@ public class TopicTerminationTest extends BrokerTestBase {
 
     @Test(timeOut = 20000)
     public void testSubscribeOnTerminatedTopicWithNoMessages() throws Exception {
-        pulsarClient.createProducer(topicName);
+        pulsarClient.newProducer().topic(topicName).create();
         admin.persistentTopics().terminateTopicAsync(topicName).get();
 
-        org.apache.pulsar.client.api.Consumer consumer = pulsarClient.subscribe(topicName, "my-sub");
+        org.apache.pulsar.client.api.Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topicName)
+                .subscriptionName("my-sub").subscribe();
 
         Thread.sleep(200);
         assertTrue(consumer.hasReachedEndOfTopic());
diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/persistent/ChecksumTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/persistent/ChecksumTest.java
index 6d7a858..3e6b3bd 100644
--- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/persistent/ChecksumTest.java
+++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/persistent/ChecksumTest.java
@@ -59,7 +59,7 @@ public class ChecksumTest extends BrokerTestBase {
     public void verifyChecksumStoredInManagedLedger() throws Exception {
         final String topicName = "persistent://prop/use/ns-abc/topic0";
 
-        Producer producer = pulsarClient.createProducer(topicName);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName).create();
 
         PersistentTopic topic = (PersistentTopic) pulsar.getBrokerService().getTopicReference(topicName);
 
@@ -86,7 +86,7 @@ public class ChecksumTest extends BrokerTestBase {
     public void verifyChecksumSentToConsumer() throws Exception {
         final String topicName = "persistent://prop/use/ns-abc/topic-1";
 
-        Producer producer = pulsarClient.createProducer(topicName);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName).create();
         RawReader reader = RawReader.create(pulsarClient, topicName, "sub").get();
 
         producer.send("Hello".getBytes());
diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/stats/ManagedLedgerMetricsTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/stats/ManagedLedgerMetricsTest.java
index 45d541f..f74f192 100644
--- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/stats/ManagedLedgerMetricsTest.java
+++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/stats/ManagedLedgerMetricsTest.java
@@ -58,7 +58,8 @@ public class ManagedLedgerMetricsTest extends BrokerTestBase {
         List<Metrics> list1 = metrics.generate();
         Assert.assertTrue(list1.isEmpty());
 
-        Producer producer = pulsarClient.createProducer("persistent://my-property/use/my-ns/my-topic1");
+        Producer<byte[]> producer = pulsarClient.newProducer().topic("persistent://my-property/use/my-ns/my-topic1")
+                .create();
         for (int i = 0; i < 10; i++) {
             String message = "my-message-" + i;
             producer.send(message.getBytes());
diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/stats/PrometheusMetricsTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/stats/PrometheusMetricsTest.java
index 8aa6fdc..62d490e 100644
--- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/stats/PrometheusMetricsTest.java
+++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/stats/PrometheusMetricsTest.java
@@ -55,8 +55,8 @@ public class PrometheusMetricsTest extends BrokerTestBase {
 
     @Test
     public void testPerTopicStats() throws Exception {
-        Producer p1 = pulsarClient.createProducer("persistent://my-property/use/my-ns/my-topic1");
-        Producer p2 = pulsarClient.createProducer("persistent://my-property/use/my-ns/my-topic2");
+        Producer<byte[]> p1 = pulsarClient.newProducer().topic("persistent://my-property/use/my-ns/my-topic1").create();
+        Producer<byte[]> p2 = pulsarClient.newProducer().topic("persistent://my-property/use/my-ns/my-topic2").create();
         for (int i = 0; i < 10; i++) {
             String message = "my-message-" + i;
             p1.send(message.getBytes());
@@ -101,8 +101,8 @@ public class PrometheusMetricsTest extends BrokerTestBase {
 
     @Test
     public void testPerNamespaceStats() throws Exception {
-        Producer p1 = pulsarClient.createProducer("persistent://my-property/use/my-ns/my-topic1");
-        Producer p2 = pulsarClient.createProducer("persistent://my-property/use/my-ns/my-topic2");
+        Producer<byte[]> p1 = pulsarClient.newProducer().topic("persistent://my-property/use/my-ns/my-topic1").create();
+        Producer<byte[]> p2 = pulsarClient.newProducer().topic("persistent://my-property/use/my-ns/my-topic2").create();
         for (int i = 0; i < 10; i++) {
             String message = "my-message-" + i;
             p1.send(message.getBytes());
diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/broker/zookeeper/ZooKeeperClientAspectJTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/broker/zookeeper/ZooKeeperClientAspectJTest.java
index 5454c8b..99ac805 100644
--- a/pulsar-broker/src/test/java/org/apache/pulsar/broker/zookeeper/ZooKeeperClientAspectJTest.java
+++ b/pulsar-broker/src/test/java/org/apache/pulsar/broker/zookeeper/ZooKeeperClientAspectJTest.java
@@ -189,7 +189,7 @@ public class ZooKeeperClientAspectJTest {
             PulsarClient pulsarClient = mockPulsar.getClient();
             PulsarService pulsar = mockPulsar.getPulsar();
 
-            pulsarClient.createProducer("persistent://my-property/use/my-ns/my-topic1");
+            pulsarClient.newProducer().topic("persistent://my-property/use/my-ns/my-topic1").create();
             Metrics zkOpMetric = getMetric(pulsar, "zk_write_latency");
             Assert.assertNotNull(zkOpMetric);
             Assert.assertTrue(zkOpMetric.getMetrics().containsKey("brk_zk_write_rate_s"));
diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/client/api/AuthenticatedProducerConsumerTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/client/api/AuthenticatedProducerConsumerTest.java
index 7c6f6a9..eafe9c8 100644
--- a/pulsar-broker/src/test/java/org/apache/pulsar/client/api/AuthenticatedProducerConsumerTest.java
+++ b/pulsar-broker/src/test/java/org/apache/pulsar/client/api/AuthenticatedProducerConsumerTest.java
@@ -109,7 +109,9 @@ public class AuthenticatedProducerConsumerTest extends ProducerConsumerBase {
         } else {
             lookupUrl = new URI("pulsar+ssl://localhost:" + BROKER_PORT_TLS).toString();
         }
-        pulsarClient = PulsarClient.create(lookupUrl, clientConf);
+        pulsarClient = PulsarClient.builder().serviceUrl(lookupUrl).statsInterval(0, TimeUnit.SECONDS)
+                .tlsTrustCertsFilePath(TLS_TRUST_CERT_FILE_PATH).allowTlsInsecureConnection(true).authentication(auth)
+                .enableTls(true).build();
     }
 
     @AfterMethod
@@ -124,26 +126,24 @@ public class AuthenticatedProducerConsumerTest extends ProducerConsumerBase {
     }
 
     public void testSyncProducerAndConsumer(int batchMessageDelayMs) throws Exception {
-        ConsumerConfiguration conf = new ConsumerConfiguration();
-        conf.setSubscriptionType(SubscriptionType.Exclusive);
-        Consumer consumer = pulsarClient.subscribe("persistent://my-property/use/my-ns/my-topic", "my-subscriber-name",
-                conf);
+        Consumer<byte[]> consumer = pulsarClient.newConsumer().topic("persistent://my-property/use/my-ns/my-topic")
+                .subscriptionName("my-subscriber-name").subscribe();
 
-        ProducerConfiguration producerConf = new ProducerConfiguration();
+        ProducerBuilder<byte[]> producerBuilder = pulsarClient.newProducer().topic("persistent://my-property/use/my-ns/my-topic");
 
         if (batchMessageDelayMs != 0) {
-            producerConf.setBatchingEnabled(true);
-            producerConf.setBatchingMaxPublishDelay(batchMessageDelayMs, TimeUnit.MILLISECONDS);
-            producerConf.setBatchingMaxMessages(5);
+            producerBuilder.enableBatching(true);
+            producerBuilder.batchingMaxPublishDelay(batchMessageDelayMs, TimeUnit.MILLISECONDS);
+            producerBuilder.batchingMaxMessages(5);
         }
 
-        Producer producer = pulsarClient.createProducer("persistent://my-property/use/my-ns/my-topic", producerConf);
+        Producer<byte[]> producer = producerBuilder.create();
         for (int i = 0; i < 10; i++) {
             String message = "my-message-" + i;
             producer.send(message.getBytes());
         }
 
-        Message msg = null;
+        Message<byte[]> msg = null;
         Set<String> messageSet = Sets.newHashSet();
         for (int i = 0; i < 10; i++) {
             msg = consumer.receive(5, TimeUnit.SECONDS);
@@ -184,8 +184,8 @@ public class AuthenticatedProducerConsumerTest extends ProducerConsumerBase {
         authPassword.configure("{\"userId\":\"superUser\",\"password\":\"supepass\"}");
         internalSetup(authPassword);
 
-        admin.properties()
-                .createProperty("my-property", new PropertyAdmin(Lists.newArrayList(), Sets.newHashSet("use")));
+        admin.properties().createProperty("my-property",
+                new PropertyAdmin(Lists.newArrayList(), Sets.newHashSet("use")));
         admin.namespaces().createNamespace("my-property/use/my-ns");
 
         testSyncProducerAndConsumer(batchMessageDelayMs);
@@ -200,8 +200,8 @@ public class AuthenticatedProducerConsumerTest extends ProducerConsumerBase {
         authPassword.configure("{\"userId\":\"superUser2\",\"password\":\"superpassword\"}");
         internalSetup(authPassword);
 
-        admin.properties()
-                .createProperty("my-property", new PropertyAdmin(Lists.newArrayList(), Sets.newHashSet("use")));
+        admin.properties().createProperty("my-property",
+                new PropertyAdmin(Lists.newArrayList(), Sets.newHashSet("use")));
         admin.namespaces().createNamespace("my-property/use/my-ns");
 
         testSyncProducerAndConsumer(batchMessageDelayMs);
@@ -209,7 +209,6 @@ public class AuthenticatedProducerConsumerTest extends ProducerConsumerBase {
         log.info("-- Exiting {} test --", methodName);
     }
 
-
     @Test(dataProvider = "batch")
     public void testAnonymousSyncProducerAndConsumer(int batchMessageDelayMs) throws Exception {
         log.info("-- Starting {} test --", methodName);
@@ -232,17 +231,19 @@ public class AuthenticatedProducerConsumerTest extends ProducerConsumerBase {
         clientConf.setOperationTimeout(1, TimeUnit.SECONDS);
         admin = spy(new PulsarAdmin(brokerUrl, clientConf));
         admin.namespaces().createNamespace("my-property/use/my-ns");
-        admin.persistentTopics().grantPermission("persistent://my-property/use/my-ns/my-topic", "anonymousUser", EnumSet
-                .allOf(AuthAction.class));
+        admin.persistentTopics().grantPermission("persistent://my-property/use/my-ns/my-topic", "anonymousUser",
+                EnumSet.allOf(AuthAction.class));
 
         // setup the client
         pulsarClient.close();
-        pulsarClient = PulsarClient.create("pulsar://localhost:" + BROKER_PORT, clientConf);
+        pulsarClient = PulsarClient.builder().serviceUrl("pulsar://localhost:" + BROKER_PORT)
+                .operationTimeout(1, TimeUnit.SECONDS).build();
 
         // unauthorized topic test
         Exception pulsarClientException = null;
         try {
-            pulsarClient.subscribe("persistent://my-property/use/my-ns/other-topic", "my-subscriber-name");
+            pulsarClient.newConsumer().topic("persistent://my-property/use/my-ns/other-topic")
+                    .subscriptionName("my-subscriber-name").subscribe();
         } catch (Exception e) {
             pulsarClientException = e;
         }
diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/client/api/AuthenticationTlsHostnameVerificationTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/client/api/AuthenticationTlsHostnameVerificationTest.java
index 5ccfc14..4338ae3 100644
--- a/pulsar-broker/src/test/java/org/apache/pulsar/client/api/AuthenticationTlsHostnameVerificationTest.java
+++ b/pulsar-broker/src/test/java/org/apache/pulsar/client/api/AuthenticationTlsHostnameVerificationTest.java
@@ -118,7 +118,10 @@ public class AuthenticationTlsHostnameVerificationTest extends ProducerConsumerB
         admin = spy(new PulsarAdmin(brokerUrlTls, clientConf));
         String lookupUrl;
         lookupUrl = new URI("pulsar+ssl://" + brokerHostName + ":" + BROKER_PORT_TLS).toString();
-        pulsarClient = PulsarClient.create(lookupUrl, clientConf);
+        pulsarClient = PulsarClient.builder().serviceUrl(lookupUrl).statsInterval(0, TimeUnit.SECONDS)
+                .tlsTrustCertsFilePath(TLS_MIM_TRUST_CERT_FILE_PATH).allowTlsInsecureConnection(true)
+                .authentication(authTls).enableTls(true).enableTlsHostnameVerification(hostnameVerificationEnabled)
+                .build();
 
         admin.properties().createProperty("my-property",
                 new PropertyAdmin(Lists.newArrayList("appid1", "appid2"), Sets.newHashSet("use")));
@@ -140,13 +143,13 @@ public class AuthenticationTlsHostnameVerificationTest extends ProducerConsumerB
 
     /**
      * It verifies that client performs host-verification in order to create producer/consumer.
-     * 
+     *
      * <pre>
      * 1. Client tries to connect to broker with hostname="localhost"
      * 2. Broker sends x509 certificates with CN = "pulsar"
      * 3. Client verifies the host-name and closes the connection and fails consumer creation
      * </pre>
-     * 
+     *
      * @throws Exception
      */
     @Test(dataProvider = "hostnameVerification")
@@ -164,11 +167,9 @@ public class AuthenticationTlsHostnameVerificationTest extends ProducerConsumerB
 
         setup();
 
-        ConsumerConfiguration conf = new ConsumerConfiguration();
-        conf.setSubscriptionType(SubscriptionType.Exclusive);
         try {
-            Consumer consumer = pulsarClient.subscribe("persistent://my-property/use/my-ns/my-topic",
-                    "my-subscriber-name", conf);
+            pulsarClient.newConsumer().topic("persistent://my-property/use/my-ns/my-topic")
+                    .subscriptionName("my-subscriber-name").subscribe();
             if (hostnameVerificationEnabled) {
                 Assert.fail("Connection should be failed due to hostnameVerification enabled");
             }
@@ -183,13 +184,13 @@ public class AuthenticationTlsHostnameVerificationTest extends ProducerConsumerB
 
     /**
      * It verifies that client performs host-verification in order to create producer/consumer.
-     * 
+     *
      * <pre>
      * 1. Client tries to connect to broker with hostname="localhost"
      * 2. Broker sends x509 certificates with CN = "localhost"
      * 3. Client verifies the host-name and continues
      * </pre>
-     * 
+     *
      * @throws Exception
      */
     @Test
@@ -203,20 +204,17 @@ public class AuthenticationTlsHostnameVerificationTest extends ProducerConsumerB
 
         setup();
 
-        ConsumerConfiguration conf = new ConsumerConfiguration();
-        conf.setSubscriptionType(SubscriptionType.Exclusive);
-        Consumer consumer = pulsarClient.subscribe("persistent://my-property/use/my-ns/my-topic", "my-subscriber-name",
-                conf);
+        Consumer<byte[]> consumer = pulsarClient.newConsumer().topic("persistent://my-property/use/my-ns/my-topic")
+                .subscriptionName("my-subscriber-name").subscribe();
 
-        ProducerConfiguration producerConf = new ProducerConfiguration();
-
-        Producer producer = pulsarClient.createProducer("persistent://my-property/use/my-ns/my-topic", producerConf);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic("persistent://my-property/use/my-ns/my-topic")
+                .create();
         for (int i = 0; i < 10; i++) {
             String message = "my-message-" + i;
             producer.send(message.getBytes());
         }
 
-        Message msg = null;
+        Message<byte[]> msg = null;
         Set<String> messageSet = Sets.newHashSet();
         for (int i = 0; i < 10; i++) {
             msg = consumer.receive(5, TimeUnit.SECONDS);
@@ -234,7 +232,7 @@ public class AuthenticationTlsHostnameVerificationTest extends ProducerConsumerB
 
     /**
      * This test verifies {@link DefaultHostnameVerifier} behavior and gives fair idea about host matching result
-     * 
+     *
      * @throws Exception
      */
     @Test
diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/client/api/AuthorizationProducerConsumerTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/client/api/AuthorizationProducerConsumerTest.java
index 1eb27db..ec2ddd1 100644
--- a/pulsar-broker/src/test/java/org/apache/pulsar/client/api/AuthorizationProducerConsumerTest.java
+++ b/pulsar-broker/src/test/java/org/apache/pulsar/client/api/AuthorizationProducerConsumerTest.java
@@ -110,37 +110,36 @@ public class AuthorizationProducerConsumerTest extends ProducerConsumerBase {
         String lookupUrl;
         lookupUrl = new URI("pulsar://localhost:" + BROKER_PORT).toString();
 
-        ClientConfiguration clientConfValid = new ClientConfiguration();
         Authentication authentication = new ClientAuthentication(clientRole);
-        clientConfValid.setAuthentication(authentication);
-
-        ClientConfiguration clientConfInvalidRole = new ClientConfiguration();
         Authentication authenticationInvalidRole = new ClientAuthentication("test-role");
-        clientConfInvalidRole.setAuthentication(authenticationInvalidRole);
 
-        pulsarClient = PulsarClient.create(lookupUrl, clientConfValid);
-        PulsarClient pulsarClientInvalidRole = PulsarClient.create(lookupUrl, clientConfInvalidRole);
+        pulsarClient = PulsarClient.builder().serviceUrl(lookupUrl).authentication(authentication).build();
+        PulsarClient pulsarClientInvalidRole = PulsarClient.builder().serviceUrl(lookupUrl)
+                .authentication(authenticationInvalidRole).build();
 
         admin.properties().createProperty("my-property",
                 new PropertyAdmin(Lists.newArrayList("appid1", "appid2"), Sets.newHashSet("use")));
         admin.namespaces().createNamespace("my-property/use/my-ns");
 
         // (1) Valid Producer and consumer creation
-        Consumer consumer = pulsarClient.subscribe("persistent://my-property/use/my-ns/my-topic", "my-subscriber-name");
-        Producer producer = pulsarClient.createProducer("persistent://my-property/use/my-ns/my-topic");
+        Consumer<byte[]> consumer = pulsarClient.newConsumer().topic("persistent://my-property/use/my-ns/my-topic")
+                .subscriptionName("my-subscriber-name").subscribe();
+        Producer<byte[]> producer = pulsarClient.newProducer().topic("persistent://my-property/use/my-ns/my-topic")
+                .create();
         consumer.close();
         producer.close();
 
         // (2) InValid user auth-role will be rejected by authorization service
         try {
-            consumer = pulsarClientInvalidRole.subscribe("persistent://my-property/use/my-ns/my-topic",
-                    "my-subscriber-name");
+            consumer = pulsarClientInvalidRole.newConsumer().topic("persistent://my-property/use/my-ns/my-topic")
+                    .subscriptionName("my-subscriber-name").subscribe();
             Assert.fail("should have failed with authorization error");
         } catch (PulsarClientException.AuthorizationException pa) {
             // Ok
         }
         try {
-            producer = pulsarClientInvalidRole.createProducer("persistent://my-property/use/my-ns/my-topic");
+            producer = pulsarClientInvalidRole.newProducer().topic("persistent://my-property/use/my-ns/my-topic")
+                    .create();
             Assert.fail("should have failed with authorization error");
         } catch (PulsarClientException.AuthorizationException pa) {
             // Ok
@@ -164,23 +163,23 @@ public class AuthorizationProducerConsumerTest extends ProducerConsumerBase {
         String lookupUrl;
         lookupUrl = new URI("pulsar://localhost:" + BROKER_PORT).toString();
 
-        ClientConfiguration clientConfValid = new ClientConfiguration();
         Authentication authentication = new ClientAuthentication(clientRole);
-        clientConfValid.setAuthentication(authentication);
 
-        pulsarClient = PulsarClient.create(lookupUrl, clientConfValid);
+        pulsarClient = PulsarClient.builder().serviceUrl(lookupUrl).authentication(authentication).build();
 
         admin.properties().createProperty("prop-prefix",
                 new PropertyAdmin(Lists.newArrayList("appid1", "appid2"), Sets.newHashSet("use")));
         admin.namespaces().createNamespace("prop-prefix/use/ns");
 
         // (1) Valid subscription name will be approved by authorization service
-        Consumer consumer = pulsarClient.subscribe("persistent://prop-prefix/use/ns/t1", clientRole + "-sub1");
+        Consumer<byte[]> consumer = pulsarClient.newConsumer().topic("persistent://prop-prefix/use/ns/t1")
+                .subscriptionName(clientRole + "-sub1").subscribe();
         consumer.close();
 
         // (2) InValid subscription name will be rejected by authorization service
         try {
-            consumer = pulsarClient.subscribe("persistent://prop-prefix/use/ns/t1", "sub1");
+            consumer = pulsarClient.newConsumer().topic("persistent://prop-prefix/use/ns/t1").subscriptionName("sub1")
+                    .subscribe();
             Assert.fail("should have failed with authorization error");
         } catch (PulsarClientException.AuthorizationException pa) {
             // Ok
@@ -201,8 +200,7 @@ public class AuthorizationProducerConsumerTest extends ProducerConsumerBase {
         String role = "test-role";
         Assert.assertFalse(authorizationService.canProduce(topicName, role, null));
         Assert.assertFalse(authorizationService.canConsume(topicName, role, null, "sub1"));
-        authorizationService
-                .grantPermissionAsync(topicName, null, role, "auth-json").get();
+        authorizationService.grantPermissionAsync(topicName, null, role, "auth-json").get();
         Assert.assertTrue(authorizationService.canProduce(topicName, role, null));
         Assert.assertTrue(authorizationService.canConsume(topicName, role, null, "sub1"));
 
@@ -219,16 +217,13 @@ public class AuthorizationProducerConsumerTest extends ProducerConsumerBase {
         AuthorizationService authorizationService = new AuthorizationService(conf, null);
         TopicName topicName = TopicName.get("persistent://prop/cluster/ns/t1");
         String role = "test-role";
-        authorizationService
-                .grantPermissionAsync(topicName, null, role, "auth-json")
-                .get();
+        authorizationService.grantPermissionAsync(topicName, null, role, "auth-json").get();
         Assert.assertEquals(TestAuthorizationProviderWithGrantPermission.authDataJson, "auth-json");
-        Assert.assertTrue(
-                authorizationService.canProduce(topicName, role, new AuthenticationDataCommand("prod-auth")));
+        Assert.assertTrue(authorizationService.canProduce(topicName, role, new AuthenticationDataCommand("prod-auth")));
         Assert.assertEquals(TestAuthorizationProviderWithGrantPermission.authenticationData.getCommandData(),
                 "prod-auth");
-        Assert.assertTrue(authorizationService.canConsume(topicName, role, new AuthenticationDataCommand("cons-auth"),
-                "sub1"));
+        Assert.assertTrue(
+                authorizationService.canConsume(topicName, role, new AuthenticationDataCommand("cons-auth"), "sub1"));
         Assert.assertEquals(TestAuthorizationProviderWithGrantPermission.authenticationData.getCommandData(),
                 "cons-auth");
 
@@ -348,8 +343,8 @@ public class AuthorizationProducerConsumerTest extends ProducerConsumerBase {
         }
 
         @Override
-        public CompletableFuture<Void> grantPermissionAsync(TopicName topicname, Set<AuthAction> actions,
-                String role, String authenticationData) {
+        public CompletableFuture<Void> grantPermissionAsync(TopicName topicname, Set<AuthAction> actions, String role,
+                String authenticationData) {
             return CompletableFuture.completedFuture(null);
         }
     }
@@ -433,8 +428,8 @@ public class AuthorizationProducerConsumerTest extends ProducerConsumerBase {
         }
 
         @Override
-        public CompletableFuture<Void> grantPermissionAsync(TopicName topicname, Set<AuthAction> actions,
-                String role, String authData) {
+        public CompletableFuture<Void> grantPermissionAsync(TopicName topicname, Set<AuthAction> actions, String role,
+                String authData) {
             this.authDataJson = authData;
             grantRoles.add(role);
             return CompletableFuture.completedFuture(null);
diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/client/api/BrokerServiceLookupTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/client/api/BrokerServiceLookupTest.java
index c72aa9e..57d8b47 100644
--- a/pulsar-broker/src/test/java/org/apache/pulsar/client/api/BrokerServiceLookupTest.java
+++ b/pulsar-broker/src/test/java/org/apache/pulsar/client/api/BrokerServiceLookupTest.java
@@ -70,11 +70,10 @@ import org.apache.pulsar.broker.loadbalance.impl.ModularLoadManagerImpl;
 import org.apache.pulsar.broker.loadbalance.impl.ModularLoadManagerWrapper;
 import org.apache.pulsar.broker.loadbalance.impl.SimpleResourceUnit;
 import org.apache.pulsar.broker.namespace.NamespaceService;
-import org.apache.pulsar.client.api.ProducerConfiguration.MessageRoutingMode;
 import org.apache.pulsar.client.impl.auth.AuthenticationTls;
-import org.apache.pulsar.common.naming.TopicName;
 import org.apache.pulsar.common.naming.NamespaceBundle;
 import org.apache.pulsar.common.naming.ServiceUnitId;
+import org.apache.pulsar.common.naming.TopicName;
 import org.apache.pulsar.common.partition.PartitionedTopicMetadata;
 import org.apache.pulsar.common.policies.data.ClusterData;
 import org.apache.pulsar.common.policies.data.PropertyAdmin;
@@ -105,6 +104,7 @@ import com.google.common.util.concurrent.MoreExecutors;
 import io.netty.handler.codec.http.HttpRequest;
 import io.netty.handler.codec.http.HttpResponse;
 import io.netty.handler.ssl.util.InsecureTrustManagerFactory;
+import lombok.Cleanup;
 
 public class BrokerServiceLookupTest extends ProducerConsumerBase {
     private static final Logger log = LoggerFactory.getLogger(BrokerServiceLookupTest.class);
@@ -114,10 +114,9 @@ public class BrokerServiceLookupTest extends ProducerConsumerBase {
     protected void setup() throws Exception {
         conf.setDefaultNumberOfNamespaceBundles(1);
         super.init();
-        org.apache.pulsar.client.api.ClientConfiguration clientConf = new org.apache.pulsar.client.api.ClientConfiguration();
-        clientConf.setStatsInterval(0, TimeUnit.SECONDS);
         URI brokerServiceUrl = new URI("pulsar://localhost:" + BROKER_PORT);
-        pulsarClient = PulsarClient.create(brokerServiceUrl.toString(), clientConf);
+        pulsarClient = PulsarClient.builder().serviceUrl(brokerServiceUrl.toString()).statsInterval(0, TimeUnit.SECONDS)
+                .build();
         super.producerBaseSetup();
     }
 
@@ -127,14 +126,13 @@ public class BrokerServiceLookupTest extends ProducerConsumerBase {
         super.internalCleanup();
     }
 
-
     /**
      * UsecaseL Multiple Broker => Lookup Redirection test
      *
-     * 1. Broker1 is a leader
-     * 2. Lookup request reaches to Broker2 which redirects to leader (Broker1) with authoritative = false
-     * 3. Leader (Broker1) finds out least loaded broker as Broker2 and redirects request to Broker2 with authoritative = true
-     * 4. Broker2 receives final request to own a bundle with authoritative = true and client connects to Broker2
+     * 1. Broker1 is a leader 2. Lookup request reaches to Broker2 which redirects to leader (Broker1) with
+     * authoritative = false 3. Leader (Broker1) finds out least loaded broker as Broker2 and redirects request to
+     * Broker2 with authoritative = true 4. Broker2 receives final request to own a bundle with authoritative = true and
+     * client connects to Broker2
      *
      * @throws Exception
      */
@@ -156,7 +154,6 @@ public class BrokerServiceLookupTest extends ProducerConsumerBase {
         pulsar.getLoadManager().get().writeLoadReportOnZookeeper();
         pulsar2.getLoadManager().get().writeLoadReportOnZookeeper();
 
-
         LoadManager loadManager1 = spy(pulsar.getLoadManager().get());
         LoadManager loadManager2 = spy(pulsar2.getLoadManager().get());
         Field loadManagerField = NamespaceService.class.getDeclaredField("loadManager");
@@ -175,19 +172,20 @@ public class BrokerServiceLookupTest extends ProducerConsumerBase {
         /**** started broker-2 ****/
 
         URI brokerServiceUrl = new URI("pulsar://localhost:" + conf2.getBrokerServicePort());
-        PulsarClient pulsarClient2 = PulsarClient.create(brokerServiceUrl.toString(), new ClientConfiguration());
+        PulsarClient pulsarClient2 = PulsarClient.builder().serviceUrl(brokerServiceUrl.toString()).build();
 
         // load namespace-bundle by calling Broker2
-        Consumer consumer = pulsarClient2.subscribe("persistent://my-property/use/my-ns/my-topic1", "my-subscriber-name",
-                new ConsumerConfiguration());
-        Producer producer = pulsarClient.createProducer("persistent://my-property/use/my-ns/my-topic1", new ProducerConfiguration());
+        Consumer<byte[]> consumer = pulsarClient2.newConsumer().topic("persistent://my-property/use/my-ns/my-topic1")
+                .subscriptionName("my-subscriber-name").subscribe();
+        Producer<byte[]> producer = pulsarClient.newProducer().topic("persistent://my-property/use/my-ns/my-topic1")
+                .create();
 
         for (int i = 0; i < 10; i++) {
             String message = "my-message-" + i;
             producer.send(message.getBytes());
         }
 
-        Message msg = null;
+        Message<byte[]> msg = null;
         Set<String> messageSet = Sets.newHashSet();
         for (int i = 0; i < 10; i++) {
             msg = consumer.receive(5, TimeUnit.SECONDS);
@@ -209,11 +207,9 @@ public class BrokerServiceLookupTest extends ProducerConsumerBase {
     }
 
     /**
-     * Usecase: Redirection due to different cluster
-     * 1. Broker1 runs on cluster: "use" and Broker2 runs on cluster: "use2"
-     * 2. Broker1 receives "use2" cluster request => Broker1 reads "/clusters" from global-zookkeeper and
-     * redirects request to Broker2 whch serves "use2"
-     * 3. Broker2 receives redirect request and own namespace bundle
+     * Usecase: Redirection due to different cluster 1. Broker1 runs on cluster: "use" and Broker2 runs on cluster:
+     * "use2" 2. Broker1 receives "use2" cluster request => Broker1 reads "/clusters" from global-zookkeeper and
+     * redirects request to Broker2 whch serves "use2" 3. Broker2 receives redirect request and own namespace bundle
      *
      * @throws Exception
      */
@@ -235,18 +231,18 @@ public class BrokerServiceLookupTest extends ProducerConsumerBase {
         conf2.setZookeeperServers("localhost:2181");
         String broker2ServiceUrl = "pulsar://localhost:" + conf2.getBrokerServicePort();
 
-        admin.clusters().createCluster(newCluster, new ClusterData("http://127.0.0.1:" + BROKER_WEBSERVICE_PORT, null, broker2ServiceUrl, null));
+        admin.clusters().createCluster(newCluster,
+                new ClusterData("http://127.0.0.1:" + BROKER_WEBSERVICE_PORT, null, broker2ServiceUrl, null));
         admin.properties().createProperty(property,
                 new PropertyAdmin(Lists.newArrayList("appid1", "appid2"), Sets.newHashSet(newCluster)));
         admin.namespaces().createNamespace(property + "/" + newCluster + "/my-ns");
 
-
         PulsarService pulsar2 = startBroker(conf2);
         pulsar.getLoadManager().get().writeLoadReportOnZookeeper();
         pulsar2.getLoadManager().get().writeLoadReportOnZookeeper();
 
         URI brokerServiceUrl = new URI(broker2ServiceUrl);
-        PulsarClient pulsarClient2 = PulsarClient.create(brokerServiceUrl.toString(), new ClientConfiguration());
+        PulsarClient pulsarClient2 = PulsarClient.builder().serviceUrl(brokerServiceUrl.toString()).build();
 
         // enable authorization: so, broker can validate cluster and redirect if finds different cluster
         pulsar.getConfiguration().setAuthorizationEnabled(true);
@@ -266,16 +262,17 @@ public class BrokerServiceLookupTest extends ProducerConsumerBase {
         /**** started broker-2 ****/
 
         // load namespace-bundle by calling Broker2
-        Consumer consumer = pulsarClient.subscribe("persistent://my-property2/use2/my-ns/my-topic1", "my-subscriber-name",
-                new ConsumerConfiguration());
-        Producer producer = pulsarClient2.createProducer("persistent://my-property2/use2/my-ns/my-topic1", new ProducerConfiguration());
+        Consumer<byte[]> consumer = pulsarClient.newConsumer().topic("persistent://my-property2/use2/my-ns/my-topic1")
+                .subscriptionName("my-subscriber-name").subscribe();
+        Producer<byte[]> producer = pulsarClient2.newProducer().topic("persistent://my-property2/use2/my-ns/my-topic1")
+                .create();
 
         for (int i = 0; i < 10; i++) {
             String message = "my-message-" + i;
             producer.send(message.getBytes());
         }
 
-        Message msg = null;
+        Message<byte[]> msg = null;
         Set<String> messageSet = Sets.newHashSet();
         for (int i = 0; i < 10; i++) {
             msg = consumer.receive(5, TimeUnit.SECONDS);
@@ -298,10 +295,8 @@ public class BrokerServiceLookupTest extends ProducerConsumerBase {
     }
 
     /**
-     * Create #PartitionedTopic and let it served by multiple brokers which requries
-     * a. tcp partitioned-metadata-lookup
-     * b. multiple topic-lookup
-     * c. partitioned producer-consumer
+     * Create #PartitionedTopic and let it served by multiple brokers which requries a. tcp partitioned-metadata-lookup
+     * b. multiple topic-lookup c. partitioned producer-consumer
      *
      * @throws Exception
      */
@@ -312,9 +307,6 @@ public class BrokerServiceLookupTest extends ProducerConsumerBase {
         int numPartitions = 8;
         TopicName topicName = TopicName.get("persistent://my-property/use/my-ns/my-partitionedtopic1");
 
-        ConsumerConfiguration conf = new ConsumerConfiguration();
-        conf.setSubscriptionType(SubscriptionType.Exclusive);
-
         admin.persistentTopics().createPartitionedTopic(topicName.toString(), numPartitions);
 
         /**** start broker-2 ****/
@@ -331,7 +323,6 @@ public class BrokerServiceLookupTest extends ProducerConsumerBase {
         pulsar.getLoadManager().get().writeLoadReportOnZookeeper();
         pulsar2.getLoadManager().get().writeLoadReportOnZookeeper();
 
-
         LoadManager loadManager1 = spy(pulsar.getLoadManager().get());
         LoadManager loadManager2 = spy(pulsar2.getLoadManager().get());
         Field loadManagerField = NamespaceService.class.getDeclaredField("loadManager");
@@ -344,20 +335,20 @@ public class BrokerServiceLookupTest extends ProducerConsumerBase {
         // mock: redirect request to leader
         doReturn(true).when(loadManager2).isCentralized();
         loadManagerField.set(pulsar2.getNamespaceService(), new AtomicReference<>(loadManager2));
-        /****  broker-2 started ****/
+        /**** broker-2 started ****/
 
-        ProducerConfiguration producerConf = new ProducerConfiguration();
-        producerConf.setMessageRoutingMode(MessageRoutingMode.RoundRobinPartition);
-        Producer producer = pulsarClient.createProducer(topicName.toString(), producerConf);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName.toString())
+                .messageRoutingMode(MessageRoutingMode.RoundRobinPartition).create();
 
-        Consumer consumer = pulsarClient.subscribe(topicName.toString(), "my-partitioned-subscriber", conf);
+        Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topicName.toString())
+                .subscriptionName("my-partitioned-subscriber").subscribe();
 
         for (int i = 0; i < 20; i++) {
             String message = "my-message-" + i;
             producer.send(message.getBytes());
         }
 
-        Message msg = null;
+        Message<byte[]> msg = null;
         Set<String> messageSet = Sets.newHashSet();
         for (int i = 0; i < 20; i++) {
             msg = consumer.receive(5, TimeUnit.SECONDS);
@@ -380,109 +371,105 @@ public class BrokerServiceLookupTest extends ProducerConsumerBase {
     }
 
     /**
-     * 1. Start broker1 and broker2 with tls enable
-     * 2. Hit HTTPS lookup url at broker2 which redirects to HTTPS broker1
+     * 1. Start broker1 and broker2 with tls enable 2. Hit HTTPS lookup url at broker2 which redirects to HTTPS broker1
      *
      * @throws Exception
      */
     @Test
-	public void testWebserviceServiceTls() throws Exception {
-		log.info("-- Starting {} test --", methodName);
-		final String TLS_SERVER_CERT_FILE_PATH = "./src/test/resources/certificate/server.crt";
-		final String TLS_SERVER_KEY_FILE_PATH = "./src/test/resources/certificate/server.key";
-		final String TLS_CLIENT_CERT_FILE_PATH = "./src/test/resources/certificate/client.crt";
-		final String TLS_CLIENT_KEY_FILE_PATH = "./src/test/resources/certificate/client.key";
-
-		/**** start broker-2 ****/
-		ServiceConfiguration conf2 = new ServiceConfiguration();
-		conf2.setAdvertisedAddress("localhost");
-		conf2.setBrokerServicePort(PortManager.nextFreePort());
-		conf2.setBrokerServicePortTls(PortManager.nextFreePort());
-		conf2.setWebServicePort(PortManager.nextFreePort());
-		conf2.setWebServicePortTls(PortManager.nextFreePort());
-		conf2.setAdvertisedAddress("localhost");
-		conf2.setTlsAllowInsecureConnection(true);
-		conf2.setTlsEnabled(true);
-		conf2.setTlsCertificateFilePath(TLS_SERVER_CERT_FILE_PATH);
-		conf2.setTlsKeyFilePath(TLS_SERVER_KEY_FILE_PATH);
-		conf2.setClusterName(conf.getClusterName());
-		conf2.setZookeeperServers("localhost:2181");
-		PulsarService pulsar2 = startBroker(conf2);
-
-		// restart broker1 with tls enabled
-		conf.setTlsAllowInsecureConnection(true);
-		conf.setTlsEnabled(true);
-		conf.setTlsCertificateFilePath(TLS_SERVER_CERT_FILE_PATH);
-		conf.setTlsKeyFilePath(TLS_SERVER_KEY_FILE_PATH);
-		stopBroker();
-		startBroker();
-		pulsar.getLoadManager().get().writeLoadReportOnZookeeper();
-		pulsar2.getLoadManager().get().writeLoadReportOnZookeeper();
-
-		LoadManager loadManager1 = spy(pulsar.getLoadManager().get());
-		LoadManager loadManager2 = spy(pulsar2.getLoadManager().get());
-		Field loadManagerField = NamespaceService.class.getDeclaredField("loadManager");
-		loadManagerField.setAccessible(true);
-
-		// mock: redirect request to leader [2]
-		doReturn(true).when(loadManager2).isCentralized();
-		loadManagerField.set(pulsar2.getNamespaceService(), new AtomicReference<>(loadManager2));
-
-		// mock: return Broker2 as a Least-loaded broker when leader receies
-		// request [3]
-		doReturn(true).when(loadManager1).isCentralized();
-		SimpleResourceUnit resourceUnit = new SimpleResourceUnit(pulsar2.getWebServiceAddress(), null);
-		doReturn(Optional.of(resourceUnit)).when(loadManager1).getLeastLoaded(any(ServiceUnitId.class));
-		loadManagerField.set(pulsar.getNamespaceService(), new AtomicReference<>(loadManager1));
-
-		/**** started broker-2 ****/
-
-		URI brokerServiceUrl = new URI("pulsar://localhost:" + conf2.getBrokerServicePort());
-		PulsarClient pulsarClient2 = PulsarClient.create(brokerServiceUrl.toString(), new ClientConfiguration());
-
-		final String lookupResourceUrl = "/lookup/v2/destination/persistent/my-property/use/my-ns/my-topic1";
-
-		// set client cert_key file
-		KeyManager[] keyManagers = null;
-		Certificate[] tlsCert = SecurityUtility.loadCertificatesFromPemFile(TLS_CLIENT_CERT_FILE_PATH);
-		PrivateKey tlsKey = SecurityUtility.loadPrivateKeyFromPemFile(TLS_CLIENT_KEY_FILE_PATH);
-		KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
-		ks.load(null, null);
-		ks.setKeyEntry("private", tlsKey, "".toCharArray(), tlsCert);
-		KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
-		kmf.init(ks, "".toCharArray());
-		keyManagers = kmf.getKeyManagers();
-		TrustManager[] trustManagers = InsecureTrustManagerFactory.INSTANCE.getTrustManagers();
-		SSLContext sslCtx = SSLContext.getInstance("TLS");
-		sslCtx.init(keyManagers, trustManagers, new SecureRandom());
-		HttpsURLConnection.setDefaultSSLSocketFactory(sslCtx.getSocketFactory());
-
-
-		// hit broker2 url
-		URLConnection con = new URL(pulsar2.getWebServiceAddressTls() + lookupResourceUrl).openConnection();
-		log.info("orignal url: {}", con.getURL());
-		con.connect();
-		log.info("connected url: {} ", con.getURL());
-		// assert connect-url: broker2-https
-		assertEquals(con.getURL().getPort(), conf2.getWebServicePortTls());
-		InputStream is = con.getInputStream();
-		// assert redirect-url: broker1-https only
-		log.info("redirected url: {}", con.getURL());
-		assertEquals(con.getURL().getPort(), conf.getWebServicePortTls());
-		is.close();
-
-		pulsarClient2.close();
-		pulsar2.close();
-		loadManager1 = null;
-		loadManager2 = null;
-
-	}
+    public void testWebserviceServiceTls() throws Exception {
+        log.info("-- Starting {} test --", methodName);
+        final String TLS_SERVER_CERT_FILE_PATH = "./src/test/resources/certificate/server.crt";
+        final String TLS_SERVER_KEY_FILE_PATH = "./src/test/resources/certificate/server.key";
+        final String TLS_CLIENT_CERT_FILE_PATH = "./src/test/resources/certificate/client.crt";
+        final String TLS_CLIENT_KEY_FILE_PATH = "./src/test/resources/certificate/client.key";
+
+        /**** start broker-2 ****/
+        ServiceConfiguration conf2 = new ServiceConfiguration();
+        conf2.setAdvertisedAddress("localhost");
+        conf2.setBrokerServicePort(PortManager.nextFreePort());
+        conf2.setBrokerServicePortTls(PortManager.nextFreePort());
+        conf2.setWebServicePort(PortManager.nextFreePort());
+        conf2.setWebServicePortTls(PortManager.nextFreePort());
+        conf2.setAdvertisedAddress("localhost");
+        conf2.setTlsAllowInsecureConnection(true);
+        conf2.setTlsEnabled(true);
+        conf2.setTlsCertificateFilePath(TLS_SERVER_CERT_FILE_PATH);
+        conf2.setTlsKeyFilePath(TLS_SERVER_KEY_FILE_PATH);
+        conf2.setClusterName(conf.getClusterName());
+        conf2.setZookeeperServers("localhost:2181");
+        PulsarService pulsar2 = startBroker(conf2);
+
+        // restart broker1 with tls enabled
+        conf.setTlsAllowInsecureConnection(true);
+        conf.setTlsEnabled(true);
+        conf.setTlsCertificateFilePath(TLS_SERVER_CERT_FILE_PATH);
+        conf.setTlsKeyFilePath(TLS_SERVER_KEY_FILE_PATH);
+        stopBroker();
+        startBroker();
+        pulsar.getLoadManager().get().writeLoadReportOnZookeeper();
+        pulsar2.getLoadManager().get().writeLoadReportOnZookeeper();
+
+        LoadManager loadManager1 = spy(pulsar.getLoadManager().get());
+        LoadManager loadManager2 = spy(pulsar2.getLoadManager().get());
+        Field loadManagerField = NamespaceService.class.getDeclaredField("loadManager");
+        loadManagerField.setAccessible(true);
+
+        // mock: redirect request to leader [2]
+        doReturn(true).when(loadManager2).isCentralized();
+        loadManagerField.set(pulsar2.getNamespaceService(), new AtomicReference<>(loadManager2));
+
+        // mock: return Broker2 as a Least-loaded broker when leader receies
+        // request [3]
+        doReturn(true).when(loadManager1).isCentralized();
+        SimpleResourceUnit resourceUnit = new SimpleResourceUnit(pulsar2.getWebServiceAddress(), null);
+        doReturn(Optional.of(resourceUnit)).when(loadManager1).getLeastLoaded(any(ServiceUnitId.class));
+        loadManagerField.set(pulsar.getNamespaceService(), new AtomicReference<>(loadManager1));
+
+        /**** started broker-2 ****/
+
+        URI brokerServiceUrl = new URI("pulsar://localhost:" + conf2.getBrokerServicePort());
+        PulsarClient pulsarClient2 = PulsarClient.builder().serviceUrl(brokerServiceUrl.toString()).build();
+
+        final String lookupResourceUrl = "/lookup/v2/destination/persistent/my-property/use/my-ns/my-topic1";
+
+        // set client cert_key file
+        KeyManager[] keyManagers = null;
+        Certificate[] tlsCert = SecurityUtility.loadCertificatesFromPemFile(TLS_CLIENT_CERT_FILE_PATH);
+        PrivateKey tlsKey = SecurityUtility.loadPrivateKeyFromPemFile(TLS_CLIENT_KEY_FILE_PATH);
+        KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
+        ks.load(null, null);
+        ks.setKeyEntry("private", tlsKey, "".toCharArray(), tlsCert);
+        KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
+        kmf.init(ks, "".toCharArray());
+        keyManagers = kmf.getKeyManagers();
+        TrustManager[] trustManagers = InsecureTrustManagerFactory.INSTANCE.getTrustManagers();
+        SSLContext sslCtx = SSLContext.getInstance("TLS");
+        sslCtx.init(keyManagers, trustManagers, new SecureRandom());
+        HttpsURLConnection.setDefaultSSLSocketFactory(sslCtx.getSocketFactory());
+
+        // hit broker2 url
+        URLConnection con = new URL(pulsar2.getWebServiceAddressTls() + lookupResourceUrl).openConnection();
+        log.info("orignal url: {}", con.getURL());
+        con.connect();
+        log.info("connected url: {} ", con.getURL());
+        // assert connect-url: broker2-https
+        assertEquals(con.getURL().getPort(), conf2.getWebServicePortTls());
+        InputStream is = con.getInputStream();
+        // assert redirect-url: broker1-https only
+        log.info("redirected url: {}", con.getURL());
+        assertEquals(con.getURL().getPort(), conf.getWebServicePortTls());
+        is.close();
+
+        pulsarClient2.close();
+        pulsar2.close();
+        loadManager1 = null;
+        loadManager2 = null;
+
+    }
 
     /**
-     * Discovery-Service lookup over binary-protocol
-     * 1. Start discovery service
-     * 2. start broker
-     * 3. Create Producer/Consumer: by calling Discovery service for partitionedMetadata and topic lookup
+     * Discovery-Service lookup over binary-protocol 1. Start discovery service 2. start broker 3. Create
+     * Producer/Consumer: by calling Discovery service for partitionedMetadata and topic lookup
      *
      * @throws Exception
      */
@@ -499,18 +486,18 @@ public class BrokerServiceLookupTest extends ProducerConsumerBase {
 
         // (2) lookup using discovery service
         final String discoverySvcUrl = discoveryService.getServiceUrl();
-        ClientConfiguration clientConfig = new ClientConfiguration();
-        PulsarClient pulsarClient2 = PulsarClient.create(discoverySvcUrl, clientConfig);
-        Consumer consumer = pulsarClient2.subscribe("persistent://my-property2/use2/my-ns/my-topic1", "my-subscriber-name",
-                new ConsumerConfiguration());
-        Producer producer = pulsarClient2.createProducer("persistent://my-property2/use2/my-ns/my-topic1", new ProducerConfiguration());
+        PulsarClient pulsarClient2 = PulsarClient.builder().serviceUrl(discoverySvcUrl).build();
+        Consumer<byte[]> consumer = pulsarClient2.newConsumer().topic("persistent://my-property2/use2/my-ns/my-topic1")
+                .subscriptionName("my-subscriber-name").subscribe();
+        Producer<byte[]> producer = pulsarClient2.newProducer().topic("persistent://my-property2/use2/my-ns/my-topic1")
+                .create();
 
         for (int i = 0; i < 10; i++) {
             String message = "my-message-" + i;
             producer.send(message.getBytes());
         }
 
-        Message msg = null;
+        Message<byte[]> msg = null;
         Set<String> messageSet = Sets.newHashSet();
         for (int i = 0; i < 10; i++) {
             msg = consumer.receive(5, TimeUnit.SECONDS);
@@ -526,12 +513,12 @@ public class BrokerServiceLookupTest extends ProducerConsumerBase {
 
     }
 
-
     /**
      * Verify discovery-service binary-proto lookup using tls
      *
      * @throws Exception
      */
+    @SuppressWarnings("deprecation")
     @Test
     public void testDiscoveryLookupTls() throws Exception {
 
@@ -562,29 +549,26 @@ public class BrokerServiceLookupTest extends ProducerConsumerBase {
 
         // (3) lookup using discovery service
         final String discoverySvcUrl = discoveryService.getServiceUrlTls();
-        ClientConfiguration clientConfig = new ClientConfiguration();
 
         Map<String, String> authParams = new HashMap<>();
         authParams.put("tlsCertFile", TLS_CLIENT_CERT_FILE_PATH);
         authParams.put("tlsKeyFile", TLS_CLIENT_KEY_FILE_PATH);
         Authentication auth = new AuthenticationTls();
         auth.configure(authParams);
-        clientConfig.setAuthentication(auth);
-        clientConfig.setUseTls(true);
-        clientConfig.setTlsAllowInsecureConnection(true);
-
 
-        PulsarClient pulsarClient2 = PulsarClient.create(discoverySvcUrl, clientConfig);
-        Consumer consumer = pulsarClient2.subscribe("persistent://my-property2/use2/my-ns/my-topic1", "my-subscriber-name",
-                new ConsumerConfiguration());
-        Producer producer = pulsarClient2.createProducer("persistent://my-property2/use2/my-ns/my-topic1", new ProducerConfiguration());
+        PulsarClient pulsarClient2 = PulsarClient.builder().serviceUrl(discoverySvcUrl).authentication(auth)
+                .enableTls(true).allowTlsInsecureConnection(true).build();
+        Consumer<byte[]> consumer = pulsarClient2.newConsumer().topic("persistent://my-property2/use2/my-ns/my-topic1")
+                .subscriptionName("my-subscriber-name").subscribe();
+        Producer<byte[]> producer = pulsarClient2.newProducer().topic("persistent://my-property2/use2/my-ns/my-topic1")
+                .create();
 
         for (int i = 0; i < 10; i++) {
             String message = "my-message-" + i;
             producer.send(message.getBytes());
         }
 
-        Message msg = null;
+        Message<byte[]> msg = null;
         Set<String> messageSet = Sets.newHashSet();
         for (int i = 0; i < 10; i++) {
             msg = consumer.receive(5, TimeUnit.SECONDS);
@@ -619,42 +603,45 @@ public class BrokerServiceLookupTest extends ProducerConsumerBase {
 
         // (2) lookup using discovery service
         final String discoverySvcUrl = discoveryService.getServiceUrl();
-        ClientConfiguration clientConfig = new ClientConfiguration();
         // set authentication data
-        clientConfig.setAuthentication(new Authentication() {
+        Authentication auth = new Authentication() {
             private static final long serialVersionUID = 1L;
 
             @Override
             public void close() throws IOException {
             }
+
             @Override
             public String getAuthMethodName() {
                 return "auth";
             }
+
             @Override
             public AuthenticationDataProvider getAuthData() throws PulsarClientException {
                 return new AuthenticationDataProvider() {
                     private static final long serialVersionUID = 1L;
                 };
             }
+
             @Override
             public void configure(Map<String, String> authParams) {
             }
+
             @Override
             public void start() throws PulsarClientException {
             }
-        });
+        };
 
-        PulsarClient pulsarClient = PulsarClient.create(discoverySvcUrl, clientConfig);
-        Consumer consumer = pulsarClient.subscribe("persistent://my-property/use2/my-ns/my-topic1",
-                "my-subscriber-name", new ConsumerConfiguration());
-        Producer producer = pulsarClient.createProducer("persistent://my-property/use2/my-ns/my-topic1",
-                new ProducerConfiguration());
+        PulsarClient pulsarClient = PulsarClient.builder().serviceUrl(discoverySvcUrl).authentication(auth).build();
+        Consumer<byte[]> consumer = pulsarClient.newConsumer().topic("persistent://my-property/use2/my-ns/my-topic1")
+                .subscriptionName("my-subscriber-name").subscribe();
+        Producer<byte[]> producer = pulsarClient.newProducer().topic("persistent://my-property/use2/my-ns/my-topic1")
+                .create();
         for (int i = 0; i < 10; i++) {
             String message = "my-message-" + i;
             producer.send(message.getBytes());
         }
-        Message msg = null;
+        Message<byte[]> msg = null;
         Set<String> messageSet = Sets.newHashSet();
         for (int i = 0; i < 10; i++) {
             msg = consumer.receive(5, TimeUnit.SECONDS);
@@ -687,35 +674,41 @@ public class BrokerServiceLookupTest extends ProducerConsumerBase {
         discoveryService.start();
         // (2) lookup using discovery service
         final String discoverySvcUrl = discoveryService.getServiceUrl();
-        ClientConfiguration clientConfig = new ClientConfiguration();
+
         // set authentication data
-        clientConfig.setAuthentication(new Authentication() {
+        Authentication auth = new Authentication() {
             private static final long serialVersionUID = 1L;
 
             @Override
             public void close() throws IOException {
             }
+
             @Override
             public String getAuthMethodName() {
                 return "auth";
             }
+
             @Override
             public AuthenticationDataProvider getAuthData() throws PulsarClientException {
                 return new AuthenticationDataProvider() {
                     private static final long serialVersionUID = 1L;
                 };
             }
+
             @Override
             public void configure(Map<String, String> authParams) {
             }
+
             @Override
             public void start() throws PulsarClientException {
             }
-        });
-        PulsarClient pulsarClient = PulsarClient.create(discoverySvcUrl, clientConfig);
+        };
+
+        @Cleanup
+        PulsarClient pulsarClient = PulsarClient.builder().serviceUrl(discoverySvcUrl).authentication(auth).build();
         try {
-            pulsarClient.subscribe("persistent://my-property/use2/my-ns/my-topic1", "my-subscriber-name",
-                    new ConsumerConfiguration());
+            pulsarClient.newConsumer().topic("persistent://my-property/use2/my-ns/my-topic1")
+                    .subscriptionName("my-subscriber-name").subscribe();
             fail("should have failed due to authentication");
         } catch (PulsarClientException e) {
             // Ok: expected
@@ -740,35 +733,41 @@ public class BrokerServiceLookupTest extends ProducerConsumerBase {
         discoveryService.start();
         // (2) lookup using discovery service
         final String discoverySvcUrl = discoveryService.getServiceUrl();
-        ClientConfiguration clientConfig = new ClientConfiguration();
+
         // set authentication data
-        clientConfig.setAuthentication(new Authentication() {
+        Authentication auth = new Authentication() {
             private static final long serialVersionUID = 1L;
 
             @Override
             public void close() throws IOException {
             }
+
             @Override
             public String getAuthMethodName() {
                 return "auth";
             }
+
             @Override
             public AuthenticationDataProvider getAuthData() throws PulsarClientException {
                 return new AuthenticationDataProvider() {
                     private static final long serialVersionUID = 1L;
                 };
             }
+
             @Override
             public void configure(Map<String, String> authParams) {
             }
+
             @Override
             public void start() throws PulsarClientException {
             }
-        });
-        PulsarClient pulsarClient = PulsarClient.create(discoverySvcUrl, clientConfig);
+        };
+
+        @Cleanup
+        PulsarClient pulsarClient = PulsarClient.builder().serviceUrl(discoverySvcUrl).authentication(auth).build();
         try {
-            pulsarClient.subscribe("persistent://my-property/use2/my-ns/my-topic1", "my-subscriber-name",
-                    new ConsumerConfiguration());
+            pulsarClient.newConsumer().topic("persistent://my-property/use2/my-ns/my-topic1")
+                    .subscriptionName("my-subscriber-name").subscribe();
             fail("should have failed due to authentication");
         } catch (PulsarClientException e) {
             // Ok: expected
@@ -833,11 +832,12 @@ public class BrokerServiceLookupTest extends ProducerConsumerBase {
         loadManagerField.set(pulsar.getNamespaceService(), new AtomicReference<>(loadManager1));
 
         URI broker2ServiceUrl = new URI("pulsar://localhost:" + conf2.getBrokerServicePort());
-        PulsarClient pulsarClient2 = PulsarClient.create(broker2ServiceUrl.toString(), new ClientConfiguration());
+        PulsarClient pulsarClient2 = PulsarClient.builder().serviceUrl(broker2ServiceUrl.toString()).build();
 
         // (3) Broker-2 receives topic-1 request, creates local-policies and sets the watch
         final String topic1 = "persistent://" + namespace + "/topic1";
-        Consumer consumer1 = pulsarClient2.subscribe(topic1, "my-subscriber-name", new ConsumerConfiguration());
+        Consumer<byte[]> consumer1 = pulsarClient2.newConsumer().topic(topic1).subscriptionName("my-subscriber-name")
+                .subscribe();
 
         Set<String> serviceUnits1 = pulsar.getNamespaceService().getOwnedServiceUnits().stream()
                 .map(nb -> nb.toString()).collect(Collectors.toSet());
@@ -865,10 +865,10 @@ public class BrokerServiceLookupTest extends ProducerConsumerBase {
 
         // (7) Make lookup request again to Broker-2 which should succeed.
         final String topic2 = "persistent://" + namespace + "/topic2";
-        Consumer consumer2 = pulsarClient.subscribe(topic2, "my-subscriber-name", new ConsumerConfiguration());
+        Consumer<byte[]> consumer2 = pulsarClient.newConsumer().topic(topic2).subscriptionName("my-subscriber-name")
+                .subscribe();
 
-        NamespaceBundle bundleInBroker1AfterSplit = pulsar2.getNamespaceService()
-                .getBundle(TopicName.get(topic2));
+        NamespaceBundle bundleInBroker1AfterSplit = pulsar2.getNamespaceService().getBundle(TopicName.get(topic2));
         assertFalse(bundleInBroker1AfterSplit.equals(unsplitBundle));
 
         consumer1.close();
@@ -942,11 +942,12 @@ public class BrokerServiceLookupTest extends ProducerConsumerBase {
             loadManagerField.set(pulsar.getNamespaceService(), new AtomicReference<>(loadManager1));
 
             URI broker2ServiceUrl = new URI("pulsar://localhost:" + conf2.getBrokerServicePort());
-            PulsarClient pulsarClient2 = PulsarClient.create(broker2ServiceUrl.toString(), new ClientConfiguration());
+            PulsarClient pulsarClient2 = PulsarClient.builder().serviceUrl(broker2ServiceUrl.toString()).build();
 
             // (3) Broker-2 receives topic-1 request, creates local-policies and sets the watch
             final String topic1 = "persistent://" + namespace + "/topic1";
-            Consumer consumer1 = pulsarClient2.subscribe(topic1, "my-subscriber-name", new ConsumerConfiguration());
+            Consumer<byte[]> consumer1 = pulsarClient2.newConsumer().topic(topic1)
+                    .subscriptionName("my-subscriber-name").subscribe();
 
             Set<String> serviceUnits1 = pulsar.getNamespaceService().getOwnedServiceUnits().stream()
                     .map(nb -> nb.toString()).collect(Collectors.toSet());
@@ -994,10 +995,10 @@ public class BrokerServiceLookupTest extends ProducerConsumerBase {
 
             // (7) Make lookup request again to Broker-2 which should succeed.
             final String topic2 = "persistent://" + namespace + "/topic2";
-            Consumer consumer2 = pulsarClient.subscribe(topic2, "my-subscriber-name", new ConsumerConfiguration());
+            Consumer<byte[]> consumer2 = pulsarClient.newConsumer().topic(topic2).subscriptionName("my-subscriber-name")
+                    .subscribe();
 
-            NamespaceBundle bundleInBroker1AfterSplit = pulsar2.getNamespaceService()
-                    .getBundle(TopicName.get(topic2));
+            NamespaceBundle bundleInBroker1AfterSplit = pulsar2.getNamespaceService().getBundle(TopicName.get(topic2));
             assertFalse(bundleInBroker1AfterSplit.equals(unsplitBundle));
 
             consumer1.close();
@@ -1152,13 +1153,16 @@ public class BrokerServiceLookupTest extends ProducerConsumerBase {
         @Override
         public void close() throws IOException {
         }
+
         @Override
         public void initialize(ServiceConfiguration config) throws IOException {
         }
+
         @Override
         public String getAuthMethodName() {
             return "auth";
         }
+
         @Override
         public String authenticate(AuthenticationDataSource authData) throws AuthenticationException {
             return "appid1";
diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/client/api/ClientDeduplicationTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/client/api/ClientDeduplicationTest.java
index fb5cc0f..de8c24c 100644
--- a/pulsar-broker/src/test/java/org/apache/pulsar/client/api/ClientDeduplicationTest.java
+++ b/pulsar-broker/src/test/java/org/apache/pulsar/client/api/ClientDeduplicationTest.java
@@ -46,9 +46,9 @@ public class ClientDeduplicationTest extends ProducerConsumerBase {
         String topic = "persistent://my-property/use/my-ns/testProducerSequenceAfterReconnect";
         admin.namespaces().setDeduplicationStatus("my-property/use/my-ns", true);
 
-        ProducerConfiguration conf = new ProducerConfiguration();
-        conf.setProducerName("my-producer-name");
-        Producer producer = pulsarClient.createProducer(topic, conf);
+        ProducerBuilder<byte[]> producerBuilder = pulsarClient.newProducer().topic(topic)
+                .producerName("my-producer-name");
+        Producer<byte[]> producer = producerBuilder.create();
 
         assertEquals(producer.getLastSequenceId(), -1L);
 
@@ -60,7 +60,7 @@ public class ClientDeduplicationTest extends ProducerConsumerBase {
 
         producer.close();
 
-        producer = pulsarClient.createProducer(topic, conf);
+        producer = producerBuilder.create();
         assertEquals(producer.getLastSequenceId(), 9L);
 
         for (int i = 10; i < 20; i++) {
@@ -77,9 +77,9 @@ public class ClientDeduplicationTest extends ProducerConsumerBase {
         String topic = "persistent://my-property/use/my-ns/testProducerSequenceAfterRestart";
         admin.namespaces().setDeduplicationStatus("my-property/use/my-ns", true);
 
-        ProducerConfiguration conf = new ProducerConfiguration();
-        conf.setProducerName("my-producer-name");
-        Producer producer = pulsarClient.createProducer(topic, conf);
+        ProducerBuilder<byte[]> producerBuilder = pulsarClient.newProducer().topic(topic)
+                .producerName("my-producer-name");
+        Producer<byte[]> producer = producerBuilder.create();
 
         assertEquals(producer.getLastSequenceId(), -1L);
 
@@ -94,7 +94,7 @@ public class ClientDeduplicationTest extends ProducerConsumerBase {
         // Kill and restart broker
         restartBroker();
 
-        producer = pulsarClient.createProducer(topic, conf);
+        producer = producerBuilder.create();
         assertEquals(producer.getLastSequenceId(), 9L);
 
         for (int i = 10; i < 20; i++) {
@@ -111,16 +111,15 @@ public class ClientDeduplicationTest extends ProducerConsumerBase {
         String topic = "persistent://my-property/use/my-ns/testProducerDeduplication";
         admin.namespaces().setDeduplicationStatus("my-property/use/my-ns", true);
 
-        ProducerConfiguration conf = new ProducerConfiguration();
-        conf.setProducerName("my-producer-name");
-
         // Set infinite timeout
-        conf.setSendTimeout(0, TimeUnit.SECONDS);
-        Producer producer = pulsarClient.createProducer(topic, conf);
+        ProducerBuilder<byte[]> producerBuilder = pulsarClient.newProducer().topic(topic)
+                .producerName("my-producer-name").sendTimeout(0, TimeUnit.SECONDS);
+        Producer<byte[]> producer = producerBuilder.create();
 
         assertEquals(producer.getLastSequenceId(), -1L);
 
-        Consumer consumer = pulsarClient.subscribe(topic, "my-subscription");
+        Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topic).subscriptionName("my-subscription")
+                .subscribe();
 
         producer.send(MessageBuilder.create().setContent("my-message-0".getBytes()).setSequenceId(0).build());
         producer.send(MessageBuilder.create().setContent("my-message-1".getBytes()).setSequenceId(1).build());
@@ -133,19 +132,19 @@ public class ClientDeduplicationTest extends ProducerConsumerBase {
         producer.close();
 
         for (int i = 0; i < 3; i++) {
-            Message msg = consumer.receive();
+            Message<byte[]> msg = consumer.receive();
             assertEquals(new String(msg.getData()), "my-message-" + i);
             consumer.acknowledge(msg);
         }
 
         // No other messages should be received
-        Message msg = consumer.receive(1, TimeUnit.SECONDS);
+        Message<byte[]> msg = consumer.receive(1, TimeUnit.SECONDS);
         assertNull(msg);
 
         // Kill and restart broker
         restartBroker();
 
-        producer = pulsarClient.createProducer(topic, conf);
+        producer = producerBuilder.create();
         assertEquals(producer.getLastSequenceId(), 2L);
 
         // Repeat the messages and verify they're not received by consumer
diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/client/api/ClientErrorsTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/client/api/ClientErrorsTest.java
index 2ef60c1..5d2b922 100644
--- a/pulsar-broker/src/test/java/org/apache/pulsar/client/api/ClientErrorsTest.java
+++ b/pulsar-broker/src/test/java/org/apache/pulsar/client/api/ClientErrorsTest.java
@@ -30,19 +30,12 @@ import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicReference;
 
 import org.apache.bookkeeper.test.PortManager;
-import org.apache.pulsar.client.api.ClientConfiguration;
-import org.apache.pulsar.client.api.Consumer;
-import org.apache.pulsar.client.api.ConsumerConfiguration;
-import org.apache.pulsar.client.api.Producer;
-import org.apache.pulsar.client.api.PulsarClient;
-import org.apache.pulsar.client.api.PulsarClientException;
-import org.apache.pulsar.client.api.SubscriptionType;
 import org.apache.pulsar.client.api.PulsarClientException.LookupException;
 import org.apache.pulsar.client.impl.ConsumerBase;
 import org.apache.pulsar.client.impl.ProducerBase;
 import org.apache.pulsar.common.api.Commands;
-import org.apache.pulsar.common.api.proto.PulsarApi.ServerError;
 import org.apache.pulsar.common.api.proto.PulsarApi.CommandLookupTopicResponse.LookupType;
+import org.apache.pulsar.common.api.proto.PulsarApi.ServerError;
 import org.testng.annotations.AfterClass;
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
@@ -78,13 +71,12 @@ public class ClientErrorsTest {
     public void testMockBrokerService() throws Exception {
         // test default actions of mock broker service
         try {
-            PulsarClient client = PulsarClient.create("http://127.0.0.1:" + WEB_SERVICE_PORT);
+            PulsarClient client = PulsarClient.builder().serviceUrl("http://127.0.0.1:" + WEB_SERVICE_PORT).build();
 
-            ConsumerConfiguration conf = new ConsumerConfiguration();
-            conf.setSubscriptionType(SubscriptionType.Exclusive);
-            Consumer consumer = client.subscribe("persistent://prop/use/ns/t1", "sub1", conf);
+            Consumer<byte[]> consumer = client.newConsumer().topic("persistent://prop/use/ns/t1")
+                    .subscriptionName("sub1").subscribe();
 
-            Producer producer = client.createProducer("persistent://prop/use/ns/t1");
+            Producer<byte[]> producer = client.newProducer().topic("persistent://prop/use/ns/t1").create();
             Thread.sleep(ASYNC_EVENT_COMPLETION_WAIT);
             producer.send("message".getBytes());
             Thread.sleep(ASYNC_EVENT_COMPLETION_WAIT);
@@ -110,7 +102,7 @@ public class ClientErrorsTest {
     }
 
     private void producerCreateFailWithoutRetry(String topic) throws Exception {
-        PulsarClient client = PulsarClient.create("http://127.0.0.1:" + WEB_SERVICE_PORT);
+        PulsarClient client = PulsarClient.builder().serviceUrl("http://127.0.0.1:" + WEB_SERVICE_PORT).build();
         final AtomicInteger counter = new AtomicInteger(0);
 
         mockBrokerService.setHandleProducer((ctx, producer) -> {
@@ -124,7 +116,7 @@ public class ClientErrorsTest {
         });
 
         try {
-            Producer producer = client.createProducer(topic);
+            client.newProducer().topic(topic).create();
         } catch (Exception e) {
             if (e.getMessage().equals(ASSERTION_ERROR)) {
                 fail("Producer create should not retry on auth error");
@@ -146,7 +138,7 @@ public class ClientErrorsTest {
     }
 
     private void producerCreateSuccessAfterRetry(String topic) throws Exception {
-        PulsarClient client = PulsarClient.create("http://127.0.0.1:" + WEB_SERVICE_PORT);
+        PulsarClient client = PulsarClient.builder().serviceUrl("http://127.0.0.1:" + WEB_SERVICE_PORT).build();
         final AtomicInteger counter = new AtomicInteger(0);
 
         mockBrokerService.setHandleProducer((ctx, producer) -> {
@@ -158,7 +150,7 @@ public class ClientErrorsTest {
         });
 
         try {
-            Producer producer = client.createProducer(topic);
+            client.newProducer().topic(topic).create();
         } catch (Exception e) {
             fail("Should not fail");
         }
@@ -178,10 +170,8 @@ public class ClientErrorsTest {
     }
 
     private void producerCreateFailAfterRetryTimeout(String topic) throws Exception {
-        ClientConfiguration conf = new ClientConfiguration();
-        conf.setOperationTimeout(1, TimeUnit.SECONDS);
-
-        PulsarClient client = PulsarClient.create("http://127.0.0.1:" + WEB_SERVICE_PORT, conf);
+        PulsarClient client = PulsarClient.builder().serviceUrl("http://127.0.0.1:" + WEB_SERVICE_PORT)
+                .operationTimeout(1, TimeUnit.SECONDS).build();
         final AtomicInteger counter = new AtomicInteger(0);
 
         mockBrokerService.setHandleProducer((ctx, producer) -> {
@@ -196,7 +186,7 @@ public class ClientErrorsTest {
         });
 
         try {
-            Producer producer = client.createProducer(topic);
+            client.newProducer().topic(topic).create();
             fail("Should have failed");
         } catch (Exception e) {
             // we fail even on the retriable error
@@ -218,7 +208,7 @@ public class ClientErrorsTest {
     }
 
     private void producerFailDoesNotFailOtherProducer(String topic1, String topic2) throws Exception {
-        PulsarClient client = PulsarClient.create("http://127.0.0.1:" + WEB_SERVICE_PORT);
+        PulsarClient client = PulsarClient.builder().serviceUrl("http://127.0.0.1:" + WEB_SERVICE_PORT).build();
         final AtomicInteger counter = new AtomicInteger(0);
 
         mockBrokerService.setHandleProducer((ctx, producer) -> {
@@ -228,14 +218,13 @@ public class ClientErrorsTest {
                 return;
             }
             ctx.writeAndFlush(Commands.newProducerSuccess(producer.getRequestId(), "default-producer"));
-
         });
 
-        ProducerBase producer1 = (ProducerBase) client.createProducer(topic1);
+        ProducerBase<byte[]> producer1 = (ProducerBase<byte[]>) client.newProducer().topic(topic1).create();
 
-        ProducerBase producer2 = null;
+        ProducerBase<byte[]> producer2 = null;
         try {
-            producer2 = (ProducerBase) client.createProducer(topic2);
+            producer2 = (ProducerBase<byte[]>) client.newProducer().topic(topic2).create();
             fail("Should have failed");
         } catch (Exception e) {
             // ok
@@ -259,7 +248,7 @@ public class ClientErrorsTest {
     }
 
     private void producerContinuousRetryAfterSendFail(String topic) throws Exception {
-        PulsarClient client = PulsarClient.create("http://127.0.0.1:" + WEB_SERVICE_PORT);
+        PulsarClient client = PulsarClient.builder().serviceUrl("http://127.0.0.1:" + WEB_SERVICE_PORT).build();
         final AtomicInteger counter = new AtomicInteger(0);
 
         mockBrokerService.setHandleProducer((ctx, producer) -> {
@@ -283,7 +272,7 @@ public class ClientErrorsTest {
         });
 
         try {
-            Producer producer = client.createProducer(topic);
+            Producer<byte[]> producer = client.newProducer().topic(topic).create();
             producer.send("message".getBytes());
         } catch (Exception e) {
             fail("Should not fail");
@@ -307,7 +296,7 @@ public class ClientErrorsTest {
     @Test
     public void testLookupWithDisconnection() throws Exception {
         final String brokerUrl = "pulsar://127.0.0.1:" + BROKER_SERVICE_PORT;
-        PulsarClient client = PulsarClient.create(brokerUrl);
+        PulsarClient client = PulsarClient.builder().serviceUrl(brokerUrl).build();
         final AtomicInteger counter = new AtomicInteger(0);
         String topic = "persistent://prop/use/ns/t1";
 
@@ -326,9 +315,7 @@ public class ClientErrorsTest {
         });
 
         try {
-            ConsumerConfiguration conf = new ConsumerConfiguration();
-            conf.setSubscriptionType(SubscriptionType.Exclusive);
-            Consumer consumer = client.subscribe(topic, "sub1", conf);
+            client.newConsumer().topic(topic).subscriptionName("sub1").subscribe();
         } catch (Exception e) {
             if (e.getMessage().equals(ASSERTION_ERROR)) {
                 fail("Subscribe should not retry on persistence error");
@@ -342,7 +329,7 @@ public class ClientErrorsTest {
     }
 
     private void subscribeFailWithoutRetry(String topic) throws Exception {
-        PulsarClient client = PulsarClient.create("http://127.0.0.1:" + WEB_SERVICE_PORT);
+        PulsarClient client = PulsarClient.builder().serviceUrl("http://127.0.0.1:" + WEB_SERVICE_PORT).build();
         final AtomicInteger counter = new AtomicInteger(0);
 
         mockBrokerService.setHandleSubscribe((ctx, subscribe) -> {
@@ -356,9 +343,7 @@ public class ClientErrorsTest {
         });
 
         try {
-            ConsumerConfiguration conf = new ConsumerConfiguration();
-            conf.setSubscriptionType(SubscriptionType.Exclusive);
-            Consumer consumer = client.subscribe(topic, "sub1", conf);
+            client.newConsumer().topic(topic).subscriptionName("sub1").subscribe();
         } catch (Exception e) {
             if (e.getMessage().equals(ASSERTION_ERROR)) {
                 fail("Subscribe should not retry on persistence error");
@@ -380,7 +365,7 @@ public class ClientErrorsTest {
     }
 
     private void subscribeSuccessAfterRetry(String topic) throws Exception {
-        PulsarClient client = PulsarClient.create("http://127.0.0.1:" + WEB_SERVICE_PORT);
+        PulsarClient client = PulsarClient.builder().serviceUrl("http://127.0.0.1:" + WEB_SERVICE_PORT).build();
         final AtomicInteger counter = new AtomicInteger(0);
 
         mockBrokerService.setHandleSubscribe((ctx, subscribe) -> {
@@ -392,9 +377,7 @@ public class ClientErrorsTest {
         });
 
         try {
-            ConsumerConfiguration conf = new ConsumerConfiguration();
-            conf.setSubscriptionType(SubscriptionType.Exclusive);
-            Consumer consumer = client.subscribe(topic, "sub1", conf);
+            client.newConsumer().topic(topic).subscriptionName("sub1").subscribe();
         } catch (Exception e) {
             fail("Should not fail");
         }
@@ -414,10 +397,8 @@ public class ClientErrorsTest {
     }
 
     private void subscribeFailAfterRetryTimeout(String topic) throws Exception {
-        ClientConfiguration conf = new ClientConfiguration();
-        conf.setOperationTimeout(200, TimeUnit.MILLISECONDS);
-
-        PulsarClient client = PulsarClient.create("http://127.0.0.1:" + WEB_SERVICE_PORT, conf);
+        PulsarClient client = PulsarClient.builder().serviceUrl("http://127.0.0.1:" + WEB_SERVICE_PORT)
+                .operationTimeout(200, TimeUnit.MILLISECONDS).build();
         final AtomicInteger counter = new AtomicInteger(0);
 
         mockBrokerService.setHandleSubscribe((ctx, subscribe) -> {
@@ -432,9 +413,7 @@ public class ClientErrorsTest {
         });
 
         try {
-            ConsumerConfiguration cConf = new ConsumerConfiguration();
-            cConf.setSubscriptionType(SubscriptionType.Exclusive);
-            client.subscribe(topic, "sub1", cConf);
+            client.newConsumer().topic(topic).subscriptionName("sub1").subscribe();
             fail("Should have failed");
         } catch (Exception e) {
             // we fail even on the retriable error
@@ -456,7 +435,7 @@ public class ClientErrorsTest {
     }
 
     private void subscribeFailDoesNotFailOtherConsumer(String topic1, String topic2) throws Exception {
-        PulsarClient client = PulsarClient.create("http://127.0.0.1:" + WEB_SERVICE_PORT);
+        PulsarClient client = PulsarClient.builder().serviceUrl("http://127.0.0.1:" + WEB_SERVICE_PORT).build();
         final AtomicInteger counter = new AtomicInteger(0);
 
         mockBrokerService.setHandleSubscribe((ctx, subscribe) -> {
@@ -469,13 +448,12 @@ public class ClientErrorsTest {
 
         });
 
-        ConsumerConfiguration conf = new ConsumerConfiguration();
-        conf.setSubscriptionType(SubscriptionType.Exclusive);
-        ConsumerBase consumer1 = (ConsumerBase) client.subscribe(topic1, "sub1", conf);
+        ConsumerBase<byte[]> consumer1 = (ConsumerBase<byte[]>) client.newConsumer().topic(topic1)
+                .subscriptionName("sub1").subscribe();
 
-        ConsumerBase consumer2 = null;
+        ConsumerBase<byte[]> consumer2 = null;
         try {
-            consumer2 = (ConsumerBase) client.subscribe(topic2, "sub1", conf);
+            consumer2 = (ConsumerBase<byte[]>) client.newConsumer().topic(topic2).subscriptionName("sub1").subscribe();
             fail("Should have failed");
         } catch (Exception e) {
             // ok
@@ -492,7 +470,7 @@ public class ClientErrorsTest {
     // other producers and fail
     @Test
     public void testOneProducerFailShouldCloseAllProducersInPartitionedProducer() throws Exception {
-        PulsarClient client = PulsarClient.create("http://127.0.0.1:" + WEB_SERVICE_PORT);
+        PulsarClient client = PulsarClient.builder().serviceUrl("http://127.0.0.1:" + WEB_SERVICE_PORT).build();
         final AtomicInteger producerCounter = new AtomicInteger(0);
         final AtomicInteger closeCounter = new AtomicInteger(0);
 
@@ -510,7 +488,7 @@ public class ClientErrorsTest {
         });
 
         try {
-            Producer producer = client.createProducer("persistent://prop/use/ns/multi-part-t1");
+            client.newProducer().topic("persistent://prop/use/ns/multi-part-t1").create();
             fail("Should have failed with an authorization error");
         } catch (Exception e) {
             assertTrue(e instanceof PulsarClientException.AuthorizationException);
@@ -527,7 +505,7 @@ public class ClientErrorsTest {
     // of other consumers and fail
     @Test
     public void testOneConsumerFailShouldCloseAllConsumersInPartitionedConsumer() throws Exception {
-        PulsarClient client = PulsarClient.create("http://127.0.0.1:" + WEB_SERVICE_PORT);
+        PulsarClient client = PulsarClient.builder().serviceUrl("http://127.0.0.1:" + WEB_SERVICE_PORT).build();
         final AtomicInteger subscribeCounter = new AtomicInteger(0);
         final AtomicInteger closeCounter = new AtomicInteger(0);
 
@@ -546,7 +524,7 @@ public class ClientErrorsTest {
         });
 
         try {
-            Consumer consumer = client.subscribe("persistent://prop/use/ns/multi-part-t1", "my-sub");
+            client.newConsumer().topic("persistent://prop/use/ns/multi-part-t1").subscriptionName("sub1").subscribe();
             fail("Should have failed with an authentication error");
         } catch (Exception e) {
             assertTrue(e instanceof PulsarClientException.AuthenticationException);
@@ -561,7 +539,7 @@ public class ClientErrorsTest {
 
     @Test
     public void testFlowSendWhenPartitionedSubscribeCompletes() throws Exception {
-        PulsarClient client = PulsarClient.create("http://127.0.0.1:" + WEB_SERVICE_PORT);
+        PulsarClient client = PulsarClient.builder().serviceUrl("http://127.0.0.1:" + WEB_SERVICE_PORT).build();
 
         AtomicInteger subscribed = new AtomicInteger();
         AtomicBoolean fail = new AtomicBoolean(false);
@@ -578,7 +556,7 @@ public class ClientErrorsTest {
             }
         });
 
-        Consumer consumer = client.subscribe("persistent://prop/use/ns/multi-part-t1", "my-sub");
+        client.newConsumer().topic("persistent://prop/use/ns/multi-part-t1").subscriptionName("sub1").subscribe();
 
         if (fail.get()) {
             fail("Flow command should have been sent after all 4 partitions subscribe successfully");
@@ -613,8 +591,8 @@ public class ClientErrorsTest {
             ctx.writeAndFlush(Commands.newSendReceipt(0, 0, 1, 1));
         });
 
-        PulsarClient client = PulsarClient.create("http://127.0.0.1:" + WEB_SERVICE_PORT);
-        Producer producer = client.createProducer("persistent://prop/use/ns/t1");
+        PulsarClient client = PulsarClient.builder().serviceUrl("http://127.0.0.1:" + WEB_SERVICE_PORT).build();
+        Producer<byte[]> producer = client.newProducer().topic("persistent://prop/use/ns/t1").create();
 
         // close the cnx after creating the producer
         channelCtx.get().channel().close().get();
@@ -651,8 +629,8 @@ public class ClientErrorsTest {
             ctx.writeAndFlush(Commands.newSuccess(subscribe.getRequestId()));
         });
 
-        PulsarClient client = PulsarClient.create("http://127.0.0.1:" + WEB_SERVICE_PORT);
-        client.subscribe("persistent://prop/use/ns/t1", "sub");
+        PulsarClient client = PulsarClient.builder().serviceUrl("http://127.0.0.1:" + WEB_SERVICE_PORT).build();
+        client.newConsumer().topic("persistent://prop/use/ns/t1").subscriptionName("sub1").subscribe();
 
         // close the cnx after creating the producer
         channelCtx.get().channel().close();
diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/client/api/DispatcherBlockConsumerTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/client/api/DispatcherBlockConsumerTest.java
index f2c63e3..28e0a4a 100644
--- a/pulsar-broker/src/test/java/org/apache/pulsar/client/api/DispatcherBlockConsumerTest.java
+++ b/pulsar-broker/src/test/java/org/apache/pulsar/client/api/DispatcherBlockConsumerTest.java
@@ -27,8 +27,6 @@ import static org.testng.Assert.assertTrue;
 import static org.testng.Assert.fail;
 
 import java.lang.reflect.Field;
-import java.util.*;
-import java.util.Arrays;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
@@ -92,7 +90,7 @@ public class DispatcherBlockConsumerTest extends ProducerConsumerBase {
      *
      * @throws Exception
      */
-    @Test(timeOut=10000)
+    @Test(timeOut = 10000)
     public void testConsumerBlockingWithUnAckedMessagesAtDispatcher() throws Exception {
         log.info("-- Starting {} test --", methodName);
 
@@ -107,18 +105,16 @@ public class DispatcherBlockConsumerTest extends ProducerConsumerBase {
             final String subscriberName = "subscriber-1";
 
             pulsar.getConfiguration().setMaxUnackedMessagesPerSubscription(unackMsgAllowed);
-            ConsumerConfiguration conf = new ConsumerConfiguration();
-            conf.setReceiverQueueSize(receiverQueueSize);
-            conf.setSubscriptionType(SubscriptionType.Shared);
-            Consumer<byte[]> consumer1 = pulsarClient.subscribe(topicName, subscriberName, conf);
-            Consumer<byte[]> consumer2 = pulsarClient.subscribe(topicName, subscriberName, conf);
-            Consumer<byte[]> consumer3 = pulsarClient.subscribe(topicName, subscriberName, conf);
-            List<Consumer<byte[]>> consumers = Lists.newArrayList(consumer1, consumer2, consumer3);
-
-            ProducerConfiguration producerConf = new ProducerConfiguration();
+            ConsumerBuilder<byte[]> consumerBuilder = pulsarClient.newConsumer().topic(topicName)
+                    .subscriptionName(subscriberName).receiverQueueSize(receiverQueueSize)
+                    .subscriptionType(SubscriptionType.Shared);
+            Consumer<byte[]> consumer1 = consumerBuilder.subscribe();
+            Consumer<byte[]> consumer2 = consumerBuilder.subscribe();
+            Consumer<byte[]> consumer3 = consumerBuilder.subscribe();
+            List<Consumer<?>> consumers = Lists.newArrayList(consumer1, consumer2, consumer3);
 
-            Producer producer = pulsarClient.createProducer("persistent://my-property/use/my-ns/unacked-topic",
-                    producerConf);
+            Producer<byte[]> producer = pulsarClient.newProducer()
+                    .topic("persistent://my-property/use/my-ns/unacked-topic").create();
 
             // (1) Produced Messages
             for (int i = 0; i < totalProducedMsgs; i++) {
@@ -127,8 +123,8 @@ public class DispatcherBlockConsumerTest extends ProducerConsumerBase {
             }
 
             // (2) try to consume messages: but will be able to consume number of messages = unackMsgAllowed
-            Message msg = null;
-            Map<Message, Consumer> messages = Maps.newHashMap();
+            Message<?> msg = null;
+            Map<Message<?>, Consumer<?>> messages = Maps.newHashMap();
             for (int i = 0; i < 3; i++) {
                 for (int j = 0; j < totalProducedMsgs; j++) {
                     msg = consumers.get(i).receive(500, TimeUnit.MILLISECONDS);
@@ -201,7 +197,8 @@ public class DispatcherBlockConsumerTest extends ProducerConsumerBase {
      *
      * @throws Exception
      */
-    @Test(timeOut=10000)
+    @SuppressWarnings("unchecked")
+    @Test(timeOut = 10000)
     public void testConsumerBlockingWithUnAckedMessagesAndRedelivery() throws Exception {
         log.info("-- Starting {} test --", methodName);
 
@@ -214,18 +211,16 @@ public class DispatcherBlockConsumerTest extends ProducerConsumerBase {
             final String subscriberName = "subscriber-1";
 
             pulsar.getConfiguration().setMaxUnackedMessagesPerSubscription(unackMsgAllowed);
-            ConsumerConfiguration conf = new ConsumerConfiguration();
-            conf.setReceiverQueueSize(receiverQueueSize);
-            conf.setSubscriptionType(SubscriptionType.Shared);
-            ConsumerImpl consumer1 = (ConsumerImpl) pulsarClient.subscribe(topicName, subscriberName, conf);
-            ConsumerImpl consumer2 = (ConsumerImpl) pulsarClient.subscribe(topicName, subscriberName, conf);
-            ConsumerImpl consumer3 = (ConsumerImpl) pulsarClient.subscribe(topicName, subscriberName, conf);
+            ConsumerBuilder<byte[]> consumerBuilder = pulsarClient.newConsumer().topic(topicName)
+                    .subscriptionName(subscriberName).receiverQueueSize(receiverQueueSize)
+                    .subscriptionType(SubscriptionType.Shared);
+            ConsumerImpl<byte[]> consumer1 = (ConsumerImpl<byte[]>) consumerBuilder.subscribe();
+            ConsumerImpl<byte[]> consumer2 = (ConsumerImpl<byte[]>) consumerBuilder.subscribe();
+            ConsumerImpl<byte[]> consumer3 = (ConsumerImpl<byte[]>) consumerBuilder.subscribe();
             List<ConsumerImpl<byte[]>> consumers = Lists.newArrayList(consumer1, consumer2, consumer3);
 
-            ProducerConfiguration producerConf = new ProducerConfiguration();
-
-            Producer producer = pulsarClient.createProducer("persistent://my-property/use/my-ns/unacked-topic",
-                    producerConf);
+            Producer<byte[]> producer = pulsarClient.newProducer()
+                    .topic("persistent://my-property/use/my-ns/unacked-topic").create();
 
             // (1) Produced Messages
             for (int i = 0; i < totalProducedMsgs; i++) {
@@ -234,8 +229,8 @@ public class DispatcherBlockConsumerTest extends ProducerConsumerBase {
             }
 
             // (2) try to consume messages: but will be able to consume number of messages = unackMsgAllowed
-            Message msg = null;
-            Multimap<ConsumerImpl, MessageId> messages = ArrayListMultimap.create();
+            Message<?> msg = null;
+            Multimap<ConsumerImpl<?>, MessageId> messages = ArrayListMultimap.create();
             for (int i = 0; i < 3; i++) {
                 for (int j = 0; j < totalProducedMsgs; j++) {
                     msg = consumers.get(i).receive(500, TimeUnit.MILLISECONDS);
@@ -316,15 +311,11 @@ public class DispatcherBlockConsumerTest extends ProducerConsumerBase {
             final String subscriberName = "subscriber-1";
 
             pulsar.getConfiguration().setMaxUnackedMessagesPerSubscription(unackMsgAllowed);
-            ConsumerConfiguration conf = new ConsumerConfiguration();
-            conf.setReceiverQueueSize(receiverQueueSize);
-            conf.setSubscriptionType(SubscriptionType.Shared);
-            Consumer consumer1 = pulsarClient.subscribe(topicName, subscriberName, conf);
+            Consumer<byte[]> consumer1 = pulsarClient.newConsumer().topic(topicName).subscriptionName(subscriberName)
+                    .receiverQueueSize(receiverQueueSize).subscriptionType(SubscriptionType.Shared).subscribe();
 
-            ProducerConfiguration producerConf = new ProducerConfiguration();
-
-            Producer producer = pulsarClient.createProducer("persistent://my-property/use/my-ns/unacked-topic",
-                    producerConf);
+            Producer<byte[]> producer = pulsarClient.newProducer()
+                    .topic("persistent://my-property/use/my-ns/unacked-topic").create();
 
             // (1) Produced Messages
             for (int i = 0; i < totalProducedMsgs; i++) {
@@ -333,8 +324,8 @@ public class DispatcherBlockConsumerTest extends ProducerConsumerBase {
             }
 
             // (2) try to consume messages: but will be able to consume number of messages = unackMsgAllowed
-            Message msg = null;
-            Map<Message, Consumer> messages = Maps.newHashMap();
+            Message<?> msg = null;
+            Map<Message<?>, Consumer<?>> messages = Maps.newHashMap();
             for (int i = 0; i < totalProducedMsgs; i++) {
                 msg = consumer1.receive(500, TimeUnit.MILLISECONDS);
                 if (msg != null) {
@@ -351,8 +342,9 @@ public class DispatcherBlockConsumerTest extends ProducerConsumerBase {
             // close consumer1: all messages of consumer1 must be replayed and received by consumer2
             consumer1.close();
             // create consumer2
-            Consumer consumer2 = pulsarClient.subscribe(topicName, subscriberName, conf);
-            Map<Message, Consumer> messages2 = Maps.newHashMap();
+            Consumer<byte[]> consumer2 = pulsarClient.newConsumer().topic(topicName).subscriptionName(subscriberName)
+                    .receiverQueueSize(receiverQueueSize).subscriptionType(SubscriptionType.Shared).subscribe();
+            Map<Message<?>, Consumer<?>> messages2 = Maps.newHashMap();
             // try to consume remaining messages: broker may take time to deliver so, retry multiple time to consume
             // all messages
             for (int retry = 0; retry < 5; retry++) {
@@ -390,7 +382,7 @@ public class DispatcherBlockConsumerTest extends ProducerConsumerBase {
      *
      * @throws Exception
      */
-    @Test(timeOut=10000)
+    @Test(timeOut = 10000)
     public void testRedeliveryOnBlockedDistpatcher() throws Exception {
         log.info("-- Starting {} test --", methodName);
 
@@ -405,18 +397,16 @@ public class DispatcherBlockConsumerTest extends ProducerConsumerBase {
             final String subscriberName = "subscriber-1";
 
             pulsar.getConfiguration().setMaxUnackedMessagesPerSubscription(unackMsgAllowed);
-            ConsumerConfiguration conf = new ConsumerConfiguration();
-            conf.setSubscriptionType(SubscriptionType.Shared);
-            conf.setReceiverQueueSize(receiverQueueSize);
-            ConsumerImpl consumer1 = (ConsumerImpl) pulsarClient.subscribe(topicName, subscriberName, conf);
-            ConsumerImpl consumer2 = (ConsumerImpl) pulsarClient.subscribe(topicName, subscriberName, conf);
-            ConsumerImpl consumer3 = (ConsumerImpl) pulsarClient.subscribe(topicName, subscriberName, conf);
-            List<ConsumerImpl<byte[]>> consumers = Lists.newArrayList( consumer1, consumer2, consumer3 );
+            ConsumerBuilder<byte[]> consumerBuilder = pulsarClient.newConsumer().topic(topicName)
+                    .subscriptionName(subscriberName).receiverQueueSize(receiverQueueSize)
+                    .subscriptionType(SubscriptionType.Shared);
+            ConsumerImpl<byte[]> consumer1 = (ConsumerImpl<byte[]>) consumerBuilder.subscribe();
+            ConsumerImpl<byte[]> consumer2 = (ConsumerImpl<byte[]>) consumerBuilder.subscribe();
+            ConsumerImpl<byte[]> consumer3 = (ConsumerImpl<byte[]>) consumerBuilder.subscribe();
+            List<ConsumerImpl<?>> consumers = Lists.newArrayList(consumer1, consumer2, consumer3);
 
-            ProducerConfiguration producerConf = new ProducerConfiguration();
-
-            Producer producer = pulsarClient.createProducer("persistent://my-property/use/my-ns/unacked-topic",
-                    producerConf);
+            Producer<byte[]> producer = pulsarClient.newProducer()
+                    .topic("persistent://my-property/use/my-ns/unacked-topic").create();
 
             // (1) Produced Messages
             for (int i = 0; i < totalProducedMsgs; i++) {
@@ -425,7 +415,7 @@ public class DispatcherBlockConsumerTest extends ProducerConsumerBase {
             }
 
             // (2) try to consume messages: but will be able to consume number of messages = unackMsgAllowed
-            Message msg = null;
+            Message<?> msg = null;
             Set<MessageId> messages = Sets.newHashSet();
             for (int i = 0; i < 3; i++) {
                 for (int j = 0; j < totalProducedMsgs; j++) {
@@ -452,7 +442,7 @@ public class DispatcherBlockConsumerTest extends ProducerConsumerBase {
             Thread.sleep(1000);
 
             // now, broker must have redelivered all unacked messages
-            Map<ConsumerImpl, Set<MessageId>> messages1 = Maps.newHashMap();
+            Map<ConsumerImpl<?>, Set<MessageId>> messages1 = Maps.newHashMap();
             for (int i = 0; i < 3; i++) {
                 for (int j = 0; j < totalProducedMsgs; j++) {
                     msg = consumers.get(i).receive(500, TimeUnit.MILLISECONDS);
@@ -541,9 +531,8 @@ public class DispatcherBlockConsumerTest extends ProducerConsumerBase {
             stopBroker();
             startBroker();
 
-            ConsumerConfiguration conf = new ConsumerConfiguration();
-            conf.setSubscriptionType(SubscriptionType.Shared);
-            Consumer consumer = pulsarClient.subscribe(topicName, subName, conf);
+            Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topicName).subscriptionName(subName)
+                    .subscriptionType(SubscriptionType.Shared).subscribe();
             Thread.sleep(timeWaitToSync);
 
             PersistentTopic topicRef = (PersistentTopic) pulsar.getBrokerService().getTopicReference(topicName);
@@ -558,7 +547,7 @@ public class DispatcherBlockConsumerTest extends ProducerConsumerBase {
             assertEquals(subStats.msgBacklog, 0);
             assertEquals(subStats.consumers.size(), 1);
 
-            Producer producer = pulsarClient.createProducer(topicName);
+            Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName).create();
             Thread.sleep(timeWaitToSync);
 
             for (int i = 0; i < 100; i++) {
@@ -607,14 +596,11 @@ public class DispatcherBlockConsumerTest extends ProducerConsumerBase {
         final String subscriberName = "subscriber-1";
         final int totalProducedMsgs = 500;
 
-        ConsumerConfiguration conf = new ConsumerConfiguration();
-        conf.setSubscriptionType(SubscriptionType.Shared);
-        Consumer consumer = pulsarClient.subscribe(topicName, subscriberName, conf);
-
-        ProducerConfiguration producerConf = new ProducerConfiguration();
+        Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topicName).subscriptionName(subscriberName)
+                .subscriptionType(SubscriptionType.Shared).subscribe();
 
-        Producer producer = pulsarClient.createProducer("persistent://my-property/use/my-ns/unacked-topic",
-                producerConf);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic("persistent://my-property/use/my-ns/unacked-topic")
+                .create();
 
         CountDownLatch latch = new CountDownLatch(totalProducedMsgs);
         // (1) Produced Messages
@@ -627,7 +613,7 @@ public class DispatcherBlockConsumerTest extends ProducerConsumerBase {
         Set<Integer> unackMessages = Sets.newHashSet(5, 10, 20, 21, 22, 23, 25, 26, 30, 32, 40, 80, 160, 320);
         int receivedMsgCount = 0;
         for (int i = 0; i < totalProducedMsgs; i++) {
-            Message msg = consumer.receive(500, TimeUnit.MILLISECONDS);
+            Message<?> msg = consumer.receive(500, TimeUnit.MILLISECONDS);
             if (!unackMessages.contains(i)) {
                 consumer.acknowledge(msg);
             }
@@ -646,13 +632,14 @@ public class DispatcherBlockConsumerTest extends ProducerConsumerBase {
 
         // start broker which will recover topic-cursor from the ledger
         startBroker();
-        consumer = pulsarClient.subscribe(topicName, subscriberName, conf);
+        consumer = pulsarClient.newConsumer().topic(topicName).subscriptionName(subscriberName)
+                .subscriptionType(SubscriptionType.Shared).subscribe();
 
         // consumer should only receive unakced messages
         Set<String> unackMsgs = unackMessages.stream().map(i -> "my-message-" + i).collect(Collectors.toSet());
         Set<String> receivedMsgs = Sets.newHashSet();
         for (int i = 0; i < totalProducedMsgs; i++) {
-            Message msg = consumer.receive(500, TimeUnit.MILLISECONDS);
+            Message<?> msg = consumer.receive(500, TimeUnit.MILLISECONDS);
             if (msg == null) {
                 break;
             }
@@ -667,18 +654,14 @@ public class DispatcherBlockConsumerTest extends ProducerConsumerBase {
      * verifies perBroker dispatching blocking. A. maxUnAckPerBroker = 200, maxUnAckPerDispatcher = 20 Now, it tests
      * with 3 subscriptions.
      *
-     * 1. Subscription-1: try to consume without acking
-     *  a. consumer will be blocked after 200 (maxUnAckPerBroker) msgs
-     *  b. even second consumer will not receive any new messages
-     *  c. broker will have 1 blocked dispatcher
-     * 2. Subscription-2: try to consume without acking
-     *  a. as broker is already blocked it will block subscription after 20 msgs (maxUnAckPerDispatcher)
-     *  b. broker will have 2 blocked dispatchers
-     * 3. Subscription-3: try to consume with acking
-     *  a. as consumer is acking not reached maxUnAckPerDispatcher=20 unack msg => consumes all produced msgs
-     * 4.Subscription-1 : acks all pending msgs and consume by acking
-     *  a. broker unblocks all dispatcher and sub-1 consumes all messages
-     * 5. Subscription-2 : it triggers redelivery and acks all messages so, it consumes all produced messages
+     * 1. Subscription-1: try to consume without acking a. consumer will be blocked after 200 (maxUnAckPerBroker) msgs
+     * b. even second consumer will not receive any new messages c. broker will have 1 blocked dispatcher 2.
+     * Subscription-2: try to consume without acking a. as broker is already blocked it will block subscription after 20
+     * msgs (maxUnAckPerDispatcher) b. broker will have 2 blocked dispatchers 3. Subscription-3: try to consume with
+     * acking a. as consumer is acking not reached maxUnAckPerDispatcher=20 unack msg => consumes all produced msgs
+     * 4.Subscription-1 : acks all pending msgs and consume by acking a. broker unblocks all dispatcher and sub-1
+     * consumes all messages 5. Subscription-2 : it triggers redelivery and acks all messages so, it consumes all
+     * produced messages
      * </pre>
      *
      * @throws Exception
@@ -705,6 +688,7 @@ public class DispatcherBlockConsumerTest extends ProducerConsumerBase {
 
             Field field = BrokerService.class.getDeclaredField("blockedDispatchers");
             field.setAccessible(true);
+            @SuppressWarnings("unchecked")
             ConcurrentOpenHashSet<PersistentDispatcherMultipleConsumers> blockedDispatchers = (ConcurrentOpenHashSet<PersistentDispatcherMultipleConsumers>) field
                     .get(pulsar.getBrokerService());
 
@@ -715,18 +699,21 @@ public class DispatcherBlockConsumerTest extends ProducerConsumerBase {
             final String subscriberName2 = "subscriber-2";
             final String subscriberName3 = "subscriber-3";
 
-            ConsumerConfiguration conf = new ConsumerConfiguration();
-            conf.setSubscriptionType(SubscriptionType.Shared);
-            conf.setReceiverQueueSize(receiverQueueSize);
-            ConsumerImpl consumer1Sub1 = (ConsumerImpl) pulsarClient.subscribe(topicName, subscriberName1, conf);
+            ConsumerImpl<byte[]> consumer1Sub1 = (ConsumerImpl<byte[]>) pulsarClient.newConsumer().topic(topicName)
+                    .subscriptionName(subscriberName1).receiverQueueSize(receiverQueueSize)
+                    .subscriptionType(SubscriptionType.Shared).subscribe();
             // create subscription-2 and 3
-            ConsumerImpl consumer1Sub2 = (ConsumerImpl) pulsarClient.subscribe(topicName, subscriberName2, conf);
+            ConsumerImpl<byte[]> consumer1Sub2 = (ConsumerImpl<byte[]>) pulsarClient.newConsumer().topic(topicName)
+                    .subscriptionName(subscriberName2).receiverQueueSize(receiverQueueSize)
+                    .subscriptionType(SubscriptionType.Shared).subscribe();
             consumer1Sub2.close();
-            ConsumerImpl consumer1Sub3 = (ConsumerImpl) pulsarClient.subscribe(topicName, subscriberName3, conf);
+            ConsumerImpl<byte[]> consumer1Sub3 = (ConsumerImpl<byte[]>) pulsarClient.newConsumer().topic(topicName)
+                    .subscriptionName(subscriberName3).receiverQueueSize(receiverQueueSize)
+                    .subscriptionType(SubscriptionType.Shared).subscribe();
             consumer1Sub3.close();
 
-            Producer producer = pulsarClient.createProducer("persistent://my-property/use/my-ns/unacked-topic",
-                    new ProducerConfiguration());
+            Producer<byte[]> producer = pulsarClient.newProducer()
+                    .topic("persistent://my-property/use/my-ns/unacked-topic").create();
 
             // continuously checks unack-message dispatching
             ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
@@ -742,7 +729,7 @@ public class DispatcherBlockConsumerTest extends ProducerConsumerBase {
              * (1) try to consume messages: without acking messages and dispatcher will be blocked once it reaches
              * maxUnAckPerBroker limit
              ***/
-            Message msg = null;
+            Message<byte[]> msg = null;
             Set<MessageId> messages1 = Sets.newHashSet();
             for (int j = 0; j < totalProducedMsgs; j++) {
                 msg = consumer1Sub1.receive(100, TimeUnit.MILLISECONDS);
@@ -760,7 +747,9 @@ public class DispatcherBlockConsumerTest extends ProducerConsumerBase {
             // client must receive number of messages = maxUnAckPerbroker rather all produced messages
             assertNotEquals(messages1.size(), totalProducedMsgs);
             // (1.b) consumer2 with same sub should not receive any more messages as subscription is blocked
-            ConsumerImpl consumer2Sub1 = (ConsumerImpl) pulsarClient.subscribe(topicName, subscriberName1, conf);
+            ConsumerImpl<byte[]> consumer2Sub1 = (ConsumerImpl<byte[]>) pulsarClient.newConsumer().topic(topicName)
+                    .subscriptionName(subscriberName1).receiverQueueSize(receiverQueueSize)
+                    .subscriptionType(SubscriptionType.Shared).subscribe();
             int consumer2Msgs = 0;
             for (int j = 0; j < totalProducedMsgs; j++) {
                 msg = consumer2Sub1.receive(100, TimeUnit.MILLISECONDS);
@@ -783,7 +772,9 @@ public class DispatcherBlockConsumerTest extends ProducerConsumerBase {
              * (2) However, other subscription2 should still be able to consume messages until it reaches to
              * maxUnAckPerDispatcher limit
              **/
-            ConsumerImpl<byte[]> consumerSub2 = (ConsumerImpl) pulsarClient.subscribe(topicName, subscriberName2, conf);
+            ConsumerImpl<byte[]> consumerSub2 = (ConsumerImpl<byte[]>) pulsarClient.newConsumer().topic(topicName)
+                    .subscriptionName(subscriberName2).receiverQueueSize(receiverQueueSize)
+                    .subscriptionType(SubscriptionType.Shared).subscribe();
             Set<MessageId> messages2 = Sets.newHashSet();
             for (int j = 0; j < totalProducedMsgs; j++) {
                 msg = consumerSub2.receive(100, TimeUnit.MILLISECONDS);
@@ -798,7 +789,9 @@ public class DispatcherBlockConsumerTest extends ProducerConsumerBase {
             assertEquals(blockedDispatchers.size(), 2);
 
             /** (3) if Subscription3 is acking then it shouldn't be blocked **/
-            consumer1Sub3 = (ConsumerImpl) pulsarClient.subscribe(topicName, subscriberName3, conf);
+            consumer1Sub3 = (ConsumerImpl<byte[]>) pulsarClient.newConsumer().topic(topicName)
+                    .subscriptionName(subscriberName3).receiverQueueSize(receiverQueueSize)
+                    .subscriptionType(SubscriptionType.Shared).subscribe();
             int consumedMsgsSub3 = 0;
             for (int j = 0; j < totalProducedMsgs; j++) {
                 msg = consumer1Sub3.receive(100, TimeUnit.MILLISECONDS);
@@ -872,6 +865,7 @@ public class DispatcherBlockConsumerTest extends ProducerConsumerBase {
      * </pre>
      *
      */
+    @SuppressWarnings("unchecked")
     @Test
     public void testBrokerDispatchBlockAndSubAckBackRequiredMsgs() {
 
@@ -904,12 +898,13 @@ public class DispatcherBlockConsumerTest extends ProducerConsumerBase {
             final String subscriberName1 = "subscriber-1";
             final String subscriberName2 = "subscriber-2";
 
-            ConsumerConfiguration conf = new ConsumerConfiguration();
-            conf.setSubscriptionType(SubscriptionType.Shared);
-            conf.setReceiverQueueSize(receiverQueueSize);
-            ConsumerImpl consumer1Sub1 = (ConsumerImpl) pulsarClient.subscribe(topicName, subscriberName1, conf);
+            ConsumerImpl<byte[]> consumer1Sub1 = (ConsumerImpl<byte[]>) pulsarClient.newConsumer().topic(topicName)
+                    .subscriptionName(subscriberName1).receiverQueueSize(receiverQueueSize)
+                    .subscriptionType(SubscriptionType.Shared).subscribe();
             // create subscription-2 and 3
-            ConsumerImpl consumer1Sub2 = (ConsumerImpl) pulsarClient.subscribe(topicName, subscriberName2, conf);
+            ConsumerImpl<byte[]> consumer1Sub2 = (ConsumerImpl<byte[]>) pulsarClient.newConsumer().topic(topicName)
+                    .subscriptionName(subscriberName2).receiverQueueSize(receiverQueueSize)
+                    .subscriptionType(SubscriptionType.Shared).subscribe();
             consumer1Sub2.close();
 
             // continuously checks unack-message dispatching
@@ -917,8 +912,8 @@ public class DispatcherBlockConsumerTest extends ProducerConsumerBase {
             executor.scheduleAtFixedRate(() -> pulsar.getBrokerService().checkUnAckMessageDispatching(), 10, 10,
                     TimeUnit.MILLISECONDS);
 
-            Producer producer = pulsarClient.createProducer("persistent://my-property/use/my-ns/unacked-topic",
-                    new ProducerConfiguration());
+            Producer<byte[]> producer = pulsarClient.newProducer()
+                    .topic("persistent://my-property/use/my-ns/unacked-topic").create();
 
             // Produced Messages
             for (int i = 0; i < totalProducedMsgs; i++) {
@@ -930,7 +925,7 @@ public class DispatcherBlockConsumerTest extends ProducerConsumerBase {
              * (1) try to consume messages: without acking messages and dispatcher will be blocked once it reaches
              * maxUnAckPerBroker limit
              ***/
-            Message msg = null;
+            Message<?> msg = null;
             Set<MessageId> messages1 = Sets.newHashSet();
             for (int j = 0; j < totalProducedMsgs; j++) {
                 msg = consumer1Sub1.receive(100, TimeUnit.MILLISECONDS);
@@ -948,7 +943,9 @@ public class DispatcherBlockConsumerTest extends ProducerConsumerBase {
             // client must receive number of messages = maxUnAckPerbroker rather all produced messages
             assertNotEquals(messages1.size(), totalProducedMsgs);
             // (1.b) consumer2 with same sub should not receive any more messages as subscription is blocked
-            ConsumerImpl consumer2Sub1 = (ConsumerImpl) pulsarClient.subscribe(topicName, subscriberName1, conf);
+            ConsumerImpl<byte[]> consumer2Sub1 = (ConsumerImpl<byte[]>) pulsarClient.newConsumer().topic(topicName)
+                    .subscriptionName(subscriberName1).receiverQueueSize(receiverQueueSize)
+                    .subscriptionType(SubscriptionType.Shared).subscribe();
             int consumer2Msgs = 0;
             for (int j = 0; j < totalProducedMsgs; j++) {
                 msg = consumer2Sub1.receive(100, TimeUnit.MILLISECONDS);
@@ -971,7 +968,9 @@ public class DispatcherBlockConsumerTest extends ProducerConsumerBase {
              * (2) However, other subscription2 should still be able to consume messages until it reaches to
              * maxUnAckPerDispatcher limit
              **/
-            consumer1Sub2 = (ConsumerImpl) pulsarClient.subscribe(topicName, subscriberName2, conf);
+            consumer1Sub2 = (ConsumerImpl<byte[]>) pulsarClient.newConsumer().topic(topicName)
+                    .subscriptionName(subscriberName2).receiverQueueSize(receiverQueueSize)
+                    .subscriptionType(SubscriptionType.Shared).subscribe();
             Set<MessageId> messages2 = Sets.newHashSet();
             for (int j = 0; j < totalProducedMsgs; j++) {
                 msg = consumer1Sub2.receive(100, TimeUnit.MILLISECONDS);
diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/client/api/MessageDispatchThrottlingTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/client/api/MessageDispatchThrottlingTest.java
index 9163e0d..4425766 100644
--- a/pulsar-broker/src/test/java/org/apache/pulsar/client/api/MessageDispatchThrottlingTest.java
+++ b/pulsar-broker/src/test/java/org/apache/pulsar/client/api/MessageDispatchThrottlingTest.java
@@ -107,7 +107,7 @@ public class MessageDispatchThrottlingTest extends ProducerConsumerBase {
 
         admin.namespaces().createNamespace(namespace);
         // create producer and topic
-        Producer producer = pulsarClient.createProducer(topicName);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName).create();
         PersistentTopic topic = (PersistentTopic) pulsar.getBrokerService().getTopic(topicName).get();
         // (1) verify message-rate is -1 initially
         Assert.assertEquals(topic.getDispatchRateLimiter().getDispatchRateOnMsg(), -1);
@@ -177,7 +177,7 @@ public class MessageDispatchThrottlingTest extends ProducerConsumerBase {
         admin.namespaces().createNamespace(namespace);
         admin.namespaces().setDispatchRate(namespace, dispatchRate);
         // create producer and topic
-        Producer producer = pulsarClient.createProducer(topicName);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName).create();
         PersistentTopic topic = (PersistentTopic) pulsar.getBrokerService().getTopic(topicName).get();
         boolean isMessageRateUpdate = false;
         int retry = 5;
@@ -199,15 +199,13 @@ public class MessageDispatchThrottlingTest extends ProducerConsumerBase {
 
         final AtomicInteger totalReceived = new AtomicInteger(0);
 
-        ConsumerConfiguration conf = new ConsumerConfiguration();
-        conf.setSubscriptionType(subscription);
-        conf.setMessageListener((consumer, msg) -> {
-            Assert.assertNotNull(msg, "Message cannot be null");
-            String receivedMessage = new String(msg.getData());
-            log.debug("Received message [{}] in the listener", receivedMessage);
-            totalReceived.incrementAndGet();
-        });
-        Consumer consumer = pulsarClient.subscribe(topicName, "my-subscriber-name", conf);
+        Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topicName).subscriptionName("my-subscriber-name")
+                .subscriptionType(subscription).messageListener((c1, msg) -> {
+                    Assert.assertNotNull(msg, "Message cannot be null");
+                    String receivedMessage = new String(msg.getData());
+                    log.debug("Received message [{}] in the listener", receivedMessage);
+                    totalReceived.incrementAndGet();
+                }).subscribe();
         // deactive cursors
         deactiveCursors((ManagedLedgerImpl) topic.getManagedLedger());
 
@@ -242,7 +240,8 @@ public class MessageDispatchThrottlingTest extends ProducerConsumerBase {
 
         int initValue = pulsar.getConfiguration().getDispatchThrottlingRatePerTopicInMsg();
         // (1) Update message-dispatch-rate limit
-        admin.brokers().updateDynamicConfiguration("dispatchThrottlingRatePerTopicInMsg", Integer.toString(messageRate));
+        admin.brokers().updateDynamicConfiguration("dispatchThrottlingRatePerTopicInMsg",
+                Integer.toString(messageRate));
         admin.brokers().updateDynamicConfiguration("dispatchThrottlingRatePerTopicInByte", Long.toString(byteRate));
         // sleep incrementally as zk-watch notification is async and may take some time
         for (int i = 0; i < 5; i++) {
@@ -254,21 +253,20 @@ public class MessageDispatchThrottlingTest extends ProducerConsumerBase {
 
         admin.namespaces().createNamespace(namespace);
         // create producer and topic
-        Producer producer = pulsarClient.createProducer(topicName);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName).create();
         PersistentTopic topic = (PersistentTopic) pulsar.getBrokerService().getTopic(topicName).get();
         int numMessages = 500;
 
         final AtomicInteger totalReceived = new AtomicInteger(0);
 
-        ConsumerConfiguration conf = new ConsumerConfiguration();
-        conf.setSubscriptionType(SubscriptionType.Shared);
-        conf.setMessageListener((consumer, msg) -> {
-            Assert.assertNotNull(msg, "Message cannot be null");
-            String receivedMessage = new String(msg.getData());
-            log.debug("Received message [{}] in the listener", receivedMessage);
-            totalReceived.incrementAndGet();
-        });
-        Consumer consumer = pulsarClient.subscribe(topicName, "my-subscriber-name", conf);
+        Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topicName).subscriptionName("my-subscriber-name")
+                .subscriptionType(SubscriptionType.Shared).messageListener((c1, msg) -> {
+                    Assert.assertNotNull(msg, "Message cannot be null");
+                    String receivedMessage = new String(msg.getData());
+                    log.debug("Received message [{}] in the listener", receivedMessage);
+                    totalReceived.incrementAndGet();
+                }).subscribe();
+
         // deactive cursors
         deactiveCursors((ManagedLedgerImpl) topic.getManagedLedger());
 
@@ -315,7 +313,7 @@ public class MessageDispatchThrottlingTest extends ProducerConsumerBase {
         admin.namespaces().createNamespace(namespace);
         admin.namespaces().setDispatchRate(namespace, dispatchRate);
         // create producer and topic
-        Producer producer = pulsarClient.createProducer(topicName);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName).create();
         PersistentTopic topic = (PersistentTopic) pulsar.getBrokerService().getTopic(topicName).get();
         boolean isMessageRateUpdate = false;
         int retry = 5;
@@ -337,16 +335,14 @@ public class MessageDispatchThrottlingTest extends ProducerConsumerBase {
 
         final AtomicInteger totalReceived = new AtomicInteger(0);
 
-        ConsumerConfiguration conf = new ConsumerConfiguration();
-        conf.setSubscriptionType(subscription);
-        conf.setMessageListener((consumer, msg) -> {
-            Assert.assertNotNull(msg, "Message cannot be null");
-            String receivedMessage = new String(msg.getData());
-            log.debug("Received message [{}] in the listener", receivedMessage);
-            totalReceived.incrementAndGet();
-            latch.countDown();
-        });
-        Consumer consumer = pulsarClient.subscribe(topicName, "my-subscriber-name", conf);
+        Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topicName).subscriptionName("my-subscriber-name")
+                .subscriptionType(subscription).messageListener((c1, msg) -> {
+                    Assert.assertNotNull(msg, "Message cannot be null");
+                    String receivedMessage = new String(msg.getData());
+                    log.debug("Received message [{}] in the listener", receivedMessage);
+                    totalReceived.incrementAndGet();
+                    latch.countDown();
+                }).subscribe();
         // deactive cursors
         deactiveCursors((ManagedLedgerImpl) topic.getManagedLedger());
 
@@ -388,7 +384,7 @@ public class MessageDispatchThrottlingTest extends ProducerConsumerBase {
         admin.namespaces().createNamespace(namespace);
         admin.namespaces().setDispatchRate(namespace, dispatchRate);
         // create producer and topic
-        Producer producer = pulsarClient.createProducer(topicName);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName).create();
         PersistentTopic topic = (PersistentTopic) pulsar.getBrokerService().getTopic(topicName).get();
         boolean isMessageRateUpdate = false;
         int retry = 5;
@@ -410,16 +406,14 @@ public class MessageDispatchThrottlingTest extends ProducerConsumerBase {
 
         final AtomicInteger totalReceived = new AtomicInteger(0);
 
-        ConsumerConfiguration conf = new ConsumerConfiguration();
-        conf.setSubscriptionType(subscription);
-        conf.setMessageListener((consumer, msg) -> {
-            Assert.assertNotNull(msg, "Message cannot be null");
-            String receivedMessage = new String(msg.getData());
-            log.debug("Received message [{}] in the listener", receivedMessage);
-            totalReceived.incrementAndGet();
-            latch.countDown();
-        });
-        Consumer consumer = pulsarClient.subscribe(topicName, "my-subscriber-name-" + subscription, conf);
+        Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topicName).subscriptionName("my-subscriber-name")
+                .subscriptionType(subscription).messageListener((c1, msg) -> {
+                    Assert.assertNotNull(msg, "Message cannot be null");
+                    String receivedMessage = new String(msg.getData());
+                    log.debug("Received message [{}] in the listener", receivedMessage);
+                    totalReceived.incrementAndGet();
+                    latch.countDown();
+                }).subscribe();
         // deactive cursors
         deactiveCursors((ManagedLedgerImpl) topic.getManagedLedger());
 
@@ -453,7 +447,7 @@ public class MessageDispatchThrottlingTest extends ProducerConsumerBase {
         admin.namespaces().createNamespace(namespace);
         admin.namespaces().setDispatchRate(namespace, dispatchRate);
         // create producer and topic
-        Producer producer = pulsarClient.createProducer(topicName);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName).create();
         PersistentTopic topic = (PersistentTopic) pulsar.getBrokerService().getTopic(topicName).get();
         boolean isMessageRateUpdate = false;
         int retry = 5;
@@ -474,19 +468,19 @@ public class MessageDispatchThrottlingTest extends ProducerConsumerBase {
 
         final AtomicInteger totalReceived = new AtomicInteger(0);
 
-        ConsumerConfiguration conf = new ConsumerConfiguration();
-        conf.setSubscriptionType(SubscriptionType.Shared);
-        conf.setMessageListener((consumer, msg) -> {
-            Assert.assertNotNull(msg, "Message cannot be null");
-            String receivedMessage = new String(msg.getData());
-            log.debug("Received message [{}] in the listener", receivedMessage);
-            totalReceived.incrementAndGet();
-        });
-        Consumer consumer1 = pulsarClient.subscribe(topicName, "my-subscriber-name", conf);
-        Consumer consumer2 = pulsarClient.subscribe(topicName, "my-subscriber-name", conf);
-        Consumer consumer3 = pulsarClient.subscribe(topicName, "my-subscriber-name", conf);
-        Consumer consumer4 = pulsarClient.subscribe(topicName, "my-subscriber-name", conf);
-        Consumer consumer5 = pulsarClient.subscribe(topicName, "my-subscriber-name", conf);
+        ConsumerBuilder<byte[]> consumerBuilder = pulsarClient.newConsumer().topic(topicName)
+                .subscriptionName("my-subscriber-name").subscriptionType(SubscriptionType.Shared).messageListener((c1, msg) -> {
+                    Assert.assertNotNull(msg, "Message cannot be null");
+                    String receivedMessage = new String(msg.getData());
+                    log.debug("Received message [{}] in the listener", receivedMessage);
+                    totalReceived.incrementAndGet();
+                });
+        Consumer<byte[]> consumer1 = consumerBuilder.subscribe();
+        Consumer<byte[]> consumer2 = consumerBuilder.subscribe();
+        Consumer<byte[]> consumer3 = consumerBuilder.subscribe();
+        Consumer<byte[]> consumer4 = consumerBuilder.subscribe();
+        Consumer<byte[]> consumer5 = consumerBuilder.subscribe();
+
         // deactive cursors
         deactiveCursors((ManagedLedgerImpl) topic.getManagedLedger());
 
@@ -521,7 +515,8 @@ public class MessageDispatchThrottlingTest extends ProducerConsumerBase {
 
         int initValue = pulsar.getConfiguration().getDispatchThrottlingRatePerTopicInMsg();
         // (1) Update message-dispatch-rate limit
-        admin.brokers().updateDynamicConfiguration("dispatchThrottlingRatePerTopicInMsg", Integer.toString(messageRate));
+        admin.brokers().updateDynamicConfiguration("dispatchThrottlingRatePerTopicInMsg",
+                Integer.toString(messageRate));
         // sleep incrementally as zk-watch notification is async and may take some time
         for (int i = 0; i < 5; i++) {
             if (pulsar.getConfiguration().getDispatchThrottlingRatePerTopicInMsg() == initValue) {
@@ -532,21 +527,19 @@ public class MessageDispatchThrottlingTest extends ProducerConsumerBase {
 
         admin.namespaces().createNamespace(namespace);
         // create producer and topic
-        Producer producer = pulsarClient.createProducer(topicName);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName).create();
         PersistentTopic topic = (PersistentTopic) pulsar.getBrokerService().getTopic(topicName).get();
         int numMessages = 500;
 
         final AtomicInteger totalReceived = new AtomicInteger(0);
 
-        ConsumerConfiguration conf = new ConsumerConfiguration();
-        conf.setSubscriptionType(subscription);
-        conf.setMessageListener((consumer, msg) -> {
-            Assert.assertNotNull(msg, "Message cannot be null");
-            String receivedMessage = new String(msg.getData());
-            log.debug("Received message [{}] in the listener", receivedMessage);
-            totalReceived.incrementAndGet();
-        });
-        Consumer consumer = pulsarClient.subscribe(topicName, "my-subscriber-name", conf);
+        Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topicName).subscriptionName("my-subscriber-name")
+                .subscriptionType(subscription).messageListener((c1, msg) -> {
+                    Assert.assertNotNull(msg, "Message cannot be null");
+                    String receivedMessage = new String(msg.getData());
+                    log.debug("Received message [{}] in the listener", receivedMessage);
+                    totalReceived.incrementAndGet();
+                }).subscribe();
         // deactive cursors
         deactiveCursors((ManagedLedgerImpl) topic.getManagedLedger());
 
@@ -587,7 +580,7 @@ public class MessageDispatchThrottlingTest extends ProducerConsumerBase {
         admin.namespaces().createNamespace(namespace);
         admin.namespaces().setDispatchRate(namespace, dispatchRate);
         // create producer and topic
-        Producer producer = pulsarClient.createProducer(topicName);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName).create();
         PersistentTopic topic = (PersistentTopic) pulsar.getBrokerService().getTopic(topicName).get();
         boolean isMessageRateUpdate = false;
         int retry = 5;
@@ -609,15 +602,14 @@ public class MessageDispatchThrottlingTest extends ProducerConsumerBase {
 
         final AtomicInteger totalReceived = new AtomicInteger(0);
 
-        ConsumerConfiguration conf = new ConsumerConfiguration();
-        conf.setSubscriptionType(subscription);
-        conf.setMessageListener((consumer, msg) -> {
-            Assert.assertNotNull(msg, "Message cannot be null");
-            String receivedMessage = new String(msg.getData());
-            log.debug("Received message [{}] in the listener", receivedMessage);
-            totalReceived.incrementAndGet();
-        });
-        Consumer consumer = pulsarClient.subscribe(topicName, "my-subscriber-name", conf);
+        ConsumerBuilder<byte[]> consumerBuilder = pulsarClient.newConsumer().topic(topicName)
+                .subscriptionName("my-subscriber-name").subscriptionType(subscription).messageListener((c1, msg) -> {
+                    Assert.assertNotNull(msg, "Message cannot be null");
+                    String receivedMessage = new String(msg.getData());
+                    log.debug("Received message [{}] in the listener", receivedMessage);
+                    totalReceived.incrementAndGet();
+                });
+        Consumer<byte[]> consumer = consumerBuilder.subscribe();
         // deactive cursors
         deactiveCursors((ManagedLedgerImpl) topic.getManagedLedger());
         consumer.close();
@@ -629,7 +621,7 @@ public class MessageDispatchThrottlingTest extends ProducerConsumerBase {
             producer.send(data);
         }
 
-        consumer = pulsarClient.subscribe(topicName, "my-subscriber-name", conf);
+        consumer = consumerBuilder.subscribe();
         final int totalReceivedBytes = dataSize * totalReceived.get();
         Assert.assertNotEquals(totalReceivedBytes, byteRate * 2);
 
@@ -646,6 +638,7 @@ public class MessageDispatchThrottlingTest extends ProducerConsumerBase {
      * 3. applies dispatch rate
      *
      * </pre>
+     *
      * @throws Exception
      */
     @Test
@@ -655,7 +648,6 @@ public class MessageDispatchThrottlingTest extends ProducerConsumerBase {
         final String namespace = "my-property/global/throttling_ns";
         final String topicName = "persistent://" + namespace + "/throttlingBlock";
 
-
         final int messageRate = 5;
         DispatchRate dispatchRate = new DispatchRate(messageRate, -1, 360);
 
@@ -665,7 +657,7 @@ public class MessageDispatchThrottlingTest extends ProducerConsumerBase {
         admin.namespaces().setDispatchRate(namespace, dispatchRate);
 
         // create producer and topic
-        Producer producer = pulsarClient.createProducer(topicName);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName).create();
         PersistentTopic topic = (PersistentTopic) pulsar.getBrokerService().getTopic(topicName).get();
         boolean isMessageRateUpdate = false;
         int retry = 5;
@@ -687,15 +679,13 @@ public class MessageDispatchThrottlingTest extends ProducerConsumerBase {
 
         final AtomicInteger totalReceived = new AtomicInteger(0);
 
-        ConsumerConfiguration conf = new ConsumerConfiguration();
-        conf.setSubscriptionType(SubscriptionType.Shared);
-        conf.setMessageListener((consumer, msg) -> {
-            Assert.assertNotNull(msg, "Message cannot be null");
-            String receivedMessage = new String(msg.getData());
-            log.debug("Received message [{}] in the listener", receivedMessage);
-            totalReceived.incrementAndGet();
-        });
-        Consumer consumer = pulsarClient.subscribe(topicName, "my-subscriber-name", conf);
+        Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topicName).subscriptionName("my-subscriber-name")
+                .subscriptionType(SubscriptionType.Shared).messageListener((c1, msg) -> {
+                    Assert.assertNotNull(msg, "Message cannot be null");
+                    String receivedMessage = new String(msg.getData());
+                    log.debug("Received message [{}] in the listener", receivedMessage);
+                    totalReceived.incrementAndGet();
+                }).subscribe();
         // deactive cursors
         deactiveCursors((ManagedLedgerImpl) topic.getManagedLedger());
 
@@ -736,7 +726,7 @@ public class MessageDispatchThrottlingTest extends ProducerConsumerBase {
         admin.brokers().updateDynamicConfiguration("dispatchThrottlingOnNonBacklogConsumerEnabled",
                 Boolean.TRUE.toString());
         // create producer and topic
-        Producer producer = pulsarClient.createProducer(topicName);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName).create();
         PersistentTopic topic = (PersistentTopic) pulsar.getBrokerService().getTopic(topicName).get();
         boolean isUpdated = false;
         int retry = 5;
@@ -760,15 +750,13 @@ public class MessageDispatchThrottlingTest extends ProducerConsumerBase {
 
         final AtomicInteger totalReceived = new AtomicInteger(0);
 
-        ConsumerConfiguration consumerConf = new ConsumerConfiguration();
-        consumerConf.setSubscriptionType(subscription);
-        consumerConf.setMessageListener((consumer, msg) -> {
-            Assert.assertNotNull(msg, "Message cannot be null");
-            String receivedMessage = new String(msg.getData());
-            log.debug("Received message [{}] in the listener", receivedMessage);
-            totalReceived.incrementAndGet();
-        });
-        Consumer consumer = pulsarClient.subscribe(topicName, "my-subscriber-name", consumerConf);
+        Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topicName).subscriptionName("my-subscriber-name")
+                .subscriptionType(subscription).messageListener((c1, msg) -> {
+                    Assert.assertNotNull(msg, "Message cannot be null");
+                    String receivedMessage = new String(msg.getData());
+                    log.debug("Received message [{}] in the listener", receivedMessage);
+                    totalReceived.incrementAndGet();
+                }).subscribe();
 
         // Asynchronously produce messages
         for (int i = 0; i < numMessages; i++) {
@@ -785,7 +773,7 @@ public class MessageDispatchThrottlingTest extends ProducerConsumerBase {
         log.info("-- Exiting {} test --", methodName);
     }
 
-     /**
+    /**
      * <pre>
      * It verifies that cluster-throttling value gets considered when namespace-policy throttling is disabled.
      *
@@ -821,7 +809,7 @@ public class MessageDispatchThrottlingTest extends ProducerConsumerBase {
 
         admin.namespaces().createNamespace(namespace);
         // create producer and topic
-        Producer producer = pulsarClient.createProducer(topicName1);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName1).create();
         PersistentTopic topic = (PersistentTopic) pulsar.getBrokerService().getTopic(topicName1).get();
 
         // (1) Update dispatch rate on cluster-config update
@@ -849,7 +837,7 @@ public class MessageDispatchThrottlingTest extends ProducerConsumerBase {
         Assert.assertEquals(clusterMessageRate, topic.getDispatchRateLimiter().getDispatchRateOnMsg());
 
         // (5) Namespace throttling is disabled so, new topic should take cluster throttling limit
-        Producer producer2 = pulsarClient.createProducer(topicName2);
+        Producer<byte[]> producer2 = pulsarClient.newProducer().topic(topicName2).create();
         PersistentTopic topic2 = (PersistentTopic) pulsar.getBrokerService().getTopic(topicName2).get();
         Assert.assertEquals(clusterMessageRate, topic2.getDispatchRateLimiter().getDispatchRateOnMsg());
 
diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/client/api/MockBrokerService.java b/pulsar-broker/src/test/java/org/apache/pulsar/client/api/MockBrokerService.java
index 13c1146..bdc8e32 100644
--- a/pulsar-broker/src/test/java/org/apache/pulsar/client/api/MockBrokerService.java
+++ b/pulsar-broker/src/test/java/org/apache/pulsar/client/api/MockBrokerService.java
@@ -244,7 +244,6 @@ public class MockBrokerService {
     EventLoopGroup workerGroup;
 
     private final int webServicePort;
-    private final int webServicePortTls;
     private final int brokerServicePort;
     private final int brokerServicePortTls;
 
@@ -268,7 +267,6 @@ public class MockBrokerService {
     public MockBrokerService(int webServicePort, int webServicePortTls, int brokerServicePort,
             int brokerServicePortTls) {
         this.webServicePort = webServicePort;
-        this.webServicePortTls = webServicePortTls;
         this.brokerServicePort = brokerServicePort;
         this.brokerServicePortTls = brokerServicePortTls;
 
diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/client/api/NonPersistentTopicTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/client/api/NonPersistentTopicTest.java
index fefe8e7..41dfb7c 100644
--- a/pulsar-broker/src/test/java/org/apache/pulsar/client/api/NonPersistentTopicTest.java
+++ b/pulsar-broker/src/test/java/org/apache/pulsar/client/api/NonPersistentTopicTest.java
@@ -104,14 +104,10 @@ public class NonPersistentTopicTest extends ProducerConsumerBase {
         log.info("-- Starting {} test --", methodName);
 
         final String topic = "non-persistent://my-property/use/my-ns/unacked-topic";
-        ConsumerConfiguration conf = new ConsumerConfiguration();
-        conf.setSubscriptionType(type);
+        ConsumerImpl<byte[]> consumer = (ConsumerImpl<byte[]>) pulsarClient.newConsumer().topic(topic)
+                .subscriptionName("subscriber-1").subscriptionType(type).subscribe();
 
-        ProducerConfiguration producerConf = new ProducerConfiguration();
-
-        ConsumerImpl consumer = (ConsumerImpl) pulsarClient.subscribe(topic, "subscriber-1", conf);
-
-        Producer producer = pulsarClient.createProducer(topic, producerConf);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topic).create();
 
         int totalProduceMsg = 500;
         for (int i = 0; i < totalProduceMsg; i++) {
@@ -120,7 +116,7 @@ public class NonPersistentTopicTest extends ProducerConsumerBase {
             Thread.sleep(10);
         }
 
-        Message msg = null;
+        Message<?> msg = null;
         Set<String> messageSet = Sets.newHashSet();
         for (int i = 0; i < totalProduceMsg; i++) {
             msg = consumer.receive(1, TimeUnit.SECONDS);
@@ -148,14 +144,10 @@ public class NonPersistentTopicTest extends ProducerConsumerBase {
 
         final String topic = "non-persistent://my-property/use/my-ns/partitioned-topic";
         admin.nonPersistentTopics().createPartitionedTopic(topic, 5);
-        ConsumerConfiguration conf = new ConsumerConfiguration();
-        conf.setSubscriptionType(type);
-
-        ProducerConfiguration producerConf = new ProducerConfiguration();
+        Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topic).subscriptionName("subscriber-1")
+                .subscriptionType(type).subscribe();
 
-        Consumer consumer = pulsarClient.subscribe(topic, "subscriber-1", conf);
-
-        Producer producer = pulsarClient.createProducer(topic, producerConf);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topic).create();
 
         int totalProduceMsg = 500;
         for (int i = 0; i < totalProduceMsg; i++) {
@@ -164,7 +156,7 @@ public class NonPersistentTopicTest extends ProducerConsumerBase {
             Thread.sleep(10);
         }
 
-        Message msg = null;
+        Message<?> msg = null;
         Set<String> messageSet = Sets.newHashSet();
         for (int i = 0; i < totalProduceMsg; i++) {
             msg = consumer.receive(1, TimeUnit.SECONDS);
@@ -196,10 +188,10 @@ public class NonPersistentTopicTest extends ProducerConsumerBase {
 
         PulsarClient client = PulsarClient.builder().serviceUrl("pulsar://localhost:" + BROKER_PORT)
                 .statsInterval(0, TimeUnit.SECONDS).build();
-        Consumer consumer = client.newConsumer().topic(topic).subscriptionName("subscriber-1").subscriptionType(type)
-                .subscribe();
+        Consumer<byte[]> consumer = client.newConsumer().topic(topic).subscriptionName("subscriber-1")
+                .subscriptionType(type).subscribe();
 
-        Producer producer = client.newProducer().topic(topic).create();
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topic).create();
 
         // Ensure all partitions exist
         for (int i = 0; i < numPartitions; i++) {
@@ -214,7 +206,7 @@ public class NonPersistentTopicTest extends ProducerConsumerBase {
             Thread.sleep(10);
         }
 
-        Message msg = null;
+        Message<?> msg = null;
         Set<String> messageSet = Sets.newHashSet();
         for (int i = 0; i < totalProduceMsg; i++) {
             msg = consumer.receive(1, TimeUnit.SECONDS);
@@ -237,8 +229,7 @@ public class NonPersistentTopicTest extends ProducerConsumerBase {
     }
 
     /**
-     * It verifies that broker doesn't dispatch messages if consumer runs out of permits
-     * filled out with messages
+     * It verifies that broker doesn't dispatch messages if consumer runs out of permits filled out with messages
      */
     @Test(dataProvider = "subscriptionType")
     public void testConsumerInternalQueueMaxOut(SubscriptionType type) throws Exception {
@@ -246,15 +237,10 @@ public class NonPersistentTopicTest extends ProducerConsumerBase {
 
         final String topic = "non-persistent://my-property/use/my-ns/unacked-topic";
         final int queueSize = 10;
-        ConsumerConfiguration conf = new ConsumerConfiguration();
-        conf.setSubscriptionType(type);
-        conf.setReceiverQueueSize(queueSize);
-
-        ProducerConfiguration producerConf = new ProducerConfiguration();
-
-        ConsumerImpl consumer = (ConsumerImpl) pulsarClient.subscribe(topic, "subscriber-1", conf);
+        ConsumerImpl<byte[]> consumer = (ConsumerImpl<byte[]>) pulsarClient.newConsumer().topic(topic)
+                .receiverQueueSize(queueSize).subscriptionName("subscriber-1").subscriptionType(type).subscribe();
 
-        Producer producer = pulsarClient.createProducer(topic, producerConf);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topic).create();
 
         int totalProduceMsg = 50;
         for (int i = 0; i < totalProduceMsg; i++) {
@@ -263,7 +249,7 @@ public class NonPersistentTopicTest extends ProducerConsumerBase {
             Thread.sleep(10);
         }
 
-        Message msg = null;
+        Message<?> msg = null;
         Set<String> messageSet = Sets.newHashSet();
         for (int i = 0; i < totalProduceMsg; i++) {
             msg = consumer.receive(1, TimeUnit.SECONDS);
@@ -300,9 +286,9 @@ public class NonPersistentTopicTest extends ProducerConsumerBase {
             // produce message concurrently
             ExecutorService executor = Executors.newFixedThreadPool(5);
             AtomicBoolean failed = new AtomicBoolean(false);
-            ProducerConfiguration producerConf = new ProducerConfiguration();
-            Consumer consumer = pulsarClient.subscribe(topic, "subscriber-1");
-            Producer producer = pulsarClient.createProducer(topic, producerConf);
+            Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topic).subscriptionName("subscriber-1")
+                    .subscribe();
+            Producer<byte[]> producer = pulsarClient.newProducer().topic(topic).create();
             byte[] msgData = "testData".getBytes();
             final int totalProduceMessages = 10;
             CountDownLatch latch = new CountDownLatch(totalProduceMessages);
@@ -319,7 +305,7 @@ public class NonPersistentTopicTest extends ProducerConsumerBase {
             }
             latch.await();
 
-            Message msg = null;
+            Message<?> msg = null;
             Set<String> messageSet = Sets.newHashSet();
             for (int i = 0; i < totalProduceMessages; i++) {
                 msg = consumer.receive(500, TimeUnit.MILLISECONDS);
@@ -352,19 +338,19 @@ public class NonPersistentTopicTest extends ProducerConsumerBase {
         log.info("-- Starting {} test --", methodName);
 
         final String topic = "non-persistent://my-property/use/my-ns/unacked-topic";
-        ConsumerConfiguration sharedConf = new ConsumerConfiguration();
-        sharedConf.setSubscriptionType(SubscriptionType.Shared);
-        ConsumerConfiguration excConf = new ConsumerConfiguration();
-        excConf.setSubscriptionType(SubscriptionType.Failover);
+        ConsumerImpl<byte[]> consumer1Shared = (ConsumerImpl<byte[]>) pulsarClient.newConsumer().topic(topic)
+                .subscriptionName("subscriber-shared").subscriptionType(SubscriptionType.Shared).subscribe();
 
-        ProducerConfiguration producerConf = new ProducerConfiguration();
+        ConsumerImpl<byte[]> consumer2Shared = (ConsumerImpl<byte[]>) pulsarClient.newConsumer().topic(topic)
+                .subscriptionName("subscriber-shared").subscriptionType(SubscriptionType.Shared).subscribe();
 
-        ConsumerImpl consumer1Shared = (ConsumerImpl) pulsarClient.subscribe(topic, "subscriber-shared", sharedConf);
-        ConsumerImpl consumer2Shared = (ConsumerImpl) pulsarClient.subscribe(topic, "subscriber-shared", sharedConf);
-        ConsumerImpl consumer1FailOver = (ConsumerImpl) pulsarClient.subscribe(topic, "subscriber-fo", excConf);
-        ConsumerImpl consumer2FailOver = (ConsumerImpl) pulsarClient.subscribe(topic, "subscriber-fo", excConf);
+        ConsumerImpl<byte[]> consumer1FailOver = (ConsumerImpl<byte[]>) pulsarClient.newConsumer().topic(topic)
+                .subscriptionName("subscriber-fo").subscriptionType(SubscriptionType.Failover).subscribe();
 
-        Producer producer = pulsarClient.createProducer(topic, producerConf);
+        ConsumerImpl<byte[]> consumer2FailOver = (ConsumerImpl<byte[]>) pulsarClient.newConsumer().topic(topic)
+                .subscriptionName("subscriber-fo").subscriptionType(SubscriptionType.Failover).subscribe();
+
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topic).create();
 
         int totalProduceMsg = 500;
         for (int i = 0; i < totalProduceMsg; i++) {
@@ -374,7 +360,7 @@ public class NonPersistentTopicTest extends ProducerConsumerBase {
         }
 
         // consume from shared-subscriptions
-        Message msg = null;
+        Message<?> msg = null;
         Set<String> messageSet = Sets.newHashSet();
         for (int i = 0; i < totalProduceMsg; i++) {
             msg = consumer1Shared.receive(500, TimeUnit.MILLISECONDS);
@@ -436,9 +422,8 @@ public class NonPersistentTopicTest extends ProducerConsumerBase {
         NonPersistentTopicStats stats;
         SubscriptionStats subStats;
 
-        ConsumerConfiguration conf = new ConsumerConfiguration();
-        conf.setSubscriptionType(SubscriptionType.Shared);
-        Consumer consumer = pulsarClient.subscribe(topicName, subName, conf);
+        Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topicName)
+                .subscriptionType(SubscriptionType.Shared).subscriptionName(subName).subscribe();
         Thread.sleep(timeWaitToSync);
 
         NonPersistentTopic topicRef = (NonPersistentTopic) pulsar.getBrokerService().getTopicReference(topicName);
@@ -452,7 +437,7 @@ public class NonPersistentTopicTest extends ProducerConsumerBase {
         assertEquals(stats.getSubscriptions().keySet().size(), 1);
         assertEquals(subStats.consumers.size(), 1);
 
-        Producer producer = pulsarClient.createProducer(topicName);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName).create();
         Thread.sleep(timeWaitToSync);
 
         int totalProducedMessages = 100;
@@ -494,21 +479,21 @@ public class NonPersistentTopicTest extends ProducerConsumerBase {
             NonPersistentTopicStats stats;
             SubscriptionStats subStats;
 
-            TopicName dest = TopicName.get(globalTopicName);
+            PulsarClient client1 = PulsarClient.builder().serviceUrl(replication.url1.toString()).build();
+            PulsarClient client2 = PulsarClient.builder().serviceUrl(replication.url2.toString()).build();
+            PulsarClient client3 = PulsarClient.builder().serviceUrl(replication.url3.toString()).build();
+
+            ConsumerImpl<byte[]> consumer1 = (ConsumerImpl<byte[]>) client1.newConsumer().topic(globalTopicName)
+                    .subscriptionName("subscriber-1").subscribe();
+            ConsumerImpl<byte[]> consumer2 = (ConsumerImpl<byte[]>) client1.newConsumer().topic(globalTopicName)
+                    .subscriptionName("subscriber-2").subscribe();
 
-            PulsarClient client1 = PulsarClient.create(replication.url1.toString(), new ClientConfiguration());
-            PulsarClient client2 = PulsarClient.create(replication.url2.toString(), new ClientConfiguration());
-            PulsarClient client3 = PulsarClient.create(replication.url3.toString(), new ClientConfiguration());
+            ConsumerImpl<byte[]> repl2Consumer = (ConsumerImpl<byte[]>) client2.newConsumer().topic(globalTopicName)
+                    .subscriptionName("subscriber-1").subscribe();
+            ConsumerImpl<byte[]> repl3Consumer = (ConsumerImpl<byte[]>) client3.newConsumer().topic(globalTopicName)
+                    .subscriptionName("subscriber-1").subscribe();
 
-            ProducerConfiguration producerConf = new ProducerConfiguration();
-            ConsumerConfiguration consumerConf = new ConsumerConfiguration();
-            ConsumerImpl consumer1 = (ConsumerImpl) client1.subscribe(globalTopicName, "subscriber-1", consumerConf);
-            ConsumerImpl consumer2 = (ConsumerImpl) client1.subscribe(globalTopicName, "subscriber-2", consumerConf);
-            ConsumerImpl repl2Consumer = (ConsumerImpl) client2.subscribe(globalTopicName, "subscriber-1",
-                    consumerConf);
-            ConsumerImpl repl3Consumer = (ConsumerImpl) client3.subscribe(globalTopicName, "subscriber-1",
-                    consumerConf);
-            Producer producer = client1.createProducer(globalTopicName, producerConf);
+            Producer<byte[]> producer = client1.newProducer().topic(globalTopicName).create();
 
             Thread.sleep(timeWaitToSync);
 
@@ -516,7 +501,7 @@ public class NonPersistentTopicTest extends ProducerConsumerBase {
 
             // Replicator for r1 -> r2,r3
             NonPersistentTopic topicRef = (NonPersistentTopic) replication.pulsar1.getBrokerService()
-                    .getTopicReference(dest.toString());
+                    .getTopicReference(globalTopicName);
             NonPersistentReplicator replicatorR2 = (NonPersistentReplicator) topicRef.getPersistentReplicator("r2");
             NonPersistentReplicator replicatorR3 = (NonPersistentReplicator) topicRef.getPersistentReplicator("r3");
             assertNotNull(topicRef);
@@ -540,7 +525,7 @@ public class NonPersistentTopicTest extends ProducerConsumerBase {
             }
 
             // (1) consume by consumer1
-            Message msg = null;
+            Message<?> msg = null;
             Set<String> messageSet = Sets.newHashSet();
             for (int i = 0; i < totalProducedMessages; i++) {
                 msg = consumer1.receive(300, TimeUnit.MILLISECONDS);
@@ -623,6 +608,7 @@ public class NonPersistentTopicTest extends ProducerConsumerBase {
 
     /**
      * verifies load manager assigns topic only if broker started in non-persistent mode
+     *
      * <pre>
      * 1. Start broker with disable non-persistent topic mode
      * 2. Create namespace with non-persistency set
@@ -647,6 +633,7 @@ public class NonPersistentTopicTest extends ProducerConsumerBase {
 
             Field field = PulsarService.class.getDeclaredField("loadManager");
             field.setAccessible(true);
+            @SuppressWarnings("unchecked")
             AtomicReference<LoadManager> loadManagerRef = (AtomicReference<LoadManager>) field.get(pulsar);
             LoadManager manager = LoadManager.create(pulsar);
             manager.start();
@@ -662,9 +649,9 @@ public class NonPersistentTopicTest extends ProducerConsumerBase {
             }
             assertNull(broker);
 
-            ProducerConfiguration producerConf = new ProducerConfiguration();
             try {
-                Producer producer = pulsarClient.createProducerAsync(topicName, producerConf).get(1, TimeUnit.SECONDS);
+                Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName).createAsync().get(1,
+                        TimeUnit.SECONDS);
                 producer.close();
                 fail("topic loading should have failed");
             } catch (Exception e) {
@@ -697,9 +684,9 @@ public class NonPersistentTopicTest extends ProducerConsumerBase {
             conf.setEnableNonPersistentTopics(false);
             stopBroker();
             startBroker();
-            ProducerConfiguration producerConf = new ProducerConfiguration();
             try {
-                Producer producer = pulsarClient.createProducerAsync(topicName, producerConf).get(1, TimeUnit.SECONDS);
+                Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName).createAsync().get(1,
+                        TimeUnit.SECONDS);
                 producer.close();
                 fail("topic loading should have failed");
             } catch (Exception e) {
@@ -736,6 +723,7 @@ public class NonPersistentTopicTest extends ProducerConsumerBase {
 
             Field field = PulsarService.class.getDeclaredField("loadManager");
             field.setAccessible(true);
+            @SuppressWarnings("unchecked")
             AtomicReference<LoadManager> loadManagerRef = (AtomicReference<LoadManager>) field.get(pulsar);
             LoadManager manager = LoadManager.create(pulsar);
             manager.start();
@@ -751,9 +739,9 @@ public class NonPersistentTopicTest extends ProducerConsumerBase {
             }
             assertNull(broker);
 
-            ProducerConfiguration producerConf = new ProducerConfiguration();
             try {
-                Producer producer = pulsarClient.createProducerAsync(topicName, producerConf).get(1, TimeUnit.SECONDS);
+                Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName).createAsync().get(1,
+                        TimeUnit.SECONDS);
                 producer.close();
                 fail("topic loading should have failed");
             } catch (Exception e) {
@@ -785,15 +773,13 @@ public class NonPersistentTopicTest extends ProducerConsumerBase {
             conf.setMaxConcurrentNonPersistentMessagePerConnection(1);
             stopBroker();
             startBroker();
-            ProducerConfiguration producerConf = new ProducerConfiguration();
-            ConsumerConfiguration consumerConfig1 = new ConsumerConfiguration();
-            consumerConfig1.setReceiverQueueSize(1);
-            Consumer consumer = pulsarClient.subscribe(topicName, "subscriber-1", consumerConfig1);
-            ConsumerConfiguration consumerConfig2 = new ConsumerConfiguration();
-            consumerConfig2.setReceiverQueueSize(1);
-            consumerConfig2.setSubscriptionType(SubscriptionType.Shared);
-            Consumer consumer2 = pulsarClient.subscribe(topicName, "subscriber-2", consumerConfig2);
-            ProducerImpl producer = (ProducerImpl) pulsarClient.createProducer(topicName, producerConf);
+            Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topicName).subscriptionName("subscriber-1")
+                    .receiverQueueSize(1).subscribe();
+
+            Consumer<byte[]> consumer2 = pulsarClient.newConsumer().topic(topicName).subscriptionName("subscriber-2")
+                    .receiverQueueSize(1).subscriptionType(SubscriptionType.Shared).subscribe();
+
+            ProducerImpl<byte[]> producer = (ProducerImpl<byte[]>) pulsarClient.newProducer().topic(topicName).create();
             String firstTimeConnected = producer.getConnectedSince();
             ExecutorService executor = Executors.newFixedThreadPool(5);
             byte[] msgData = "testData".getBytes();
@@ -801,7 +787,7 @@ public class NonPersistentTopicTest extends ProducerConsumerBase {
             CountDownLatch latch = new CountDownLatch(totalProduceMessages);
             for (int i = 0; i < totalProduceMessages; i++) {
                 executor.submit(() -> {
-                    producer.sendAsync(msgData).handle((msg,e)->{
+                    producer.sendAsync(msgData).handle((msg, e) -> {
                         latch.countDown();
                         return null;
                     });
diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/client/api/PartitionedProducerConsumerTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/client/api/PartitionedProducerConsumerTest.java
index 3be9edc..0708229 100644
--- a/pulsar-broker/src/test/java/org/apache/pulsar/client/api/PartitionedProducerConsumerTest.java
+++ b/pulsar-broker/src/test/java/org/apache/pulsar/client/api/PartitionedProducerConsumerTest.java
@@ -25,20 +25,10 @@ import static org.testng.Assert.fail;
 import java.util.Set;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.Executor;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.TimeUnit;
 
-import org.apache.pulsar.client.api.Consumer;
-import org.apache.pulsar.client.api.ConsumerConfiguration;
-import org.apache.pulsar.client.api.Message;
-import org.apache.pulsar.client.api.MessageBuilder;
-import org.apache.pulsar.client.api.Producer;
-import org.apache.pulsar.client.api.ProducerConfiguration;
-import org.apache.pulsar.client.api.PulsarClientException;
-import org.apache.pulsar.client.api.SubscriptionType;
-import org.apache.pulsar.client.api.ProducerConfiguration.MessageRoutingMode;
 import org.apache.pulsar.client.impl.PartitionedProducerImpl;
 import org.apache.pulsar.common.naming.TopicName;
 import org.slf4j.Logger;
@@ -80,23 +70,20 @@ public class PartitionedProducerConsumerTest extends ProducerConsumerBase {
         int numPartitions = 4;
         TopicName topicName = TopicName.get("persistent://my-property/use/my-ns/my-partitionedtopic1");
 
-        ConsumerConfiguration conf = new ConsumerConfiguration();
-        conf.setSubscriptionType(SubscriptionType.Exclusive);
-
         admin.persistentTopics().createPartitionedTopic(topicName.toString(), numPartitions);
 
-        ProducerConfiguration producerConf = new ProducerConfiguration();
-        producerConf.setMessageRoutingMode(MessageRoutingMode.RoundRobinPartition);
-        Producer producer = pulsarClient.createProducer(topicName.toString(), producerConf);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName.toString())
+                .messageRoutingMode(MessageRoutingMode.RoundRobinPartition).create();
 
-        Consumer consumer = pulsarClient.subscribe(topicName.toString(), "my-partitioned-subscriber", conf);
+        Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topicName.toString())
+                .subscriptionName("my-partitioned-subscriber").subscribe();
 
         for (int i = 0; i < 10; i++) {
             String message = "my-message-" + i;
             producer.send(message.getBytes());
         }
 
-        Message msg = null;
+        Message<byte[]> msg = null;
         Set<String> messageSet = Sets.newHashSet();
         for (int i = 0; i < 10; i++) {
             msg = consumer.receive(5, TimeUnit.SECONDS);
@@ -121,13 +108,13 @@ public class PartitionedProducerConsumerTest extends ProducerConsumerBase {
 
         int numPartitions = 4;
         final String specialCharacter = "! * ' ( ) ; : @ & = + $ , /\\ ? % # [ ]";
-        TopicName topicName = TopicName.get("persistent://my-property/use/my-ns/my-partitionedtopic1" + specialCharacter);
+        TopicName topicName = TopicName
+                .get("persistent://my-property/use/my-ns/my-partitionedtopic1" + specialCharacter);
         admin.persistentTopics().createPartitionedTopic(topicName.toString(), numPartitions);
 
-        ProducerConfiguration producerConf = new ProducerConfiguration();
-        producerConf.setMessageRoutingMode(MessageRoutingMode.RoundRobinPartition);
         // Try to create producer which does lookup and create connection with broker
-        Producer producer = pulsarClient.createProducer(topicName.toString(), producerConf);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName.toString())
+                .messageRoutingMode(MessageRoutingMode.RoundRobinPartition).create();
         producer.close();
         admin.persistentTopics().deletePartitionedTopic(topicName.toString());
         log.info("-- Exiting {} test --", methodName);
@@ -140,23 +127,20 @@ public class PartitionedProducerConsumerTest extends ProducerConsumerBase {
         int numPartitions = 4;
         TopicName topicName = TopicName.get("persistent://my-property/use/my-ns/my-partitionedtopic2");
 
-        ConsumerConfiguration conf = new ConsumerConfiguration();
-        conf.setSubscriptionType(SubscriptionType.Exclusive);
-
         admin.persistentTopics().createPartitionedTopic(topicName.toString(), numPartitions);
 
-        ProducerConfiguration producerConf = new ProducerConfiguration();
-        producerConf.setMessageRoutingMode(MessageRoutingMode.SinglePartition);
-        Producer producer = pulsarClient.createProducer(topicName.toString(), producerConf);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName.toString())
+                .messageRoutingMode(MessageRoutingMode.SinglePartition).create();
 
-        Consumer consumer = pulsarClient.subscribe(topicName.toString(), "my-partitioned-subscriber", conf);
+        Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topicName.toString())
+                .subscriptionName("my-partitioned-subscriber").subscribe();
 
         for (int i = 0; i < 10; i++) {
             String message = "my-message-" + i;
             producer.send(message.getBytes());
         }
 
-        Message msg = null;
+        Message<byte[]> msg = null;
         Set<String> messageSet = Sets.newHashSet();
 
         for (int i = 0; i < 10; i++) {
@@ -186,15 +170,13 @@ public class PartitionedProducerConsumerTest extends ProducerConsumerBase {
         String dummyKey1 = "dummykey1";
         String dummyKey2 = "dummykey2";
 
-        ConsumerConfiguration conf = new ConsumerConfiguration();
-        conf.setSubscriptionType(SubscriptionType.Exclusive);
-
         admin.persistentTopics().createPartitionedTopic(topicName.toString(), numPartitions);
 
-        Producer producer = pulsarClient.createProducer(topicName.toString());
-        Consumer consumer = pulsarClient.subscribe(topicName.toString(), "my-partitioned-subscriber", conf);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName.toString()).create();
+        Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topicName.toString())
+                .subscriptionName("my-partitioned-subscriber").subscribe();
 
-        Message msg = null;
+        Message<byte[]> msg = null;
         for (int i = 0; i < 5; i++) {
             String message = "my-message-" + i;
             msg = MessageBuilder.create().setContent(message.getBytes()).setKey(dummyKey1).build();
@@ -242,13 +224,11 @@ public class PartitionedProducerConsumerTest extends ProducerConsumerBase {
         TopicName topicName = TopicName.get("persistent://my-property/use/my-ns/my-partitionedtopic4");
         admin.persistentTopics().createPartitionedTopic(topicName.toString(), numPartitions);
 
-        ConsumerConfiguration consumerConf = new ConsumerConfiguration();
-        consumerConf.setSubscriptionType(SubscriptionType.Exclusive);
-
-        Consumer consumer = pulsarClient.subscribe(topicName.toString(), "my-subscriber-name", consumerConf);
+        Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topicName.toString())
+                .subscriptionName("my-subscriber-name").subscribe();
 
         try {
-            Message msg = MessageBuilder.create().setContent("InvalidMessage".getBytes()).build();
+            Message<byte[]> msg = MessageBuilder.create().setContent("InvalidMessage".getBytes()).build();
             consumer.acknowledge(msg);
         } catch (PulsarClientException.InvalidMessageException e) {
             // ok
@@ -270,7 +250,7 @@ public class PartitionedProducerConsumerTest extends ProducerConsumerBase {
             // ok
         }
 
-        Producer producer = pulsarClient.createProducer(topicName.toString());
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName.toString()).create();
         producer.close();
 
         try {
@@ -291,47 +271,30 @@ public class PartitionedProducerConsumerTest extends ProducerConsumerBase {
         TopicName topicName = TopicName.get("persistent://my-property/use/my-ns/my-partitionedtopic5");
         admin.persistentTopics().createPartitionedTopic(topicName.toString(), numPartitions);
 
-        ProducerConfiguration producerConf = new ProducerConfiguration();
-        Producer producer = null;
-        Consumer consumer = null;
+        Producer<byte[]> producer = null;
+        Consumer<byte[]> consumer = null;
 
         try {
-            producerConf.setMessageRouter(null);
+            pulsarClient.newProducer().messageRouter(null);
             Assert.fail("should fail");
         } catch (NullPointerException e) {
             // ok
         }
 
         try {
-            producerConf.setMessageRoutingMode(null);
+            pulsarClient.newProducer().messageRoutingMode(null);
             Assert.fail("should fail");
         } catch (NullPointerException e) {
             // ok
         }
 
         try {
-            producer = pulsarClient.createProducer(topicName.toString(), null);
-            Assert.fail("should fail");
-        } catch (PulsarClientException e) {
-            Assert.assertTrue(e instanceof PulsarClientException.InvalidConfigurationException);
-        }
-
-        ConsumerConfiguration consumerConf = new ConsumerConfiguration();
-
-        try {
-            consumer = pulsarClient.subscribe(topicName.toString(), "my-subscriber-name", null);
-            Assert.fail("Should fail");
-        } catch (PulsarClientException e) {
-            Assert.assertTrue(e instanceof PulsarClientException.InvalidConfigurationException);
-        }
-
-        try {
-            producer = pulsarClient.createProducer(topicName.toString());
-            consumer = pulsarClient.subscribe(topicName.toString(), "my-sub");
+            producer = pulsarClient.newProducer().topic(topicName.toString()).create();
+            consumer = pulsarClient.newConsumer().topic(topicName.toString()).subscriptionName("my-sub").subscribe();
             producer.send("message1".getBytes());
             producer.send("message2".getBytes());
-            Message msg1 = consumer.receive();
-            Message msg2 = consumer.receive();
+            /* Message<byte[]> msg1 = */ consumer.receive();
+            Message<byte[]> msg2 = consumer.receive();
             consumer.acknowledgeCumulative(msg2);
             Assert.fail("should fail since ack cumulative is not supported for partitioned topic");
         } catch (PulsarClientException e) {
@@ -352,15 +315,16 @@ public class PartitionedProducerConsumerTest extends ProducerConsumerBase {
         TopicName topicName = TopicName.get("persistent://my-property/use/my-ns/my-partitionedtopic6");
         admin.persistentTopics().createPartitionedTopic(topicName.toString(), numPartitions);
 
-        Producer producer = pulsarClient.createProducer(topicName.toString());
-        Consumer consumer = pulsarClient.subscribe(topicName.toString(), "my-sub");
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName.toString()).create();
+        Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topicName.toString()).subscriptionName("my-sub")
+                .subscribe();
         consumer.unsubscribe();
         consumer.close();
         producer.close();
 
         admin.persistentTopics().deletePartitionedTopic(topicName.toString());
 
-        Producer producer1 = pulsarClient.createProducer(topicName.toString());
+        Producer<byte[]> producer1 = pulsarClient.newProducer().topic(topicName.toString()).create();
         if (producer1 instanceof PartitionedProducerImpl) {
             Assert.fail("should fail since partitioned topic was deleted");
         }
@@ -377,16 +341,12 @@ public class PartitionedProducerConsumerTest extends ProducerConsumerBase {
         int numPartitions = 4;
         TopicName topicName = TopicName.get("persistent://my-property/use/my-ns/my-partitionedtopic1");
 
-        ConsumerConfiguration conf = new ConsumerConfiguration();
-        conf.setSubscriptionType(SubscriptionType.Shared);
-
         admin.persistentTopics().createPartitionedTopic(topicName.toString(), numPartitions);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName.toString())
+                .messageRoutingMode(MessageRoutingMode.RoundRobinPartition).create();
 
-        ProducerConfiguration producerConf = new ProducerConfiguration();
-        producerConf.setMessageRoutingMode(MessageRoutingMode.RoundRobinPartition);
-        Producer producer = pulsarClient.createProducer(topicName.toString(), producerConf);
-
-        Consumer consumer = pulsarClient.subscribe(topicName.toString(), "my-partitioned-subscriber", conf);
+        Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topicName.toString())
+                .subscriptionName("my-partitioned-subscriber").subscriptionType(SubscriptionType.Shared).subscribe();
 
         // produce messages
         for (int i = 0; i < totalMsg; i++) {
@@ -428,16 +388,13 @@ public class PartitionedProducerConsumerTest extends ProducerConsumerBase {
         int numPartitions = 4;
         TopicName topicName = TopicName.get("persistent://my-property/use/my-ns/my-partitionedtopic1");
 
-        ConsumerConfiguration conf = new ConsumerConfiguration();
-        conf.setReceiverQueueSize(1);
-
         admin.persistentTopics().createPartitionedTopic(topicName.toString(), numPartitions);
 
-        ProducerConfiguration producerConf = new ProducerConfiguration();
-        producerConf.setMessageRoutingMode(MessageRoutingMode.RoundRobinPartition);
-        Producer producer = pulsarClient.createProducer(topicName.toString(), producerConf);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName.toString())
+                .messageRoutingMode(MessageRoutingMode.RoundRobinPartition).create();
 
-        Consumer consumer = pulsarClient.subscribe(topicName.toString(), "my-partitioned-subscriber", conf);
+        Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topicName.toString())
+                .subscriptionName("my-partitioned-subscriber").receiverQueueSize(1).subscribe();
 
         // produce messages
         for (int i = 0; i < totalMsg; i++) {
@@ -483,17 +440,15 @@ public class PartitionedProducerConsumerTest extends ProducerConsumerBase {
         final String producer2Msg = "producer2";
         final int queueSize = 10;
 
-        ConsumerConfiguration conf = new ConsumerConfiguration();
-        conf.setReceiverQueueSize(queueSize);
-
         admin.persistentTopics().createPartitionedTopic(topicName, numPartitions);
 
-        ProducerConfiguration producerConf = new ProducerConfiguration();
-        producerConf.setMessageRoutingMode(MessageRoutingMode.RoundRobinPartition);
-        Producer producer1 = pulsarClient.createProducer(topicName + "-partition-0", producerConf);
-        Producer producer2 = pulsarClient.createProducer(topicName + "-partition-1", producerConf);
+        Producer<byte[]> producer1 = pulsarClient.newProducer().topic(topicName + "-partition-0")
+                .messageRoutingMode(MessageRoutingMode.RoundRobinPartition).create();
+        Producer<byte[]> producer2 = pulsarClient.newProducer().topic(topicName + "-partition-1")
+                .messageRoutingMode(MessageRoutingMode.RoundRobinPartition).create();
 
-        Consumer consumer = pulsarClient.subscribe(topicName, "my-partitioned-subscriber", conf);
+        Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topicName)
+                .subscriptionName("my-partitioned-subscriber").receiverQueueSize(queueSize).subscribe();
 
         int partition2Msgs = 0;
 
@@ -513,7 +468,7 @@ public class PartitionedProducerConsumerTest extends ProducerConsumerBase {
         // also: we will keep producing messages to partition-1
         int produceMsgInPartition1AfterNumberOfConsumeMessages = 2;
         for (int i = 0; i < 3 * queueSize; i++) {
-            Message msg = consumer.receive();
+            Message<byte[]> msg = consumer.receive();
             partition2Msgs += (new String(msg.getData())).startsWith(producer2Msg) ? 1 : 0;
             if (i >= produceMsgInPartition1AfterNumberOfConsumeMessages) {
                 producer1.send(producer1Msg.getBytes());
@@ -532,10 +487,10 @@ public class PartitionedProducerConsumerTest extends ProducerConsumerBase {
         log.info("-- Exiting {} test --", methodName);
     }
 
-    private void receiveAsync(Consumer consumer, int totalMessage, int currentMessage, CountDownLatch latch,
+    private void receiveAsync(Consumer<byte[]> consumer, int totalMessage, int currentMessage, CountDownLatch latch,
             final Set<String> consumeMsg, ExecutorService executor) throws PulsarClientException {
         if (currentMessage < totalMessage) {
-            CompletableFuture<Message> future = consumer.receiveAsync();
+            CompletableFuture<Message<byte[]>> future = consumer.receiveAsync();
             future.handle((msg, exception) -> {
                 if (exception == null) {
                     // add message to consumer-queue to verify with produced messages
diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/client/api/SimpleProducerConsumerStatTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/client/api/SimpleProducerConsumerStatTest.java
index 0bc78da..30a2c25 100644
--- a/pulsar-broker/src/test/java/org/apache/pulsar/client/api/SimpleProducerConsumerStatTest.java
+++ b/pulsar-broker/src/test/java/org/apache/pulsar/client/api/SimpleProducerConsumerStatTest.java
@@ -34,14 +34,6 @@ import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
 
 import org.apache.pulsar.client.admin.PulsarAdminException;
-import org.apache.pulsar.client.api.Consumer;
-import org.apache.pulsar.client.api.ConsumerConfiguration;
-import org.apache.pulsar.client.api.Message;
-import org.apache.pulsar.client.api.MessageId;
-import org.apache.pulsar.client.api.Producer;
-import org.apache.pulsar.client.api.ProducerConfiguration;
-import org.apache.pulsar.client.api.PulsarClientException;
-import org.apache.pulsar.client.api.SubscriptionType;
 import org.apache.pulsar.client.impl.ConsumerStats;
 import org.apache.pulsar.client.impl.ProducerStats;
 import org.slf4j.Logger;
@@ -84,25 +76,25 @@ public class SimpleProducerConsumerStatTest extends ProducerConsumerBase {
     @Test(dataProvider = "batch_with_timeout")
     public void testSyncProducerAndConsumer(int batchMessageDelayMs, int ackTimeoutSec) throws Exception {
         log.info("-- Starting {} test --", methodName);
-        ConsumerConfiguration conf = new ConsumerConfiguration();
-        conf.setSubscriptionType(SubscriptionType.Exclusive);
+        ConsumerBuilder<byte[]> consumerBuilder = pulsarClient.newConsumer()
+                .topic("persistent://my-property/tp1/my-ns/my-topic1").subscriptionName("my-subscriber-name");
+
         // Cumulative Ack-counter works if ackTimeOutTimer-task is enabled
         boolean isAckTimeoutTaskEnabledForCumulativeAck = ackTimeoutSec > 0;
         if (ackTimeoutSec > 0) {
-            conf.setAckTimeout(ackTimeoutSec, TimeUnit.SECONDS);
+            consumerBuilder.ackTimeout(ackTimeoutSec, TimeUnit.SECONDS);
         }
 
-        Consumer consumer = pulsarClient.subscribe("persistent://my-property/tp1/my-ns/my-topic1", "my-subscriber-name",
-                conf);
+        Consumer<byte[]> consumer = consumerBuilder.subscribe();
 
-        ProducerConfiguration producerConf = new ProducerConfiguration();
+        ProducerBuilder<byte[]> producerBuilder = pulsarClient.newProducer()
+                .topic("persistent://my-property/tp1/my-ns/my-topic1");
         if (batchMessageDelayMs != 0) {
-            producerConf.setBatchingEnabled(true);
-            producerConf.setBatchingMaxPublishDelay(batchMessageDelayMs, TimeUnit.MILLISECONDS);
-            producerConf.setBatchingMaxMessages(5);
+            producerBuilder.enableBatching(true).batchingMaxPublishDelay(batchMessageDelayMs, TimeUnit.MILLISECONDS)
+                    .batchingMaxMessages(5);
         }
 
-        Producer producer = pulsarClient.createProducer("persistent://my-property/tp1/my-ns/my-topic1", producerConf);
+        Producer<byte[]> producer = producerBuilder.create();
 
         int numMessages = 11;
         for (int i = 0; i < numMessages; i++) {
@@ -110,7 +102,7 @@ public class SimpleProducerConsumerStatTest extends ProducerConsumerBase {
             producer.send(message.getBytes());
         }
 
-        Message msg = null;
+        Message<byte[]> msg = null;
         Set<String> messageSet = Sets.newHashSet();
         for (int i = 0; i < numMessages; i++) {
             msg = consumer.receive(5, TimeUnit.SECONDS);
@@ -131,23 +123,22 @@ public class SimpleProducerConsumerStatTest extends ProducerConsumerBase {
     @Test(dataProvider = "batch_with_timeout")
     public void testAsyncProducerAndAsyncAck(int batchMessageDelayMs, int ackTimeoutSec) throws Exception {
         log.info("-- Starting {} test --", methodName);
-        ConsumerConfiguration conf = new ConsumerConfiguration();
-        conf.setSubscriptionType(SubscriptionType.Exclusive);
+        ConsumerBuilder<byte[]> consumerBuilder = pulsarClient.newConsumer()
+                .topic("persistent://my-property/tp1/my-ns/my-topic2").subscriptionName("my-subscriber-name");
         if (ackTimeoutSec > 0) {
-            conf.setAckTimeout(ackTimeoutSec, TimeUnit.SECONDS);
+            consumerBuilder.ackTimeout(ackTimeoutSec, TimeUnit.SECONDS);
         }
 
-        Consumer consumer = pulsarClient.subscribe("persistent://my-property/tp1/my-ns/my-topic2", "my-subscriber-name",
-                conf);
+        Consumer<byte[]> consumer = consumerBuilder.subscribe();
 
-        ProducerConfiguration producerConf = new ProducerConfiguration();
+        ProducerBuilder<byte[]> producerBuilder = pulsarClient.newProducer()
+                .topic("persistent://my-property/tp1/my-ns/my-topic2");
         if (batchMessageDelayMs != 0) {
-            producerConf.setBatchingMaxPublishDelay(batchMessageDelayMs, TimeUnit.MILLISECONDS);
-            producerConf.setBatchingMaxMessages(5);
-            producerConf.setBatchingEnabled(true);
+            producerBuilder.enableBatching(true).batchingMaxPublishDelay(batchMessageDelayMs, TimeUnit.MILLISECONDS)
+                    .batchingMaxMessages(5);
         }
 
-        Producer producer = pulsarClient.createProducer("persistent://my-property/tp1/my-ns/my-topic2", producerConf);
+        Producer<byte[]> producer = producerBuilder.create();
         List<Future<MessageId>> futures = Lists.newArrayList();
 
         int numMessages = 50;
@@ -163,7 +154,7 @@ public class SimpleProducerConsumerStatTest extends ProducerConsumerBase {
             future.get();
         }
 
-        Message msg = null;
+        Message<byte[]> msg = null;
         Set<String> messageSet = Sets.newHashSet();
         for (int i = 0; i < numMessages; i++) {
             msg = consumer.receive(5, TimeUnit.SECONDS);
@@ -187,23 +178,22 @@ public class SimpleProducerConsumerStatTest extends ProducerConsumerBase {
     public void testAsyncProducerAndReceiveAsyncAndAsyncAck(int batchMessageDelayMs, int ackTimeoutSec)
             throws Exception {
         log.info("-- Starting {} test --", methodName);
-        ConsumerConfiguration conf = new ConsumerConfiguration();
-        conf.setSubscriptionType(SubscriptionType.Exclusive);
+        ConsumerBuilder<byte[]> consumerBuilder = pulsarClient.newConsumer()
+                .topic("persistent://my-property/tp1/my-ns/my-topic2").subscriptionName("my-subscriber-name");
         if (ackTimeoutSec > 0) {
-            conf.setAckTimeout(ackTimeoutSec, TimeUnit.SECONDS);
+            consumerBuilder.ackTimeout(ackTimeoutSec, TimeUnit.SECONDS);
         }
 
-        Consumer consumer = pulsarClient.subscribe("persistent://my-property/tp1/my-ns/my-topic2", "my-subscriber-name",
-                conf);
+        Consumer<byte[]> consumer = consumerBuilder.subscribe();
 
-        ProducerConfiguration producerConf = new ProducerConfiguration();
+        ProducerBuilder<byte[]> producerBuilder = pulsarClient.newProducer()
+                .topic("persistent://my-property/tp1/my-ns/my-topic2");
         if (batchMessageDelayMs != 0) {
-            producerConf.setBatchingMaxPublishDelay(batchMessageDelayMs, TimeUnit.MILLISECONDS);
-            producerConf.setBatchingMaxMessages(5);
-            producerConf.setBatchingEnabled(true);
+            producerBuilder.enableBatching(true).batchingMaxPublishDelay(batchMessageDelayMs, TimeUnit.MILLISECONDS)
+                    .batchingMaxMessages(5);
         }
 
-        Producer producer = pulsarClient.createProducer("persistent://my-property/tp1/my-ns/my-topic2", producerConf);
+        Producer<byte[]> producer = producerBuilder.create();
         List<Future<MessageId>> futures = Lists.newArrayList();
 
         int numMessages = 101;
@@ -218,8 +208,8 @@ public class SimpleProducerConsumerStatTest extends ProducerConsumerBase {
         for (Future<MessageId> future : futures) {
             future.get();
         }
-        Message msg = null;
-        CompletableFuture<Message> future_msg = null;
+        Message<byte[]> msg = null;
+        CompletableFuture<Message<byte[]>> future_msg = null;
         Set<String> messageSet = Sets.newHashSet();
         for (int i = 0; i < numMessages; i++) {
             future_msg = consumer.receiveAsync();
@@ -245,30 +235,28 @@ public class SimpleProducerConsumerStatTest extends ProducerConsumerBase {
     @Test(dataProvider = "batch", timeOut = 100000)
     public void testMessageListener(int batchMessageDelayMs) throws Exception {
         log.info("-- Starting {} test --", methodName);
-        ConsumerConfiguration conf = new ConsumerConfiguration();
-        conf.setAckTimeout(100, TimeUnit.SECONDS);
-        conf.setSubscriptionType(SubscriptionType.Exclusive);
 
         int numMessages = 100;
         final CountDownLatch latch = new CountDownLatch(numMessages);
 
-        conf.setMessageListener((consumer, msg) -> {
-            assertNotNull(msg, "Message cannot be null");
-            String receivedMessage = new String(msg.getData());
-            log.debug("Received message [{}] in the listener", receivedMessage);
-            consumer.acknowledgeAsync(msg);
-            latch.countDown();
-        });
-
-        Consumer consumer = pulsarClient.subscribe("persistent://my-property/tp1/my-ns/my-topic3", "my-subscriber-name",
-                conf);
-        ProducerConfiguration producerConf = new ProducerConfiguration();
+        Consumer<byte[]> consumer = pulsarClient.newConsumer().topic("persistent://my-property/tp1/my-ns/my-topic3")
+                .subscriptionName("my-subscriber-name").ackTimeout(100, TimeUnit.SECONDS)
+                .messageListener((consumer1, msg) -> {
+                    assertNotNull(msg, "Message cannot be null");
+                    String receivedMessage = new String(msg.getData());
+                    log.debug("Received message [{}] in the listener", receivedMessage);
+                    consumer1.acknowledgeAsync(msg);
+                    latch.countDown();
+                }).subscribe();
+
+        ProducerBuilder<byte[]> producerBuilder = pulsarClient.newProducer()
+                .topic("persistent://my-property/tp1/my-ns/my-topic3");
         if (batchMessageDelayMs != 0) {
-            producerConf.setBatchingMaxPublishDelay(batchMessageDelayMs, TimeUnit.MILLISECONDS);
-            producerConf.setBatchingMaxMessages(5);
-            producerConf.setBatchingEnabled(true);
+            producerBuilder.enableBatching(true).batchingMaxPublishDelay(batchMessageDelayMs, TimeUnit.MILLISECONDS)
+                    .batchingMaxMessages(5);
         }
-        Producer producer = pulsarClient.createProducer("persistent://my-property/tp1/my-ns/my-topic3", producerConf);
+
+        Producer<byte[]> producer = producerBuilder.create();
         List<Future<MessageId>> futures = Lists.newArrayList();
 
         // Asynchronously produce messages
@@ -295,19 +283,18 @@ public class SimpleProducerConsumerStatTest extends ProducerConsumerBase {
     public void testSendTimeout(int batchMessageDelayMs) throws Exception {
         log.info("-- Starting {} test --", methodName);
 
-        ConsumerConfiguration consumerConf = new ConsumerConfiguration();
-        consumerConf.setSubscriptionType(SubscriptionType.Exclusive);
-        Consumer consumer = pulsarClient.subscribe("persistent://my-property/tp1/my-ns/my-topic5", "my-subscriber-name",
-                consumerConf);
-        ProducerConfiguration producerConf = new ProducerConfiguration();
+        Consumer<byte[]> consumer = pulsarClient.newConsumer().topic("persistent://my-property/tp1/my-ns/my-topic5")
+                .subscriptionName("my-subscriber-name").subscribe();
+
+        ProducerBuilder<byte[]> producerBuilder = pulsarClient.newProducer()
+                .topic("persistent://my-property/tp1/my-ns/my-topic5").sendTimeout(1, TimeUnit.SECONDS);
         if (batchMessageDelayMs != 0) {
-            producerConf.setBatchingMaxPublishDelay(2 * batchMessageDelayMs, TimeUnit.MILLISECONDS);
-            producerConf.setBatchingMaxMessages(5);
-            producerConf.setBatchingEnabled(true);
+            producerBuilder.enableBatching(true).batchingMaxPublishDelay(2 * batchMessageDelayMs, TimeUnit.MILLISECONDS)
+                    .batchingMaxMessages(5);
         }
-        producerConf.setSendTimeout(1, TimeUnit.SECONDS);
 
-        Producer producer = pulsarClient.createProducer("persistent://my-property/tp1/my-ns/my-topic5", producerConf);
+        Producer<byte[]> producer = producerBuilder.create();
+
         final String message = "my-message";
 
         // Trigger the send timeout
@@ -325,7 +312,7 @@ public class SimpleProducerConsumerStatTest extends ProducerConsumerBase {
         startBroker();
 
         // We should not have received any message
-        Message msg = consumer.receive(3, TimeUnit.SECONDS);
+        Message<byte[]> msg = consumer.receive(3, TimeUnit.SECONDS);
         assertNull(msg);
         consumer.close();
         producer.close();
@@ -338,21 +325,16 @@ public class SimpleProducerConsumerStatTest extends ProducerConsumerBase {
         assertEquals(cStat.getTotalMsgsReceived(), cStat.getTotalAcksSent());
         log.info("-- Exiting {} test --", methodName);
     }
-    
+
     public void testBatchMessagesRateOut() throws PulsarClientException, InterruptedException, PulsarAdminException {
         log.info("-- Starting {} test --", methodName);
         String topicName = "persistent://my-property/cluster/my-ns/testBatchMessagesRateOut";
         double produceRate = 17;
         int batchSize = 5;
-        ConsumerConfiguration consumerConf = new ConsumerConfiguration();
-        consumerConf.setSubscriptionType(SubscriptionType.Exclusive);
-        Consumer<byte[]> consumer = pulsarClient.subscribe(topicName, "my-subscriber-name", consumerConf);
-        ProducerConfiguration producerConf = new ProducerConfiguration();
-        producerConf.setBatchingMaxMessages(batchSize);
-        producerConf.setBatchingEnabled(true);
-        producerConf.setBatchingMaxPublishDelay(2, TimeUnit.SECONDS);
-
-        Producer producer = pulsarClient.createProducer(topicName, producerConf);
+        Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topicName).subscriptionName("my-subscriber-name")
+                .subscribe();
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topicName).batchingMaxMessages(batchSize)
+                .enableBatching(true).batchingMaxPublishDelay(2, TimeUnit.SECONDS).create();
         AtomicBoolean runTest = new AtomicBoolean(true);
         Thread t1 = new Thread(() -> {
             RateLimiter r = RateLimiter.create(produceRate);
@@ -372,7 +354,7 @@ public class SimpleProducerConsumerStatTest extends ProducerConsumerBase {
         log.info("-- Exiting {} test --", methodName);
     }
 
-    public void validatingLogInfo(Consumer consumer, Producer producer, boolean verifyAckCount)
+    public void validatingLogInfo(Consumer<?> consumer, Producer<?> producer, boolean verifyAckCount)
             throws InterruptedException {
         // Waiting for recording last stat info
         Thread.sleep(1000);
diff --git a/pulsar-broker/src/test/java/org/apache/pulsar/client/api/SimpleProducerConsumerTest.java b/pulsar-broker/src/test/java/org/apache/pulsar/client/api/SimpleProducerConsumerTest.java
index 3aff2a7..2cc4cf9 100644
--- a/pulsar-broker/src/test/java/org/apache/pulsar/client/api/SimpleProducerConsumerTest.java
+++ b/pulsar-broker/src/test/java/org/apache/pulsar/client/api/SimpleProducerConsumerTest.java
@@ -32,8 +32,6 @@ import java.io.IOException;
 import java.lang.reflect.Field;
 import java.lang.reflect.Modifier;
 import java.nio.file.Files;
-import java.nio.file.LinkOption;
-import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.util.List;
 import java.util.Map;
@@ -54,6 +52,7 @@ import java.util.stream.Collectors;
 import org.apache.bookkeeper.mledger.impl.EntryCacheImpl;
 import org.apache.bookkeeper.mledger.impl.ManagedLedgerImpl;
 import org.apache.pulsar.broker.service.persistent.PersistentTopic;
+import org.apache.pulsar.client.api.PulsarClientException.InvalidConfigurationException;
 import org.apache.pulsar.client.impl.ConsumerImpl;
 import org.apache.pulsar.client.impl.MessageIdImpl;
 import org.apache.pulsar.common.api.PulsarDecoder;
@@ -95,26 +94,25 @@ public class SimpleProducerConsumerTest extends ProducerConsumerBase {
     public void testSyncProducerAndConsumer(int batchMessageDelayMs) throws Exception {
         log.info("-- Starting {} test --", methodName);
 
-        ConsumerConfiguration conf = new ConsumerConfiguration();
-        conf.setSubscriptionType(SubscriptionType.Exclusive);
-        Consumer consumer = pulsarClient.subscribe("persistent://my-property/use/my-ns/my-topic1", "my-subscriber-name",
-                conf);
+        Consumer<byte[]> consumer = pulsarClient.newConsumer().topic("persistent://my-property/use/my-ns/my-topic1")
+                .subscriptionName("my-subscriber-name").subscribe();
 
-        ProducerConfiguration producerConf = new ProducerConfiguration();
+        ProducerBuilder<byte[]> producerBuilder = pulsarClient.newProducer()
+                .topic("persistent://my-property/use/my-ns/my-topic1");
 
         if (batchMessageDelayMs != 0) {
-            producerConf.setBatchingEnabled(true);
-            producerConf.setBatchingMaxPublishDelay(batchMessageDelayMs, TimeUnit.MILLISECONDS);
-            producerConf.setBatchingMaxMessages(5);
+            producerBuilder.enableBatching(true);
+            producerBuilder.batchingMaxPublishDelay(batchMessageDelayMs, TimeUnit.MILLISECONDS);
+            producerBuilder.batchingMaxMessages(5);
         }
 
-        Producer producer = pulsarClient.createProducer("persistent://my-property/use/my-ns/my-topic1", producerConf);
+        Producer<byte[]> producer = producerBuilder.create();
         for (int i = 0; i < 10; i++) {
             String message = "my-message-" + i;
             producer.send(message.getBytes());
         }
 
-        Message msg = null;
+        Message<byte[]> msg = null;
         Set<String> messageSet = Sets.newHashSet();
         for (int i = 0; i < 10; i++) {
             msg = consumer.receive(5, TimeUnit.SECONDS);
@@ -132,17 +130,18 @@ public class SimpleProducerConsumerTest extends ProducerConsumerBase {
     @Test(dataProvider = "batch")
     public void testAsyncProducerAndAsyncAck(int batchMessageDelayMs) throws Exception {
         log.info("-- Starting {} test --", methodName);
-        ConsumerConfiguration conf = new ConsumerConfiguration();
-        conf.setSubscriptionType(SubscriptionType.Exclusive);
-        Consumer consumer = pulsarClient.subscribe("persistent://my-property/use/my-ns/my-topic2", "my-subscriber-name",
-                conf);
-        ProducerConfiguration producerConf = new ProducerConfiguration();
+        Consumer<byte[]> consumer = pulsarClient.newConsumer().topic("persistent://my-property/use/my-ns/my-topic2")
+                .subscriptionName("my-subscriber-name").subscribe();
+
+        ProducerBuilder<byte[]> producerBuilder = pulsarClient.newProducer()
+                .topic("persistent://my-property/use/my-ns/my-topic2");
+
         if (batchMessageDelayMs != 0) {
-            producerConf.setBatchingMaxPublishDelay(batchMessageDelayMs, TimeUnit.MILLISECONDS);
-            producerConf.setBatchingMaxMessages(5);
-            producerConf.setBatchingEnabled(true);
+            producerBuilder.enableBatching(true);
+            producerBuilder.batchingMaxPublishDelay(batchMessageDelayMs, TimeUnit.MILLISECONDS);
+            producerBuilder.batchingMaxMessages(5);
         }
-        Producer producer = pulsarClient.createProducer("persistent://my-property/use/my-ns/my-topic2", producerConf);
+        Producer<byte[]> producer = producerBuilder.create();
         List<Future<MessageId>> futures = Lists.newArrayList();
 
         // Asynchronously produce messages
@@ -157,7 +156,7 @@ public class SimpleProducerConsumerTest extends ProducerConsumerBase {
             future.get();
         }
 
-        Message msg = null;
+        Message<byte[]> msg = null;
         Set<String> messageSet = Sets.newHashSet();
         for (int i = 0; i < 10; i++) {
             msg = consumer.receive(5, TimeUnit.SECONDS);
@@ -178,28 +177,28 @@ public class SimpleProducerConsumerTest extends ProducerConsumerBase {
     @Test(dataProvider = "batch", timeOut = 100000)
     public void testMessageListener(int batchMessageDelayMs) throws Exception {
         log.info("-- Starting {} test --", methodName);
-        ConsumerConfiguration conf = new ConsumerConfiguration();
-        conf.setSubscriptionType(SubscriptionType.Exclusive);
 
         int numMessages = 100;
         final CountDownLatch latch = new CountDownLatch(numMessages);
 
-        conf.setMessageListener((consumer, msg) -> {
-            Assert.assertNotNull(msg, "Message cannot be null");
-            String receivedMessage = new String(msg.getData());
-            log.debug("Received message [{}] in the listener", receivedMessage);
-            consumer.acknowledgeAsync(msg);
-            latch.countDown();
-        });
-        Consumer consumer = pulsarClient.subscribe("persistent://my-property/use/my-ns/my-topic3", "my-subscriber-name",
-                conf);
-        ProducerConfiguration producerConf = new ProducerConfiguration();
+        Consumer<byte[]> consumer = pulsarClient.newConsumer().topic("persistent://my-property/use/my-ns/my-topic3")
+                .subscriptionName("my-subscriber-name").messageListener((c1, msg) -> {
+                    Assert.assertNotNull(msg, "Message cannot be null");
+                    String receivedMessage = new String(msg.getData());
+                    log.debug("Received message [{}] in the listener", receivedMessage);
+                    c1.acknowledgeAsync(msg);
+                    latch.countDown();
+                }).subscribe();
+
+        ProducerBuilder<byte[]> producerBuilder = pulsarClient.newProducer()
+                .topic("persistent://my-property/use/my-ns/my-topic3");
+
         if (batchMessageDelayMs != 0) {
-            producerConf.setBatchingMaxPublishDelay(batchMessageDelayMs, TimeUnit.MILLISECONDS);
-            producerConf.setBatchingMaxMessages(5);
-            producerConf.setBatchingEnabled(true);
+            producerBuilder.enableBatching(true);
+            producerBuilder.batchingMaxPublishDelay(batchMessageDelayMs, TimeUnit.MILLISECONDS);
+            producerBuilder.batchingMaxMessages(5);
         }
-        Producer producer = pulsarClient.createProducer("persistent://my-property/use/my-ns/my-topic3", producerConf);
+        Producer<byte[]> producer = producerBuilder.create();
         List<Future<MessageId>> futures = Lists.newArrayList();
 
         // Asynchronously produce messages
@@ -224,18 +223,17 @@ public class SimpleProducerConsumerTest extends ProducerConsumerBase {
     public void testBackoffAndReconnect(int batchMessageDelayMs) throws Exception {
         log.info("-- Starting {} test --", methodName);
         // Create consumer and producer
-        ConsumerConfiguration conf = new ConsumerConfiguration();
-        conf.setSubscriptionType(SubscriptionType.Exclusive);
-        Consumer consumer = pulsarClient.subscribe("persistent://my-property/use/my-ns/my-topic4", "my-subscriber-name",
-                conf);
-        ProducerConfiguration producerConf = new ProducerConfiguration();
+        Consumer<byte[]> consumer = pulsarClient.newConsumer().topic("persistent://my-property/use/my-ns/my-topic4")
+                .subscriptionName("my-subscriber-name").subscribe();
+        ProducerBuilder<byte[]> producerBuilder = pulsarClient.newProducer()
+                .topic("persistent://my-property/use/my-ns/my-topic4");
+
         if (batchMessageDelayMs != 0) {
-            producerConf.setBatchingMaxPublishDelay(batchMessageDelayMs, TimeUnit.MILLISECONDS);
-            producerConf.setBatchingMaxMessages(5);
-            producerConf.setBatchingEnabled(true);
+            producerBuilder.enableBatching(true);
+            producerBuilder.batchingMaxPublishDelay(batchMessageDelayMs, TimeUnit.MILLISECONDS);
+            producerBuilder.batchingMaxMessages(5);
         }
-        Producer producer = pulsarClient.createProducer("persistent://my-property/use/my-ns/my-topic4", producerConf);
-
+        Producer<byte[]> producer = producerBuilder.create();
         // Produce messages
         CompletableFuture<MessageId> lastFuture = null;
         for (int i = 0; i < 10; i++) {
@@ -247,7 +245,7 @@ public class SimpleProducerConsumerTest extends ProducerConsumerBase {
 
         lastFuture.get();
 
-        Message msg = null;
+        Message<byte[]> msg = null;
         for (int i = 0; i < 10; i++) {
             msg = consumer.receive(5, TimeUnit.SECONDS);
             log.info("Received: [{}]", new String(msg.getData()));
@@ -274,19 +272,17 @@ public class SimpleProducerConsumerTest extends ProducerConsumerBase {
     public void testSendTimeout(int batchMessageDelayMs) throws Exception {
         log.info("-- Starting {} test --", methodName);
 
-        ConsumerConfiguration consumerConf = new ConsumerConfiguration();
-        consumerConf.setSubscriptionType(SubscriptionType.Exclusive);
-        Consumer consumer = pulsarClient.subscribe("persistent://my-property/use/my-ns/my-topic5", "my-subscriber-name",
-                consumerConf);
-        ProducerConfiguration producerConf = new ProducerConfiguration();
+        Consumer<byte[]> consumer = pulsarClient.newConsumer().topic("persistent://my-property/use/my-ns/my-topic5")
+                .subscriptionName("my-subscriber-name").subscribe();
+        ProducerBuilder<byte[]> producerBuilder = pulsarClient.newProducer()
+                .topic("persistent://my-property/use/my-ns/my-topic5").sendTimeout(1, TimeUnit.SECONDS);
+
         if (batchMessageDelayMs != 0) {
-            producerConf.setBatchingMaxPublishDelay(2 * batchMessageDelayMs, TimeUnit.MILLISECONDS);
-            producerConf.setBatchingMaxMessages(5);
-            producerConf.setBatchingEnabled(true);
+            producerBuilder.enableBatching(true);
+            producerBuilder.batchingMaxPublishDelay(batchMessageDelayMs, TimeUnit.MILLISECONDS);
+            producerBuilder.batchingMaxMessages(5);
         }
-        producerConf.setSendTimeout(1, TimeUnit.SECONDS);
-
-        Producer producer = pulsarClient.createProducer("persistent://my-property/use/my-ns/my-topic5", producerConf);
+        Producer<byte[]> producer = producerBuilder.create();
         final String message = "my-message";
 
         // Trigger the send timeout
@@ -304,7 +300,7 @@ public class SimpleProducerConsumerTest extends ProducerConsumerBase {
         startBroker();
 
         // We should not have received any message
-        Message msg = consumer.receive(3, TimeUnit.SECONDS);
+        Message<byte[]> msg = consumer.receive(3, TimeUnit.SECONDS);
         Assert.assertNull(msg);
         consumer.close();
         log.info("-- Exiting {} test --", methodName);
@@ -314,32 +310,29 @@ public class SimpleProducerConsumerTest extends ProducerConsumerBase {
     public void testInvalidSequence() throws Exception {
         log.info("-- Starting {} test --", methodName);
 
-        PulsarClient client1 = PulsarClient.create("http://127.0.0.1:" + BROKER_WEBSERVICE_PORT);
+        PulsarClient client1 = PulsarClient.builder().serviceUrl("http://127.0.0.1:" + BROKER_WEBSERVICE_PORT).build();
         client1.close();
 
-        ConsumerConfiguration consumerConf = new ConsumerConfiguration();
-        consumerConf.setSubscriptionType(SubscriptionType.Exclusive);
-
         try {
-            Consumer consumer = client1.subscribe("persistent://my-property/use/my-ns/my-topic6", "my-subscriber-name",
-                    consumerConf);
+            client1.newConsumer().topic("persistent://my-property/use/my-ns/my-topic6")
+                    .subscriptionName("my-subscriber-name").subscribe();
             Assert.fail("Should fail");
         } catch (PulsarClientException e) {
             Assert.assertTrue(e instanceof PulsarClientException.AlreadyClosedException);
         }
 
         try {
-            Producer producer = client1.createProducer("persistent://my-property/use/my-ns/my-topic6");
+            client1.newProducer().topic("persistent://my-property/use/my-ns/my-topic6").create();
             Assert.fail("Should fail");
         } catch (PulsarClientException e) {
             Assert.assertTrue(e instanceof PulsarClientException.AlreadyClosedException);
         }
 
-        Consumer consumer = pulsarClient.subscribe("persistent://my-property/use/my-ns/my-topic6", "my-subscriber-name",
-                consumerConf);
+        Consumer<byte[]> consumer = pulsarClient.newConsumer().topic("persistent://my-property/use/my-ns/my-topic6")
+                .subscriptionName("my-subscriber-name").subscribe();
 
         try {
-            Message msg = MessageBuilder.create().setContent("InvalidMessage".getBytes()).build();
+            Message<byte[]> msg = MessageBuilder.create().setContent("InvalidMessage".getBytes()).build();
             consumer.acknowledge(msg);
         } catch (PulsarClientException.InvalidMessageException e) {
             // ok
@@ -361,7 +354,8 @@ public class SimpleProducerConsumerTest extends ProducerConsumerBase {
             // ok
         }
 
-        Producer producer = pulsarClient.createProducer("persistent://my-property/use/my-ns/my-topic6");
+        Producer<byte[]> producer = pulsarClient.newProducer().topic("persistent://my-property/use/my-ns/my-topic6")
+                .create();
         producer.close();
 
         try {
@@ -376,91 +370,72 @@ public class SimpleProducerConsumerTest extends ProducerConsumerBase {
     @Test
     public void testSillyUser() {
         try {
-            PulsarClient client1 = PulsarClient.create("invalid://url");
+            PulsarClient.builder().serviceUrl("invalid://url").build();
             Assert.fail("should fail");
         } catch (PulsarClientException e) {
             Assert.assertTrue(e instanceof PulsarClientException.InvalidServiceURL);
         }
 
-        ProducerConfiguration producerConf = new ProducerConfiguration();
-
         try {
-            producerConf.setSendTimeout(-1, TimeUnit.SECONDS);
+            pulsarClient.newProducer().sendTimeout(-1, TimeUnit.SECONDS);
             Assert.fail("should fail");
         } catch (IllegalArgumentException e) {
             // ok
         }
 
         try {
-            producerConf.setMaxPendingMessages(0);
+            pulsarClient.newProducer().maxPendingMessages(0);
             Assert.fail("should fail");
         } catch (IllegalArgumentException e) {
             // ok
         }
 
         try {
-            Producer producer = pulsarClient.createProducer("persistent://my-property/use/my-ns/my-topic7", (ProducerConfiguration) null);
-            Assert.fail("should fail");
-        } catch (PulsarClientException e) {
-            Assert.assertTrue(e instanceof PulsarClientException.InvalidConfigurationException);
-        }
-
-        try {
-            Producer producer = pulsarClient.createProducer("invalid://topic", producerConf);
+            pulsarClient.newProducer().topic("invalid://topic").create();
             Assert.fail("should fail");
         } catch (PulsarClientException e) {
             Assert.assertTrue(e instanceof PulsarClientException.InvalidTopicNameException);
         }
 
-        ConsumerConfiguration consumerConf = new ConsumerConfiguration();
-
         try {
-            consumerConf.setMessageListener(null);
+            pulsarClient.newConsumer().messageListener(null);
             Assert.fail("should fail");
         } catch (NullPointerException e) {
             // ok
         }
 
         try {
-            consumerConf.setSubscriptionType(null);
+            pulsarClient.newConsumer().subscriptionType(null);
             Assert.fail("should fail");
         } catch (NullPointerException e) {
             // ok
         }
 
         try {
-            consumerConf.setReceiverQueueSize(-1);
+            pulsarClient.newConsumer().receiverQueueSize(-1);
             Assert.fail("should fail");
         } catch (IllegalArgumentException e) {
             // ok
         }
 
         try {
-            Consumer consumer = pulsarClient.subscribe("persistent://my-property/use/my-ns/my-topic7",
-                    "my-subscriber-name", (ConsumerConfiguration) null);
+            pulsarClient.newConsumer().topic("persistent://my-property/use/my-ns/my-topic7").subscriptionName(null)
+                    .subscribe();
             Assert.fail("Should fail");
         } catch (PulsarClientException e) {
-            Assert.assertTrue(e instanceof PulsarClientException.InvalidConfigurationException);
+            assertEquals(e.getClass(), InvalidConfigurationException.class);
         }
 
         try {
-            Consumer consumer = pulsarClient.subscribe("persistent://my-property/use/my-ns/my-topic7", null,
-                    consumerConf);
+            pulsarClient.newConsumer().topic("persistent://my-property/use/my-ns/my-topic7").subscriptionName("")
+                    .subscribe();
             Assert.fail("Should fail");
         } catch (PulsarClientException e) {
             Assert.assertTrue(e instanceof PulsarClientException.InvalidConfigurationException);
         }
 
         try {
-            Consumer consumer = pulsarClient.subscribe("persistent://my-property/use/my-ns/my-topic7", "",
-                    consumerConf);
-            Assert.fail("Should fail");
-        } catch (PulsarClientException e) {
-            Assert.assertTrue(e instanceof PulsarClientException.InvalidConfigurationException);
-        }
-
-        try {
-            Consumer consumer = pulsarClient.subscribe("invalid://topic7", "my-subscriber-name", consumerConf);
+            pulsarClient.newConsumer().topic("invalid://topic7").subscriptionName("my-subscriber-name").subscribe();
             Assert.fail("Should fail");
         } catch (PulsarClientException e) {
             Assert.assertTrue(e instanceof PulsarClientException.InvalidTopicNameException);
@@ -475,10 +450,10 @@ public class SimpleProducerConsumerTest extends ProducerConsumerBase {
         final int recvQueueSize = 100;
         final int numConsumersThreads = 10;
 
-        final ConsumerConfiguration conf = new ConsumerConfiguration();
-        conf.setReceiverQueueSize(recvQueueSize);
         String subName = UUID.randomUUID().toString();
-        final Consumer consumer = pulsarClient.subscribe("persistent://my-property/use/my-ns/my-topic7", subName, conf);
+        final Consumer<byte[]> consumer = pulsarClient.newConsumer()
+                .topic("persistent://my-property/use/my-ns/my-topic7").subscriptionName(subName)
+                .receiverQueueSize(recvQueueSize).subscribe();
         ExecutorService executor = Executors.newCachedThreadPool();
 
         final CyclicBarrier barrier = new CyclicBarrier(numConsumersThreads + 1);
@@ -502,20 +477,22 @@ public class SimpleProducerConsumerTest extends ProducerConsumerBase {
         Thread.sleep(2000);
 
         // publish 100 messages so that the consumers blocked on receive() will now get the messages
-        ProducerConfiguration producerConf = new ProducerConfiguration();
+        ProducerBuilder<byte[]> producerBuilder = pulsarClient.newProducer()
+                .topic("persistent://my-property/use/my-ns/my-topic7");
+
         if (batchMessageDelayMs != 0) {
-            producerConf.setBatchingMaxPublishDelay(batchMessageDelayMs, TimeUnit.MILLISECONDS);
-            producerConf.setBatchingMaxMessages(5);
-            producerConf.setBatchingEnabled(true);
+            producerBuilder.batchingMaxPublishDelay(batchMessageDelayMs, TimeUnit.MILLISECONDS);
+            producerBuilder.batchingMaxMessages(5);
+            producerBuilder.enableBatching(true);
         }
-        Producer producer = pulsarClient.createProducer("persistent://my-property/use/my-ns/my-topic7", producerConf);
+        Producer<byte[]> producer = producerBuilder.create();
         for (int i = 0; i < recvQueueSize; i++) {
             String message = "my-message-" + i;
             producer.send(message.getBytes());
         }
         Thread.sleep(500);
 
-        ConsumerImpl consumerImpl = (ConsumerImpl) consumer;
+        ConsumerImpl<byte[]> consumerImpl = (ConsumerImpl<byte[]>) consumer;
         // The available permits should be 10 and num messages in the queue should be 90
         Assert.assertEquals(consumerImpl.getAvailablePermits(), numConsumersThreads);
         Assert.assertEquals(consumerImpl.numMessagesInQueue(), recvQueueSize - numConsumersThreads);
@@ -540,7 +517,7 @@ public class SimpleProducerConsumerTest extends ProducerConsumerBase {
 
         // clear the queue
         while (true) {
-            Message msg = consumer.receive(1, TimeUnit.SECONDS);
+            Message<byte[]> msg = consumer.receive(1, TimeUnit.SECONDS);
             if (msg == null) {
                 break;
             }
@@ -583,8 +560,9 @@ public class SimpleProducerConsumerTest extends ProducerConsumerBase {
 
         try {
             final String topic = "persistent://my-property/use/my-ns/bigMsg";
-            Producer producer = pulsarClient.createProducer(topic);
-            Message message = MessageBuilder.create().setContent(new byte[PulsarDecoder.MaxMessageSize + 1]).build();
+            Producer<byte[]> producer = pulsarClient.newProducer().topic(topic).create();
+            Message<byte[]> message = MessageBuilder.create().setContent(new byte[PulsarDecoder.MaxMessageSize + 1])
+                    .build();
             producer.send(message);
             fail("Should have thrown exception");
         } catch (PulsarClientException.InvalidMessageException e) {
@@ -613,18 +591,16 @@ public class SimpleProducerConsumerTest extends ProducerConsumerBase {
         final String topic = "persistent://my-property/use/my-ns/bigMsg";
 
         // (a) non-batch msg with compression
-        ProducerConfiguration producerConf = new ProducerConfiguration();
-        producerConf.setCompressionType(CompressionType.LZ4);
-        Producer producer = pulsarClient.createProducer(topic, producerConf);
-        Message message = MessageBuilder.create().setContent(new byte[PulsarDecoder.MaxMessageSize + 1]).build();
+        Producer<byte[]> producer = pulsarClient.newProducer().topic(topic).compressionType(CompressionType.LZ4)
+                .create();
+        Message<byte[]> message = MessageBuilder.create().setContent(new byte[PulsarDecoder.MaxMessageSize + 1])
+                .build();
         producer.send(message);
         producer.close();
 
         // (b) batch-msg
-        producerConf = new ProducerConfiguration();
-        producerConf.setBatchingEnabled(true);
-        producerConf.setCompressionType(CompressionType.LZ4);
-        producer = pulsarClient.createProducer(topic, producerConf);
+        producer = pulsarClient.newProducer().topic(topic).enableBatching(true).compressionType(CompressionType.LZ4)
+                .create();
         message = MessageBuilder.create().setContent(new byte[PulsarDecoder.MaxMessageSize + 1]).build();
         try {
             producer.send(message);
@@ -635,9 +611,7 @@ public class SimpleProducerConsumerTest extends ProducerConsumerBase {
         producer.close();
 
         // (c) non-batch msg without compression
-        producerConf = new ProducerConfiguration();
-        producerConf.setCompressionType(CompressionType.NONE);
-        producer = pulsarClient.createProducer(topic, producerConf);
+        producer = pulsarClient.newProducer().topic(topic).compressionType(CompressionType.NONE).create();
         message = MessageBuilder.create().setContent(new byte[PulsarDecoder.MaxMessageSize + 1]).build();
         try {
             producer.send(message);
@@ -648,10 +622,8 @@ public class SimpleProducerConsumerTest extends ProducerConsumerBase {
         producer.close();
 
         // (d) non-batch msg with compression and try to consume message
-        producerConf = new ProducerConfiguration();
-        producerConf.setCompressionType(CompressionType.LZ4);
-        producer = pulsarClient.createProducer(topic, producerConf);
-        Consumer consumer = pulsarClient.subscribe(topic, "sub1");
+        producer = pulsarClient.newProducer().topic(topic).compressionType(CompressionType.LZ4).create();
+        Consumer<byte[]> consumer = pulsarClient.newConsumer().topic(topic).subscriptionName("sub1").subscribe();
         byte[] content = new byte[PulsarDecoder.MaxMessageSize + 10];
         message = MessageBuilder.create().setContent(content).build();
         producer.send(message);
@@ -681,23 +653,21 @@ public class SimpleProducerConsumerTest extends ProducerConsumerBase {
         final String topicName = "cache-topic";
         final String sub1 = "faster-sub1";
         final String sub2 = "slower-sub2";
-        ConsumerConfiguration conf = new ConsumerConfiguration();
-        conf.setSubscriptionType(SubscriptionType.Shared);
-        conf.setReceiverQueueSize(receiverSize);
-
-        ProducerConfiguration producerConf = new ProducerConfiguration();
-
-        if (batchMessageDelayMs != 0) {
-            producerConf.setBatchingEnabled(true);
-            producerConf.setBatchingMaxPublishDelay(batchMessageDelayMs, TimeUnit.MILLISECONDS);
-            producerConf.setBatchingMaxMessages(5);
-        }
 
         /************ usecase-1: *************/
         // 1. Subscriber Faster subscriber
-        Consumer subscriber1 = pulsarClient.subscribe("persistent://my-property/use/my-ns/" + topicName, sub1, conf);
+        Consumer<byte[]> subscriber1 = pulsarClient.newConsumer()
+                .topic("persistent://my-property/use/my-ns/" + topicName).subscriptionName(sub1)
+                .subscriptionType(SubscriptionType.Shared).receiverQueueSize(receiverSize).subscribe();
         final String topic = "persistent://my-property/use/my-ns/" + topicName;
-        Producer producer = pulsarClient.createProducer(topic, producerConf);
+        ProducerBuilder<byte[]> producerBuilder = pulsarClient.newProducer().topic(topic);
+
+        if (batchMessageDelayMs != 0) {
+            producerBuilder.batchingMaxPublishDelay(batchMessageDelayMs, TimeUnit.MILLISECONDS);
+            producerBuilder.batchingMaxMessages(5);
+            producerBuilder.enableBatching(true);
+        }
+        Producer<byte[]> producer = producerBuilder.create();
 
         PersistentTopic topicRef = (PersistentTopic) pulsar.getBrokerService().getTopicReference(topic);
         ManagedLedgerImpl ledger = (ManagedLedgerImpl) topicRef.getManagedLedger();
@@ -709,7 +679,7 @@ public class SimpleProducerConsumerTest extends ProducerConsumerBase {
         EntryCacheImpl entryCache = spy((EntryCacheImpl) cacheField.get(ledger));
         cacheField.set(ledger, entryCache);
 
-        Message msg = null;
+        Message<byte[]> msg = null;
         // 2. Produce messages
         for (int i = 0; i < 30; i++) {
             String message = "my-message-" + i;
@@ -737,7 +707,8 @@ public class SimpleProducerConsumerTest extends ProducerConsumerBase {
 
         /************ usecase-2: *************/
         // 1.b Subscriber slower-subscriber
-        Consumer subscriber2 = pulsarClient.subscribe("persistent://my-property/use/my-ns/" + topicName, sub2, conf);
+        Consumer<byte[]> subscriber2 = pulsarClient.newConsumer()
+                .topic("persistent://my-property/use/my-ns/" + topicName).subscriptionName(sub2).subscribe();
         // Produce messages
         final int moreMessages = 10;
         for (int i = 0; i < receiverSize + moreMessages; i++) {
@@ -763,10 +734,10 @@ public class SimpleProducerConsumerTest extends ProducerConsumerBase {
 
         // 3.b Close subscriber2: which will trigger cache to clear the cache
         subscriber2.close();
-        
+
         // retry strategically until broker clean up closed subscribers and invalidate all cache entries
         retryStrategically((test) -> entryCache.getSize() == 0, 5, 100);
-        
+
         // Verify: EntryCache should be cleared
         assertTrue(entryCache.getSize() == 0);
         subscriber1.close();
@@ -783,24 +754,22 @@ public class SimpleProducerConsumerTest extends ProducerConsumerBase {
         final String topic = "persistent://my-property/use/my-ns/" + topicName;
         final String sub1 = "faster-sub1";
         final String sub2 = "slower-sub2";
-        ConsumerConfiguration conf = new ConsumerConfiguration();
-        conf.setSubscriptionType(SubscriptionType.Shared);
-        conf.setReceiverQueueSize(receiverSize);
 
-        ProducerConfiguration producerConf = new ProducerConfiguration();
+        // 1. Subscriber Faster subscriber: let it consume all messages immediately
+        Consumer<byte[]> subscriber1 = pulsarClient.newConsumer()
+                .topic("persistent://my-property/use/my-ns/" + topicName).subscriptionName(sub1)
+                .subscriptionType(SubscriptionType.Shared).receiverQueueSize(receiverSize).subscribe();
+        // 1.b. Subscriber Slow subscriber:
+        Consumer<byte[]> subscriber2 = pulsarClient.newConsumer()
+                .topic("persistent://my-property/use/my-ns/" + topicName).subscriptionName(sub2)
+                .subscriptionType(SubscriptionType.Shared).receiverQueueSize(receiverSize).subscribe();
 
+        ProducerBuilder<byte[]> producerBuilder = pulsarClient.newProducer().topic(topic);
         if (batchMessageDelayMs != 0) {
-            producerConf.setBatchingEnabled(true);
-            producerConf.setBatchingMaxPublishDelay(batchMessageDelayMs, TimeUnit.MILLISECONDS);
-            producerConf.setBatchingMaxMessages(5);
+            producerBuilder.enableBatching(true).batchingMaxPublishDelay(batchMessageDelayMs, TimeUnit.MILLISECONDS)
+                    .batchingMaxMessages(5);
         }
-
-        // 1. Subscriber Faster subscriber: let it consume all messages immediately
-        Consumer subscriber1 = pulsarClient.subscribe("persistent://my-property/use/my-ns/" + topicName, sub1, conf);
-        // 1.b. Subscriber Slow subscriber:
-        conf.setReceiverQueueSize(receiverSize);
-        Consumer subscriber2 = pulsarClient.subscribe("persistent://my-property/use/my-ns/" + topicName, sub2, conf);
-        Producer producer = pulsarClient.createProducer(topic, producerConf);
+        Producer<byte[]> producer = producerBuilder.create();
 
         PersistentTopic topicRef = (PersistentTopic) pulsar.getBrokerService().getTopicReference(topic);
         ManagedLedgerImpl ledger = (ManagedLedgerImpl) topicRef.getManagedLedger();
@@ -817,7 +786,7 @@ public class SimpleProducerConsumerTest extends ProducerConsumerBase {
         field.set(ledger, maxMessageCacheRetentionTimeMillis);
         final long maxActiveCursorBacklogEntries = (long) backlogThresholdField.get(ledger);
 
-        Message msg = null;
+        Message<byte[]> msg = null;
         final int totalMsgs = (int) maxActiveCursorBacklogEntries + receiverSize + 1;
         // 2. Produce messages
         for (int i = 0; i < totalMsgs; i++) {
@@ -865,15 +834,13 @@ public class SimpleProducerConsumerTest extends ProducerConsumerBase {
         final int totalMsg = 100;
         final Set<String> produceMsgs = Sets.newHashSet();
         final Set<String> consumeMsgs = Sets.newHashSet();
-        final ProducerConfiguration producerConf = new ProducerConfiguration();
-        final ConsumerConfiguration conf = new ConsumerConfiguration();
 
-        conf.setSubscriptionType(SubscriptionType.Exclusive);
-        Consumer consumer = pulsarClient.subscribe("persistent://my-property/use/my-ns/my-topic1", "my-subscriber-name",
-                conf);
+        Consumer<byte[]> consumer = pulsarClient.newConsumer().topic("persistent://my-property/use/my-ns/my-topic1")
+                .subscriptionName("my-subscriber-name").subscribe();
 
         // produce message
-        Producer producer = pulsarClient.createProducer("persistent://my-property/use/my-ns/my-topic1", producerConf);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic("persistent://my-property/use/my-ns/my-topic1")
+                .create();
         for (int i = 0; i < totalMsg; i++) {
             String message = "my-message-" + i;
             producer.send(message.getBytes());
@@ -906,15 +873,13 @@ public class SimpleProducerConsumerTest extends ProducerConsumerBase {
         final int totalMsg = 100;
         final Set<String> produceMsgs = Sets.newHashSet();
         final Set<String> consumeMsgs = Sets.newHashSet();
-        final ProducerConfiguration producerConf = new ProducerConfiguration();
-        final ConsumerConfiguration conf = new ConsumerConfiguration();
-
-        conf.setSubscriptionType(SubscriptionType.Exclusive);
-        Consumer consumer = pulsarClient.subscribe("persistent://my-property/use/my-ns/my-topic1", "my-subscriber-name",
-                conf);
+        Consumer<byte[]> consumer = pulsarClient.newConsumer().topic("persistent://my-property/use/my-ns/my-topic1")
+                .subscriptionName("my-subscriber-name").subscribe();
+        ;
 
         // produce message
-        Producer producer = pulsarClient.createProducer("persistent://my-property/use/my-ns/my-topic1", producerConf);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic("persistent://my-property/use/my-ns/my-topic1")
+                .create();
         for (int i = 0; i < totalMsg; i++) {
             String message = "my-message-" + i;
             producer.send(message.getBytes());
@@ -945,11 +910,11 @@ public class SimpleProducerConsumerTest extends ProducerConsumerBase {
         log.info("-- Starting {} test --", methodName);
 
         final int totalMsg = 100;
-        final ProducerConfiguration producerConf = new ProducerConfiguration();
-        Producer producer = pulsarClient.createProducer("persistent://my-property/use/my-ns/my-topic1", producerConf);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic("persistent://my-property/use/my-ns/my-topic1")
+                .create();
         for (int i = 0; i < totalMsg; i++) {
             final String message = "my-message-" + i;
-            Message msg = MessageBuilder.create().setContent(message.getBytes()).build();
+            Message<byte[]> msg = MessageBuilder.create().setContent(message.getBytes()).build();
             final AtomicInteger msgLength = new AtomicInteger();
             CompletableFuture<MessageId> future = producer.sendAsync(msg).handle((r, ex) -> {
                 if (ex != null) {
@@ -974,25 +939,22 @@ public class SimpleProducerConsumerTest extends ProducerConsumerBase {
     public void testSharedConsumerAckDifferentConsumer() throws Exception {
         log.info("-- Starting {} test --", methodName);
 
-        ConsumerConfiguration conf = new ConsumerConfiguration();
-        conf.setReceiverQueueSize(1);
-        conf.setSubscriptionType(SubscriptionType.Shared);
-        Consumer consumer1 = pulsarClient.subscribe("persistent://my-property/use/my-ns/my-topic1", "my-subscriber-name",
-                conf);
-        Consumer consumer2 = pulsarClient.subscribe("persistent://my-property/use/my-ns/my-topic1", "my-subscriber-name",
-                conf);
-
-        ProducerConfiguration producerConf = new ProducerConfiguration();
+        ConsumerBuilder<byte[]> consumerBuilder = pulsarClient.newConsumer()
+                .topic("persistent://my-property/use/my-ns/my-topic1").subscriptionName("my-subscriber-name")
+                .receiverQueueSize(1).subscriptionType(SubscriptionType.Shared);
+        Consumer<byte[]> consumer1 = consumerBuilder.subscribe();
+        Consumer<byte[]> consumer2 = consumerBuilder.subscribe();
 
-        Producer producer = pulsarClient.createProducer("persistent://my-property/use/my-ns/my-topic1", producerConf);
+        Producer<byte[]> producer = pulsarClient.newProducer().topic("persistent://my-property/use/my-ns/my-topic1")
+                .create();
         for (int i = 0; i < 10; i++) {
             String message = "my-message-" + i;
             producer.send(message.getBytes());
         }
 
-        Message msg = null;
-        Set<Message> consumerMsgSet1 = Sets.newHashSet();
-        Set<Message> consumerMsgSet2 = Sets.newHashSet();
+        Message<byte[]> msg = null;
+        Set<Message<byte[]>> consumerMsgSet1 = Sets.newHashSet();
+        Set<Message<byte[]>> consumerMsgSet2 = Sets.newHashSet();
         for (int i = 0; i < 5; i++) {
             msg = consumer1.receive();
             consumerMsgSet1.add(msg);
@@ -1032,10 +994,10 @@ public class SimpleProducerConsumerTest extends ProducerConsumerBase {
         log.info("-- Exiting {} test --", methodName);
     }
 
-    private void receiveAsync(Consumer consumer, int totalMessage, int currentMessage, CountDownLatch latch,
+    private void receiveAsync(Consumer<byte[]> consumer, int totalMessage, int currentMessage, CountDownLatch latch,
             final Set<String> consumeMsg, ExecutorService executor) throws PulsarClientException {
         if (currentMessage < totalMessage) {
-            CompletableFuture<Message> future = consumer.receiveAsync();
+            CompletableFuture<Message<byte[]>> future = consumer.receiveAsync();
             future.handle((msg, exception) -> {
                 if (exception == null) {
                     // add message to consumer-queue to verify with produced messages
@@ -1061,13 +1023,11 @@ public class SimpleProducerConsumerTest extends ProducerConsumerBase {
     }
 
     /**
-     * Verify: Consumer stops receiving msg when reach unack-msg limit and
-     * starts receiving once acks messages
-     * 1. Produce X (600) messages
-     * 2. Consumer has receive size (10) and receive message without acknowledging
-     * 3. Consumer will stop receiving message after unAckThreshold = 500
-     * 4. Consumer acks messages and starts consuming remanining messages
-     * This testcase enables checksum sending while producing message and broker verifies the checksum for the message.
+     * Verify: Consumer stops receiving msg when reach unack-msg limit and starts receiving once acks messages 1.
+     * Produce X (600) messages 2. Consumer has receive size (10) and receive message without acknowledging 3. Consumer
+     * will stop receiving message after unAckThreshold = 500 4. Consumer acks messages and starts consuming remanining
+     * messages This testcase enables checksum sending while producing message and broker verifies the checksum for the
+     * message.
      *
      * @throws Exception
      */
@@ -1082,16 +1042,12 @@ public class SimpleProducerConsumerTest extends ProducerConsumerBase {
             final int totalProducedMsgs = 600;
 
             pulsar.getConfiguration().setMaxUnackedMessagesPerConsumer(unAckedMessagesBufferSize);
-            ConsumerConfiguration conf = new ConsumerConfiguration();
-            conf.setReceiverQueueSize(receiverQueueSize);
-            conf.setSubscriptionType(SubscriptionType.Shared);
-            Consumer consumer = pulsarClient.subscribe("persistent://my-property/use/my-ns/unacked-topic",
-                    "subscriber-1", conf);
+            Consumer<byte[]> consumer = pulsarClient.newConsumer()
+                    .topic("persistent://my-property/use/my-ns/unacked-topic").subscriptionName("subscriber-1")
+                    .receiverQueueSize(receiverQueueSize).subscriptionType(SubscriptionType.Shared).subscribe();
 
-            ProducerConfiguration producerConf = new ProducerConfiguration();
-
-            Producer producer = pulsarClient.createProducer("persistent://my-property/use/my-ns/unacked-topic",
-                    producerConf);
+            Producer<byte[]> producer = pulsarClient.newProducer()
+                    .topic("persistent://my-property/use/my-ns/unacked-topic").create();
 
             // (1) Produced Messages
             for (int i = 0; i < totalProducedMsgs; i++) {
@@ -1100,8 +1056,8 @@ public class SimpleProducerConsumerTest extends ProducerConsumerBase {
             }
 
             // (2) try to consume messages: but will be able to consume number of messages = unAckedMessagesBufferSize
-            Message msg = null;
-            List<Message> messages = Lists.newArrayList();
+            Message<byte[]> msg = null;
+            List<Message<byte[]>> messages = Lists.newArrayList();
             for (int i = 0; i < totalProducedMsgs; i++) {
                 msg = consumer.receive(1, TimeUnit.SECONDS);
                 if (msg != null) {
@@ -1146,18 +1102,11 @@ public class SimpleProducerConsumerTest extends ProducerConsumerBase {
     }
 
     /**
-     * Verify: iteration of
-     * a. message receive w/o acking
-     * b. stop receiving msg
-     * c. ack msgs
-     * d. started receiving msgs
+     * Verify: iteration of a. message receive w/o acking b. stop receiving msg c. ack msgs d. started receiving msgs
      *
-     * 1. Produce total X (1500) messages
-     * 2. Consumer consumes messages without acking until stop receiving
-     * from broker due to reaching ack-threshold (500)
-     * 3. Consumer acks messages after stop getting messages
-     * 4. Consumer again tries to consume messages
-     * 5. Consumer should be able to complete consuming all 1500 messages in 3 iteration (1500/500)
+     * 1. Produce total X (1500) messages 2. Consumer consumes messages without acking until stop receiving from broker
+     * due to reaching ack-threshold (500) 3. Consumer acks messages after stop getting messages 4. Consumer again tries
+     * to consume messages 5. Consumer should be able to complete consuming all 1500 messages in 3 iteration (1500/500)
      *
      * @throws Exception
      */
@@ -1174,16 +1123,12 @@ public class SimpleProducerConsumerTest extends ProducerConsumerBase {
             // receiver consumes messages in iteration after acknowledging broker
             final int totalReceiveIteration = totalProducedMsgs / unAckedMessagesBufferSize;
             pulsar.getConfiguration().setMaxUnackedMessagesPerConsumer(unAckedMessagesBufferSize);
-            ConsumerConfiguration conf = new ConsumerConfiguration();
-            conf.setReceiverQueueSize(receiverQueueSize);
-            conf.setSubscriptionType(SubscriptionType.Shared);
-            Consumer consumer = pulsarClient.subscribe("persistent://my-property/use/my-ns/unacked-topic",
-                    "subscriber-1", conf);
-
-            ProducerConfiguration producerConf = new ProducerConfiguration();
+            Consumer<byte[]> consumer = pulsarClient.newConsumer()
+                    .topic("persistent://my-property/use/my-ns/unacked-topic").subscriptionName("subscriber-1")
+                    .receiverQueueSize(receiverQueueSize).subscriptionType(SubscriptionType.Shared).subscribe();
 
-            Producer producer = pulsarClient.createProducer("persistent://my-property/use/my-ns/unacked-topic",
-                    producerConf);
+            Producer<byte[]> producer = pulsarClient.newProducer()
+                    .topic("persistent://my-property/use/my-ns/unacked-topic").create();
 
             // (1) Produced Messages
             for (int i = 0; i < totalProducedMsgs; i++) {
@@ -1195,8 +1140,8 @@ public class SimpleProducerConsumerTest extends ProducerConsumerBase {
             // (2) Receive Messages
             for (int j = 0; j < totalReceiveIteration; j++) {
 
-                Message msg = null;
-                List<Message> messages = Lists.newArrayList();
+                Message<byte[]> msg = null;
+                List<Message<byte[]>> messages = Lists.newArrayList();
                 for (int i = 0; i < totalProducedMsgs; i++) {
                     msg = consumer.receive(1, TimeUnit.SECONDS);
                     if (msg != null) {
@@ -1232,7 +1177,6 @@ public class SimpleProducerConsumerTest extends ProducerConsumerBase {
         }
     }
 
-
     /**
      * Verify: Consumer1 which doesn't send ack will not impact Consumer2 which sends ack for consumed message.
      *
@@ -1252,18 +1196,13 @@ public class SimpleProducerConsumerTest extends ProducerConsumerBase {
             int totalReceiveMessages = 0;
 
             pulsar.getConfiguration().setMaxUnackedMessagesPerConsumer(maxUnackedMessages);
-            ConsumerConfiguration conf = new ConsumerConfiguration();
-            conf.setReceiverQueueSize(receiverQueueSize);
-            conf.setSubscriptionType(SubscriptionType.Shared);
-            Consumer consumer1 = pulsarClient.subscribe("persistent://my-property/use/my-ns/unacked-topic",
-                    "subscriber-1", conf);
-            Consumer consumer2 = pulsarClient.subscribe("persistent://my-property/use/my-ns/unacked-topic",
-                    "subscriber-1", conf);
-
-            ProducerConfiguration producerConf = new ProducerConfiguration();
-
-            Producer producer = pulsarClient.createProducer("persistent://my-property/use/my-ns/unacked-topic",
-                    producerConf);
+            ConsumerBuilder<byte[]> consumerBuilder = pulsarClient.newConsumer()
+                    .topic("persistent://my-property/use/my-ns/unacked-topic").subscriptionName("subscriber-1")
+                    .receiverQueueSize(receiverQueueSize).subscriptionType(SubscriptionType.Shared);
+            Consumer<byte[]> consumer1 = consumerBuilder.subscribe();
+            Consumer<byte[]> consumer2 = consumerBuilder.subscribe();
+            Producer<byte[]> producer = pulsarClient.newProducer()
+                    .topic("persistent://my-property/use/my-ns/unacked-topic").create();
 
             // (1) Produced Messages
             for (int i = 0; i < totalProducedMsgs; i++) {
@@ -1271,11 +1210,10 @@ public class SimpleProducerConsumerTest extends ProducerConsumerBase {
                 producer.send(message.getBytes());
             }
 
-
             // (2) Consumer1: consume without ack:
             // try to consume messages: but will be able to consume number of messages = maxUnackedMessages
-            Message msg = null;
-            List<Message> messages = Lists.newArrayList();
+            Message<byte[]> msg = null;
+            List<Message<byte[]>> messages = Lists.newArrayList();
             for (int i = 0; i < totalProducedMsgs; i++) {
                 msg = consumer1.receive(1, TimeUnit.SECONDS);
                 if (msg != null) {
@@ -1348,17 +1286,13 @@ public class SimpleProducerConsumerTest extends ProducerConsumerBase {
             final int receiverQueueSize = 20;
             final int totalProducedMsgs = 100;
 
-            ConsumerConfiguration conf = new ConsumerConfiguration();
-            conf.setReceiverQueueSize(receiverQueueSize);
-            conf.setAckTimeout(1, TimeUnit.SECONDS);
-            conf.setSubscriptionType(SubscriptionType.Shared);
-            ConsumerImpl consumer = (ConsumerImpl) pulsarClient
-                    .subscribe("persistent://my-property/use/my-ns/unacked-topic", "subscriber-1", conf);
+            ConsumerImpl<byte[]> consumer = (ConsumerImpl<byte[]>) pulsarClient.newConsumer()
+                    .topic("persistent://my-property/use/my-ns/unacked-topic").subscriptionName("subscriber-1")
+                    .receiverQueueSize(receiverQueueSize).ackTimeout(1, TimeUnit.SECONDS)
+                    .subscriptionType(SubscriptionType.Shared).subscribe();
 
-            ProducerConfiguration producerConf = new ProducerConfiguration();
-
-            Producer producer = pulsarClient.createProducer("persistent://my-property/use/my-ns/unacked-topic",
-                    producerConf);
+            Producer<byte[]> producer = pulsarClient.newProducer()
+                    .topic("persistent://my-property/use/my-ns/unacked-topic").create();
 
             // (1) Produced Messages
             for (int i = 0; i < totalProducedMsgs; i++) {
@@ -1375,7 +1309,7 @@ public class SimpleProducerConsumerTest extends ProducerConsumerBase {
             assertEquals(consumer.numMessagesInQueue(), receiverQueueSize);
 
             for (int i = 0; i < totalProducedMsgs; i++) {
-                Message msg = consumer.receive(1, TimeUnit.SECONDS);
+                Message<byte[]> msg = consumer.receive(1, TimeUnit.SECONDS);
                 if (msg != null) {
                     consumer.acknowledge(msg);
                     totalReceiveMsg++;
@@ -1409,16 +1343,12 @@ public class SimpleProducerConsumerTest extends ProducerConsumerBase {
             final int totalProducedMsgs = 100;
 
             pulsar.getConfiguration().setMaxUnackedMessagesPerConsumer(unAckedMessagesBufferSize);
-            ConsumerConfiguration conf = new ConsumerConfiguration();
-            conf.setReceiverQueueSize(receiverQueueSize);
-            conf.setSubscriptionType(SubscriptionType.Shared);
-            ConsumerImpl consumer = (ConsumerImpl) pulsarClient
-                    .subscribe("persistent://my-property/use/my-ns/unacked-topic", "subscriber-1", conf);
-
-            ProducerConfiguration producerConf = new ProducerConfiguration();
+            ConsumerImpl<byte[]> consumer = (ConsumerImpl<byte[]>) pulsarClient.newConsumer()
+                    .topic("persistent://my-property/use/my-ns/unacked-topic").subscriptionName("subscriber-1")
+                    .receiverQueueSize(receiverQueueSize).subscriptionType(SubscriptionType.Shared).subscribe();
 
-            Producer producer = pulsarClient.createProducer("persistent://my-property/use/my-ns/unacked-topic",
-                    producerConf);
+            Producer<byte[]> producer = pulsarClient.newProducer()
+                    .topic("persistent://my-property/use/my-ns/unacked-topic").create();
 
             // (1) Produced Messages
             for (int i = 0; i < totalProducedMsgs; i++) {
@@ -1427,8 +1357,8 @@ public class SimpleProducerConsumerTest extends ProducerConsumerBase {
             }
 
             // (2) try to consume messages: but will be able to consume number of messages = unAckedMessagesBufferSize
-            Message msg = null;
-            List<Message> messages = Lists.newArrayList();
+            Message<byte[]> msg = null;
+            List<Message<byte[]>> messages = Lists.newArrayList();
             for (int i = 0; i < totalProducedMsgs; i++) {
                 msg = consumer.receive(1, TimeUnit.SECONDS);
                 if (msg != null) {
@@ -1480,22 +1410,20 @@ public class SimpleProducerConsumerTest extends ProducerConsumerBase {
             int totalReceiveMessages = 0;
 
             pulsar.getConfiguration().setMaxUnackedMessagesPerConsumer(maxUnackedMessages);
-            ConsumerConfiguration conf = new ConsumerConfiguration();
-            conf.setReceiverQueueSize(receiverQueueSize);
-            conf.setSubscriptionType(SubscriptionType.Shared);
-            Consumer consumer1 = pulsarClient.subscribe("persistent://my-property/use/my-ns/unacked-topic",
-                    "subscriber-1", conf);
+            Consumer<byte[]> consumer1 = pulsarClient.newConsumer()
+                    .topic("persistent://my-property/use/my-ns/unacked-topic").subscriptionName("subscriber-1")
+                    .receiverQueueSize(receiverQueueSize).subscriptionType(SubscriptionType.Shared).subscribe();
 
-            ProducerConfiguration producerConf = new ProducerConfiguration();
+            ProducerBuilder<byte[]> producerBuidler = pulsarClient.newProducer()
+                    .topic("persistent://my-property/use/my-ns/unacked-topic");
 
             if (batchMessageDelayMs != 0) {
-                producerConf.setBatchingEnabled(true);
-                producerConf.setBatchingMaxPublishDelay(batchMessageDelayMs, TimeUnit.MILLISECONDS);
-                producerConf.setBatchingMaxMessages(5);
+                producerBuidler.enableBatching(true);
+                producerBuidler.batchingMaxPublishDelay(batchMessageDelayMs, TimeUnit.MILLISECONDS);
+                producerBuidler.batchingMaxMessages(5);
             }
 
-            Producer producer = pulsarClient.createProducer("persistent://my-property/use/my-ns/unacked-topic",
-                    producerConf);
+            Producer<byte[]> producer = producerBuidler.create();
 
             List<CompletableFuture<MessageId>> futures = Lists.newArrayList();
             // (1) Produced Messages
@@ -1508,8 +1436,8 @@ public class SimpleProducerConsumerTest extends ProducerConsumerBase {
 
             // (2) Consumer1: consume without ack:
             // try to consume messages: but will be able to consume number of messages = maxUnackedMessages
-            Message msg = null;
-            List<Message> messages = Lists.newArrayList();
+            Message<byte[]> msg = null;
+            List<Message<byte[]>> messages = Lists.newArrayList();
             for (int i = 0; i < totalProducedMsgs; i++) {
                 msg = consumer1.receive(1, TimeUnit.SECONDS);
                 if (msg != null) {
@@ -1575,18 +1503,14 @@ public class SimpleProducerConsumerTest extends ProducerConsumerBase {
             int totalReceiveMessages = 0;
 
             pulsar.getConfiguration().setMaxUnackedMessagesPerConsumer(maxUnackedMessages);
-            ConsumerConfiguration conf = new ConsumerConfiguration();
-            conf.setReceiverQueueSize(receiverQueueSize);
-            conf.setSubscriptionType(SubscriptionType.Shared);
-            Consumer consumer1 = pulsarClient.subscribe("persistent://my-property/use/my-ns/unacked-topic",
-                    "subscriber-1", conf);
-            Consumer consumer2 = pulsarClient.subscribe("persistent://my-property/use/my-ns/unacked-topic",
-                    "subscriber-1", conf);
-
-            ProducerConfiguration producerConf = new ProducerConfiguration();
+            ConsumerBuilder<byte[]> consumerBuilder = pulsarClient.newConsumer()
+                    .topic("persistent://my-property/use/my-ns/unacked-topic").subscriptionName("subscriber-1")
+                    .receiverQueueSize(receiverQueueSize).subscriptionType(SubscriptionType.Shared);
+            Consumer<byte[]> consumer1 = consumerBuilder.subscribe();
+            Consumer<byte[]> consumer2 = consumerBuilder.subscribe();
 
-            Producer producer = pulsarClient.createProducer("persistent://my-property/use/my-ns/unacked-topic",
-                    producerConf);
+            Producer<byte[]> producer = pulsarClient.newProducer()
+                    .topic("persistent://my-property/use/my-ns/unacked-topic").create();
 
             // (1) Produced Messages
             for (int i = 0; i < totalProducedMsgs; i++) {
@@ -1594,11 +1518,10 @@ public class SimpleProducerConsumerTest extends ProducerConsumerBase {
                 producer.send(message.getBytes());
             }
 
-
             // (2) Consumer1: consume without ack:
             // try to consume messages: but will be able to consume number of messages = maxUnackedMessages
-            Message msg = null;
-            List<Message> messages = Lists.newArrayList();
+            Message<byte[]> msg = null;
+            List<Message<byte[]>> messages = Lists.newArrayList();
             for (int i = 0; i < totalProducedMsgs; i++) {
                 msg = consumer1.receive(1, TimeUnit.SECONDS);
                 if (msg != null) {
@@ -1610,7 +1533,7 @@ public class SimpleProducerConsumerTest extends ProducerConsumerBase {
                 }
             }
 
-            assertEquals(messages.size(), maxUnackedMessages); //consumer1
+            assertEquals(messages.size(), maxUnackedMessages); // consumer1
 
             // (3) ack for all UnackedMessages from consumer2
             messages.forEach(m -> {
@@ -1661,26 +1584,24 @@ public class SimpleProducerConsumerTest extends ProducerConsumerBase {
         log.info("-- Starting {} test --", methodName);
 
         final int totalMsg = 10;
-        ConsumerConfiguration conf = new ConsumerConfiguration();
-        conf.setSubscriptionType(SubscriptionType.Exclusive);
-        Consumer consumer = pulsarClient.subscribe("persistent://my-property/use/my-ns/my-topic1", "my-subscriber-name",
-                conf);
+        Consumer<byte[]> consumer = pulsarClient.newConsumer().topic("persistent://my-property/use/my-ns/my-topic1")
+                .subscriptionName("my-subscriber-name").subscribe();
 
-        ProducerConfiguration producerConf = new ProducerConfiguration();
+        ProducerBuilder<byte[]> producerBuilder = pulsarClient.newProducer()
+                .topic("persistent://my-property/use/my-ns/my-topic1");
         final int batchMessageDelayMs = 300;
         if (batchMessageDelayMs != 0) {
-            producerConf.setBatchingEnabled(true);
-            producerConf.setBatchingMaxPublishDelay(batchMessageDelayMs, TimeUnit.MILLISECONDS);
-            producerConf.setBatchingMaxMessages(5);
+            producerBuilder.enableBatching(true).batchingMaxPublishDelay(batchMessageDelayMs, TimeUnit.MILLISECONDS)
+                    .batchingMaxMessages(5);
         }
 
-        Producer producer = pulsarClient.createProducer("persistent://my-property/use/my-ns/my-topic1", producerConf);
+        Producer<byte[]> producer = producerBuilder.create();
... 7182 lines suppressed ...

-- 
To stop receiving notification emails like this one, please contact
mmerli@apache.org.