diff --git a/eclipse-language-servers/org.springframework.tooling.boot.java.ls/.project b/eclipse-language-servers/org.springframework.tooling.boot.java.ls/.project
new file mode 100644
index 000000000..17dc13dae
--- /dev/null
+++ b/eclipse-language-servers/org.springframework.tooling.boot.java.ls/.project
@@ -0,0 +1,28 @@
+
+
+ org.springframework.tooling.boot.java.ls
+
+
+
+
+
+ org.eclipse.jdt.core.javabuilder
+
+
+
+
+ org.eclipse.pde.ManifestBuilder
+
+
+
+
+ org.eclipse.pde.SchemaBuilder
+
+
+
+
+
+ org.eclipse.pde.PluginNature
+ org.eclipse.jdt.core.javanature
+
+
diff --git a/eclipse-language-servers/org.springframework.tooling.properties.ls/.project b/eclipse-language-servers/org.springframework.tooling.properties.ls/.project
new file mode 100644
index 000000000..f455d5529
--- /dev/null
+++ b/eclipse-language-servers/org.springframework.tooling.properties.ls/.project
@@ -0,0 +1,28 @@
+
+
+ org.springframework.tooling.properties.ls
+
+
+
+
+
+ org.eclipse.jdt.core.javabuilder
+
+
+
+
+ org.eclipse.pde.ManifestBuilder
+
+
+
+
+ org.eclipse.pde.SchemaBuilder
+
+
+
+
+
+ org.eclipse.pde.PluginNature
+ org.eclipse.jdt.core.javanature
+
+
diff --git a/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/common/CommonLanguageTools.java b/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/common/CommonLanguageTools.java
index e4fb52e18..fb37add51 100644
--- a/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/common/CommonLanguageTools.java
+++ b/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/common/CommonLanguageTools.java
@@ -27,10 +27,10 @@ import org.springframework.ide.vscode.boot.metadata.types.TypeParser;
import org.springframework.ide.vscode.boot.metadata.types.TypeUtil;
import org.springframework.ide.vscode.boot.metadata.types.TypeUtil.EnumCaseMode;
import org.springframework.ide.vscode.boot.properties.reconcile.PropertyNavigator;
-import org.springframework.ide.vscode.commons.languageserver.util.DocumentRegion;
import org.springframework.ide.vscode.commons.util.CollectionUtil;
import org.springframework.ide.vscode.commons.util.FuzzyMap;
import org.springframework.ide.vscode.commons.util.Log;
+import org.springframework.ide.vscode.commons.util.text.DocumentRegion;
import org.springframework.ide.vscode.commons.util.text.LanguageId;
import org.springframework.ide.vscode.commons.util.text.TextDocument;
@@ -69,7 +69,7 @@ public class CommonLanguageTools {
public static Collection getValueHints(FuzzyMap index, TypeUtil typeUtil, String query, String propertyName, EnumCaseMode caseMode) {
Type type = getValueType(index, typeUtil, propertyName);
- if (TypeUtil.isArray(type) || TypeUtil.isList(type)) {
+ if (TypeUtil.isSequencable(type)) {
//It is useful to provide content assist for the values in the list when entering a list
type = TypeUtil.getDomainType(type);
}
diff --git a/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/java/beans/BeansSymbolProvider.java b/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/java/beans/BeansSymbolProvider.java
index 60823e48b..3878448ad 100644
--- a/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/java/beans/BeansSymbolProvider.java
+++ b/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/java/beans/BeansSymbolProvider.java
@@ -26,9 +26,9 @@ import org.eclipse.lsp4j.SymbolKind;
import org.springframework.ide.vscode.boot.java.handlers.SymbolProvider;
import org.springframework.ide.vscode.boot.java.utils.ASTUtils;
import org.springframework.ide.vscode.boot.java.utils.FunctionUtils;
-import org.springframework.ide.vscode.commons.languageserver.util.DocumentRegion;
import org.springframework.ide.vscode.commons.util.BadLocationException;
import org.springframework.ide.vscode.commons.util.Log;
+import org.springframework.ide.vscode.commons.util.text.DocumentRegion;
import org.springframework.ide.vscode.commons.util.text.TextDocument;
import com.google.common.collect.ImmutableList;
diff --git a/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/java/data/DataRepositorySymbolProvider.java b/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/java/data/DataRepositorySymbolProvider.java
index 40ed758bd..b50524866 100644
--- a/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/java/data/DataRepositorySymbolProvider.java
+++ b/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/java/data/DataRepositorySymbolProvider.java
@@ -20,9 +20,9 @@ import org.eclipse.lsp4j.SymbolInformation;
import org.eclipse.lsp4j.SymbolKind;
import org.springframework.ide.vscode.boot.java.handlers.SymbolProvider;
import org.springframework.ide.vscode.boot.java.utils.ASTUtils;
-import org.springframework.ide.vscode.commons.languageserver.util.DocumentRegion;
import org.springframework.ide.vscode.commons.util.BadLocationException;
import org.springframework.ide.vscode.commons.util.Log;
+import org.springframework.ide.vscode.commons.util.text.DocumentRegion;
import org.springframework.ide.vscode.commons.util.text.TextDocument;
import com.google.common.collect.ImmutableList;
diff --git a/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/java/handlers/BootJavaHoverProvider.java b/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/java/handlers/BootJavaHoverProvider.java
index 6512b57e4..dcd1fef7d 100644
--- a/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/java/handlers/BootJavaHoverProvider.java
+++ b/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/java/handlers/BootJavaHoverProvider.java
@@ -37,10 +37,10 @@ import org.springframework.ide.vscode.commons.boot.app.cli.SpringBootApp;
import org.springframework.ide.vscode.commons.java.IClasspath;
import org.springframework.ide.vscode.commons.java.IJavaProject;
import org.springframework.ide.vscode.commons.languageserver.java.JavaProjectFinder;
-import org.springframework.ide.vscode.commons.languageserver.util.DocumentRegion;
import org.springframework.ide.vscode.commons.languageserver.util.HoverHandler;
import org.springframework.ide.vscode.commons.languageserver.util.SimpleTextDocumentService;
import org.springframework.ide.vscode.commons.util.Log;
+import org.springframework.ide.vscode.commons.util.text.DocumentRegion;
import org.springframework.ide.vscode.commons.util.text.IDocument;
import org.springframework.ide.vscode.commons.util.text.TextDocument;
diff --git a/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/java/livehover/ComponentInjectionsHoverProvider.java b/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/java/livehover/ComponentInjectionsHoverProvider.java
index 53052c42c..8c8694c91 100644
--- a/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/java/livehover/ComponentInjectionsHoverProvider.java
+++ b/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/java/livehover/ComponentInjectionsHoverProvider.java
@@ -33,9 +33,9 @@ import org.springframework.ide.vscode.commons.boot.app.cli.SpringBootApp;
import org.springframework.ide.vscode.commons.boot.app.cli.livebean.LiveBean;
import org.springframework.ide.vscode.commons.boot.app.cli.livebean.LiveBeansModel;
import org.springframework.ide.vscode.commons.java.IJavaProject;
-import org.springframework.ide.vscode.commons.languageserver.util.DocumentRegion;
import org.springframework.ide.vscode.commons.util.Log;
import org.springframework.ide.vscode.commons.util.StringUtil;
+import org.springframework.ide.vscode.commons.util.text.DocumentRegion;
import org.springframework.ide.vscode.commons.util.text.TextDocument;
import com.google.common.collect.ImmutableList;
diff --git a/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/java/snippets/JavaSnippet.java b/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/java/snippets/JavaSnippet.java
index 0e3fa7755..0e2d5c584 100644
--- a/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/java/snippets/JavaSnippet.java
+++ b/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/java/snippets/JavaSnippet.java
@@ -17,8 +17,8 @@ import org.eclipse.jdt.core.dom.ASTNode;
import org.eclipse.jdt.core.dom.CompilationUnit;
import org.eclipse.lsp4j.CompletionItemKind;
import org.springframework.ide.vscode.commons.languageserver.completion.ICompletionProposal;
-import org.springframework.ide.vscode.commons.languageserver.util.DocumentRegion;
import org.springframework.ide.vscode.commons.languageserver.util.SnippetBuilder;
+import org.springframework.ide.vscode.commons.util.text.DocumentRegion;
import com.google.common.base.Supplier;
diff --git a/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/java/snippets/JavaSnippetBuilder.java b/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/java/snippets/JavaSnippetBuilder.java
index 7f2c9ec7b..2280851a0 100644
--- a/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/java/snippets/JavaSnippetBuilder.java
+++ b/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/java/snippets/JavaSnippetBuilder.java
@@ -15,8 +15,8 @@ import java.util.regex.Pattern;
import org.springframework.ide.vscode.commons.languageserver.completion.DocumentEdits;
import org.springframework.ide.vscode.commons.languageserver.completion.IndentUtil;
-import org.springframework.ide.vscode.commons.languageserver.util.DocumentRegion;
import org.springframework.ide.vscode.commons.languageserver.util.SnippetBuilder;
+import org.springframework.ide.vscode.commons.util.text.DocumentRegion;
import org.springframework.ide.vscode.commons.util.text.IDocument;
import com.google.common.base.Supplier;
diff --git a/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/java/snippets/JavaSnippetCompletion.java b/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/java/snippets/JavaSnippetCompletion.java
index bf3eb74c2..f7214a88c 100644
--- a/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/java/snippets/JavaSnippetCompletion.java
+++ b/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/java/snippets/JavaSnippetCompletion.java
@@ -17,10 +17,10 @@ import org.eclipse.lsp4j.CompletionItemKind;
import org.springframework.ide.vscode.boot.java.jdt.imports.ImportRewrite;
import org.springframework.ide.vscode.commons.languageserver.completion.DocumentEdits;
import org.springframework.ide.vscode.commons.languageserver.completion.ICompletionProposal;
-import org.springframework.ide.vscode.commons.languageserver.util.DocumentRegion;
import org.springframework.ide.vscode.commons.languageserver.util.SnippetBuilder;
import org.springframework.ide.vscode.commons.util.Renderable;
import org.springframework.ide.vscode.commons.util.Renderables;
+import org.springframework.ide.vscode.commons.util.text.DocumentRegion;
import com.google.common.base.Supplier;
diff --git a/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/java/snippets/JavaSnippetManager.java b/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/java/snippets/JavaSnippetManager.java
index ed6f7fdc8..bbfd6d5bc 100644
--- a/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/java/snippets/JavaSnippetManager.java
+++ b/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/java/snippets/JavaSnippetManager.java
@@ -17,10 +17,10 @@ import java.util.List;
import org.eclipse.jdt.core.dom.ASTNode;
import org.eclipse.jdt.core.dom.CompilationUnit;
import org.springframework.ide.vscode.commons.languageserver.completion.ICompletionProposal;
-import org.springframework.ide.vscode.commons.languageserver.util.DocumentRegion;
import org.springframework.ide.vscode.commons.languageserver.util.PrefixFinder;
import org.springframework.ide.vscode.commons.languageserver.util.SnippetBuilder;
import org.springframework.ide.vscode.commons.util.FuzzyMatcher;
+import org.springframework.ide.vscode.commons.util.text.DocumentRegion;
import org.springframework.ide.vscode.commons.util.text.IDocument;
import com.google.common.base.Supplier;
diff --git a/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/java/utils/ASTUtils.java b/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/java/utils/ASTUtils.java
index 96f9172e5..c7394b8e2 100644
--- a/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/java/utils/ASTUtils.java
+++ b/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/java/utils/ASTUtils.java
@@ -31,9 +31,9 @@ import org.eclipse.jdt.core.dom.SingleMemberAnnotation;
import org.eclipse.jdt.core.dom.StringLiteral;
import org.eclipse.jdt.core.dom.TypeDeclaration;
import org.eclipse.lsp4j.Range;
-import org.springframework.ide.vscode.commons.languageserver.util.DocumentRegion;
import org.springframework.ide.vscode.commons.util.CollectorUtil;
import org.springframework.ide.vscode.commons.util.Log;
+import org.springframework.ide.vscode.commons.util.text.DocumentRegion;
import org.springframework.ide.vscode.commons.util.text.TextDocument;
import com.google.common.collect.ImmutableList;
diff --git a/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/java/utils/FunctionUtils.java b/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/java/utils/FunctionUtils.java
index 223eed5e9..6314795ad 100644
--- a/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/java/utils/FunctionUtils.java
+++ b/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/java/utils/FunctionUtils.java
@@ -18,7 +18,7 @@ import java.util.function.Supplier;
import org.eclipse.jdt.core.dom.ITypeBinding;
import org.eclipse.jdt.core.dom.Modifier;
import org.eclipse.jdt.core.dom.TypeDeclaration;
-import org.springframework.ide.vscode.commons.languageserver.util.DocumentRegion;
+import org.springframework.ide.vscode.commons.util.text.DocumentRegion;
import org.springframework.ide.vscode.commons.util.text.TextDocument;
import reactor.util.function.Tuple3;
diff --git a/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/metadata/types/DelimitedStringParser.java b/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/metadata/types/DelimitedStringParser.java
new file mode 100644
index 000000000..0dc8a4405
--- /dev/null
+++ b/headless-services/commons/commons-boot/src/main/java/org/springframework/ide/vscode/boot/metadata/types/DelimitedStringParser.java
@@ -0,0 +1,72 @@
+/*******************************************************************************
+ * 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.ide.vscode.boot.metadata.types;
+
+import java.util.ArrayList;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.springframework.ide.vscode.commons.util.ExceptionUtil;
+import org.springframework.ide.vscode.commons.util.StringUtil;
+import org.springframework.ide.vscode.commons.util.ValueParseException;
+import org.springframework.ide.vscode.commons.util.ValueParser;
+
+import com.google.common.collect.ImmutableList;
+
+/**
+ * Parser that is capable of parsing comma-separated lists. The parser
+ * is constructed from another parser which is used to parse the elements.
+ */
+public class DelimitedStringParser implements ValueParser {
+
+ private static final Pattern COMMA = Pattern.compile("(\\s)*\\,(\\s)*");;
+ private Pattern SEPARATOR = COMMA;
+
+ private ValueParser elementParser;
+
+ public DelimitedStringParser(ValueParser elementParser) {
+ super();
+ this.elementParser = elementParser;
+ }
+
+ @Override
+ public Object parse(String str) throws Exception {
+ if (!StringUtil.hasText(str)) {
+ return ImmutableList.of();
+ }
+ int offset = 0;
+ Matcher matcher = SEPARATOR.matcher(str);
+ ArrayList