diff --git a/lib/java/gradle.properties b/lib/java/gradle.properties
index 8559464..1cdf095 100644
--- a/lib/java/gradle.properties
+++ b/lib/java/gradle.properties
@@ -28,7 +28,9 @@
 httpclient.version=4.5.10
 httpcore.version=4.4.12
 slf4j.version=1.7.28
-servlet.version=2.5
+#servlet.version=2.5
+#It contains servlet3
+tomcat.embed.version=8.5.46
 junit.version=4.12
 mockito.version=1.10.19
 javax.annotation.version=1.3.2
diff --git a/lib/java/gradle/environment.gradle b/lib/java/gradle/environment.gradle
index 45fa63a..965a908 100644
--- a/lib/java/gradle/environment.gradle
+++ b/lib/java/gradle/environment.gradle
@@ -44,7 +44,8 @@
 // Versions used in this project
 ext.httpclientVersion = property('httpclient.version')
 ext.httpcoreVersion = property('httpcore.version')
-ext.servletVersion = property('servlet.version')
+//ext.servletVersion = property('servlet.version')
+ext.tomcatEmbedVersion = property('tomcat.embed.version')
 ext.slf4jVersion = property('slf4j.version')
 ext.junitVersion = property('junit.version')
 ext.mockitoVersion = property('mockito.version')
@@ -66,7 +67,8 @@
     compile "org.slf4j:slf4j-api:${slf4jVersion}"
     compile "org.apache.httpcomponents:httpclient:${httpclientVersion}"
     compile "org.apache.httpcomponents:httpcore:${httpcoreVersion}"
-    compile "javax.servlet:servlet-api:${servletVersion}"
+    //compile "javax.servlet:servlet-api:${servletVersion}"
+    compile "org.apache.tomcat.embed:tomcat-embed-core:${tomcatEmbedVersion}"
     compile "javax.annotation:javax.annotation-api:${javaxAnnotationVersion}"
 
     testCompile "junit:junit:${junitVersion}"
diff --git a/lib/java/gradle/functionalTests.gradle b/lib/java/gradle/functionalTests.gradle
index c420d12..6a388a6 100644
--- a/lib/java/gradle/functionalTests.gradle
+++ b/lib/java/gradle/functionalTests.gradle
@@ -34,6 +34,7 @@
             include '**/test/TestClient.java'
             include '**/test/TestServer.java'
             include '**/test/TestNonblockingServer.java'
+            include '**/test/TestTServletServer.java'
         }
     }
 }
@@ -55,7 +56,7 @@
 shadowJar {
     description = 'Assemble a test JAR file for cross-check execution'
     // make sure the runners are created when this runs
-    dependsOn 'generateRunnerScriptForClient', 'generateRunnerScriptForServer', 'generateRunnerScriptForNonblockingServer'
+    dependsOn 'generateRunnerScriptForClient', 'generateRunnerScriptForServer', 'generateRunnerScriptForNonblockingServer', 'generateRunnerScriptForTServletServer'
 
     baseName = 'functionalTest'
     destinationDir = file("$buildDir/functionalTestJar")
@@ -153,3 +154,24 @@
         serverFile.setExecutable(true, false)
     }
 }
+
+task generateRunnerScriptForTServletServer(group: 'Build') {
+    description = 'Generate a runner script for cross-check tests with TestTServletServer'
+
+    def serverFile = file("$buildDir/runservletserver${scriptExt}")
+
+    def runServerText = """\
+${scriptHead}
+
+"${javaExe}" -cp "$jarPath" "-Djavax.net.ssl.keyStore=$keyStore" -Djavax.net.ssl.keyStorePassword=thrift org.apache.thrift.test.TestTServletServer $args
+"""
+
+    inputs.property 'runServerText', runServerText
+    outputs.file serverFile
+
+    doLast {
+        serverFile.parentFile.mkdirs()
+        serverFile.text = runServerText
+        serverFile.setExecutable(true, false)
+    }
+}
diff --git a/lib/java/gradle/sourceConfiguration.gradle b/lib/java/gradle/sourceConfiguration.gradle
index 8dd0331..3bd432a 100644
--- a/lib/java/gradle/sourceConfiguration.gradle
+++ b/lib/java/gradle/sourceConfiguration.gradle
@@ -34,6 +34,7 @@
             exclude '**/test/TestClient.java'
             exclude '**/test/TestServer.java'
             exclude '**/test/TestNonblockingServer.java'
+            exclude '**/test/TestTServletServer.java'
         }
         resources {
             srcDir 'test'
diff --git a/lib/java/test/org/apache/thrift/test/TestClient.java b/lib/java/test/org/apache/thrift/test/TestClient.java
index 84410ce..dbada08 100644
--- a/lib/java/test/org/apache/thrift/test/TestClient.java
+++ b/lib/java/test/org/apache/thrift/test/TestClient.java
@@ -27,6 +27,7 @@
 import java.util.Map;
 import java.util.Set;
 
+import org.apache.http.impl.client.HttpClients;
 import org.apache.thrift.TApplicationException;
 import org.apache.thrift.TException;
 import org.apache.thrift.TSerializer;
@@ -76,6 +77,7 @@
     String protocol_type = "binary";
     String transport_type = "buffered";
     boolean ssl = false;
+    boolean http_client = false;
 
     int socketTimeout = 1000;
 
@@ -99,6 +101,8 @@
           transport_type.trim();
         } else if (args[i].equals("--ssl")) {
           ssl = true;
+        } else if (args[i].equals("--client")) {
+          http_client = true;  
         } else if (args[i].equals("--help")) {
           System.out.println("Allowed options:");
           System.out.println("  --help\t\t\tProduce help message");
@@ -145,8 +149,13 @@
 
     try {
       if (transport_type.equals("http")) {
-        String url = "http://" + host + ":" + port + "/service";
-        transport = new THttpClient(url);
+        String url = "http://" + host + ":" + port + "/test/service";
+        if (http_client == true) {
+          
+          transport = new THttpClient(url, HttpClients.createDefault());
+        } else {
+          transport = new THttpClient(url);
+        }
       } else {
         TSocket socket = null;
         if (ssl == true) {
diff --git a/lib/java/test/org/apache/thrift/test/TestServlet.java b/lib/java/test/org/apache/thrift/test/TestServlet.java
new file mode 100644
index 0000000..e63109d
--- /dev/null
+++ b/lib/java/test/org/apache/thrift/test/TestServlet.java
@@ -0,0 +1,52 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.thrift.test;
+
+import org.apache.thrift.TProcessor;
+import org.apache.thrift.protocol.TCompactProtocol;
+import org.apache.thrift.protocol.TProtocolFactory;
+import org.apache.thrift.server.ServerTestBase.TestHandler;
+import org.apache.thrift.server.TExtensibleServlet;
+
+import thrift.test.ThriftTest;
+
+@SuppressWarnings("serial")
+public class TestServlet extends TExtensibleServlet {
+
+  @Override
+  protected TProtocolFactory getInProtocolFactory(){
+      TProtocolFactory tProtocolFactory = new TCompactProtocol.Factory();
+      return tProtocolFactory;
+  }
+
+  @Override
+  protected TProtocolFactory getOutProtocolFactory(){
+      TProtocolFactory tProtocolFactory = new TCompactProtocol.Factory();
+      return tProtocolFactory;
+  }
+
+  @SuppressWarnings({"rawtypes", "unchecked"})
+  @Override
+  protected TProcessor getProcessor(){
+      TestHandler testHandler = new TestHandler();
+      ThriftTest.Processor testProcessor = new ThriftTest.Processor(testHandler);
+      return testProcessor;
+  }
+}
diff --git a/lib/java/test/org/apache/thrift/test/TestTServletServer.java b/lib/java/test/org/apache/thrift/test/TestTServletServer.java
new file mode 100644
index 0000000..93e7944
--- /dev/null
+++ b/lib/java/test/org/apache/thrift/test/TestTServletServer.java
@@ -0,0 +1,52 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.thrift.test;
+
+import org.apache.catalina.core.StandardContext;
+import org.apache.catalina.startup.Tomcat;
+import org.apache.catalina.startup.Tomcat.FixContextListener;
+
+
+/**
+ * run tomcat for test TServlet
+ */
+public class TestTServletServer {
+
+  static final int port = 9090;
+
+  public static void main(String [] args) throws Exception{
+    Tomcat tomcat = new Tomcat();
+    tomcat.setPort( port );
+    tomcat.setBaseDir(System.getProperty("user.dir")+"\\build");
+    tomcat.getHost().setAutoDeploy( false );
+
+    String contextPath = "/test";
+    StandardContext context = new StandardContext();
+    context.setPath( contextPath );
+    context.addLifecycleListener( new FixContextListener() );
+    tomcat.getHost().addChild( context );
+
+    tomcat.addServlet( contextPath, "testServlet", new TestServlet() );
+    context.addServletMappingDecoded( "/service", "testServlet");
+    tomcat.start();
+    tomcat.getServer().await();
+  }
+  
+}
