diff --git a/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons.test/.classpath b/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons.test/.classpath
new file mode 100644
index 000000000..f19381878
--- /dev/null
+++ b/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons.test/.classpath
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons.test/.project b/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons.test/.project
new file mode 100644
index 000000000..212ab34eb
--- /dev/null
+++ b/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons.test/.project
@@ -0,0 +1,34 @@
+
+
+ org.springframework.tooling.ls.eclipse.commons.test
+
+
+
+
+
+ org.eclipse.jdt.core.javabuilder
+
+
+
+
+ org.eclipse.pde.ManifestBuilder
+
+
+
+
+ org.eclipse.pde.SchemaBuilder
+
+
+
+
+ org.eclipse.m2e.core.maven2Builder
+
+
+
+
+
+ org.eclipse.m2e.core.maven2Nature
+ org.eclipse.pde.PluginNature
+ org.eclipse.jdt.core.javanature
+
+
diff --git a/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons.test/.settings/org.eclipse.jdt.core.prefs b/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons.test/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 000000000..0c68a61dc
--- /dev/null
+++ b/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons.test/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons.test/.settings/org.eclipse.m2e.core.prefs b/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons.test/.settings/org.eclipse.m2e.core.prefs
new file mode 100644
index 000000000..f897a7f1c
--- /dev/null
+++ b/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons.test/.settings/org.eclipse.m2e.core.prefs
@@ -0,0 +1,4 @@
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1
diff --git a/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons.test/META-INF/MANIFEST.MF b/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons.test/META-INF/MANIFEST.MF
new file mode 100644
index 000000000..5543a757f
--- /dev/null
+++ b/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons.test/META-INF/MANIFEST.MF
@@ -0,0 +1,14 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Test
+Bundle-SymbolicName: org.springframework.tooling.ls.eclipse.commons.test
+Bundle-Version: 1.0.0.qualifier
+Automatic-Module-Name: org.springframework.tooling.ls.eclipse.commons.test
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Require-Bundle: org.junit,
+ org.eclipse.core.runtime,
+ org.eclipse.core.resources,
+ org.springframework.tooling.ls.eclipse.commons,
+ org.eclipse.jdt.core,
+ org.apache.commons.io,
+ org.springframework.tooling.jdt.ls.commons
diff --git a/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons.test/build.properties b/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons.test/build.properties
new file mode 100644
index 000000000..34d2e4d2d
--- /dev/null
+++ b/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons.test/build.properties
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .
diff --git a/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons.test/pom.xml b/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons.test/pom.xml
new file mode 100644
index 000000000..37c2315c9
--- /dev/null
+++ b/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons.test/pom.xml
@@ -0,0 +1,82 @@
+
+ 4.0.0
+ eclipse-test-plugin
+ org.springframework.tooling.ls.eclipse.commons.test
+ 1.0.0-SNAPSHOT
+ org.springframework.tooling.ls.eclipse.commons.test
+
+
+ org.springframework.boot.ide
+ org.springframework.boot.ide.servers
+ 4.0.0-SNAPSHOT
+ ../pom.xml
+
+
+
+
+
+
+
+
+ osx
+
+
+ mac
+
+
+
+ -XstartOnFirstThread
+
+
+
+
+
+
+
+ org.eclipse.tycho
+ target-platform-configuration
+
+
+
+
+ eclipse-feature
+ org.eclipse.jdt
+ 0.0.0
+
+
+ eclipse-feature
+ org.eclipse.platform
+ 0.0.0
+
+
+ eclipse-feature
+ org.eclipse.rcp
+ 0.0.0
+
+
+ eclipse-feature
+ org.eclipse.m2e.feature
+ 0.0.0
+
+
+
+
+
+
+ org.eclipse.tycho
+ tycho-surefire-plugin
+ ${tycho-version}
+
+ 200
+ **/*Test.java
+ true
+ ${test.argLine}
+ false
+
+
+
+
+
+
diff --git a/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons.test/src/org/springframework/tooling/ls/eclipse/commons/test/JavadocTest.java b/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons.test/src/org/springframework/tooling/ls/eclipse/commons/test/JavadocTest.java
new file mode 100644
index 000000000..5ebd7b593
--- /dev/null
+++ b/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons.test/src/org/springframework/tooling/ls/eclipse/commons/test/JavadocTest.java
@@ -0,0 +1,86 @@
+/*******************************************************************************
+ * Copyright (c) 2018 Pivotal, Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Pivotal, Inc. - initial API and implementation
+ *******************************************************************************/
+package org.springframework.tooling.ls.eclipse.commons.test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import java.util.concurrent.TimeUnit;
+
+import org.eclipse.jdt.core.IField;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.IMethod;
+import org.eclipse.jdt.core.IType;
+import org.junit.After;
+import org.junit.Test;
+import org.springframework.tooling.jdt.ls.commons.javadoc.JavadocResponse;
+import org.springframework.tooling.ls.eclipse.commons.JavadocParams;
+import org.springframework.tooling.ls.eclipse.commons.STS4LanguageClientImpl;
+
+public class JavadocTest {
+
+ private static STS4LanguageClientImpl client = new STS4LanguageClientImpl();
+
+ @After
+ public void tearDown() throws Exception {
+ TestUtils.deleteAllProjects();
+ }
+
+ @Test
+ public void classJavadoc() throws Exception {
+ IJavaProject project = TestUtils.createTestProject("simple-java-project");
+ assertNotNull(project);
+ IType type = project.findType("com.sample.SampleJavadoc");
+ assertNotNull(type);
+
+ String expectedBindingKey = "Lcom/sample/SampleJavadoc;";
+ assertEquals(expectedBindingKey, type.getKey());
+
+ JavadocParams params = new JavadocParams(project.getProject().getLocation().toFile().toURI().toString(), expectedBindingKey);
+ JavadocResponse response = client.javadoc(params).get(1, TimeUnit.SECONDS);
+ assertEquals("**Sample class**", response.getContent());
+ }
+
+ @Test
+ public void fieldJavadoc() throws Exception {
+ IJavaProject project = TestUtils.createTestProject("simple-java-project");
+ assertNotNull(project);
+ IType type = project.findType("com.sample.SampleJavadoc");
+ assertNotNull(type);
+ IField field = type.getField("number");
+ assertNotNull(field);
+
+ String expectedBindingKey = "Lcom/sample/SampleJavadoc;.number";
+ assertEquals(expectedBindingKey, field.getKey());
+
+ JavadocParams params = new JavadocParams(project.getProject().getLocation().toFile().toURI().toString(), expectedBindingKey);
+ JavadocResponse response = client.javadoc(params).get(1, TimeUnit.SECONDS);
+ assertEquals("**Sample field**", response.getContent());
+ }
+
+ @Test
+ public void methodJavadoc() throws Exception {
+ IJavaProject project = TestUtils.createTestProject("simple-java-project");
+ assertNotNull(project);
+ IType type = project.findType("com.sample.SampleJavadoc");
+ assertNotNull(type);
+ IMethod method = type.getMethod("getNumber", new String[0]);
+ assertNotNull(method);
+
+ String expectedBindingKey = "Lcom/sample/SampleJavadoc;.getNumber()V";
+ assertEquals(expectedBindingKey, method.getKey());
+
+ JavadocParams params = new JavadocParams(project.getProject().getLocation().toFile().toURI().toString(), expectedBindingKey);
+ JavadocResponse response = client.javadoc(params).get(1, TimeUnit.SECONDS);
+ assertEquals("**Sample getter**", response.getContent());
+ }
+
+}
diff --git a/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons.test/src/org/springframework/tooling/ls/eclipse/commons/test/TestUtils.java b/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons.test/src/org/springframework/tooling/ls/eclipse/commons/test/TestUtils.java
new file mode 100644
index 000000000..f59a134f1
--- /dev/null
+++ b/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons.test/src/org/springframework/tooling/ls/eclipse/commons/test/TestUtils.java
@@ -0,0 +1,79 @@
+/*******************************************************************************
+ * Copyright (c) 2018 Pivotal, Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Pivotal, Inc. - initial API and implementation
+ *******************************************************************************/
+ package org.springframework.tooling.ls.eclipse.commons.test;
+
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+
+import org.apache.commons.io.FileUtils;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IncrementalProjectBuilder;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.JavaCore;
+
+public class TestUtils {
+
+ public static IJavaProject createTestProject(String name) throws Exception {
+ File testProjectSourceLocation = new File(FileLocator.toFileURL(Platform.getBundle("org.springframework.tooling.ls.eclipse.commons.test").getEntry("test-projects/"+name)).toURI());
+ File targetWorkspace = ResourcesPlugin.getWorkspace().getRoot().getLocation().toFile();
+
+ FileUtils.copyDirectory(testProjectSourceLocation, new File(targetWorkspace, name));
+
+ IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(name);
+ project.create(null);
+ project.open(null);
+ project.refreshLocal(IResource.DEPTH_INFINITE, null);
+
+ assertTrue(project.hasNature(JavaCore.NATURE_ID));
+ ResourcesPlugin.getWorkspace().build(IncrementalProjectBuilder.FULL_BUILD, null);
+
+ return JavaCore.create(project);
+ }
+
+ public static void deleteAllProjects() throws Exception {
+ IProject[] allProjects = ResourcesPlugin.getWorkspace().getRoot().getProjects();
+ for (IProject project : allProjects) {
+ project.refreshLocal(IResource.DEPTH_INFINITE, null);
+ project.close(null);
+ deleteProject(project);
+ }
+ ResourcesPlugin.getWorkspace().build(IncrementalProjectBuilder.FULL_BUILD, null);
+ }
+
+ private static void deleteProject(IProject project) throws Exception {
+ int retryCount = 10; // wait 1 minute at most
+ Exception lastException = null;
+ while (project.exists() && --retryCount >= 0) {
+ try {
+ project.delete(true, true, new NullProgressMonitor());
+ lastException = null;
+ } catch (Exception e) {
+ lastException = e;
+ try {
+ Thread.sleep(1000);
+ }
+ catch (InterruptedException e1) {
+ }
+ }
+ }
+ if (lastException!=null) {
+ throw lastException;
+ }
+ }
+
+
+}
diff --git a/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons.test/test-projects/simple-java-project/src/com/sample/SampleJavadoc.java b/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons.test/test-projects/simple-java-project/src/com/sample/SampleJavadoc.java
new file mode 100644
index 000000000..e008f3c82
--- /dev/null
+++ b/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons.test/test-projects/simple-java-project/src/com/sample/SampleJavadoc.java
@@ -0,0 +1,20 @@
+package com.sample;
+
+/**
+ * Sample class
+ */
+public class SampleJavadoc {
+
+ /**
+ * Sample field
+ */
+ public int number;
+
+ /**
+ * Sample getter
+ */
+ public int getNumber() {
+ return number;
+ }
+
+}
diff --git a/eclipse-language-servers/pom.xml b/eclipse-language-servers/pom.xml
index f02b1024c..5f399c103 100644
--- a/eclipse-language-servers/pom.xml
+++ b/eclipse-language-servers/pom.xml
@@ -29,6 +29,7 @@
../headless-services/jdt-ls-extension
org.springframework.tooling.ls.eclipse.commons
+ org.springframework.tooling.ls.eclipse.commons.test
org.springframework.tooling.cloudfoundry.manifest.ls
org.springframework.tooling.cloudfoundry.manifest.ls.feature