diff --git a/internal/lsp/protocol/tsclient.go b/internal/lsp/protocol/tsclient.go
index 251c74a..d30594b 100644
--- a/internal/lsp/protocol/tsclient.go
+++ b/internal/lsp/protocol/tsclient.go
@@ -2,8 +2,8 @@
 
 // Package protocol contains data types and code for LSP jsonrpcs
 // generated automatically from vscode-languageserver-node
-// commit: 399de64448129835b53c7efe8962de91681d6cde
-// last fetched Wed Aug 26 2020 20:34:24 GMT-0400 (Eastern Daylight Time)
+// commit: 60a5a7825e6f54f57917091f394fd8db7d1724bc
+// last fetched Thu Sep 10 2020 09:21:57 GMT-0400 (Eastern Daylight Time)
 
 // Code generated (see typescript/README.md) DO NOT EDIT.
 
diff --git a/internal/lsp/protocol/tsprotocol.go b/internal/lsp/protocol/tsprotocol.go
index 8d774a6..13d40c5 100644
--- a/internal/lsp/protocol/tsprotocol.go
+++ b/internal/lsp/protocol/tsprotocol.go
@@ -1,7 +1,7 @@
 // Package protocol contains data types and code for LSP jsonrpcs
 // generated automatically from vscode-languageserver-node
-// commit: 399de64448129835b53c7efe8962de91681d6cde
-// last fetched Wed Aug 26 2020 20:34:24 GMT-0400 (Eastern Daylight Time)
+// commit: 60a5a7825e6f54f57917091f394fd8db7d1724bc
+// last fetched Thu Sep 10 2020 09:21:57 GMT-0400 (Eastern Daylight Time)
 package protocol
 
 // Code generated (see typescript/README.md) DO NOT EDIT.
@@ -390,7 +390,7 @@
 	 */
 	Command Command `json:"command,omitempty"`
 	/**
-	 * An data entry field that is preserved on a code lens item between
+	 * A data entry field that is preserved on a code lens item between
 	 * a [CodeLensRequest](#CodeLensRequest) and a [CodeLensResolveRequest]
 	 * (#CodeLensResolveRequest)
 	 */
@@ -748,7 +748,7 @@
 	 */
 	Command *Command `json:"command,omitempty"`
 	/**
-	 * An data entry field that is preserved on a completion item between
+	 * A data entry field that is preserved on a completion item between
 	 * a [CompletionRequest](#CompletionRequest) and a [CompletionResolveRequest]
 	 * (#CompletionResolveRequest)
 	 */
@@ -900,7 +900,7 @@
 type Declaration = []Location /*Location | Location[]*/
 
 /**
- * Since 3.14.0
+ * @since 3.14.0
  */
 type DeclarationClientCapabilities struct {
 	/**
@@ -1862,7 +1862,7 @@
 }
 
 /**
- * Since 3.6.0
+ * @since 3.6.0
  */
 type ImplementationClientCapabilities struct {
 	/**
@@ -1874,7 +1874,7 @@
 	/**
 	 * The client supports additional metadata in the form of definition links.
 	 *
-	 * Since 3.14.0
+	 * @since 3.14.0
 	 */
 	LinkSupport bool `json:"linkSupport,omitempty"`
 }
@@ -2113,9 +2113,17 @@
 	ExecuteCommandProvider ExecuteCommandOptions `json:"executeCommandProvider,omitempty"`
 	/**
 	 * The server provides Call Hierarchy support.
+	 *
+	 * @since 3.16.0 - Proposed state
 	 */
 	CallHierarchyProvider interface{}/* bool | CallHierarchyOptions | CallHierarchyRegistrationOptions*/ `json:"callHierarchyProvider,omitempty"`
 	/**
+	 * The server provides semantic tokens support.
+	 *
+	 * @since 3.16.0 - Proposed state
+	 */
+	SemanticTokensProvider interface{}/*SemanticTokensOptions | SemanticTokensRegistrationOptions*/ `json:"semanticTokensProvider,omitempty"`
+	/**
 	 * Experimental server capabilities.
 	 */
 	Experimental interface{} `json:"experimental,omitempty"`
@@ -2506,6 +2514,12 @@
 	 * @since version 3.12.0
 	 */
 	PrepareSupport bool `json:"prepareSupport,omitempty"`
+	/**
+	 * Client supports the default behavior result.
+	 *
+	 * @since version 3.16.0
+	 */
+	PrepareSupportDefaultBehavior bool `json:"prepareSupportDefaultBehavior,omitempty"`
 }
 
 /**
@@ -2682,7 +2696,8 @@
 	 */
 	TextDocument TextDocumentIdentifier `json:"textDocument"`
 	/**
-	 * The previous result id.
+	 * The result id of a previous response. The result Id can either point to a full response
+	 * or a delta response depending on what was recevied last.
 	 */
 	PreviousResultID string `json:"previousResultId"`
 	WorkDoneProgressParams
@@ -2710,6 +2725,40 @@
 /**
  * @since 3.16.0 - Proposed state
  */
+type SemanticTokensLegend struct {
+	/**
+	 * The token types a server uses.
+	 */
+	TokenTypes []string `json:"tokenTypes"`
+	/**
+	 * The token modifiers a server uses.
+	 */
+	TokenModifiers []string `json:"tokenModifiers"`
+}
+
+/**
+ * @since 3.16.0 - Proposed state
+ */
+type SemanticTokensOptions struct {
+	/**
+	 * The legend used by the server
+	 */
+	Legend SemanticTokensLegend `json:"legend"`
+	/**
+	 * Server supports providing semantic tokens for a sepcific range
+	 * of a document.
+	 */
+	Range bool/*boolean | {	}*/ `json:"range,omitempty"`
+	/**
+	 * Server supports providing semantic tokens for a full document.
+	 */
+	Full bool/*boolean | <elided struct>*/ `json:"full,omitempty"`
+	WorkDoneProgressOptions
+}
+
+/**
+ * @since 3.16.0 - Proposed state
+ */
 type SemanticTokensParams struct {
 	/**
 	 * The text document.
@@ -2735,6 +2784,15 @@
 	PartialResultParams
 }
 
+/**
+ * @since 3.16.0 - Proposed state
+ */
+type SemanticTokensRegistrationOptions struct {
+	TextDocumentRegistrationOptions
+	SemanticTokensOptions
+	StaticRegistrationOptions
+}
+
 type ServerCapabilities = struct {
 	/**
 	 * Defines how text documents are synced. Is either a detailed structure defining each notification or
@@ -2835,9 +2893,17 @@
 	ExecuteCommandProvider ExecuteCommandOptions `json:"executeCommandProvider,omitempty"`
 	/**
 	 * The server provides Call Hierarchy support.
+	 *
+	 * @since 3.16.0 - Proposed state
 	 */
 	CallHierarchyProvider interface{}/* bool | CallHierarchyOptions | CallHierarchyRegistrationOptions*/ `json:"callHierarchyProvider,omitempty"`
 	/**
+	 * The server provides semantic tokens support.
+	 *
+	 * @since 3.16.0 - Proposed state
+	 */
+	SemanticTokensProvider interface{}/*SemanticTokensOptions | SemanticTokensRegistrationOptions*/ `json:"semanticTokensProvider,omitempty"`
+	/**
 	 * Experimental server capabilities.
 	 */
 	Experimental interface{} `json:"experimental,omitempty"`
diff --git a/internal/lsp/protocol/tsserver.go b/internal/lsp/protocol/tsserver.go
index 29285e0..d1dada3 100644
--- a/internal/lsp/protocol/tsserver.go
+++ b/internal/lsp/protocol/tsserver.go
@@ -2,8 +2,8 @@
 
 // Package protocol contains data types and code for LSP jsonrpcs
 // generated automatically from vscode-languageserver-node
-// commit: 399de64448129835b53c7efe8962de91681d6cde
-// last fetched Wed Aug 26 2020 20:34:24 GMT-0400 (Eastern Daylight Time)
+// commit: 60a5a7825e6f54f57917091f394fd8db7d1724bc
+// last fetched Thu Sep 10 2020 09:21:57 GMT-0400 (Eastern Daylight Time)
 
 // Code generated (see typescript/README.md) DO NOT EDIT.
 
@@ -18,6 +18,7 @@
 type Server interface {
 	DidChangeWorkspaceFolders(context.Context, *DidChangeWorkspaceFoldersParams) error
 	WorkDoneProgressCancel(context.Context, *WorkDoneProgressCancelParams) error
+	SemanticTokensRefresh(context.Context) error
 	Initialized(context.Context, *InitializedParams) error
 	Exit(context.Context) error
 	DidChangeConfiguration(context.Context, *DidChangeConfigurationParams) error
@@ -39,6 +40,9 @@
 	PrepareCallHierarchy(context.Context, *CallHierarchyPrepareParams) ([]CallHierarchyItem /*CallHierarchyItem[] | null*/, error)
 	IncomingCalls(context.Context, *CallHierarchyIncomingCallsParams) ([]CallHierarchyIncomingCall /*CallHierarchyIncomingCall[] | null*/, error)
 	OutgoingCalls(context.Context, *CallHierarchyOutgoingCallsParams) ([]CallHierarchyOutgoingCall /*CallHierarchyOutgoingCall[] | null*/, error)
+	SemanticTokensFull(context.Context, *SemanticTokensParams) (*SemanticTokens /*SemanticTokens | null*/, error)
+	SemanticTokensFullDelta(context.Context, *SemanticTokensDeltaParams) (interface{} /* SemanticTokens | SemanticTokensDelta | nil*/, error)
+	SemanticTokensRange(context.Context, *SemanticTokensRangeParams) (*SemanticTokens /*SemanticTokens | null*/, error)
 	Initialize(context.Context, *ParamInitialize) (*InitializeResult, error)
 	Shutdown(context.Context) error
 	WillSaveWaitUntil(context.Context, *WillSaveTextDocumentParams) ([]TextEdit /*TextEdit[] | null*/, error)
@@ -60,11 +64,8 @@
 	RangeFormatting(context.Context, *DocumentRangeFormattingParams) ([]TextEdit /*TextEdit[] | null*/, error)
 	OnTypeFormatting(context.Context, *DocumentOnTypeFormattingParams) ([]TextEdit /*TextEdit[] | null*/, error)
 	Rename(context.Context, *RenameParams) (*WorkspaceEdit /*WorkspaceEdit | null*/, error)
-	PrepareRename(context.Context, *PrepareRenameParams) (*Range /*Range | { range: Range, placeholder: string } | null*/, error)
+	PrepareRename(context.Context, *PrepareRenameParams) (*Range /*Range | { range: Range, placeholder: string } | { defaultBehavior: boolean } | null*/, error)
 	ExecuteCommand(context.Context, *ExecuteCommandParams) (interface{} /*any | null*/, error)
-	SemanticTokensFull(context.Context, *SemanticTokensParams) (*SemanticTokens /*SemanticTokens | null*/, error)
-	SemanticTokensFullDelta(context.Context, *SemanticTokensDeltaParams) (interface{} /* SemanticTokens | SemanticTokensDelta | nil*/, error)
-	SemanticTokensRange(context.Context, *SemanticTokensRangeParams) (*SemanticTokens /*SemanticTokens | null*/, error)
 	NonstandardRequest(ctx context.Context, method string, params interface{}) (interface{}, error)
 }
 
@@ -84,6 +85,9 @@
 		}
 		err := server.WorkDoneProgressCancel(ctx, &params)
 		return true, reply(ctx, nil, err)
+	case "workspace/semanticTokens/refresh": // notif
+		err := server.SemanticTokensRefresh(ctx)
+		return true, reply(ctx, nil, err)
 	case "initialized": // notif
 		var params InitializedParams
 		if err := json.Unmarshal(r.Params(), &params); err != nil {
@@ -227,6 +231,27 @@
 		}
 		resp, err := server.OutgoingCalls(ctx, &params)
 		return true, reply(ctx, resp, err)
+	case "textDocument/semanticTokens/full": // req
+		var params SemanticTokensParams
+		if err := json.Unmarshal(r.Params(), &params); err != nil {
+			return true, sendParseError(ctx, reply, err)
+		}
+		resp, err := server.SemanticTokensFull(ctx, &params)
+		return true, reply(ctx, resp, err)
+	case "textDocument/semanticTokens/full/delta": // req
+		var params SemanticTokensDeltaParams
+		if err := json.Unmarshal(r.Params(), &params); err != nil {
+			return true, sendParseError(ctx, reply, err)
+		}
+		resp, err := server.SemanticTokensFullDelta(ctx, &params)
+		return true, reply(ctx, resp, err)
+	case "textDocument/semanticTokens/range": // req
+		var params SemanticTokensRangeParams
+		if err := json.Unmarshal(r.Params(), &params); err != nil {
+			return true, sendParseError(ctx, reply, err)
+		}
+		resp, err := server.SemanticTokensRange(ctx, &params)
+		return true, reply(ctx, resp, err)
 	case "initialize": // req
 		var params ParamInitialize
 		if err := json.Unmarshal(r.Params(), &params); err != nil {
@@ -387,27 +412,6 @@
 		}
 		resp, err := server.ExecuteCommand(ctx, &params)
 		return true, reply(ctx, resp, err)
-	case "textDocument/semanticTokens/full": // req
-		var params SemanticTokensParams
-		if err := json.Unmarshal(r.Params(), &params); err != nil {
-			return true, sendParseError(ctx, reply, err)
-		}
-		resp, err := server.SemanticTokensFull(ctx, &params)
-		return true, reply(ctx, resp, err)
-	case "textDocument/semanticTokens/full/delta": // req
-		var params SemanticTokensDeltaParams
-		if err := json.Unmarshal(r.Params(), &params); err != nil {
-			return true, sendParseError(ctx, reply, err)
-		}
-		resp, err := server.SemanticTokensFullDelta(ctx, &params)
-		return true, reply(ctx, resp, err)
-	case "textDocument/semanticTokens/range": // req
-		var params SemanticTokensRangeParams
-		if err := json.Unmarshal(r.Params(), &params); err != nil {
-			return true, sendParseError(ctx, reply, err)
-		}
-		resp, err := server.SemanticTokensRange(ctx, &params)
-		return true, reply(ctx, resp, err)
 
 	default:
 		return false, nil
@@ -422,6 +426,10 @@
 	return s.Conn.Notify(ctx, "window/workDoneProgress/cancel", params)
 }
 
+func (s *serverDispatcher) SemanticTokensRefresh(ctx context.Context) error {
+	return s.Conn.Notify(ctx, "workspace/semanticTokens/refresh", nil)
+}
+
 func (s *serverDispatcher) Initialized(ctx context.Context, params *InitializedParams) error {
 	return s.Conn.Notify(ctx, "initialized", params)
 }
@@ -545,6 +553,30 @@
 	return result, nil
 }
 
+func (s *serverDispatcher) SemanticTokensFull(ctx context.Context, params *SemanticTokensParams) (*SemanticTokens /*SemanticTokens | null*/, error) {
+	var result *SemanticTokens /*SemanticTokens | null*/
+	if err := Call(ctx, s.Conn, "textDocument/semanticTokens/full", params, &result); err != nil {
+		return nil, err
+	}
+	return result, nil
+}
+
+func (s *serverDispatcher) SemanticTokensFullDelta(ctx context.Context, params *SemanticTokensDeltaParams) (interface{} /* SemanticTokens | SemanticTokensDelta | nil*/, error) {
+	var result interface{} /* SemanticTokens | SemanticTokensDelta | nil*/
+	if err := Call(ctx, s.Conn, "textDocument/semanticTokens/full/delta", params, &result); err != nil {
+		return nil, err
+	}
+	return result, nil
+}
+
+func (s *serverDispatcher) SemanticTokensRange(ctx context.Context, params *SemanticTokensRangeParams) (*SemanticTokens /*SemanticTokens | null*/, error) {
+	var result *SemanticTokens /*SemanticTokens | null*/
+	if err := Call(ctx, s.Conn, "textDocument/semanticTokens/range", params, &result); err != nil {
+		return nil, err
+	}
+	return result, nil
+}
+
 func (s *serverDispatcher) Initialize(ctx context.Context, params *ParamInitialize) (*InitializeResult, error) {
 	var result *InitializeResult
 	if err := Call(ctx, s.Conn, "initialize", params, &result); err != nil {
@@ -709,8 +741,8 @@
 	return result, nil
 }
 
-func (s *serverDispatcher) PrepareRename(ctx context.Context, params *PrepareRenameParams) (*Range /*Range | { range: Range, placeholder: string } | null*/, error) {
-	var result *Range /*Range | { range: Range, placeholder: string } | null*/
+func (s *serverDispatcher) PrepareRename(ctx context.Context, params *PrepareRenameParams) (*Range /*Range | { range: Range, placeholder: string } | { defaultBehavior: boolean } | null*/, error) {
+	var result *Range /*Range | { range: Range, placeholder: string } | { defaultBehavior: boolean } | null*/
 	if err := Call(ctx, s.Conn, "textDocument/prepareRename", params, &result); err != nil {
 		return nil, err
 	}
@@ -725,30 +757,6 @@
 	return result, nil
 }
 
-func (s *serverDispatcher) SemanticTokensFull(ctx context.Context, params *SemanticTokensParams) (*SemanticTokens /*SemanticTokens | null*/, error) {
-	var result *SemanticTokens /*SemanticTokens | null*/
-	if err := Call(ctx, s.Conn, "textDocument/semanticTokens/full", params, &result); err != nil {
-		return nil, err
-	}
-	return result, nil
-}
-
-func (s *serverDispatcher) SemanticTokensFullDelta(ctx context.Context, params *SemanticTokensDeltaParams) (interface{} /* SemanticTokens | SemanticTokensDelta | nil*/, error) {
-	var result interface{} /* SemanticTokens | SemanticTokensDelta | nil*/
-	if err := Call(ctx, s.Conn, "textDocument/semanticTokens/full/delta", params, &result); err != nil {
-		return nil, err
-	}
-	return result, nil
-}
-
-func (s *serverDispatcher) SemanticTokensRange(ctx context.Context, params *SemanticTokensRangeParams) (*SemanticTokens /*SemanticTokens | null*/, error) {
-	var result *SemanticTokens /*SemanticTokens | null*/
-	if err := Call(ctx, s.Conn, "textDocument/semanticTokens/range", params, &result); err != nil {
-		return nil, err
-	}
-	return result, nil
-}
-
 func (s *serverDispatcher) NonstandardRequest(ctx context.Context, method string, params interface{}) (interface{}, error) {
 	var result interface{}
 	if err := Call(ctx, s.Conn, method, params, &result); err != nil {
diff --git a/internal/lsp/protocol/typescript/code.ts b/internal/lsp/protocol/typescript/code.ts
index 0bf9265..39cea15 100644
--- a/internal/lsp/protocol/typescript/code.ts
+++ b/internal/lsp/protocol/typescript/code.ts
@@ -70,9 +70,13 @@
     const decl: ts.VariableDeclaration = dl.declarations[0];
     const name = decl.name.getText()
     // we want the initializers
-    if (name == 'method') {  // StringLiteral
-      if (!ts.isStringLiteral(decl.initializer))
-        throw new Error(`expect StringLiteral at ${loc(decl)}`);
+    if (name == 'method') {  // mostly StringLiteral but NoSubstitutionTemplateLiteral in protocol.semanticTokens.ts
+      if (!ts.isStringLiteral(decl.initializer)) {
+        if (!ts.isNoSubstitutionTemplateLiteral(decl.initializer)) {
+          console.log(`${decl.initializer.getText()}`);
+          throw new Error(`expect StringLiteral at ${loc(decl)} got ${strKind(decl.initializer)}`);
+        }
+      }
       rpc = decl.initializer.getText()
     }
     else if (name == 'type') {  // NewExpression
@@ -520,7 +524,7 @@
     ans = ans.concat(getComments(n));
     const json = u.JSON(n);
     // SelectionRange is a recursive type
-    let gt = goType(n.type, n.name.getText());
+    let gt = goType(n.type, n.name.getText(), nm);
     if (gt == d.name) gt = '*' + gt;  // avoid recursive types
     // there are several cases where a * is needed
     starred.forEach(([a, b]) => {
@@ -613,12 +617,12 @@
 }
 
 // return a go type and maybe an assocated javascript tag
-function goType(n: ts.TypeNode, nm: string): string {
+function goType(n: ts.TypeNode, nm: string, parent?: string): string {
   if (n.getText() == 'T') return 'interface{}';  // should check it's generic
   if (ts.isTypeReferenceNode(n)) {
     return goName(n.typeName.getText());  // avoid <T>
   } else if (ts.isUnionTypeNode(n)) {
-    return goUnionType(n, nm);
+    return goUnionType(n, nm, parent);
   } else if (ts.isIntersectionTypeNode(n)) {
     return goIntersectionType(n, nm);
   } else if (strKind(n) == 'StringKeyword') {
@@ -659,8 +663,16 @@
 // The choice is uniform interface{}, or some heuristically assigned choice,
 // or some better sytematic idea I haven't thought of. Using interface{}
 // is, in practice, impossibly complex in the existing code.
-function goUnionType(n: ts.UnionTypeNode, nm: string): string {
-  const help = `/*${n.getText()}*/`  // show the original as a comment
+function goUnionType(n: ts.UnionTypeNode, nm: string, parent?: string): string {
+  let help = `/*${n.getText()}*/`  // show the original as a comment
+  // There are some bad cases with newlines:
+  // range?: boolean | {\n	};
+  // full?: boolean | {\n		/**\n		 * The server supports deltas for full documents.\n		 */\n		delta?: boolean;\n	}
+  // These are handled specially:
+  if (parent == 'SemanticTokensOptions') {
+    if (nm == 'range') help = help.replace(/\n/, '');
+    if (nm == 'full') help = '/*boolean | <elided struct>*/';
+  }
   // handle all the special cases
   switch (n.types.length) {
     case 2:
@@ -725,8 +737,9 @@
       break;
     case 4:
       if (nm == 'documentChanges') return `TextDocumentEdit ${help} `;
+      if (nm == 'textDocument/prepareRename') return `Range ${help} `;
     default:
-      throw new Error(`goUnionType ${n.types.length} `)
+      throw new Error(`goUnionType len=${n.types.length} nm=${nm}`)
   }
 
   // Result will be interface{} with a comment
diff --git a/internal/lsp/protocol/typescript/util.ts b/internal/lsp/protocol/typescript/util.ts
index 13815d5..77b2023 100644
--- a/internal/lsp/protocol/typescript/util.ts
+++ b/internal/lsp/protocol/typescript/util.ts
@@ -14,7 +14,7 @@
   `${dir}/${srcDir}/protocol/src/browser/main.ts`, `${dir}${srcDir}/types/src/main.ts`,
   `${dir}${srcDir}/jsonrpc/src/node/main.ts`
 ];
-export const gitHash = '399de64448129835b53c7efe8962de91681d6cde'
+export const gitHash = '60a5a7825e6f54f57917091f394fd8db7d1724bc'
 let outFname = 'tsprotocol.go';
 let fda: number, fdb: number, fde: number;  // file descriptors
 
diff --git a/internal/lsp/server.go b/internal/lsp/server.go
index c135b34..dfc2222 100644
--- a/internal/lsp/server.go
+++ b/internal/lsp/server.go
@@ -104,6 +104,10 @@
 	snapshotID   uint64
 }
 
+func (s *Server) workDoneProgressCancel(ctx context.Context, params *protocol.WorkDoneProgressCancelParams) error {
+	return s.progress.cancel(ctx, params.Token)
+}
+
 func (s *Server) nonstandardRequest(ctx context.Context, method string, params interface{}) (interface{}, error) {
 	paramMap := params.(map[string]interface{})
 	if method == "gopls/diagnoseFiles" {
diff --git a/internal/lsp/server_gen.go b/internal/lsp/server_gen.go
index 471f1a4..d22a5eb 100644
--- a/internal/lsp/server_gen.go
+++ b/internal/lsp/server_gen.go
@@ -176,6 +176,10 @@
 	return nil, notImplemented("SemanticTokensRange")
 }
 
+func (s *Server) SemanticTokensRefresh(context.Context) error {
+	return notImplemented("SemanticTokensRefresh")
+}
+
 func (s *Server) SetTrace(context.Context, *protocol.SetTraceParams) error {
 	return notImplemented("SetTrace")
 }
@@ -205,5 +209,5 @@
 }
 
 func (s *Server) WorkDoneProgressCancel(ctx context.Context, params *protocol.WorkDoneProgressCancelParams) error {
-	return s.progress.cancel(ctx, params.Token)
+	return s.workDoneProgressCancel(ctx, params)
 }
